wifi: update rtl8723bs driver
authorhwg <hwg@rock-chips.com>
Sun, 28 Sep 2014 06:33:27 +0000 (14:33 +0800)
committerhwg <hwg@rock-chips.com>
Sun, 28 Sep 2014 06:33:27 +0000 (14:33 +0800)
 rk version 4.00.WFD, rtk version v4.3.5_11545.20140603_BTCOEX20140507-4E40

209 files changed:
drivers/net/wireless/rockchip_wlan/rtl8723bs/Kconfig
drivers/net/wireless/rockchip_wlan/rtl8723bs/Makefile
drivers/net/wireless/rockchip_wlan/rtl8723bs/clean [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/efuse/rtw_efuse.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_ap.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_beamforming.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_bt_mp.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_btcoex.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_debug.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_ieee80211.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_io.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_ioctl_set.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mem.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mlme.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mlme_ext.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mp.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_odm.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_p2p.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_pwrctrl.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_recv.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_security.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_sreset.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_sta_mgt.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_tdls.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_vht.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_wapi.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_wlan_util.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/HalPhyRf.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_AntDiv.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_CfoTracking.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_CfoTracking.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DIG.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DIG.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicBBPowerSaving.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicBBPowerSaving.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicTxPower.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicTxPower.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_EdcaTurboCheck.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_EdcaTurboCheck.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_HWConfig.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_HWConfig.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_NoiseMonitor.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_NoiseMonitor.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_PathDiv.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_PathDiv.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_RegDefine11AC.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_RegDefine11N.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_debug.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_debug.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_interface.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_interface.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_precomp.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_types.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/Hal8723BReg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/odm_RTL8723B.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/rtl8723b/odm_RTL8723B.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_btcoex.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_com.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_com_phycfg.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_hci/hal_sdio.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/rtl8723b_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/rtl8723b_dm.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/rtl8723b_hal_init.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/rtl8723b_mp.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/rtl8723b_phycfg.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/rtl8723b_rxdesc.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/sdio/rtl8723bs_recv.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/sdio/rtl8723bs_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/sdio/sdio_halinit.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/rtl8723b/sdio/sdio_ops.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/ifcfg-wlan0 [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/Hal8188EPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/Hal8192CPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/Hal8192DPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/Hal8192EPhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/Hal8812PhyReg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/autoconf.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/basic_types.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/drv_conf.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/drv_types.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_btcoex.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_com.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_com_h2c.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_com_phycfg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_com_reg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_data.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_gspi.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_intf.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_pg.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_sdio.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/ieee80211.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/ioctl_cfg80211.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/osdep_intf.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/osdep_service.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/pci_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/pci_ops.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8188e_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8188e_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8188e_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8188e_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192c_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192c_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192d_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192d_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192d_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192e_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192e_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192e_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192e_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8192e_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723a_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723a_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723a_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723b_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723b_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723b_led.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723b_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723b_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8723b_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8812a_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8812a_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8812a_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtl8812a_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_android.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_beamforming.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_bt_mp.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_btcoex.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_debug.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_eeprom.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_efuse.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_event.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_ht.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mem.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mlme.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mlme_ext.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mp.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mp_phy_regdef.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_odm.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_pwrctrl.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_rf.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_security.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_tdls.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_version.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_vht.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_wifi_regd.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/sdio_ops.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/sta_info.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/include/wifi.h
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/ioctl_cfg80211.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/ioctl_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/mlme_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/os_intfs.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/recv_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/rtw_android.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/rtw_proc.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/sdio_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/wifi_regd.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/wifi_version.h [changed mode: 0644->0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/linux/xmit_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/os_dep/osdep_service.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/platform/platform_ARM_SUNnI_sdio.c
drivers/net/wireless/rockchip_wlan/rtl8723bs/platform/platform_ARM_WMT_sdio.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/runwpa [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723bs/wlan0dhcp [new file with mode: 0755]

index 9cc6fea7ca44069c5fd33ef6496f25a2c884f65e..5ff95dbc11bdd5f2b0fe39e2a67f13bff46683df 100755 (executable)
@@ -1,7 +1,16 @@
+#config RTL8723AS
+#      tristate "Realtek 8723A SDIO or SPI WiFi"
+#      ---help---
+#        Help message of RTL8723AS
+
 config RTL8723BS
-       tristate "Realtek 8723BS SDIO or SPI WiFi Support"
-    select WIRELESS_EXT
-    select WEXT_PRIV
-    select IEEE80211
+       tristate "Realtek 8723BS SDIO or SPI WiFi"
        ---help---
          Help message of RTL8723BS
+
+#config WLAN_SDIO
+#      bool "Enable SDIO interface for Realtek"
+#      depends on RTL8723AS || RTL8723BS
+#      default n
+#      ---help---
+#        Use memory preallocated in platform
index afc25e7ba1dc5f40ac284e75e1d036b2770db666..8fb5ca2aeeeba909aed69aefdbb2c98faaafaf96 100755 (executable)
@@ -1,5 +1,5 @@
 EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS)
-EXTRA_CFLAGS += -O1
+EXTRA_CFLAGS += -O1 -Wframe-larger-than=1200
 #EXTRA_CFLAGS += -O3
 #EXTRA_CFLAGS += -Wall
 #EXTRA_CFLAGS += -Wextra
@@ -18,8 +18,11 @@ EXTRA_CFLAGS += -Wno-unused
 
 EXTRA_CFLAGS += -I$(src)/include
 
+EXTRA_LDFLAGS += --strip-debug
+
 CONFIG_AUTOCFG_CP = n
 
+########################## WIFI IC ############################
 CONFIG_MULTIDRV = n
 CONFIG_RTL8192C = n
 CONFIG_RTL8192D = n
@@ -29,12 +32,12 @@ CONFIG_RTL8812A = n
 CONFIG_RTL8821A = n
 CONFIG_RTL8192E = n
 CONFIG_RTL8723B = y
-
+######################### Interface ###########################
 CONFIG_USB_HCI = n
 CONFIG_PCI_HCI = n
 CONFIG_SDIO_HCI = y
 CONFIG_GSPI_HCI = n
-
+########################## Features ###########################
 CONFIG_MP_INCLUDED = y
 CONFIG_POWER_SAVING = y
 CONFIG_USB_AUTOSUSPEND = n
@@ -46,15 +49,21 @@ CONFIG_INTEL_WIDI = n
 CONFIG_WAPI_SUPPORT = n
 CONFIG_EFUSE_CONFIG_FILE = n
 CONFIG_EXT_CLK = n
-CONFIG_WOWLAN = n
-CONFIG_GPIO_WAKEUP = n
 CONFIG_TRAFFIC_PROTECT = y
 CONFIG_LOAD_PHY_PARA_FROM_FILE = y
+CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY = n
+CONFIG_CALIBRATE_TX_POWER_TO_MAX = n
 CONFIG_ODM_ADAPTIVITY = n
+CONFIG_SKIP_SIGNAL_SCALE_MAPPING = n
+######################## Wake On Lan ##########################
+CONFIG_WOWLAN = y
+CONFIG_GPIO_WAKEUP = y
 CONFIG_PNO_SUPPORT = n
 CONFIG_PNO_SET_DEBUG = n
 CONFIG_AP_WOWLAN = n
-
+######### Notify SDIO Host Keep Power During Syspend ##########
+CONFIG_RTW_SDIO_PM_KEEP_POWER = y
+###################### Platform Related #######################
 CONFIG_PLATFORM_I386_PC = n
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_JB_X86 = n
@@ -77,6 +86,7 @@ CONFIG_PLATFORM_ARM_TCC8900 = n
 CONFIG_PLATFORM_ARM_TCC8920 = n
 CONFIG_PLATFORM_ARM_TCC8920_JB42 = n
 CONFIG_PLATFORM_ARM_RK2818 = n
+CONFIG_PLATFORM_ARM_RK3066 = n
 CONFIG_PLATFORM_ARM_RK3188 = y
 CONFIG_PLATFORM_ARM_URBETTER = n
 CONFIG_PLATFORM_ARM_TI_PANDA = n
@@ -95,6 +105,8 @@ CONFIG_PLATFORM_ACTIONS_ATV5201 = n
 CONFIG_PLATFORM_ARM_RTD299X = n
 CONFIG_PLATFORM_ARM_SPREADTRUM_6820 = n
 CONFIG_PLATFORM_ARM_SPREADTRUM_8810 = n
+CONFIG_PLATFORM_ARM_WMT = n
+###############################################################
 
 CONFIG_DRVEXT_MODULE = n
 
@@ -147,15 +159,23 @@ _HAL_INTFS_FILES :=       hal/hal_intf.o \
                        hal/hal_com_phycfg.o \
                        hal/hal_phy.o \
                        hal/hal_btcoex.o \
+                       hal/hal_hci/hal_$(HCI_NAME).o \
                        hal/led/hal_$(HCI_NAME)_led.o
-
+                       
 _OUTSRC_FILES := hal/OUTSRC/odm_debug.o        \
                hal/OUTSRC/odm_AntDiv.o\
                hal/OUTSRC/odm_interface.o\
                hal/OUTSRC/odm_HWConfig.o\
                hal/OUTSRC/odm.o\
-               hal/OUTSRC/HalPhyRf.o
-
+               hal/OUTSRC/HalPhyRf.o\
+               hal/OUTSRC/odm_EdcaTurboCheck.o\
+               hal/OUTSRC/odm_DIG.o\
+               hal/OUTSRC/odm_PathDiv.o\
+               hal/OUTSRC/odm_DynamicBBPowerSaving.o\
+               hal/OUTSRC/odm_DynamicTxPower.o\
+               hal/OUTSRC/odm_CfoTracking.o\
+               hal/OUTSRC/odm_NoiseMonitor.o
+               
 EXTRA_CFLAGS += -I$(src)/platform
 _PLATFORM_FILES := platform/platform_ops.o
 
@@ -519,10 +539,6 @@ _OUTSRC_FILES += hal/OUTSRC/$(RTL871X)/HalHWImg8812A_FW.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_MAC.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_BB.o\
                hal/OUTSRC/$(RTL871X)/HalHWImg8812A_RF.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_FW.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_MAC.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_BB.o\
-               hal/OUTSRC/$(RTL871X)/HalHWImg8812A_TestChip_RF.o\
                hal/OUTSRC/$(RTL871X)/HalPhyRf_8812A.o\
                hal/OUTSRC/$(RTL871X)/odm_RegConfig8812A.o\
                hal/OUTSRC/$(RTL871X)/odm_RTL8812A.o
@@ -550,9 +566,6 @@ _OUTSRC_FILES += hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.o\
                hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.o\
-               hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.o\
-               hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.o\
-               hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_RF.o\
                hal/OUTSRC/rtl8812a/HalPhyRf_8812A.o\
                hal/OUTSRC/rtl8821a/HalPhyRf_8821A.o\
                hal/OUTSRC/rtl8821a/odm_RegConfig8821A.o\
@@ -569,6 +582,9 @@ RTL871X = rtl8723b
 ifeq ($(CONFIG_USB_HCI), y)
 MODULE_NAME = 8723bu
 endif
+ifeq ($(CONFIG_PCI_HCI), y)
+MODULE_NAME = 8723be
+endif
 ifeq ($(CONFIG_SDIO_HCI), y)
 MODULE_NAME = 8723bs
 endif
@@ -585,12 +601,19 @@ _HAL_INTFS_FILES +=       hal/$(RTL871X)/$(RTL871X)_hal_init.o \
                        hal/$(RTL871X)/$(RTL871X)_dm.o \
                        hal/$(RTL871X)/$(RTL871X)_rxdesc.o \
                        hal/$(RTL871X)/$(RTL871X)_cmd.o \
+                       
+
+_HAL_INTFS_FILES +=    \
                        hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \
                        hal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o
 
+ifeq ($(CONFIG_PCI_HCI), y)
+_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o
+else
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o
+endif
 
 ifeq ($(CONFIG_MP_INCLUDED), y)
 _HAL_INTFS_FILES += hal/$(RTL871X)/$(RTL871X)_mp.o
@@ -668,6 +691,12 @@ endif
 
 ifeq ($(CONFIG_EFUSE_CONFIG_FILE), y)
 EXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE
+ifeq ($(MODULE_NAME), 8189es)
+EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_8189e.map\"
+else
+EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_$(MODULE_NAME).map\"
+endif
+EXTRA_CFLAGS += -DWIFIMAC_PATH=\"/data/wifimac.txt\"
 endif
 
 ifeq ($(CONFIG_EXT_CLK), y)
@@ -682,46 +711,50 @@ ifeq ($(CONFIG_LOAD_PHY_PARA_FROM_FILE), y)
 EXTRA_CFLAGS += -DCONFIG_LOAD_PHY_PARA_FROM_FILE
 endif
 
+ifeq ($(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY), y)
+EXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_BY_REGULATORY
+endif
+
+ifeq ($(CONFIG_CALIBRATE_TX_POWER_TO_MAX), y)
+EXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_TO_MAX
+endif
+
 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_SKIP_SIGNAL_SCALE_MAPPING), y)
+EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING
 endif
 
-ifeq ($(CONFIG_RTL8192E), y)
 ifeq ($(CONFIG_WOWLAN), y)
 EXTRA_CFLAGS += -DCONFIG_WOWLAN
+ifeq ($(CONFIG_SDIO_HCI), y)
+EXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER
 endif
 endif
 
-ifeq ($(CONFIG_RTL8723B), y)
-ifeq ($(CONFIG_WOWLAN), y)
-EXTRA_CFLAGS += -DCONFIG_WOWLAN
+ifeq ($(CONFIG_AP_WOWLAN), y)
+EXTRA_CFLAGS += -DCONFIG_AP_WOWLAN
+ifeq ($(CONFIG_SDIO_HCI), y)
+EXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER
 endif
-ifeq ($(CONFIG_GPIO_WAKEUP), y)
-EXTRA_CFLAGS += -DCONFIG_GPIO_WAKEUP
 endif
+
 ifeq ($(CONFIG_PNO_SUPPORT), y)
 EXTRA_CFLAGS += -DCONFIG_PNO_SUPPORT
 ifeq ($(CONFIG_PNO_SET_DEBUG), y)
 EXTRA_CFLAGS += -DCONFIG_PNO_SET_DEBUG
 endif
 endif
-ifeq ($(CONFIG_AP_WOWLAN), y)
-EXTRA_CFLAGS += -DCONFIG_AP_WOWLAN
-ifeq ($(CONFIG_SDIO_HCI), y)
-EXTRA_CFLAGS += -DCONFIG_MMC_PM_KEEP_POWER
-endif
-endif
+
+ifeq ($(CONFIG_GPIO_WAKEUP), y)
+EXTRA_CFLAGS += -DCONFIG_GPIO_WAKEUP
 endif
 
-ifeq ($(CONFIG_WOWLAN), y)
+ifeq ($(CONFIG_RTW_SDIO_PM_KEEP_POWER), y)
 ifeq ($(CONFIG_SDIO_HCI), y)
-EXTRA_CFLAGS += -DCONFIG_MMC_PM_KEEP_POWER
+EXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER
 endif
 endif
 
@@ -764,7 +797,7 @@ KSRC:= /usr/src/Mstar_kernel/2.6.28.9/
 endif
 
 ifeq ($(CONFIG_PLATFORM_MSTAR), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR                 #-DCONFIG_PLATFORM_MSTAR_SCAN_BEFORE_CONNECT
 ARCH:=arm
 CROSS_COMPILE:= /usr/src/bin/arm-none-linux-gnueabi-
 KVER:= 3.1.10
@@ -910,6 +943,7 @@ endif
 
 ifeq ($(CONFIG_PLATFORM_TI_DM365), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_TI_DM365
+EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX
 ARCH := arm
 CROSS_COMPILE := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-
 KVER  := 2.6.18
@@ -971,7 +1005,7 @@ 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
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
 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
@@ -979,14 +1013,36 @@ MODULE_NAME := wlan
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
+# default setting for Android 4.1, 4.2, 4.3, 4.4
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+# default setting for Power control
 EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
 EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
-EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT
+# default setting for Special function
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS
 ARCH := arm
-#CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
-#KSRC := /home/android_sdk/Rockchip/Rk3188/kernel
-MODULE_NAME := 8723bs
+CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
+KSRC := /home/android_sdk/Rockchip/Rk3188/kernel
+MODULE_NAME := wlan
+endif
+
+ifeq ($(CONFIG_PLATFORM_ARM_RK3066), y)
+EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS
+ifeq ($(CONFIG_SDIO_HCI), y)
+EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
+endif
+EXTRA_CFLAGS += -fno-pic
+ARCH := arm
+CROSS_COMPILE := /home/android_sdk/Rockchip/rk3066_20130607/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-
+#CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3066sdk/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-
+KSRC := /home/android_sdk/Rockchip/Rk3066sdk/kernel
+MODULE_NAME :=wlan
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_URBETTER), y)
@@ -1064,7 +1120,7 @@ ifeq ($(CONFIG_PLATFORM_ARM_SUN6I), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
 EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN6I
 EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT
-# default setting for Android 4.1, 4.2
+# default setting for Android 4.1, 4.2, 4.3, 4.4
 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
 EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
 EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION
@@ -1081,25 +1137,22 @@ _PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o
 endif
 
 ARCH := arm
-KVER  := 3.3.0
 #Android-JB42
 #CROSS_COMPILE := /home/android_sdk/Allwinner/a31/android-jb42/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-
 #KSRC :=/home/android_sdk/Allwinner/a31/android-jb42/lichee/linux-3.3
-
-#Android-KK44
-CROSS_COMPILE := /home/android_sdk/Allwinner/a31/android-kk44/A3x-KK-SDK/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-
-KSRC :=/home/android_sdk/Allwinner/a31/android-kk44/A3x-KK-SDK/lichee/linux-3.3
-
-ifeq ($(CONFIG_USB_HCI), y)
-MODULE_NAME := 8188eu_sw
-endif
+#ifeq ($(CONFIG_USB_HCI), y)
+#MODULE_NAME := 8188eu_sw
+#endif
+# ==== Cross compile setting for kitkat-a3x_v4.5 =====
+CROSS_COMPILE := /home/android_sdk/Allwinner/a31/kitkat-a3x_v4.5/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-
+KSRC :=/home/android_sdk/Allwinner/a31/kitkat-a3x_v4.5/lichee/linux-3.3
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_SUN7I), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
 EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN7I
 EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT
-# default setting for Android 4.1, 4.2
+# default setting for Android 4.1, 4.2, 4.3, 4.4
 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
 EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
 EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION
@@ -1115,20 +1168,14 @@ endif
 
 ARCH := arm
 # ===Cross compile setting for Android 4.2 SDK ===
-#CROSS_COMPILE :=/home/android_sdk/Allwinner/a20_evb/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
-#KVER  := 3.3.0
+#CROSS_COMPILE := /home/android_sdk/Allwinner/a20_evb/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
 #KSRC := /home/android_sdk/Allwinner/a20_evb/lichee/linux-3.3
-
 # ==== Cross compile setting for Android 4.3 SDK =====
 #CROSS_COMPILE := /home/android_sdk/Allwinner/a20/android-jb43/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
-#KVER  := 3.4.39
-#KSRC :=/home/android_sdk/Allwinner/a20/android-jb43/lichee/linux-3.4
-
-# ==== Cross compile setting for Android 4.4 SDK =====
-CROSS_COMPILE := /home/android_sdk/Allwinner/a20/android-kitkat44/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
-KVER  := 3.4.39
-KSRC :=/home/android_sdk/Allwinner/a20/android-kitkat44/lichee/linux-3.4
-
+#KSRC := /home/android_sdk/Allwinner/a20/android-jb43/lichee/linux-3.4
+# ==== Cross compile setting for kitkat-a20_v4.4 =====
+CROSS_COMPILE := /home/android_sdk/Allwinner/a20/kitkat-a20_v4.4/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
+KSRC := /home/android_sdk/Allwinner/a20/kitkat-a20_v4.4/lichee/linux-3.4
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_SUN8I), y)
@@ -1150,9 +1197,12 @@ _PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o
 endif
 
 ARCH := arm
-CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-jb42/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
-KVER  := 3.4.39
-KSRC :=/home/android_sdk/Allwinner/a23/android-jb42/lichee/linux-3.4
+# ===Cross compile setting for Android 4.2 SDK ===
+#CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-jb42/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
+#KSRC :=/home/android_sdk/Allwinner/a23/android-jb42/lichee/linux-3.4
+# ===Cross compile setting for Android 4.4 SDK ===
+CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-kk44/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-
+KSRC :=/home/android_sdk/Allwinner/a23/android-kk44/lichee/linux-3.4
 endif
 
 ifeq ($(CONFIG_PLATFORM_ACTIONS_ATV5201), y)
@@ -1177,7 +1227,6 @@ endif
 EXTRA_CFLAGS += -DCONFIG_PLATFORM_SPRD
 EXTRA_CFLAGS += -DPLATFORM_SPREADTRUM_6820
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
-EXTRA_LDFLAGS += --strip-debug
 ifeq ($(RTL871X), rtl8188e)
 EXTRA_CFLAGS += -DSOFTAP_PS_DURATION=50
 endif
@@ -1194,7 +1243,6 @@ endif
 EXTRA_CFLAGS += -DCONFIG_PLATFORM_SPRD
 EXTRA_CFLAGS += -DPLATFORM_SPREADTRUM_8810
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
-EXTRA_LDFLAGS += --strip-debug
 ifeq ($(RTL871X), rtl8188e)
 EXTRA_CFLAGS += -DSOFTAP_PS_DURATION=50
 endif
@@ -1204,6 +1252,20 @@ _PLATFORM_FILES += platform/platform_sprd_sdio.o
 endif
 endif
 
+ifeq ($(CONFIG_PLATFORM_ARM_WMT), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
+ifeq ($(CONFIG_SDIO_HCI), y)
+_PLATFORM_FILES += platform/platform_ARM_WMT_sdio.o
+endif
+ARCH := arm
+CROSS_COMPILE := /home/android_sdk/WonderMedia/wm8880-android4.4/toolchain/arm_201103_gcc4.5.2/mybin/arm_1103_le-
+KSRC := /home/android_sdk/WonderMedia/wm8880-android4.4/kernel4.4/
+MODULE_NAME :=8189es_kk
+endif
+
 ifeq ($(CONFIG_MULTIDRV), y)   
 
 ifeq ($(CONFIG_SDIO_HCI), y)
@@ -1305,6 +1367,7 @@ config_r:
        @echo "make config"
        /bin/bash script/Configure script/config.in
 
+
 .PHONY: modules clean
 
 clean:
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/clean b/drivers/net/wireless/rockchip_wlan/rtl8723bs/clean
new file mode 100755 (executable)
index 0000000..8766421
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/bash
+rmmod 8192cu
+rmmod 8192ce
+rmmod 8192du
+rmmod 8192de
index 3a0c788351fd16e02288f0c6da8e37de9c39ac55..5d3f80afea294225dd79824e0f3eaa057d514fd2 100755 (executable)
@@ -430,7 +430,7 @@ efuse_OneByteRead(
        IN      u8                      *data,
        IN      BOOLEAN         bPseudoTest)
 {
-       u     tmpidx = 0;
+       u32     tmpidx = 0;
        u8      bResult;
        u8      readbyte;
 
@@ -775,6 +775,8 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
        s32     i, j, idx;
        u8      ret = _SUCCESS;
        u16     mapLen=0;
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
 
        EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);
 
@@ -809,6 +811,19 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)
                        {
                                word_en &= ~BIT(i >> 1);
                                newdata[i] = data[idx];
+#ifdef CONFIG_RTL8723B                                 
+                                if( addr + idx == 0x8)
+                                {      
+                                       if (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID))
+                                       {
+                                               if(pEEPROM->adjuseVoltageVal == 6)
+                                               {
+                                                               newdata[i] = map[addr + idx];
+                                                               DBG_8192C(" %s ,\n adjuseVoltageVal = %d ,newdata[%d] = %x \n",__func__,pEEPROM->adjuseVoltageVal,i,newdata[i]);         
+                                               }
+                                       }
+                                 }
+#endif
                        }
                }
 
@@ -1308,4 +1323,114 @@ int retriveAdaptorInfoFile(char *path, struct eeprom_priv * eeprom_priv)
 #endif //CONFIG_ADAPTOR_INFO_CACHING_FILE
 #endif //PLATFORM_LINUX
 
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+
+void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter)
+{
+       u32 i;
+       struct file *fp;
+       mm_segment_t fs;
+       u8 source_addr[18];
+       loff_t pos = 0;
+       u32 curtime = rtw_get_current_time();
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8 *head, *end;
+
+       u8 null_mac_addr[ETH_ALEN] = {0, 0, 0,0, 0, 0};
+       u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+       
+       _rtw_memset(source_addr, 0, 18);
+       _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
+
+       fp = filp_open("/data/wifimac.txt", O_RDWR,  0644);
+       if (IS_ERR(fp)) {
+               pEEPROM->bloadmac_fail_flag = _TRUE;
+               DBG_871X("Error, wifi mac address file doesn't exist.\n");
+       } else {
+               fs = get_fs();
+               set_fs(KERNEL_DS);
+
+               DBG_871X("wifi mac address:\n");
+               vfs_read(fp, source_addr, 18, &pos);
+               source_addr[17] = ':';
+
+               head = end = source_addr;
+               for (i=0; i<ETH_ALEN; i++) {
+                       while (end && (*end != ':') )
+                               end++;
+
+                       if (end && (*end == ':') )
+                               *end = '\0';
+
+                       pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
+
+                       if (end) {
+                               end++;
+                               head = end;
+                       }
+                       DBG_871X("%02x \n", pEEPROM->mac_addr[i]);
+               }
+               DBG_871X("\n");
+               set_fs(fs);
+               pEEPROM->bloadmac_fail_flag = _FALSE;
+               filp_close(fp, NULL);
+       }
+
+       if ( (_rtw_memcmp(pEEPROM->mac_addr, null_mac_addr, ETH_ALEN)) ||
+               (_rtw_memcmp(pEEPROM->mac_addr, multi_mac_addr, ETH_ALEN)) ) {
+               pEEPROM->mac_addr[0] = 0x00;
+               pEEPROM->mac_addr[1] = 0xe0;
+               pEEPROM->mac_addr[2] = 0x4c;
+               pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
+               pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+               pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+       }
+
+       DBG_871X("Hal_ReadMACAddrFromFile: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x !!!\n",
+                 pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
+                 pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
+                 pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
+}
+
+
+u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER  padapter)
+{
+       u32 i;
+       struct file *fp;
+       mm_segment_t fs;
+       u8 temp[3];
+       loff_t pos = 0;
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8      *PROMContent = pEEPROM->efuse_eeprom_data;
+
+
+       temp[2] = 0; // add end of string '\0'
+
+       fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR,  0644);
+       if (IS_ERR(fp)) {
+               pEEPROM->bloadfile_fail_flag = _TRUE;
+               DBG_871X("Error, Efuse configure file doesn't exist.\n");
+               return _FAIL;
+       }
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+
+       DBG_871X("Efuse configure file:\n");
+       for (i=0; i< EFUSE_MAP_SIZE  ; i++) {
+               vfs_read(fp, temp, 2, &pos);
+               PROMContent[i] = simple_strtoul(temp, NULL, 16 );
+               pos += 1; // Filter the space character
+               DBG_871X("%02X \n", PROMContent[i]);
+       }
+       DBG_871X("\n");
+       set_fs(fs);
+
+       filp_close(fp, NULL);
+       
+       pEEPROM->bloadfile_fail_flag = _FALSE;
+       
+       return _SUCCESS;
+}
 
+#endif //#CONFIG_EFUSE_CONFIG_FILE
index 89213721e5d65dfa658ec24610b59f6dd8d29cdb..8c4166f4c20746d85129919b9c7b1ead100b5dc8 100755 (executable)
@@ -249,6 +249,9 @@ void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *d
                        dst_ie = (p+ielen);\r
        }\r
 \r
+       if(dst_ie == NULL)\r
+               return;\r
+\r
        if(remainder_ielen>0)\r
        {\r
                pbackup_remainder_ie = rtw_malloc(remainder_ielen);\r
@@ -379,7 +382,8 @@ void        expire_timeout_chk(_adapter *padapter)
        while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)       \r
        {\r
                psta = LIST_CONTAINOR(plist, struct sta_info, auth_list);\r
-\r              plist = get_next(plist);\r
+\r
+               plist = get_next(plist);\r
 \r
 \r
 #ifdef CONFIG_ATMEL_RC_PATCH\r
@@ -958,6 +962,7 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
        struct ht_priv  *phtpriv_ap = &pmlmepriv->htpriv;\r
        struct ht_priv  *phtpriv_sta = &psta->htpriv;\r
 #endif //CONFIG_80211N_HT\r
+       u8      cur_ldpc_cap=0, cur_stbc_cap=0, cur_beamform_cap=0;\r
        //set intf_tag to if1\r
        //psta->intf_tag = 0;\r
 \r
@@ -987,29 +992,77 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
                //check if sta supports rx ampdu\r
                phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable;\r
 \r
-               //check if sta support s Short GI 20M\r
+               phtpriv_sta->rx_ampdu_min_spacing = (phtpriv_sta->ht_cap.ampdu_params_info&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;\r
+       \r
+               // bwmode\r
+               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))\r
+               {                       \r
+                       psta->bw_mode = CHANNEL_WIDTH_40;\r
+               }\r
+               else\r
+               {                       \r
+                       psta->bw_mode = CHANNEL_WIDTH_20;\r
+               }               \r
+\r
+               if(pmlmeext->cur_bwmode < psta->bw_mode)\r
+               {\r
+                       psta->bw_mode = pmlmeext->cur_bwmode;\r
+               }\r
+\r
+               phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;\r
+\r
+\r
+               //check if sta support s Short GI 20M \r
                if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\r
                {\r
                        phtpriv_sta->sgi_20m = _TRUE;\r
                }\r
-               //check if sta support s Short GI 40M\r
+               \r
+               //check if sta support s Short GI 40M \r
                if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\r
                {\r
-                       phtpriv_sta->sgi_40m = _TRUE;\r
+                       if(psta->bw_mode == CHANNEL_WIDTH_40) //according to psta->bw_mode\r
+                               phtpriv_sta->sgi_40m = _TRUE;\r
+                       else\r
+                               phtpriv_sta->sgi_40m = _FALSE;\r
                }\r
 \r
-               // bwmode\r
-               if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))\r
+               psta->qos_option = _TRUE;\r
+\r
+               // B0 Config LDPC Coding Capability\r
+               if (TEST_FLAG(phtpriv_ap->ldpc_cap, LDPC_HT_ENABLE_TX) && \r
+                       GET_HT_CAPABILITY_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap)))\r
                {\r
-                       phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;\r
-                       psta->bw_mode = CHANNEL_WIDTH_40;\r
+                       SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));\r
+                       DBG_871X("Enable HT Tx LDPC for STA(%d)\n",psta->aid);\r
                }\r
-               else\r
+\r
+               // B7 B8 B9 Config STBC setting\r
+               if (TEST_FLAG(phtpriv_ap->stbc_cap, STBC_HT_ENABLE_TX) &&\r
+                       GET_HT_CAPABILITY_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap)))\r
                {\r
-                       psta->bw_mode = CHANNEL_WIDTH_20;\r
+                       SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) );\r
+                       DBG_871X("Enable HT Tx STBC for STA(%d)\n",psta->aid);\r
                }\r
 \r
-               psta->qos_option = _TRUE;\r
+#ifdef CONFIG_BEAMFORMING\r
+               // Config Tx beamforming setting\r
+               if (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && \r
+                       GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP((u8 *)(&phtpriv_sta->ht_cap)))\r
+               {\r
+                       SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);\r
+               }\r
+\r
+               if (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) &&\r
+                       GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP((u8 *)(&phtpriv_sta->ht_cap)))\r
+               {\r
+                       SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);\r
+               }\r
+\r
+               if (cur_beamform_cap) {\r
+                       DBG_871X("Client STA(%d) HT Beamforming Cap = 0x%02X\n", psta->aid, cur_beamform_cap);\r
+               }\r
+#endif //CONFIG_BEAMFORMING\r
        }\r
        else\r
        {\r
@@ -1021,6 +1074,10 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
                phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\r
        }\r
 \r
+       phtpriv_sta->ldpc_cap = cur_ldpc_cap;\r
+       phtpriv_sta->stbc_cap = cur_stbc_cap;\r
+       phtpriv_sta->beamform_cap = cur_beamform_cap;\r
+\r
        //Rx AMPDU\r
        send_delba(padapter, 0, psta->hwaddr);// recipient\r
        \r
@@ -1034,6 +1091,8 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
        update_sta_vht_info_apmode(padapter, psta);\r
 #endif\r
 \r
+       update_ldpc_stbc_cap(psta);\r
+\r
        //todo: init other variables\r
        \r
        _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));\r
@@ -1050,6 +1109,65 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
 \r
 }\r
 \r
+static void update_ap_info(_adapter *padapter, struct sta_info *psta)\r
+{\r
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\r
+       WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\r
+       struct security_priv *psecuritypriv = &padapter->securitypriv;\r
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
+#ifdef CONFIG_80211N_HT\r
+       struct ht_priv  *phtpriv_ap = &pmlmepriv->htpriv;\r
+#endif //CONFIG_80211N_HT\r
+\r
+\r
+       psta->wireless_mode = pmlmeext->cur_wireless_mode;\r
+\r
+       psta->bssratelen = rtw_get_rateset_len(pnetwork->SupportedRates);\r
+       _rtw_memcpy(psta->bssrateset, pnetwork->SupportedRates, psta->bssratelen);\r
+\r
+#ifdef CONFIG_80211N_HT        \r
+       //HT related cap\r
+       if(phtpriv_ap->ht_option)\r
+       {\r
+               //check if sta supports rx ampdu\r
+               //phtpriv_ap->ampdu_enable = phtpriv_ap->ampdu_enable;\r
+\r
+               //check if sta support s Short GI 20M\r
+               if((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\r
+               {\r
+                       phtpriv_ap->sgi_20m = _TRUE;\r
+               }\r
+               //check if sta support s Short GI 40M\r
+               if((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\r
+               {\r
+                       phtpriv_ap->sgi_40m = _TRUE;\r
+               }\r
+\r
+               psta->qos_option = _TRUE;\r
+       }\r
+       else\r
+       {\r
+               phtpriv_ap->ampdu_enable = _FALSE;\r
+               \r
+               phtpriv_ap->sgi_20m = _FALSE;\r
+               phtpriv_ap->sgi_40m = _FALSE;\r
+       }\r
+\r
+       psta->bw_mode = pmlmeext->cur_bwmode;\r
+       phtpriv_ap->ch_offset = pmlmeext->cur_ch_offset;\r
+\r
+       phtpriv_ap->agg_enable_bitmap = 0x0;//reset\r
+       phtpriv_ap->candidate_tid_bitmap = 0x0;//reset\r
+\r
+       _rtw_memcpy(&psta->htpriv, &pmlmepriv->htpriv, sizeof(struct ht_priv));\r
+\r
+#ifdef CONFIG_80211AC_VHT\r
+       _rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv));\r
+#endif //CONFIG_80211AC_VHT\r
+\r
+#endif //CONFIG_80211N_HT\r
+}\r
+\r
 static void update_hw_ht_param(_adapter *padapter)\r
 {\r
        unsigned char           max_AMPDU_len;\r
@@ -1614,19 +1732,40 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
        p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\r
        if(p && ie_len>0)\r
        {\r
-               u8 rf_type;\r
-\r
+               u8 rf_type=0;\r
+               u8 max_rx_ampdu_factor=0;\r
                struct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2);\r
 \r
                pHT_caps_ie=p;\r
-               \r
-               \r
+\r
                ht_cap = _TRUE;\r
                network_type |= WIRELESS_11_24N;\r
 \r
-       \r
-               rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\r
+               rtw_ht_use_default_setting(padapter);\r
+\r
+               if (pmlmepriv->htpriv.sgi_20m == _FALSE)\r
+                       pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_20);\r
+\r
+               if (pmlmepriv->htpriv.sgi_40m == _FALSE)\r
+                       pht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_40);\r
+\r
+               if (!TEST_FLAG(pmlmepriv->htpriv.ldpc_cap, LDPC_HT_ENABLE_RX))\r
+               {\r
+                       pht_cap->cap_info &= ~(IEEE80211_HT_CAP_LDPC_CODING);\r
+               }\r
 \r
+               if (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_TX))\r
+               {\r
+                       pht_cap->cap_info &= ~(IEEE80211_HT_CAP_TX_STBC);\r
+               }               \r
+\r
+               if (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_RX))\r
+               {\r
+                       pht_cap->cap_info &= ~(IEEE80211_HT_CAP_RX_STBC_3R);\r
+               }\r
+\r
+               pht_cap->ampdu_params_info &= ~(IEEE80211_HT_CAP_AMPDU_FACTOR|IEEE80211_HT_CAP_AMPDU_DENSITY);\r
+               \r
                if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) ||\r
                        (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP))\r
                {\r
@@ -1637,15 +1776,43 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
                        pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);    \r
                }       \r
 \r
-               pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & 0x03); //set  Max Rx AMPDU size  to 64K\r
+               rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);\r
+               pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & max_rx_ampdu_factor); //set  Max Rx AMPDU size  to 64K\r
 \r
+               rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\r
                if(rf_type == RF_1T1R)\r
                {                       \r
                        pht_cap->supp_mcs_set[0] = 0xff;\r
-                       pht_cap->supp_mcs_set[1] = 0x0;                         \r
+                       pht_cap->supp_mcs_set[1] = 0x0;\r
                }\r
 \r
-               _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len);            \r
+#ifdef CONFIG_BEAMFORMING\r
+               // Use registry value to enable HT Beamforming.\r
+               // ToDo: use configure file to set these capability.\r
+               pht_cap->tx_BF_cap_info = 0;\r
+\r
+               // HT Beamformer\r
+               if(TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE))\r
+               {\r
+                       // Transmit NDP Capable\r
+                       SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(pht_cap, 1);\r
+                       // Explicit Compressed Steering Capable\r
+                       SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pht_cap, 1);\r
+                       // Compressed Steering Number Antennas\r
+                       SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, 1);\r
+               }\r
+\r
+               // HT Beamformee\r
+               if(TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE))\r
+               {\r
+                       // Receive NDP Capable\r
+                       SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(pht_cap, 1);\r
+                       // Explicit Compressed Beamforming Feedback Capable\r
+                       SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pht_cap, 2);\r
+               }\r
+#endif //CONFIG_BEAMFORMING\r
+\r
+               _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len);\r
                \r
        }\r
 \r
@@ -1760,7 +1927,11 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)
                { \r
                        return _FAIL;\r
                }       \r
-       }       \r
+       }\r
+\r
+       // update AP's sta info \r
+       update_ap_info(padapter, psta);\r
+       \r
        psta->state |= WIFI_AP_STATE;           //Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724  \r
        rtw_indicate_connect( padapter);\r
 \r
@@ -1980,11 +2151,10 @@ static int rtw_ap_set_key(_adapter *padapter, u8 *key, u8 alg, int keyid, u8 set
                        keylen = 13;                    \r
                        break;\r
                case _TKIP_:\r
-               case _TKIP_WTMIC_:              \r
+               case _TKIP_WTMIC_:\r
                case _AES_:\r
-                       keylen = 16;            \r
                default:\r
-                       keylen = 16;            \r
+                       keylen = 16;\r
        }\r
 \r
        _rtw_memcpy(&(psetkeyparm->key[0]), key, keylen);\r
@@ -2157,7 +2327,20 @@ static void update_bcn_wps_ie(_adapter *padapter)
 \r
        if(pbackup_remainder_ie)\r
                rtw_mfree(pbackup_remainder_ie, remainder_ielen);\r
-\r
+       \r
+       // deal with the case without set_tx_beacon_cmd() in update_beacon() \r
+#if defined( CONFIG_INTERRUPT_BASED_TXBCN ) || defined( CONFIG_PCI_HCI )\r
+       if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\r
+       {\r
+               u8 sr = 0;\r
+               rtw_get_wps_attr_content(pwps_ie_src,  wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);\r
+       \r
+               if( sr ) {\r
+                       set_fwstate(pmlmepriv, WIFI_UNDER_WPS);\r
+                       DBG_871X("%s, set WIFI_UNDER_WPS\n", __func__);\r
+               }\r
+       }\r
+#endif\r
 }\r
 \r
 static void update_bcn_p2p_ie(_adapter *padapter)\r
@@ -2709,6 +2892,10 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
                issue_deauth(padapter, psta->hwaddr, reason);\r
        }\r
 \r
+#ifdef CONFIG_BEAMFORMING\r
+       beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, psta->hwaddr, ETH_ALEN, 1);\r
+#endif\r
+\r
        psta->htpriv.agg_enable_bitmap = 0x0;//reset\r
        psta->htpriv.candidate_tid_bitmap = 0x0;//reset\r
 \r
@@ -2716,8 +2903,7 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
        //report_del_sta_event(padapter, psta->hwaddr, reason);\r
 \r
        //clear cam entry / key\r
-       //clear_cam_entry(padapter, (psta->mac_id + 3));\r
-       rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)rtw_get_camid(psta->mac_id), _TRUE);\r
+       rtw_clearstakey_cmd(padapter, psta, _TRUE);\r
 \r
 \r
        _enter_critical_bh(&psta->lock, &irqL);\r
@@ -2956,13 +3142,14 @@ void rtw_ap_restore_network(_adapter *padapter)
                if (psta == NULL) {\r
                        DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter));\r
                } else if (psta->state &_FW_LINKED) {\r
+                       rtw_sta_media_status_rpt(padapter, psta, 1);\r
                        Update_RA_Entry(padapter, psta);\r
                        //pairwise key\r
                        /* per sta pairwise key and settings */\r
                        if(     (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||\r
                                (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))\r
                        {\r
-                               rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE);\r
+                               rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE);\r
                        }                       \r
                }\r
        }\r
@@ -3117,15 +3304,15 @@ void concurrent_set_ap_chbw(_adapter *padapter, u8 channel, u8 channel_offset, u
        {\r
                set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);\r
        }\r
-       else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)//only second adapter can enter AP Mode\r
+       else if(check_buddy_fwstate(padapter, _FW_LINKED)==_TRUE)\r
        {\r
                _adapter *pbuddy_adapter = padapter->pbuddy_adapter;            \r
                struct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\r
-       \r
-               //To sync cur_channel/cur_bwmode/cur_ch_offset with primary adapter\r
-               DBG_871X("primary iface is at linked state, sync cur_channel/cur_bwmode/cur_ch_offset\n");\r
-               DBG_871X("primary adapter, CH=%d, BW=%d, offset=%d\n", pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);\r
-               DBG_871X("second adapter, CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset);\r
+\r
+               //To sync cur_channel/cur_bwmode/cur_ch_offset with buddy adapter\r
+               DBG_871X(ADPT_FMT" is at linked state\n", ADPT_ARG(pbuddy_adapter));\r
+               DBG_871X(ADPT_FMT": CH=%d, BW=%d, offset=%d\n", ADPT_ARG(pbuddy_adapter), pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_bwmode, pbuddy_mlmeext->cur_ch_offset);\r
+               DBG_871X(ADPT_FMT": CH=%d, BW=%d, offset=%d\n", ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset);\r
 \r
                if((cur_channel <= 14 && pbuddy_mlmeext->cur_channel >= 36) ||\r
                        (cur_channel >= 36 && pbuddy_mlmeext->cur_channel <= 14))\r
@@ -3272,9 +3459,8 @@ void concurrent_set_ap_chbw(_adapter *padapter, u8 channel, u8 channel_offset, u
                        \r
                }\r
                else\r
-               {               \r
-                       //follow buddy's ch/bw/ch_offset setting, needn't set ch_bw again.\r
-                       //set_channel_bwmode(padapter, cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\r
+               {\r
+                       set_channel_bwmode(padapter, cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\r
                }               \r
 \r
                // to update channel value in beacon\r
@@ -3287,7 +3473,7 @@ void concurrent_set_ap_chbw(_adapter *padapter, u8 channel, u8 channel_offset, u
                        pht_info->primary_channel = cur_channel;\r
        }\r
 \r
-       DBG_871X("%s, CH=%d, BW=%d, offset=%d\n", __FUNCTION__, cur_channel, cur_bwmode, cur_ch_offset);\r
+       DBG_871X(FUNC_ADPT_FMT" CH=%d, BW=%d, offset=%d\n", FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset);\r
 \r
        pmlmeext->cur_channel = cur_channel;    \r
        pmlmeext->cur_bwmode = cur_bwmode;\r
index 6486c8243ca5d82e731c02a358ae0446531121f2..a3b44c3f503a26eb0a1f462ea2953644858f07b1 100755 (executable)
@@ -20,6 +20,7 @@
 #define _RTW_BEAMFORMING_C_\r
 \r
 #include <drv_types.h>\r
+#include <hal_data.h>\r
 \r
 #ifdef CONFIG_BEAMFORMING\r
 \r
@@ -30,7 +31,7 @@ struct beamforming_entry      *beamforming_get_entry_by_addr(struct mlme_priv *pmlmep
        \r
        for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\r
        {\r
-               if(     pBeamInfo->beamforming_entry[i].used && \r
+               if(     pBeamInfo->beamforming_entry[i].bUsed && \r
                        (_rtw_memcmp(ra,pBeamInfo->beamforming_entry[i].mac_addr, ETH_ALEN)))\r
                {\r
                        *idx = i;\r
@@ -41,6 +42,25 @@ struct beamforming_entry     *beamforming_get_entry_by_addr(struct mlme_priv *pmlmep
        return NULL;\r
 }\r
 \r
+BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv ,u8 mac_id)\r
+{\r
+       u8      i = 0;\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO((struct mlme_priv *)pmlmepriv);\r
+       BEAMFORMING_CAP         BeamformEntryCap = BEAMFORMING_CAP_NONE;\r
+       \r
+       for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\r
+       {\r
+               if(     pBeamInfo->beamforming_entry[i].bUsed && \r
+                       (mac_id == pBeamInfo->beamforming_entry[i].mac_id))\r
+               {\r
+                       BeamformEntryCap =  pBeamInfo->beamforming_entry[i].beamforming_entry_cap;\r
+                       i = BEAMFORMING_ENTRY_NUM;\r
+               }\r
+       }\r
+\r
+       return BeamformEntryCap;\r
+}\r
+\r
 struct beamforming_entry       *beamforming_get_free_entry(struct mlme_priv *pmlmepriv, u8* idx)\r
 {\r
        u8      i = 0;\r
@@ -48,7 +68,7 @@ struct beamforming_entry      *beamforming_get_free_entry(struct mlme_priv *pmlmepriv
 \r
        for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\r
        {\r
-               if(pBeamInfo->beamforming_entry[i].used == _FALSE)\r
+               if(pBeamInfo->beamforming_entry[i].bUsed == _FALSE)\r
                {\r
                        *idx = i;\r
                        return &(pBeamInfo->beamforming_entry[i]);\r
@@ -66,7 +86,7 @@ struct beamforming_entry      *beamforming_add_entry(PADAPTER adapter, u8* ra, u16 ai
 \r
        if(pEntry != NULL)\r
        {       \r
-               pEntry->used = _TRUE;\r
+               pEntry->bUsed = _TRUE;\r
                pEntry->aid = aid;\r
                pEntry->mac_id = mac_id;\r
                pEntry->sound_bw = bw;\r
@@ -86,11 +106,18 @@ struct beamforming_entry   *beamforming_add_entry(PADAPTER adapter, u8* ra, u16 ai
                        pEntry->p_aid = (pEntry->p_aid << 1) | (ra[4] >> 7 );\r
                }\r
                _rtw_memcpy(pEntry->mac_addr, ra, ETH_ALEN);\r
-               pEntry->tx_bf = _FALSE;\r
-               pEntry->sound_period = 6;\r
+               pEntry->bSound = _FALSE;\r
+\r
+               //3 TODO SW/FW sound period\r
+               pEntry->sound_period = 200;\r
                pEntry->beamforming_entry_cap = beamfrom_cap;\r
                pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\r
 \r
+               pEntry->LogSeq = 0xff;\r
+               pEntry->LogRetryCnt = 0;\r
+               pEntry->LogSuccessCnt = 0;\r
+               pEntry->LogStatusFailCnt = 0;\r
+\r
                return pEntry;\r
        }\r
        else\r
@@ -103,7 +130,7 @@ BOOLEAN     beamforming_remove_entry(struct mlme_priv *pmlmepriv, u8* ra, u8* idx)
 \r
        if(pEntry != NULL)\r
        {       \r
-               pEntry->used = _FALSE;\r
+               pEntry->bUsed = _FALSE;\r
                pEntry->beamforming_entry_cap = BEAMFORMING_CAP_NONE;\r
                pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\r
                return _TRUE;\r
@@ -112,22 +139,345 @@ BOOLEAN  beamforming_remove_entry(struct mlme_priv *pmlmepriv, u8* ra, u8* idx)
                return _FALSE;\r
 }\r
 \r
-/* Used for BeamformingStart_SW and  BeamformingStart_FW */\r
+/* Used for BeamformingStart_V1  */\r
 void   beamforming_dym_ndpa_rate(PADAPTER adapter)\r
 {\r
        u16     NDPARate = MGN_6M;\r
-       /*PHAL_DATA_TYPE        pHalData = GET_HAL_DATA(adapter);\r
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(adapter);\r
        \r
        if(pHalData->dmpriv.MinUndecoratedPWDBForDM > 30) // link RSSI > 30%\r
                NDPARate = MGN_24M;\r
        else\r
                NDPARate = MGN_6M;\r
-*/\r
+\r
        //BW = CHANNEL_WIDTH_20;\r
        NDPARate = NDPARate << 8;\r
        rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_RATE, (u8 *)&NDPARate);\r
 }\r
 \r
+void beamforming_dym_period(PADAPTER Adapter)\r
+{\r
+       u8      Idx;\r
+       BOOLEAN bChangePeriod = _FALSE;\r
+       u16     SoundPeriod_SW, SoundPeriod_FW;\r
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
+       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);\r
+       struct beamforming_entry        *pBeamformEntry;\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(( &Adapter->mlmepriv));\r
+       struct sounding_info            *pSoundInfo = &(pBeamInfo->sounding_info);\r
+       \r
+       //3 TODO  per-client throughput caculation.\r
+\r
+       if(pdvobjpriv->traffic_stat.cur_tx_tp + pdvobjpriv->traffic_stat.cur_rx_tp > 2)\r
+       {\r
+               SoundPeriod_SW = 32*20;\r
+               SoundPeriod_FW = 2;\r
+       }       \r
+       else\r
+       {\r
+               SoundPeriod_SW = 32*2000;\r
+               SoundPeriod_FW = 200;\r
+       }       \r
+\r
+       for(Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++)\r
+       {\r
+               pBeamformEntry = pBeamInfo->beamforming_entry+Idx;\r
+               if(pBeamformEntry->bDefaultCSI)\r
+               {\r
+                       SoundPeriod_SW = 32*2000;\r
+                       SoundPeriod_FW = 200;\r
+               }\r
+\r
+               if(pBeamformEntry->beamforming_entry_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
+               {\r
+                       if(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER)\r
+                       {                               \r
+                               if(pBeamformEntry->sound_period != SoundPeriod_FW)\r
+                               {\r
+                                       pBeamformEntry->sound_period = SoundPeriod_FW;\r
+                                       bChangePeriod = _TRUE;  // Only FW sounding need to send H2C packet to change sound period. \r
+                               }\r
+                       }\r
+                       else if(pBeamformEntry->sound_period != SoundPeriod_SW)\r
+                       {\r
+                               pBeamformEntry->sound_period = SoundPeriod_SW;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if(bChangePeriod)\r
+               rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&Idx);\r
+}\r
+\r
+u32    beamforming_get_report_frame(PADAPTER    Adapter, union recv_frame *precv_frame)\r
+{\r
+       u32     ret = _SUCCESS;\r
+       struct beamforming_entry        *pBeamformEntry = NULL;\r
+       struct mlme_priv                        *pmlmepriv = &(Adapter->mlmepriv);\r
+       u8      *pframe = precv_frame->u.hdr.rx_data;\r
+       u32     frame_len = precv_frame->u.hdr.len;\r
+       u8      *ta;\r
+       u8      idx, offset;\r
+       \r
+       //DBG_871X("beamforming_get_report_frame\n");\r
+\r
+       //Memory comparison to see if CSI report is the same with previous one\r
+       ta = GetAddr2Ptr(pframe);\r
+       pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx);\r
+       if(pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU)\r
+               offset = 31; //24+(1+1+3)+2  MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)\r
+       else if(pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT)\r
+               offset = 34; //24+(1+1+6)+2  MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)\r
+       else\r
+               return ret;\r
+\r
+       //DBG_871X("%s MacId %d offset=%d\n", __FUNCTION__, pBeamformEntry->mac_id, offset);\r
+\r
+       if(_rtw_memcmp(pBeamformEntry->PreCsiReport + offset, pframe+offset, frame_len-offset) == _FALSE)\r
+       {\r
+               pBeamformEntry->DefaultCsiCnt = 0;\r
+               //DBG_871X("%s CSI report is NOT the same with previos one\n", __FUNCTION__);\r
+       }\r
+       else\r
+       {\r
+               pBeamformEntry->DefaultCsiCnt ++;\r
+               //DBG_871X("%s CSI report is the SAME with previos one\n", __FUNCTION__);\r
+       }\r
+       _rtw_memcpy(&pBeamformEntry->PreCsiReport, pframe, frame_len);\r
+\r
+       pBeamformEntry->bDefaultCSI = _FALSE;\r
+\r
+       if(pBeamformEntry->DefaultCsiCnt > 20)\r
+               pBeamformEntry->bDefaultCSI = _TRUE;\r
+       else\r
+               pBeamformEntry->bDefaultCSI = _FALSE;\r
+       \r
+       return ret;\r
+}\r
+\r
+void   beamforming_get_ndpa_frame(PADAPTER      Adapter, union recv_frame *precv_frame)\r
+{\r
+       u8      *ta;\r
+       u8      idx, Sequence;\r
+       u8      *pframe = precv_frame->u.hdr.rx_data;\r
+       struct mlme_priv                        *pmlmepriv = &(Adapter->mlmepriv);\r
+       struct beamforming_entry        *pBeamformEntry = NULL;\r
+\r
+       //DBG_871X("beamforming_get_ndpa_frame\n");\r
+\r
+       if(IS_HARDWARE_TYPE_8812(Adapter) == _FALSE)\r
+               return;\r
+       else if(GetFrameSubType(pframe) != WIFI_NDPA)\r
+               return;\r
+\r
+       ta = GetAddr2Ptr(pframe);\r
+       // Remove signaling TA. \r
+       ta[0] = ta[0] & 0xFE; \r
+       \r
+       pBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx);\r
+\r
+       if(pBeamformEntry == NULL)\r
+               return;\r
+       else if(!(pBeamformEntry->beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU))\r
+               return;\r
+       else if(pBeamformEntry->LogSuccessCnt > 1)\r
+               return;\r
+\r
+       Sequence = (pframe[16]) >> 2;\r
+\r
+       if(pBeamformEntry->LogSeq != Sequence)\r
+       {\r
+               /* Previous frame doesn't retry when meet new sequence number */\r
+               if(pBeamformEntry->LogSeq != 0xff && pBeamformEntry->LogRetryCnt == 0)\r
+                       pBeamformEntry->LogSuccessCnt++;\r
+               \r
+               pBeamformEntry->LogSeq = Sequence;\r
+               pBeamformEntry->LogRetryCnt = 0;\r
+       }       \r
+       else\r
+       {\r
+               if(pBeamformEntry->LogRetryCnt == 3)\r
+                       beamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_CLK, NULL, 0, 1);\r
+\r
+               pBeamformEntry->LogRetryCnt++;\r
+       }\r
+\r
+       DBG_871X("%s LogSeq %d LogRetryCnt %d LogSuccessCnt %d\n", \r
+                       __FUNCTION__, pBeamformEntry->LogSeq, pBeamformEntry->LogRetryCnt, pBeamformEntry->LogSuccessCnt);\r
+}\r
+\r
+BOOLEAN        issue_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx)\r
+{\r
+       struct xmit_frame               *pmgntframe;\r
+       struct pkt_attrib               *pattrib;\r
+       struct rtw_ieee80211_hdr        *pwlanhdr;\r
+       struct xmit_priv                *pxmitpriv = &(Adapter->xmitpriv);\r
+       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;\r
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
+       u8      ActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c};\r
+       u8      *pframe;\r
+       u16     *fctrl;\r
+       u16     duration = 0;\r
+       u8      aSifsTime = 0;\r
+\r
+       if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
+       {\r
+               return _FALSE;\r
+       }\r
+\r
+       //update attribute\r
+       pattrib = &pmgntframe->attrib;\r
+       update_mgntframe_attrib(Adapter, pattrib);\r
+\r
+       if (qidx == BCN_QUEUE_INX)\r
+               pattrib->qsel = 0x10;\r
+       pattrib->rate = MGN_MCS8;\r
+       pattrib->bwmode = bw;\r
+       pattrib->order = 1;\r
+       pattrib->subtype = WIFI_ACTION_NOACK;\r
+\r
+       _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\r
+\r
+       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\r
+\r
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\r
+\r
+       fctrl = &pwlanhdr->frame_ctl;\r
+       *(fctrl) = 0;\r
+\r
+       SetOrderBit(pframe);\r
+       SetFrameSubType(pframe, WIFI_ACTION_NOACK);\r
+\r
+       _rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(Adapter->eeprompriv)), ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
+\r
+       if( pmlmeext->cur_wireless_mode == WIRELESS_11B)\r
+               aSifsTime = 10;\r
+       else\r
+               aSifsTime = 16;\r
+\r
+       duration = 2*aSifsTime + 40;\r
+       \r
+       if(bw == CHANNEL_WIDTH_40)\r
+               duration+= 87;\r
+       else    \r
+               duration+= 180;\r
+\r
+       SetDuration(pframe, duration);\r
+\r
+       //HT control field\r
+       SET_HT_CTRL_CSI_STEERING(pframe+24, 3);\r
+       SET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1);\r
+\r
+       _rtw_memcpy(pframe+28, ActionHdr, 4);\r
+\r
+       pattrib->pktlen = 32;\r
+\r
+       pattrib->last_txcmdsz = pattrib->pktlen;\r
+\r
+       dump_mgntframe(Adapter, pmgntframe);\r
+\r
+       return _TRUE;\r
+}\r
+\r
+BOOLEAN        beamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx)\r
+{\r
+       return issue_ht_ndpa_packet(Adapter, ra, bw, qidx);\r
+}\r
+\r
+BOOLEAN        issue_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx)\r
+{\r
+       struct xmit_frame               *pmgntframe;\r
+       struct pkt_attrib               *pattrib;\r
+       struct rtw_ieee80211_hdr        *pwlanhdr;\r
+       struct xmit_priv                *pxmitpriv = &(Adapter->xmitpriv);\r
+       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;\r
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
+       struct mlme_priv                *pmlmepriv = &(Adapter->mlmepriv);\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\r
+       struct rtw_ndpa_sta_info        sta_info;\r
+       u8      *pframe;\r
+       u16     *fctrl;\r
+       u16     duration = 0;\r
+       u8      sequence = 0, aSifsTime = 0;\r
+\r
+       if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
+       {\r
+               return _FALSE;\r
+       }\r
+\r
+       //update attribute\r
+       pattrib = &pmgntframe->attrib;\r
+       update_mgntframe_attrib(Adapter, pattrib);\r
+\r
+       if (qidx == BCN_QUEUE_INX)\r
+               pattrib->qsel = 0x10;\r
+       pattrib->rate = MGN_VHT2SS_MCS0;\r
+       pattrib->bwmode = bw;\r
+       pattrib->subtype = WIFI_NDPA;\r
+\r
+       _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\r
+\r
+       pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\r
+\r
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\r
+\r
+       fctrl = &pwlanhdr->frame_ctl;\r
+       *(fctrl) = 0;\r
+\r
+       SetFrameSubType(pframe, WIFI_NDPA);\r
+\r
+       _rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr2, myid(&(Adapter->eeprompriv)), ETH_ALEN);\r
+\r
+       if (IsSupported5G(pmlmeext->cur_wireless_mode) || IsSupportedHT(pmlmeext->cur_wireless_mode))\r
+               aSifsTime = 16;\r
+       else\r
+               aSifsTime = 10;\r
+\r
+       duration = 2*aSifsTime + 44;\r
+       \r
+       if(bw == CHANNEL_WIDTH_80)\r
+               duration += 40;\r
+       else if(bw == CHANNEL_WIDTH_40)\r
+               duration+= 87;\r
+       else    \r
+               duration+= 180;\r
+\r
+       SetDuration(pframe, duration);\r
+\r
+       sequence = pBeamInfo->sounding_sequence<< 2;\r
+       if (pBeamInfo->sounding_sequence >= 0x3f)\r
+               pBeamInfo->sounding_sequence = 0;\r
+       else\r
+               pBeamInfo->sounding_sequence++;\r
+\r
+       _rtw_memcpy(pframe+16, &sequence,1);\r
+\r
+       if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\r
+               aid = 0;                \r
+\r
+       sta_info.aid = aid;\r
+       sta_info.feedback_type = 0;\r
+       sta_info.nc_index= 0;\r
+       \r
+       _rtw_memcpy(pframe+17, (u8 *)&sta_info, 2);\r
+\r
+       pattrib->pktlen = 19;\r
+\r
+       pattrib->last_txcmdsz = pattrib->pktlen;\r
+\r
+       dump_mgntframe(Adapter, pmgntframe);\r
+\r
+       return _TRUE;\r
+}\r
+\r
+BOOLEAN        beamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx)\r
+{\r
+       return issue_vht_ndpa_packet(Adapter, ra, aid, bw, qidx);\r
+}\r
+\r
 BOOLEAN        beamfomring_bSounding(struct beamforming_info *pBeamInfo)\r
 {\r
        BOOLEAN         bSounding = _FALSE;\r
@@ -147,7 +497,8 @@ u8  beamforming_sounding_idx(struct beamforming_info *pBeamInfo)
 \r
        for(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\r
        {\r
-               if (pBeamInfo->beamforming_entry[i].used)\r
+               if (pBeamInfo->beamforming_entry[i].bUsed &&\r
+                       (_FALSE == pBeamInfo->beamforming_entry[i].bSound))\r
                {\r
                        idx = i;\r
                        break;\r
@@ -230,16 +581,16 @@ BOOLEAN   beamforming_start_fw(PADAPTER adapter, u8 idx)
        struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\r
 \r
        pEntry = &(pBeamInfo->beamforming_entry[idx]);\r
-       if(pEntry->used == _FALSE)\r
+       if(pEntry->bUsed == _FALSE)\r
        {\r
                DBG_871X("Skip Beamforming, no entry for Idx =%d\n", idx);\r
                return _FALSE;\r
        }\r
 \r
        pEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSING;\r
+       pEntry->bSound = _TRUE;\r
        rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx);\r
-       \r
-       DBG_871X("%s  Idx %d \n", __FUNCTION__, idx);\r
+\r
        return _TRUE;\r
 }\r
 \r
@@ -337,26 +688,6 @@ void       beamforming_notify(PADAPTER adapter)
        DBG_871X("%s BeamformState %d bSounding %d\n", __FUNCTION__, pBeamInfo->beamforming_state, bSounding);\r
 }\r
 \r
-void   beamforming_reset(PADAPTER adapter)\r
-{\r
-       u8      idx = 0;\r
-       struct mlme_priv                        *pmlmepriv = &(adapter->mlmepriv);\r
-       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\r
-\r
-       for(idx = 0; idx < BEAMFORMING_ENTRY_NUM; idx++)\r
-       {\r
-               if(pBeamInfo->beamforming_entry[idx].used == _TRUE)\r
-               {\r
-                       pBeamInfo->beamforming_entry[idx].used = _FALSE;\r
-                       pBeamInfo->beamforming_entry[idx].beamforming_entry_cap = BEAMFORMING_CAP_NONE;\r
-                       pBeamInfo->beamforming_entry[idx].beamforming_entry_state= BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\r
-                       rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx);\r
-               }\r
-       }\r
-\r
-       DBG_871X("%s\n", __FUNCTION__);\r
-}\r
-\r
 BOOLEAN        beamforming_init_entry(PADAPTER adapter, struct sta_info *psta, u8* idx)\r
 {\r
        struct mlme_priv        *pmlmepriv = &(adapter->mlmepriv);\r
@@ -462,6 +793,62 @@ void       beamforming_deinit_entry(PADAPTER adapter, u8* ra)
        DBG_871X("%s Idx %d\n", __FUNCTION__, idx);\r
 }\r
 \r
+void   beamforming_reset(PADAPTER adapter)\r
+{\r
+       u8      idx = 0;\r
+       struct mlme_priv                        *pmlmepriv = &(adapter->mlmepriv);\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\r
+\r
+       for(idx = 0; idx < BEAMFORMING_ENTRY_NUM; idx++)\r
+       {\r
+               if(pBeamInfo->beamforming_entry[idx].bUsed == _TRUE)\r
+               {\r
+                       pBeamInfo->beamforming_entry[idx].bUsed = _FALSE;\r
+                       pBeamInfo->beamforming_entry[idx].beamforming_entry_cap = BEAMFORMING_CAP_NONE;\r
+                       pBeamInfo->beamforming_entry[idx].beamforming_entry_state= BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\r
+                       rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx);\r
+               }\r
+       }\r
+\r
+       DBG_871X("%s\n", __FUNCTION__);\r
+}\r
+\r
+void beamforming_sounding_fail(PADAPTER Adapter)\r
+{\r
+       struct mlme_priv                        *pmlmepriv = &(Adapter->mlmepriv);\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\r
+       struct beamforming_entry        *pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]);\r
+\r
+       pEntry->bSound = _FALSE;\r
+       rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx);\r
+       beamforming_deinit_entry(Adapter, pEntry->mac_addr);\r
+}\r
+\r
+void   beamforming_check_sounding_success(PADAPTER Adapter,BOOLEAN status)\r
+{\r
+       struct mlme_priv                        *pmlmepriv = &(Adapter->mlmepriv);\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\r
+       struct beamforming_entry        *pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]);\r
+\r
+       if(status == 1)\r
+       {\r
+               pEntry->LogStatusFailCnt = 0;\r
+       }       \r
+       else\r
+       {\r
+               pEntry->LogStatusFailCnt++;\r
+               DBG_871X("%s LogStatusFailCnt %d\n", __FUNCTION__, pEntry->LogStatusFailCnt);\r
+       }\r
+       if(pEntry->LogStatusFailCnt > 20)\r
+       {\r
+               DBG_871X("%s LogStatusFailCnt > 20, Stop SOUNDING\n", __FUNCTION__);\r
+               //pEntry->bSound = _FALSE;\r
+               //rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx);\r
+               //beamforming_deinit_entry(Adapter, pEntry->mac_addr);\r
+               beamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_FAIL, NULL, 0, 1);\r
+       }\r
+}\r
+\r
 void   beamforming_enter(PADAPTER adapter, PVOID psta)\r
 {\r
        u8      idx = 0xff;\r
@@ -469,7 +856,7 @@ void        beamforming_enter(PADAPTER adapter, PVOID psta)
        if(beamforming_init_entry(adapter, (struct sta_info *)psta, &idx))\r
                rtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_ENTER, (u8 *)&idx);\r
 \r
-       DBG_871X("%s Idx %d\n", __FUNCTION__, idx);\r
+       //DBG_871X("%s Idx %d\n", __FUNCTION__, idx);\r
 }\r
 \r
 void   beamforming_leave(PADAPTER adapter,u8* ra)\r
@@ -494,9 +881,9 @@ BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info        *pBeamInfo)
        {\r
                beamforming_entry = pBeamInfo->beamforming_entry[i];\r
 \r
-               if(beamforming_entry.used)\r
+               if(beamforming_entry.bUsed)\r
                {\r
-                       if( (beamforming_entry.beamforming_entry_cap& BEAMFORMEE_CAP_VHT_SU) ||\r
+                       if( (beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) ||\r
                                (beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_HT_EXPLICIT))\r
                                bSelfBeamformee = _TRUE;\r
                        if( (beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) ||\r
@@ -516,10 +903,19 @@ BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info      *pBeamInfo)
        return beamform_cap;\r
 }\r
 \r
+void   beamforming_watchdog(PADAPTER Adapter)\r
+{\r
+       struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(( &(Adapter->mlmepriv)));\r
+\r
+       if(pBeamInfo->beamforming_state != BEAMFORMING_STATE_START)\r
+               return;\r
+\r
+       beamforming_dym_period(Adapter);\r
+       beamforming_dym_ndpa_rate(Adapter);\r
+}\r
 \r
 void   beamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf)\r
 {\r
-       struct pwrctrl_priv             *pwrpriv = adapter_to_pwrctl(padapter);\r
        \r
 _func_enter_;\r
 \r
@@ -532,6 +928,14 @@ _func_enter_;
                case BEAMFORMING_CTRL_LEAVE:\r
                        beamforming_leave(padapter, pbuf);\r
                        break;\r
+\r
+               case BEAMFORMING_CTRL_SOUNDING_FAIL:\r
+                       beamforming_sounding_fail(padapter);\r
+                       break;\r
+\r
+               case BEAMFORMING_CTRL_SOUNDING_CLK:\r
+                       rtw_hal_set_hwreg(padapter, HW_VAR_SOUNDING_CLK, NULL);\r
+                       break;\r
        \r
                default:\r
                        break;\r
@@ -566,15 +970,20 @@ _func_enter_;
                        goto exit;\r
                }\r
 \r
-               wk_buf = rtw_zmalloc(size);\r
-               if(wk_buf==NULL){\r
-                       rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj));\r
-                       rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));\r
-                       res= _FAIL;\r
-                       goto exit;\r
-               }\r
+               if (pbuf != NULL) {\r
+                       wk_buf = rtw_zmalloc(size);\r
+                       if(wk_buf==NULL){\r
+                               rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj));\r
+                               rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));\r
+                               res= _FAIL;\r
+                               goto exit;\r
+                       }\r
 \r
-               _rtw_memcpy(wk_buf, pbuf, size);\r
+                       _rtw_memcpy(wk_buf, pbuf, size);\r
+               } else {\r
+                       wk_buf = NULL;\r
+                       size = 0;\r
+               }\r
 \r
                pdrvextra_cmd_parm->ec_id = BEAMFORMING_WK_CID;\r
                pdrvextra_cmd_parm->type = type;\r
index 63fbf9e40373d5b664ac98a4b9da13cc184bc656..c9554f75f6cfa4329acd6e90b9b282a5b0db0e47 100755 (executable)
@@ -529,7 +529,7 @@ MPTBT_FwC2hBtMpCtrl(
        \r
        if(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 )\r
        {       \r
-               DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n");\r
+               //DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n");\r
                return;\r
        }\r
        if( length > 32 || length < 3 )\r
index 589abd0047d28b7a118aaf00121e2a9cc80c50f7..bfaeccab46c5769d5f4582b6abaae2020cbcef3e 100755 (executable)
@@ -28,9 +28,14 @@ void rtw_btcoex_Initialize(PADAPTER padapter)
        hal_btcoex_Initialize(padapter);
 }
 
-void rtw_btcoex_HAL_Initialize(PADAPTER padapter)
+void rtw_btcoex_PowerOnSetting(PADAPTER padapter)
 {
-       hal_btcoex_InitHwConfig(padapter);
+       hal_btcoex_PowerOnSetting(padapter);
+}
+
+void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly)
+{
+       hal_btcoex_InitHwConfig(padapter, bWifiOnly);
 }
 
 void rtw_btcoex_IpsNotify(PADAPTER padapter, u8 type)
@@ -114,6 +119,11 @@ void rtw_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType)
        hal_btcoex_SpecialPacketNotify(padapter, pktType);
 }
 
+void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state)
+{
+       hal_btcoex_IQKNotify(padapter, state);
+}
+
 void rtw_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf)
 {
        hal_btcoex_BtInfoNotify(padapter, length, tmpBuf);
@@ -145,9 +155,9 @@ void rtw_btcoex_HaltNotify(PADAPTER padapter)
        hal_btcoex_HaltNotify(padapter);
 }
 
-void rtw_btcoex_SwitchGntBt(PADAPTER padapter)
+void rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter)
 {
-       hal_btcoex_SwitchGntBt(padapter);       
+       hal_btcoex_SwitchBtTRxMask(padapter);   
 }
 
 void rtw_btcoex_Switch(PADAPTER padapter, u8 enable)
@@ -245,6 +255,11 @@ u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)
        return hal_btcoex_GetPgAntNum(padapter);
 }
 
+void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
+{
+       hal_btcoex_SetSingleAntPath(padapter, singleAntPath);
+}
+
 u32 rtw_btcoex_GetRaMask(PADAPTER padapter)
 {
        return hal_btcoex_GetRaMask(padapter);
@@ -294,7 +309,8 @@ void rtw_btcoex_RejectApAggregatedPacket(PADAPTER padapter, u8 enable)
        if (_TRUE == enable)
        {
                pmlmeinfo->bAcceptAddbaReq = _FALSE;
-               send_delba(padapter, 0, psta->hwaddr);
+               if (psta)
+                       send_delba(padapter, 0, psta->hwaddr);
        }
        else
        {
index 5185f4d3046333ef48ebe4ada7b862663a5d78f7..59182b10d0f5f7d2688e60fd125cd8bf68564a06 100755 (executable)
@@ -330,7 +330,7 @@ int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
                bAllow = _TRUE;
 
        if( (pcmdpriv->padapter->hw_init_completed ==_FALSE && bAllow == _FALSE)
-               || pcmdpriv->cmdthd_running== _FALSE    //com_thread not running
+               || ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE   //com_thread not running
        )
        {
                //DBG_871X("%s:%s: drop cmdcode:%u, hw_init_completed:%u, cmdthd_running:%u\n", caller_func, __FUNCTION__,
@@ -430,8 +430,9 @@ _func_exit_;
 
 void rtw_stop_cmd_thread(_adapter *adapter)
 {
-       if(adapter->cmdThread && adapter->cmdpriv.cmdthd_running == _TRUE
-               && adapter->cmdpriv.stop_req == 0)
+       if(adapter->cmdThread &&
+               ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE &&
+               adapter->cmdpriv.stop_req == 0)
        {
                adapter->cmdpriv.stop_req = 1;
                _rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);
@@ -460,7 +461,7 @@ _func_enter_;
        prspbuf = pcmdpriv->rsp_buf;
 
        pcmdpriv->stop_req = 0;
-       pcmdpriv->cmdthd_running=_TRUE;
+       ATOMIC_SET(&(pcmdpriv->cmdthd_running), _TRUE);
        _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
 
        RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n"));
@@ -582,7 +583,7 @@ post_process:
                }
 
                //call callback function for post-processed
-               if(pcmd->cmdcode <= (sizeof(rtw_cmd_callback) /sizeof(struct _cmd_callback)))
+               if(pcmd->cmdcode < (sizeof(rtw_cmd_callback) /sizeof(struct _cmd_callback)))
                {
                        pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback;
                        if(pcmd_callback == NULL)
@@ -607,8 +608,6 @@ post_process:
                goto _next;
 
        }
-       pcmdpriv->cmdthd_running=_FALSE;
-
 
        // free all cmd_obj resources
        do{
@@ -633,6 +632,7 @@ post_process:
        }while(1);
 
        _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
+       ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE);
 
 _func_exit_;
 
@@ -1294,7 +1294,8 @@ u8 rtw_joinbss_cmd(_adapter  *padapter, struct wlan_network* pnetwork)
        NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
+       u32 tmp_len;
+       u8 *ptmp=NULL;
 _func_enter_;
 
        rtw_led_control(padapter, LED_CTL_START_TO_LINK);
@@ -1387,9 +1388,7 @@ _func_enter_;
        pqospriv->qos_option = 0;
        
        if(pregistrypriv->wmm_enable)   
-       {       
-               u32 tmp_len;
-               
+       {
                tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength);    
 
                if (psecnetwork->IELength != tmp_len)           
@@ -1405,7 +1404,8 @@ _func_enter_;
 
 #ifdef CONFIG_80211N_HT
        phtpriv->ht_option = _FALSE;
-       if(pregistrypriv->ht_enable)
+       ptmp = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &tmp_len, pnetwork->network.IELength-12);
+       if(pregistrypriv->ht_enable && ptmp && tmp_len>0)
        {
                //      Added by Albert 2010/06/23
                //      For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue.
@@ -1415,10 +1415,12 @@ _func_enter_;
                        ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ ))
                {
                        rtw_ht_use_default_setting(padapter);
-               
+
+                       rtw_build_wmm_ie_ht(padapter, &psecnetwork->IEs[12], &psecnetwork->IELength);
+
                        //rtw_restructure_ht_ie
-                       rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], 
-                                                                       pnetwork->network.IELength, &psecnetwork->IELength,
+                       rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[12], &psecnetwork->IEs[0], 
+                                                                       pnetwork->network.IELength-12, &psecnetwork->IELength,
                                                                        pnetwork->network.Configuration.DSConfig);
                }
        }
@@ -1568,7 +1570,7 @@ _func_exit_;
        return res;
 }
 
-u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue)
+u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue)
 {
        struct cmd_obj*                 ph2c;
        struct set_stakey_parm  *psetstakey_para;
@@ -1577,7 +1579,6 @@ u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue)
        
        struct mlme_priv                        *pmlmepriv = &padapter->mlmepriv;
        struct security_priv            *psecuritypriv = &padapter->securitypriv;
-       struct sta_info*                        sta = (struct sta_info* )psta;
        u8      res=_SUCCESS;
 
 _func_enter_;
@@ -1649,7 +1650,7 @@ _func_exit_;
        return res;
 }
 
-u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
+u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
 {
        struct cmd_obj*                 ph2c;
        struct set_stakey_parm  *psetstakey_para;
@@ -1657,14 +1658,18 @@ u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
        struct set_stakey_rsp           *psetstakey_rsp = NULL; 
        struct mlme_priv                        *pmlmepriv = &padapter->mlmepriv;
        struct security_priv            *psecuritypriv = &padapter->securitypriv;
-       struct sta_info*                        sta = (struct sta_info* )psta;
+       s16 cam_id = 0;
        u8      res=_SUCCESS;
 
 _func_enter_;
 
        if(!enqueue)
        {
-               clear_cam_entry(padapter, entry);
+               while((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1)) >= 0) {
+                       DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id);
+                       clear_cam_entry(padapter, cam_id);
+                       rtw_camid_free(padapter, cam_id);
+               }
        }
        else
        {
@@ -1696,8 +1701,6 @@ _func_enter_;
                _rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
 
                psetstakey_para->algorithm = _NO_PRIVACY_;
-
-               psetstakey_para->id = entry;
        
                res = rtw_enqueue_cmd(pcmdpriv, ph2c);  
                
@@ -2286,13 +2289,22 @@ static void collect_traffic_statistics(_adapter *padapter)
 u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
 {
        u8      bEnterPS = _FALSE;
-       u16     BusyThreshold = 100;
+#ifdef CONFIG_BT_COEXIST
+       u16     BusyThresholdHigh = 25;
+       u16     BusyThresholdLow = 10;
+#else
+       u16     BusyThresholdHigh = 100;
+       u16     BusyThresholdLow = 75;
+#endif
+       u16     BusyThreshold = BusyThresholdHigh;
        u8      bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE;
        u8      bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE;
 
        struct mlme_priv                *pmlmepriv = &(padapter->mlmepriv);
 #ifdef CONFIG_TDLS
        struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);
+       struct tdls_txmgmt txmgmt;
+       u8 baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 #endif //CONFIG_TDLS
 
        RT_LINK_DETECT_T * link_detect = &pmlmepriv->LinkDetectInfo;
@@ -2305,16 +2317,12 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
        if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) 
                /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
        {
-#ifdef CONFIG_BT_COEXIST
-               if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 25 ||
-                       pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 25 )
-#else // !CONFIG_BT_COEXIST
                // if we raise bBusyTraffic in last watchdog, using lower threshold.
                if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
-                       BusyThreshold = 75;
+                               BusyThreshold = BusyThresholdLow;
+
                if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold ||
                        pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold )
-#endif // !CONFIG_BT_COEXIST
                {
                        bBusyTraffic = _TRUE;
 
@@ -2357,7 +2365,10 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
 #ifdef CONFIG_TDLS
 #ifdef CONFIG_TDLS_AUTOSETUP
                if( ( ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0 ) //10 * 2sec, periodically sending
-                       issue_tdls_dis_req( padapter, NULL );
+               {
+                       _rtw_memcpy(txmgmt.peer, baddr, ETH_ALEN);
+                       issue_tdls_dis_req( padapter, &txmgmt );
+               }
                ptdlsinfo->watchdog_count++;
 #endif //CONFIG_TDLS_AUTOSETUP
 #endif //CONFIG_TDLS
@@ -2459,7 +2470,16 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
        else
        {
 #ifdef CONFIG_LPS
-               if(!from_timer)
+               struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+               int n_assoc_iface = 0;
+               int i;
+
+               for (i = 0; i < dvobj->iface_nums; i++) {
+                       if (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))
+                               n_assoc_iface++;
+               }
+
+               if(!from_timer && n_assoc_iface == 0)
                        LPS_Leave(padapter, "NON_LINKED");
 #endif
        }
@@ -2478,6 +2498,28 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
        
 }
 
+//To avoid RX affect TX throughput
+void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)
+{
+       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
+       struct mlme_priv                *pmlmepriv = &(padapter->mlmepriv);
+
+       if(IS_HARDWARE_TYPE_8821U(padapter) || IS_HARDWARE_TYPE_8192EU(padapter))
+       {
+               if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
+               {
+                       if(pdvobjpriv->traffic_stat.cur_tx_tp > 2 && pdvobjpriv->traffic_stat.cur_rx_tp < 30)
+                               rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x1010);
+                       else
+                               rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x2005); //dmc agg th 20K
+                       
+                       //DBG_871X("TX_TP=%u, RX_TP=%u \n", pdvobjpriv->traffic_stat.cur_tx_tp, pdvobjpriv->traffic_stat.cur_rx_tp);
+               }
+       }
+}
+
+
+
 void dynamic_chk_wk_hdl(_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv;
@@ -2505,8 +2547,12 @@ void dynamic_chk_wk_hdl(_adapter *padapter)
        {
                linked_status_chk(padapter);    
                traffic_status_watchdog(padapter, 0);
+               dm_DynamicUsbTxAgg(padapter, 0);
        }
 
+#ifdef CONFIG_BEAMFORMING
+       beamforming_watchdog(padapter);
+#endif
 
        rtw_hal_dm_watchdog(padapter);
 
@@ -2594,7 +2640,6 @@ _func_enter_;
                        break;
                case LPS_CTRL_TRAFFIC_BUSY:
                        LPS_Leave(padapter, "LPS_CTRL_TRAFFIC_BUSY");
-
                default:
                        break;
        }
@@ -2615,11 +2660,6 @@ _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));    
@@ -2737,6 +2777,8 @@ void rtw_lps_change_dtim_hdl(_adapter *padapter, u8 dtim)
 
 }
 
+#endif
+
 u8 rtw_lps_change_dtim_cmd(_adapter*padapter, u8 dtim)
 {
        struct cmd_obj  *ph2c;
@@ -2779,8 +2821,6 @@ exit:
 
 }
 
-#endif
-
 #if (RATE_ADAPTIVE_SUPPORT==1)
 void rpt_timer_setting_wk_hdl(_adapter *padapter, u16 minRptTime)
 {
@@ -2878,17 +2918,14 @@ _func_exit_;
 }
 #endif
 
-void rtw_dm_ra_mask_hdl(_adapter*padapter)
+void rtw_dm_ra_mask_hdl(_adapter *padapter, struct sta_info *psta)
 {
-       struct sta_info *psta = NULL;
-
-       psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
        if (psta) {
                set_sta_rate(padapter, psta);
        }
 }
 
-u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter)
+u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta)
 {
        struct cmd_obj  *ph2c;
        struct drvextra_cmd_parm        *pdrvextra_cmd_parm;
@@ -2912,7 +2949,7 @@ u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter)
        pdrvextra_cmd_parm->ec_id = DM_RA_MSK_WK_CID;
        pdrvextra_cmd_parm->type = 0;
        pdrvextra_cmd_parm->size = 0;
-       pdrvextra_cmd_parm->pbuf = NULL;
+       pdrvextra_cmd_parm->pbuf = psta;
 
        init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
 
@@ -3032,43 +3069,41 @@ _func_exit_;
 
 #ifdef CONFIG_AP_MODE
 
+extern u32 g_wait_hiq_empty;
+
 static void rtw_chk_hi_queue_hdl(_adapter *padapter)
 {
-       int cnt=0;
        struct sta_info *psta_bmc;
        struct sta_priv *pstapriv = &padapter->stapriv;
+       u32 start = rtw_get_current_time();
+       u8 empty = _FALSE;
 
        psta_bmc = rtw_get_bcmc_stainfo(padapter);
        if(!psta_bmc)
                return;
 
-       if(psta_bmc->sleepq_len==0)
-       {               
-               u8 val = 0;
+       rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
 
-               //while((rtw_read32(padapter, 0x414)&0x00ffff00)!=0)
-               //while((rtw_read32(padapter, 0x414)&0x0000ff00)!=0)
-               
-               rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);           
-               
-               while(_FALSE == val)
-               {
-                       rtw_msleep_os(100);
+       while(_FALSE == empty && rtw_get_passing_time_ms(start) < g_wait_hiq_empty)
+       {
+               rtw_msleep_os(100);
+               rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
+       }
 
-                       cnt++;
-                       
-                       if(cnt>10)
-                               break;
+       if(psta_bmc->sleepq_len==0)
+       {
+               if(empty == _SUCCESS)
+               {
+                       bool update_tim = _FALSE;
 
-                       rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
-               }
+                       if (pstapriv->tim_bitmap & BIT(0))
+                               update_tim = _TRUE;
 
-               if(cnt<=10)
-               {
                        pstapriv->tim_bitmap &= ~BIT(0);
                        pstapriv->sta_dz_bitmap &= ~BIT(0);
-                       
-                       update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
+
+                       if (update_tim == _TRUE)
+                               update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
                }
                else //re check again
                {
@@ -3115,6 +3150,147 @@ exit:
 }
 #endif
 
+#ifdef CONFIG_BT_COEXIST
+struct btinfo {
+       u8 cid;
+       u8 len;
+
+       u8 bConnection:1;
+       u8 bSCOeSCO:1;
+       u8 bInQPage:1;
+       u8 bACLBusy:1;
+       u8 bSCOBusy:1;
+       u8 bHID:1;
+       u8 bA2DP:1;
+       u8 bFTP:1;
+
+       u8 retry_cnt:4;
+       u8 rsvd_34:1;
+       u8 rsvd_35:1;
+       u8 rsvd_36:1;
+       u8 rsvd_37:1;
+
+       u8 rssi;
+
+       u8 rsvd_50:1;
+       u8 rsvd_51:1;
+       u8 rsvd_52:1;
+       u8 rsvd_53:1;
+       u8 rsvd_54:1;
+       u8 rsvd_55:1;
+       u8 eSCO_SCO:1;
+       u8 Master_Slave:1;
+
+       u8 rsvd_6;
+       u8 rsvd_7;
+};
+
+void btinfo_evt_dump(void *sel, void *buf)
+{
+       struct btinfo *info = (struct btinfo *)buf;
+       
+       DBG_871X_SEL_NL(sel, "cid:0x%02x, len:%u\n", info->cid, info->len);
+
+       if (info->len > 2)
+       DBG_871X_SEL_NL(sel, "byte2:%s%s%s%s%s%s%s%s\n"
+               , info->bConnection?"bConnection ":""
+               , info->bSCOeSCO?"bSCOeSCO ":""
+               , info->bInQPage?"bInQPage ":""
+               , info->bACLBusy?"bACLBusy ":""
+               , info->bSCOBusy?"bSCOBusy ":""
+               , info->bHID?"bHID ":""
+               , info->bA2DP?"bA2DP ":""
+               , info->bFTP?"bFTP":""
+       );
+
+       if (info->len > 3)
+       DBG_871X_SEL_NL(sel, "retry_cnt:%u\n", info->retry_cnt);
+
+       if (info->len > 4)
+       DBG_871X_SEL_NL(sel, "rssi:%u\n", info->rssi);
+
+       if (info->len > 5)
+       DBG_871X_SEL_NL(sel, "byte5:%s%s\n"
+               , info->eSCO_SCO?"eSCO_SCO ":""
+               , info->Master_Slave?"Master_Slave ":""
+       );
+}
+
+static void rtw_btinfo_hdl(_adapter *adapter, u8 *buf, u16 buf_len)
+{
+       #define BTINFO_WIFI_FETCH 0x23
+       #define BTINFO_BT_AUTO_RPT 0x27
+       struct btinfo *info = (struct btinfo *)buf;
+       u8 cmd_idx;
+       u8 len;
+
+       cmd_idx = info->cid;
+
+       if (info->len > buf_len-2) {
+               rtw_warn_on(1);
+               len = buf_len-2;
+       } else {
+               len = info->len;
+       }
+
+//#define DBG_PROC_SET_BTINFO_EVT
+#ifdef DBG_PROC_SET_BTINFO_EVT
+       btinfo_evt_dump(RTW_DBGDUMP, info);
+#endif
+
+       /* transform BT-FW btinfo to WiFI-FW C2H format and notify */
+       if (cmd_idx == BTINFO_WIFI_FETCH)
+               buf[1] = 0;
+       else if (cmd_idx == BTINFO_BT_AUTO_RPT)
+               buf[1] = 2;
+       rtw_btcoex_BtInfoNotify(adapter ,len+1, &buf[1]);
+}
+
+u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len)
+{
+       struct cmd_obj *ph2c;
+       struct drvextra_cmd_parm *pdrvextra_cmd_parm;
+       u8 *btinfo;
+       struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
+       u8      res = _SUCCESS;
+
+       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((u8*)ph2c, sizeof(struct cmd_obj));
+               res = _FAIL;
+               goto exit;
+       }
+
+       btinfo = rtw_zmalloc(len);
+       if (btinfo == NULL) {
+               rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
+               rtw_mfree((u8*)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));
+               res = _FAIL;
+               goto exit;
+       }
+
+       pdrvextra_cmd_parm->ec_id = BTINFO_WK_CID;
+       pdrvextra_cmd_parm->type = 0;
+       pdrvextra_cmd_parm->size = len;
+       pdrvextra_cmd_parm->pbuf = btinfo;
+
+       _rtw_memcpy(btinfo, buf, len);
+
+       init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
+
+       res = rtw_enqueue_cmd(pcmdpriv, ph2c);
+
+exit:
+       return res;
+}
+#endif
+
 //#ifdef CONFIG_C2H_PACKET_EN
 u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length)
 {
@@ -3345,9 +3521,13 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)
                        break;
 #endif //CONFIG_BEAMFORMING
                case DM_RA_MSK_WK_CID:
-                       rtw_dm_ra_mask_hdl(padapter);
+                       rtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf);
                        break;
-
+#ifdef CONFIG_BT_COEXIST
+               case BTINFO_WK_CID:
+                       rtw_btinfo_hdl(padapter ,pdrvextra_cmd->pbuf, pdrvextra_cmd->size);
+                       break;
+#endif
                default:
                        break;
        }
index 3990a651696d4a1514af78cf3190f9732e7894cf..adff131bd16ee5ca19211a57269f55df3e63a363 100755 (executable)
@@ -62,7 +62,7 @@ u32 GlobalDebugLevel = _drv_err_;
 
 void dump_drv_version(void *sel)
 {
-       DBG_871X_SEL_NL(sel, "%s\n", DRIVERVERSION);
+       DBG_871X_SEL_NL(sel, "%s %s\n", DRV_NAME, DRIVERVERSION);
        DBG_871X_SEL_NL(sel, "build time: %s %s\n", __DATE__, __TIME__);
 }
 
@@ -273,11 +273,30 @@ int proc_get_sec_info(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);  
-       struct security_priv *psecuritypriv = &padapter->securitypriv;
+       struct security_priv *sec = &padapter->securitypriv;
 
        DBG_871X_SEL_NL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", 
-                                               psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
-                                               psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
+                                               sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,
+                                               sec->ndisauthtype, sec->ndisencryptstatus);
+
+       DBG_871X_SEL_NL(m, "hw_decrypted=%d\n", sec->hw_decrypted);
+
+#ifdef DBG_SW_SEC_CNT
+       DBG_871X_SEL_NL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n"
+               , sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);
+       DBG_871X_SEL_NL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n"
+               , sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);
+
+       DBG_871X_SEL_NL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n"
+               , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);  
+       DBG_871X_SEL_NL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n"
+               , sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);
+
+       DBG_871X_SEL_NL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n"
+               , sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);
+       DBG_871X_SEL_NL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n"
+               , sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);
+#endif /* DBG_SW_SEC_CNT */
 
        return 0;
 }
@@ -437,6 +456,63 @@ int proc_get_rf_info(struct seq_file *m, void *v)
        return 0;
 }
 
+int proc_get_survey_info(struct seq_file *m, void *v)
+{
+       _irqL irqL;
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
+       _queue  *queue  = &(pmlmepriv->scanned_queue);
+       struct wlan_network     *pnetwork = NULL;
+       _list   *plist, *phead;
+       s32 notify_signal;
+       s16 notify_noise = 0;
+       u16  index = 0;
+
+       _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);    
+       phead = get_list_head(queue);
+       plist = get_next(phead);
+       if ((!phead) || (!plist))
+               return 0;
+
+       DBG_871X_SEL_NL(m, "%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %s\n","index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
+       while(1)
+       {
+               if (rtw_end_of_queue_search(phead,plist)== _TRUE)
+                       break;
+
+               pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
+                if (!pnetwork)
+                       break;
+       
+               if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
+                       is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
+                       notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm
+               } else {
+                       notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
+               }
+
+               #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise));
+               #endif
+       
+               DBG_871X_SEL_NL(m, "%5d  "MAC_FMT"  %3d  %3d  %4d  %4d  %5d  %s\n", 
+                       ++index,
+                       MAC_ARG(pnetwork->network.MacAddress), 
+                       pnetwork->network.Configuration.DSConfig,
+                       (int)pnetwork->network.Rssi,
+                       notify_signal,
+                       notify_noise,
+                       rtw_get_passing_time_ms((u32)pnetwork->last_scanned),
+                       //translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),
+                       pnetwork->network.Ssid.Ssid);
+               plist = get_next(plist);
+       }
+       _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
+
+       return 0;
+}
+
 int proc_get_ap_info(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
@@ -494,8 +570,14 @@ int proc_get_adapter_state(struct seq_file *m, void *v)
        struct net_device *dev = m->private;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
 
-       DBG_871X_SEL_NL(m, "bSurpriseRemoved=%d, bDriverStopped=%d\n", 
-                                               padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#ifdef CONFIG_CONCURRENT_MODE
+       DBG_871X_SEL_NL(m, "name=%s, iface_type=%d, bSurpriseRemoved=%d, bDriverStopped=%d\n",
+                                       dev->name, padapter->iface_type,
+                                       padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#else
+       DBG_871X_SEL_NL(m, "name=%s, bSurpriseRemoved=%d, bDriverStopped=%d\n",
+                                       dev->name, padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#endif
 
        return 0;
 }
@@ -585,6 +667,24 @@ ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, si
        return count;
 }
 
+u32 g_wait_hiq_empty = 0;
+
+ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       char tmp[32];
+
+       if (count < 1)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
+               int num = sscanf(tmp, "%u", &g_wait_hiq_empty);
+       }
+
+       return count;
+}
+
 int proc_get_suspend_resume_info(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
@@ -624,6 +724,269 @@ int proc_get_suspend_resume_info(struct seq_file *m, void *v)
        return 0;
 }
 
+#ifdef CONFIG_DBG_COUNTER
+
+int proc_get_rx_logs(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct rx_logs *rx_logs = &padapter->rx_logs;
+
+       DBG_871X_SEL_NL(m, 
+               "intf_rx=%d\n"
+               "intf_rx_err_recvframe=%d\n"
+               "intf_rx_err_skb=%d\n"
+               "intf_rx_report=%d\n"
+               "core_rx=%d\n"
+               "core_rx_pre=%d\n"
+               "core_rx_pre_ver_err=%d\n"
+               "core_rx_pre_mgmt=%d\n"
+               "core_rx_pre_mgmt_err_80211w=%d\n"
+               "core_rx_pre_mgmt_err=%d\n"
+               "core_rx_pre_ctrl=%d\n"
+               "core_rx_pre_ctrl_err=%d\n"
+               "core_rx_pre_data=%d\n"
+               "core_rx_pre_data_wapi_seq_err=%d\n"
+               "core_rx_pre_data_wapi_key_err=%d\n"
+               "core_rx_pre_data_handled=%d\n"
+               "core_rx_pre_data_err=%d\n"
+               "core_rx_pre_data_unknown=%d\n"
+               "core_rx_pre_unknown=%d\n"
+               "core_rx_enqueue=%d\n"
+               "core_rx_dequeue=%d\n"
+               "core_rx_post=%d\n"
+               "core_rx_post_decrypt=%d\n"
+               "core_rx_post_decrypt_wep=%d\n"
+               "core_rx_post_decrypt_tkip=%d\n"
+               "core_rx_post_decrypt_aes=%d\n"
+               "core_rx_post_decrypt_wapi=%d\n"
+               "core_rx_post_decrypt_hw=%d\n"
+               "core_rx_post_decrypt_unknown=%d\n"
+               "core_rx_post_decrypt_err=%d\n"
+               "core_rx_post_defrag_err=%d\n"
+               "core_rx_post_portctrl_err=%d\n"
+               "core_rx_post_indicate=%d\n"
+               "core_rx_post_indicate_in_oder=%d\n"
+               "core_rx_post_indicate_reoder=%d\n"
+               "core_rx_post_indicate_err=%d\n"
+               "os_indicate=%d\n"
+               "os_indicate_ap_mcast=%d\n"
+               "os_indicate_ap_forward=%d\n"
+               "os_indicate_ap_self=%d\n"
+               "os_indicate_err=%d\n"
+               "os_netif_ok=%d\n"
+               "os_netif_err=%d\n",
+               rx_logs->intf_rx,
+               rx_logs->intf_rx_err_recvframe,
+               rx_logs->intf_rx_err_skb,
+               rx_logs->intf_rx_report,
+               rx_logs->core_rx,
+               rx_logs->core_rx_pre,
+               rx_logs->core_rx_pre_ver_err,
+               rx_logs->core_rx_pre_mgmt,
+               rx_logs->core_rx_pre_mgmt_err_80211w,
+               rx_logs->core_rx_pre_mgmt_err,
+               rx_logs->core_rx_pre_ctrl,
+               rx_logs->core_rx_pre_ctrl_err,
+               rx_logs->core_rx_pre_data,
+               rx_logs->core_rx_pre_data_wapi_seq_err,
+               rx_logs->core_rx_pre_data_wapi_key_err,
+               rx_logs->core_rx_pre_data_handled,
+               rx_logs->core_rx_pre_data_err,
+               rx_logs->core_rx_pre_data_unknown,
+               rx_logs->core_rx_pre_unknown,
+               rx_logs->core_rx_enqueue,
+               rx_logs->core_rx_dequeue,
+               rx_logs->core_rx_post,
+               rx_logs->core_rx_post_decrypt,
+               rx_logs->core_rx_post_decrypt_wep,
+               rx_logs->core_rx_post_decrypt_tkip,
+               rx_logs->core_rx_post_decrypt_aes,
+               rx_logs->core_rx_post_decrypt_wapi,
+               rx_logs->core_rx_post_decrypt_hw,
+               rx_logs->core_rx_post_decrypt_unknown,
+               rx_logs->core_rx_post_decrypt_err,
+               rx_logs->core_rx_post_defrag_err,
+               rx_logs->core_rx_post_portctrl_err,
+               rx_logs->core_rx_post_indicate,
+               rx_logs->core_rx_post_indicate_in_oder,
+               rx_logs->core_rx_post_indicate_reoder,
+               rx_logs->core_rx_post_indicate_err,
+               rx_logs->os_indicate,
+               rx_logs->os_indicate_ap_mcast,
+               rx_logs->os_indicate_ap_forward,
+               rx_logs->os_indicate_ap_self,
+               rx_logs->os_indicate_err,
+               rx_logs->os_netif_ok,
+               rx_logs->os_netif_err
+       );
+
+       return 0;
+}
+
+int proc_get_tx_logs(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct tx_logs *tx_logs = &padapter->tx_logs;
+       
+       DBG_871X_SEL_NL(m,
+               "os_tx=%d\n"
+               "os_tx_err_up=%d\n"
+               "os_tx_err_xmit=%d\n"
+               "os_tx_m2u=%d\n"
+               "os_tx_m2u_ignore_fw_linked=%d\n"
+               "os_tx_m2u_ignore_self=%d\n"
+               "os_tx_m2u_entry=%d\n"
+               "os_tx_m2u_entry_err_xmit=%d\n"
+               "os_tx_m2u_entry_err_skb=%d\n"
+               "os_tx_m2u_stop=%d\n"
+               "core_tx=%d\n"
+               "core_tx_err_pxmitframe=%d\n"
+               "core_tx_err_brtx=%d\n"
+               "core_tx_upd_attrib=%d\n"
+               "core_tx_upd_attrib_adhoc=%d\n"
+               "core_tx_upd_attrib_sta=%d\n"
+               "core_tx_upd_attrib_ap=%d\n"
+               "core_tx_upd_attrib_unknown=%d\n"
+               "core_tx_upd_attrib_dhcp=%d\n"
+               "core_tx_upd_attrib_icmp=%d\n"
+               "core_tx_upd_attrib_active=%d\n"
+               "core_tx_upd_attrib_err_ucast_sta=%d\n"
+               "core_tx_upd_attrib_err_ucast_ap_link=%d\n"
+               "core_tx_upd_attrib_err_sta=%d\n"
+               "core_tx_upd_attrib_err_link=%d\n"
+               "core_tx_upd_attrib_err_sec=%d\n"
+               "core_tx_ap_enqueue_warn_fwstate=%d\n"
+               "core_tx_ap_enqueue_warn_sta=%d\n"
+               "core_tx_ap_enqueue_warn_nosta=%d\n"
+               "core_tx_ap_enqueue_warn_link=%d\n"
+               "core_tx_ap_enqueue_warn_trigger=%d\n"
+               "core_tx_ap_enqueue_mcast=%d\n"
+               "core_tx_ap_enqueue_ucast=%d\n"
+               "core_tx_ap_enqueue=%d\n"
+               "intf_tx=%d\n"
+               "intf_tx_pending_ac=%d\n"
+               "intf_tx_pending_fw_under_survey=%d\n"
+               "intf_tx_pending_fw_under_linking=%d\n"
+               "intf_tx_pending_xmitbuf=%d\n"
+               "intf_tx_enqueue=%d\n"
+               "core_tx_enqueue=%d\n"
+               "core_tx_enqueue_class=%d\n"
+               "core_tx_enqueue_class_err_sta=%d\n"
+               "core_tx_enqueue_class_err_nosta=%d\n"
+               "core_tx_enqueue_class_err_fwlink=%d\n"
+               "intf_tx_direct=%d\n"
+               "intf_tx_direct_err_coalesce=%d\n"
+               "intf_tx_dequeue=%d\n"
+               "intf_tx_dequeue_err_coalesce=%d\n"
+               "intf_tx_dump_xframe=%d\n"
+               "intf_tx_dump_xframe_err_txdesc=%d\n"
+               "intf_tx_dump_xframe_err_port=%d\n",
+               tx_logs->os_tx,
+               tx_logs->os_tx_err_up,
+               tx_logs->os_tx_err_xmit,
+               tx_logs->os_tx_m2u,
+               tx_logs->os_tx_m2u_ignore_fw_linked,
+               tx_logs->os_tx_m2u_ignore_self,
+               tx_logs->os_tx_m2u_entry,
+               tx_logs->os_tx_m2u_entry_err_xmit,
+               tx_logs->os_tx_m2u_entry_err_skb,
+               tx_logs->os_tx_m2u_stop,
+               tx_logs->core_tx,
+               tx_logs->core_tx_err_pxmitframe,
+               tx_logs->core_tx_err_brtx,
+               tx_logs->core_tx_upd_attrib,
+               tx_logs->core_tx_upd_attrib_adhoc,
+               tx_logs->core_tx_upd_attrib_sta,
+               tx_logs->core_tx_upd_attrib_ap,
+               tx_logs->core_tx_upd_attrib_unknown,
+               tx_logs->core_tx_upd_attrib_dhcp,
+               tx_logs->core_tx_upd_attrib_icmp,
+               tx_logs->core_tx_upd_attrib_active,
+               tx_logs->core_tx_upd_attrib_err_ucast_sta,
+               tx_logs->core_tx_upd_attrib_err_ucast_ap_link,
+               tx_logs->core_tx_upd_attrib_err_sta,
+               tx_logs->core_tx_upd_attrib_err_link,
+               tx_logs->core_tx_upd_attrib_err_sec,
+               tx_logs->core_tx_ap_enqueue_warn_fwstate,
+               tx_logs->core_tx_ap_enqueue_warn_sta,
+               tx_logs->core_tx_ap_enqueue_warn_nosta,
+               tx_logs->core_tx_ap_enqueue_warn_link,
+               tx_logs->core_tx_ap_enqueue_warn_trigger,
+               tx_logs->core_tx_ap_enqueue_mcast,
+               tx_logs->core_tx_ap_enqueue_ucast,
+               tx_logs->core_tx_ap_enqueue,
+               tx_logs->intf_tx,
+               tx_logs->intf_tx_pending_ac,
+               tx_logs->intf_tx_pending_fw_under_survey,
+               tx_logs->intf_tx_pending_fw_under_linking,
+               tx_logs->intf_tx_pending_xmitbuf,
+               tx_logs->intf_tx_enqueue,
+               tx_logs->core_tx_enqueue,
+               tx_logs->core_tx_enqueue_class,
+               tx_logs->core_tx_enqueue_class_err_sta,
+               tx_logs->core_tx_enqueue_class_err_nosta,
+               tx_logs->core_tx_enqueue_class_err_fwlink,
+               tx_logs->intf_tx_direct,
+               tx_logs->intf_tx_direct_err_coalesce,
+               tx_logs->intf_tx_dequeue,
+               tx_logs->intf_tx_dequeue_err_coalesce,
+               tx_logs->intf_tx_dump_xframe,
+               tx_logs->intf_tx_dump_xframe_err_txdesc,
+               tx_logs->intf_tx_dump_xframe_err_port
+       );
+
+       return 0;
+}
+
+int proc_get_int_logs(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+       DBG_871X_SEL_NL(m,
+               "all=%d\n"
+               "err=%d\n"
+               "tbdok=%d\n"
+               "tbder=%d\n"
+               "bcnderr=%d\n"
+               "bcndma=%d\n"
+               "bcndma_e=%d\n"
+               "rx=%d\n"
+               "rx_rdu=%d\n"
+               "rx_fovw=%d\n"
+               "txfovw=%d\n"
+               "mgntok=%d\n"
+               "highdok=%d\n"
+               "bkdok=%d\n"
+               "bedok=%d\n"
+               "vidok=%d\n"
+               "vodok=%d\n",
+               padapter->int_logs.all,
+               padapter->int_logs.err,
+               padapter->int_logs.tbdok,
+               padapter->int_logs.tbder,
+               padapter->int_logs.bcnderr,
+               padapter->int_logs.bcndma,
+               padapter->int_logs.bcndma_e,
+               padapter->int_logs.rx,
+               padapter->int_logs.rx_rdu,
+               padapter->int_logs.rx_fovw,
+               padapter->int_logs.txfovw,
+               padapter->int_logs.mgntok,
+               padapter->int_logs.highdok,
+               padapter->int_logs.bkdok,
+               padapter->int_logs.bedok,
+               padapter->int_logs.vidok,
+               padapter->int_logs.vodok
+       );
+
+       return 0;
+}
+
+#endif // CONFIG_DBG_COUNTER
+
 int proc_get_rx_signal(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
@@ -631,10 +994,27 @@ int proc_get_rx_signal(struct seq_file *m, void *v)
        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 
        DBG_871X_SEL_NL(m, "rssi:%d\n", padapter->recvpriv.rssi);
-       DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);
+       //DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);
        DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
        DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
-       DBG_871X_SEL_NL(m, "noise:%u\n", padapter->recvpriv.noise);
+       DBG_871X_SEL_NL(m, "noise:%d\n", padapter->recvpriv.noise);
+       rtw_odm_get_perpkt_rssi(m,padapter);
+       #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+       rtw_get_raw_rssi_info(m,padapter);
+       #endif
+       return 0;
+}
+
+
+int proc_get_hw_status(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *dvobj = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
+
+       DBG_871X_SEL_NL(m, "RX FIFO full count: last_time=%lld, current_time=%lld, differential=%lld\n"
+       , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);
 
        return 0;
 }
@@ -659,7 +1039,6 @@ ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t
                        return count;
                        
                signal_strength = signal_strength>100?100:signal_strength;
-               signal_strength = signal_strength<0?0:signal_strength;
 
                padapter->recvpriv.is_signal_dbg = is_signal_dbg;
                padapter->recvpriv.signal_strength_dbg=signal_strength;
@@ -741,7 +1120,7 @@ ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t co
 
                int num = sscanf(tmp, "%d ", &mode);
 
-               if( pregpriv && mode >= 0 && mode < 2 )
+               if( pregpriv &&  mode < 2 )
                {
 
                        pregpriv->bw_mode = mode;
@@ -781,7 +1160,7 @@ ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size
 
                int num = sscanf(tmp, "%d ", &mode);
 
-               if( pregpriv && mode >= 0 && mode < 3 )
+               if( pregpriv && mode < 3 )
                {
                        pregpriv->ampdu_enable= mode;
                        printk("ampdu_enable=%d\n", mode);
@@ -887,6 +1266,7 @@ ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t co
        return count;
 }
 
+/*
 int proc_get_two_path_rssi(struct seq_file *m, void *v)
 {
        struct net_device *dev = m->private;
@@ -898,6 +1278,7 @@ int proc_get_two_path_rssi(struct seq_file *m, void *v)
 
        return 0;
 }
+*/
 #ifdef CONFIG_80211N_HT
 int proc_get_rx_stbc(struct seq_file *m, void *v)
 {
@@ -1014,6 +1395,7 @@ int proc_get_all_sta_info(struct seq_file *m, void *v)
 
                        //if(extra_arg == psta->aid)
                        {
+                               DBG_871X_SEL_NL(m, "==============================\n");
                                DBG_871X_SEL_NL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
                                DBG_871X_SEL_NL(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
                                DBG_871X_SEL_NL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
@@ -1024,6 +1406,11 @@ int proc_get_all_sta_info(struct seq_file *m, void *v)
                                DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
 #endif //CONFIG_80211N_HT
                                DBG_871X_SEL_NL(m, "sleepq_len=%d\n", psta->sleepq_len);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt);
+                               DBG_871X_SEL_NL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt);
+
                                DBG_871X_SEL_NL(m, "capability=0x%x\n", psta->capability);
                                DBG_871X_SEL_NL(m, "flags=0x%x\n", psta->flags);
                                DBG_871X_SEL_NL(m, "wpa_psk=0x%x\n", psta->wpa_psk);
@@ -1039,14 +1426,23 @@ int proc_get_all_sta_info(struct seq_file *m, void *v)
                                        {
                                                DBG_871X_SEL_NL(m, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
                                        }
-                               }               
-                                                                       
-                       }                                                       
-                       
+                               }
+
+#ifdef CONFIG_TDLS
+                               DBG_871X_SEL_NL(m, "tdls_sta_state=0x%08x\n", psta->tdls_sta_state);
+                               DBG_871X_SEL_NL(m, "PeerKey_Lifetime=%d\n", psta->TDLS_PeerKey_Lifetime);
+                               DBG_871X_SEL_NL(m, "rx_data_pkts=%llu\n", psta->sta_stats.rx_data_pkts);
+                               DBG_871X_SEL_NL(m, "rx_bytes=%llu\n", psta->sta_stats.rx_bytes);
+                               DBG_871X_SEL_NL(m, "tx_data_pkts=%llu\n", psta->sta_stats.tx_pkts);
+                               DBG_871X_SEL_NL(m, "tx_bytes=%llu\n", psta->sta_stats.tx_bytes);
+#endif //CONFIG_TDLS
+                               DBG_871X_SEL_NL(m, "==============================\n");
+                       }
+
                }
-               
+
        }
-       
+
        _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
 
        return 0;
@@ -1287,5 +1683,91 @@ ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t cou
 }
 #endif /* DBG_CONFIG_ERROR_DETECT */
 
+#ifdef CONFIG_PCI_HCI
+
+int proc_get_rx_ring(struct seq_file *m, void *v)
+{
+       _irqL irqL;
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
+       struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+       struct recv_priv *precvpriv = &padapter->recvpriv;
+       struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];
+       int i, j;
+
+       DBG_871X_SEL_NL(m, "rx ring (%p)\n", rx_ring);
+       DBG_871X_SEL_NL(m, "  dma: 0x%08x\n", (int) rx_ring->dma);
+       DBG_871X_SEL_NL(m, "  idx: %d\n", rx_ring->idx);
+
+       _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
+       for (i=0; i<precvpriv->rxringcount; i++)
+       {
+               struct recv_stat *entry = &rx_ring->desc[i];
+               struct sk_buff *skb = rx_ring->rx_buf[i];
+
+               DBG_871X_SEL_NL(m, "  desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n",
+                       i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));
+
+               for (j=0; j<sizeof(*entry)/4; j++)
+               {
+                       if ((j % 4) == 0)
+                               DBG_871X_SEL_NL(m, "  0x%03x", j);
+
+                       DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[j]);
+
+                       if ((j % 4) == 3)
+                               DBG_871X_SEL_NL(m, "\n");
+               }
+       }
+       _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
+
+       return 0;
+}
+
+int proc_get_tx_ring(struct seq_file *m, void *v)
+{
+       _irqL irqL;
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
+       struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       int i, j, k;
+
+       _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
+       for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++)
+       {
+               struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];
+
+               DBG_871X_SEL_NL(m, "tx ring[%d] (%p)\n", i, tx_ring);
+               DBG_871X_SEL_NL(m, "  dma: 0x%08x\n", (int) tx_ring->dma);
+               DBG_871X_SEL_NL(m, "  idx: %d\n", tx_ring->idx);
+               DBG_871X_SEL_NL(m, "  entries: %d\n", tx_ring->entries);
+//             DBG_871X_SEL_NL(m, "  queue: %d\n", tx_ring->queue);
+               DBG_871X_SEL_NL(m, "  qlen: %d\n", tx_ring->qlen);
+
+               for (j=0; j < pxmitpriv->txringcount[i]; j++)
+               {
+                       struct tx_desc *entry = &tx_ring->desc[j];
+
+                       DBG_871X_SEL_NL(m, "  desc[%03d]: %p\n", j, entry);
+                       for (k=0; k < sizeof(*entry)/4; k++)
+                       {
+                               if ((k % 4) == 0)
+                                       DBG_871X_SEL_NL(m, "  0x%03x", k);
+
+                               DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[k]);
+
+                               if ((k % 4) == 3)
+                                       DBG_871X_SEL_NL(m, "\n");
+                       }
+               }
+       }
+       _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
+
+       return 0;
+}
+
+#endif
+
 #endif
 
index 7340d469fc426e04707b97c373b890e8ef90d80d..ba88c986ae7081361f74a74ee40262eae618e858 100755 (executable)
@@ -898,6 +898,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
@@ -1326,54 +1348,58 @@ u8 convert_ip_addr(u8 hch, u8 mch, u8 lch)
 }
 
 extern char* rtw_initmac;
-#include <linux/rfkill-wlan.h>
+extern int rockchip_wifi_mac_addr(unsigned char *buf);
 void rtw_macaddr_cfg(u8 *mac_addr)
 {
-    u8 mac[ETH_ALEN];
-
-    if(mac_addr == NULL)    return;
-
-    if ( rtw_initmac )
-    {   //  Users specify the mac address
-        int jj,kk;
+       u8 mac[ETH_ALEN];
+    u8 macbuf[30] = {0};
+       if(mac_addr == NULL)    return;
+       
+       if ( rtw_initmac )
+       {       //      Users specify the mac address
+               int jj,kk;
 
-        for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
-        {
-            mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]);
-        }
-        _rtw_memcpy(mac_addr, mac, ETH_ALEN);
-    }
-    else
+               for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
+               {
+                       mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]);
+               }
+               _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+       }
+       else
     {
         printk("Wifi Efuse Mac => %02x:%02x:%02x:%02x:%02x:%02x\n", mac_addr[0], mac_addr[1],
             mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
-        if (!rockchip_wifi_mac_addr(mac)) {
-            printk("=========> get mac address from flash=[%02x:%02x:%02x:%02x:%02x:%02x]\n", mac[0], mac[1],
-                mac[2], mac[3], mac[4], mac[5]);
+        if (!rockchip_wifi_mac_addr(macbuf)) {
+            int jj,kk;
+            printk("=========> get mac address from flash %s\n", macbuf);
+            for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
+            {
+                mac[jj] = key_2char2num(macbuf[kk], macbuf[kk+ 1]);
+            }
             _rtw_memcpy(mac_addr, mac, ETH_ALEN);
         } else {
             //  Use the mac address stored in the Efuse
             _rtw_memcpy(mac, mac_addr, ETH_ALEN);
         }
     }
+       
+       if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) &&
+            (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) ||
+           ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) &&
+            (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0)))
+       {
+               mac[0] = 0x00;
+               mac[1] = 0xe0;
+               mac[2] = 0x4c;
+               mac[3] = 0x87;
+               mac[4] = 0x00;
+               mac[5] = 0x00;
+               // use default mac addresss
+               _rtw_memcpy(mac_addr, mac, ETH_ALEN);
+               DBG_871X("MAC Address from efuse error, assign default one !!!\n");
+       }       
 
-    if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) &&
-         (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) ||
-        ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) &&
-         (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0)))
-    {
-        mac[0] = 0x00;
-        mac[1] = 0xe0;
-        mac[2] = 0x4c;
-        mac[3] = 0x87;
-        mac[4] = 0x00;
-        mac[5] = 0x00;
-        // use default mac addresss
-        _rtw_memcpy(mac_addr, mac, ETH_ALEN);
-        DBG_871X("MAC Address from efuse error, assign default one !!!\n");
-    }
-
-    DBG_871X("rtw_macaddr_cfg MAC Address  = "MAC_FMT"\n", MAC_ARG(mac_addr));
+       DBG_871X("rtw_macaddr_cfg MAC Address  = "MAC_FMT"\n", MAC_ARG(mac_addr));
 }
 
 void dump_ies(u8 *buf, u32 buf_len)
@@ -1517,6 +1543,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
@@ -1841,6 +1889,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)
@@ -2035,68 +2107,68 @@ void rtw_get_bcn_info(struct wlan_network *pnetwork)
 }
 
 //show MCS rate, unit: 100Kbps
-u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, unsigned char * MCS_rate)
+u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate)
 {
        u16 max_rate = 0;
        
        if(rf_type == RF_1T1R)
        {
                if(MCS_rate[0] & BIT(7))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?1500:1350):((short_GI_20)?722:650);
+                       max_rate = (bw_40MHz) ? ((short_GI)?1500:1350):((short_GI)?722:650);
                else if(MCS_rate[0] & BIT(6))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?1350:1215):((short_GI_20)?650:585);
+                       max_rate = (bw_40MHz) ? ((short_GI)?1350:1215):((short_GI)?650:585);
                else if(MCS_rate[0] & BIT(5))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?1200:1080):((short_GI_20)?578:520);
+                       max_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520);
                else if(MCS_rate[0] & BIT(4))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?900:810):((short_GI_20)?433:390);
+                       max_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390);
                else if(MCS_rate[0] & BIT(3))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?600:540):((short_GI_20)?289:260);
+                       max_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260);
                else if(MCS_rate[0] & BIT(2))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?450:405):((short_GI_20)?217:195);
+                       max_rate = (bw_40MHz) ? ((short_GI)?450:405):((short_GI)?217:195);
                else if(MCS_rate[0] & BIT(1))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?300:270):((short_GI_20)?144:130);
+                       max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);
                else if(MCS_rate[0] & BIT(0))
-                       max_rate = (bw_40MHz) ? ((short_GI_40)?150:135):((short_GI_20)?72:65);
+                       max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
        }
        else
        {
                if(MCS_rate[1])
                {
                        if(MCS_rate[1] & BIT(7))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?3000:2700):((short_GI_20)?1444:1300);
+                               max_rate = (bw_40MHz) ? ((short_GI)?3000:2700):((short_GI)?1444:1300);
                        else if(MCS_rate[1] & BIT(6))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?2700:2430):((short_GI_20)?1300:1170);
+                               max_rate = (bw_40MHz) ? ((short_GI)?2700:2430):((short_GI)?1300:1170);
                        else if(MCS_rate[1] & BIT(5))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?2400:2160):((short_GI_20)?1156:1040);
+                               max_rate = (bw_40MHz) ? ((short_GI)?2400:2160):((short_GI)?1156:1040);
                        else if(MCS_rate[1] & BIT(4))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?1800:1620):((short_GI_20)?867:780);
+                               max_rate = (bw_40MHz) ? ((short_GI)?1800:1620):((short_GI)?867:780);
                        else if(MCS_rate[1] & BIT(3))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?1200:1080):((short_GI_20)?578:520);
+                               max_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520);
                        else if(MCS_rate[1] & BIT(2))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?900:810):((short_GI_20)?433:390);
+                               max_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390);
                        else if(MCS_rate[1] & BIT(1))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?600:540):((short_GI_20)?289:260);
+                               max_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260);
                        else if(MCS_rate[1] & BIT(0))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?300:270):((short_GI_20)?144:130);
+                               max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);
                }
                else
                {
                        if(MCS_rate[0] & BIT(7))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?1500:1350):((short_GI_20)?722:650);
+                               max_rate = (bw_40MHz) ? ((short_GI)?1500:1350):((short_GI)?722:650);
                        else if(MCS_rate[0] & BIT(6))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?1350:1215):((short_GI_20)?650:585);
+                               max_rate = (bw_40MHz) ? ((short_GI)?1350:1215):((short_GI)?650:585);
                        else if(MCS_rate[0] & BIT(5))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?1200:1080):((short_GI_20)?578:520);
+                               max_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520);
                        else if(MCS_rate[0] & BIT(4))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?900:810):((short_GI_20)?433:390);
+                               max_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390);
                        else if(MCS_rate[0] & BIT(3))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?600:540):((short_GI_20)?289:260);
+                               max_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260);
                        else if(MCS_rate[0] & BIT(2))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?450:405):((short_GI_20)?217:195);
+                               max_rate = (bw_40MHz) ? ((short_GI)?450:405):((short_GI)?217:195);
                        else if(MCS_rate[0] & BIT(1))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?300:270):((short_GI_20)?144:130);
+                               max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);
                        else if(MCS_rate[0] & BIT(0))
-                               max_rate = (bw_40MHz) ? ((short_GI_40)?150:135):((short_GI_20)?72:65);
+                               max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
                }
        }
        return max_rate;
index 576a614241d379d6b0a5a04ca70f73249b05bd17..e4c0245769797f3073ee85c848a2e3ee0d659bd9 100755 (executable)
@@ -316,9 +316,10 @@ void _rtw_read_port_cancel(_adapter *adapter)
 
        _read_port_cancel = pintfhdl->io_ops._read_port_cancel;
 
+       RTW_DISABLE_FUNC(adapter, DF_RX_BIT);
+
        if(_read_port_cancel)
                _read_port_cancel(pintfhdl);
-
 }
 
 u32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)
@@ -365,9 +366,10 @@ void _rtw_write_port_cancel(_adapter *adapter)
 
        _write_port_cancel = pintfhdl->io_ops._write_port_cancel;
 
+       RTW_DISABLE_FUNC(adapter, DF_TX_BIT);
+
        if(_write_port_cancel)
                _write_port_cancel(pintfhdl);
-
 }
 int rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(_adapter *padapter,struct _io_ops *pops))
 {
index f0262332294e2afd9f7a4145568b1df30808557a..59b88f4d5c10b138f3719aa94ca0528f33f3dd97 100755 (executable)
@@ -378,6 +378,7 @@ handle_tkip_countermeasure:
                goto release_mlme_lock;
        }
 
+       _rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID));
        _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
        pmlmepriv->assoc_by_bssid=_TRUE;
 
@@ -574,10 +575,14 @@ handle_tkip_countermeasure:
 
        if (ssid && ssid_valid)
                _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));
+       else
+               _rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID));
 
        if (bssid && bssid_valid) {
                _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
                pmlmepriv->assoc_by_bssid = _TRUE;
+       } else {
+               pmlmepriv->assoc_by_bssid = _FALSE;
        }
 
        if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
@@ -702,7 +707,8 @@ _func_enter_;
                rtw_indicate_disconnect(padapter);
                //modify for CONFIG_IEEE80211W, none 11w can use it
                rtw_free_assoc_resources_cmd(padapter);
-               rtw_pwr_wakeup(padapter);               
+               if (_FAIL == rtw_pwr_wakeup(padapter))
+                       DBG_871X("%s(): rtw_pwr_wakeup fail !!!\n",__FUNCTION__);
        }
 
        _exit_critical_bh(&pmlmepriv->lock, &irqL);
@@ -1248,11 +1254,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, _TRUE);
+                               res=rtw_setstakey_cmd(padapter, 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, _TRUE);
+                               res=rtw_setstakey_cmd(padapter, stainfo, _TRUE, _TRUE);
                                RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n"));
                        }
                        
@@ -1332,22 +1338,13 @@ _func_exit_;
 u16 rtw_get_cur_max_rate(_adapter *adapter)
 {
        int     i = 0;
-       u8      *p;
        u16     rate = 0, max_rate = 0;
-       struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       struct registry_priv *pregistrypriv = &adapter->registrypriv;
        struct mlme_priv        *pmlmepriv = &adapter->mlmepriv;
-       WLAN_BSSID_EX  *pcur_bss = &pmlmepriv->cur_network.network;
+       WLAN_BSSID_EX   *pcur_bss = &pmlmepriv->cur_network.network;
+       struct sta_info *psta = NULL;
+       u8      short_GI=0;
 #ifdef CONFIG_80211N_HT
-       struct rtw_ieee80211_ht_cap *pht_capie;
        u8      rf_type = 0;
-       u8      bw_40MHz=0, short_GI_20=0, short_GI_40=0, cbw40_enable=0;
-       u16     mcs_rate=0;
-       u32     ht_ielen = 0;   
-#endif
-#ifdef CONFIG_80211AC_VHT
-       struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
 #endif
 
 #ifdef CONFIG_MP_INCLUDED
@@ -1362,45 +1359,26 @@ u16 rtw_get_cur_max_rate(_adapter *adapter)
                && (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE))
                return 0;
 
-#ifdef CONFIG_80211N_HT
-       if (IsSupportedHT(pmlmeext->cur_wireless_mode)) {
-               p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength-12);
-               if(p && ht_ielen>0)
-               {
-                       pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);
-               
-                       _rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
-
-                       //bw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH) ? 1:0;
-                       //cur_bwmod is updated by beacon, pmlmeinfo is updated by association response
-                       bw_40MHz = (pmlmeext->cur_bwmode && (HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH & pmlmeinfo->HT_info.infos[0])) ? 1:0;
-                       
-                       //short_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1:0;
-                       short_GI_20 = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info&IEEE80211_HT_CAP_SGI_20) ? 1:0;
-                       short_GI_40 = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info&IEEE80211_HT_CAP_SGI_40) ? 1:0;
-
-                       rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+       psta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv));
+       if (psta == NULL)
+               return 0;
 
-                       if (pmlmeext->cur_channel > 14) {
-                               if ((pregistrypriv->bw_mode & 0xf0) > 0)
-                                       cbw40_enable = 1;
-                       } else {
-                               if ((pregistrypriv->bw_mode & 0x0f) > 0)
-                                       cbw40_enable = 1;
-                       }
+       short_GI = query_ra_short_GI(psta);
 
-                       max_rate = rtw_mcs_rate(
-                               rf_type,
-                               bw_40MHz & cbw40_enable, 
-                               short_GI_20,
-                               short_GI_40,
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate
-                       );
-               }
+#ifdef CONFIG_80211N_HT
+       if (IsSupportedHT(psta->wireless_mode)) {
+               rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+
+               max_rate = rtw_mcs_rate(
+                       rf_type,
+                       ((psta->bw_mode == CHANNEL_WIDTH_40)?1:0),
+                       short_GI,
+                       psta->htpriv.ht_cap.supp_mcs_set
+               );
        }
 #ifdef CONFIG_80211AC_VHT
-       else if (IsSupportedVHT(pmlmeext->cur_wireless_mode)) {
-               max_rate = ((rtw_vht_data_rate(pmlmeext->cur_bwmode, pvhtpriv->sgi_80m, pvhtpriv->vht_highest_rate) + 1) >> 1) * 10;
+       else if (IsSupportedVHT(psta->wireless_mode)) {
+               max_rate = ((rtw_vht_mcs_to_data_rate(psta->bw_mode, short_GI, pmlmepriv->vhtpriv.vht_highest_rate) + 1) >> 1) * 10;
        }
 #endif //CONFIG_80211AC_VHT
        else 
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mem.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/core/rtw_mem.c
new file mode 100755 (executable)
index 0000000..a4de3e6
--- /dev/null
@@ -0,0 +1,103 @@
+\r
+#include <drv_types.h>\r
+#include <rtw_mem.h>\r
+\r
+MODULE_LICENSE("GPL");\r
+MODULE_DESCRIPTION("Realtek Wireless Lan Driver");\r
+MODULE_AUTHOR("Realtek Semiconductor Corp.");\r
+MODULE_VERSION("DRIVERVERSION");\r
+\r
+struct sk_buff_head rtk_skb_mem_q;\r
+struct u8* rtk_buf_mem[NR_RECVBUFF];\r
+\r
+struct u8      * rtw_get_buf_premem(int index)\r
+{\r
+       printk("%s, rtk_buf_mem index : %d\n", __func__, index);\r
+       return rtk_buf_mem[index];\r
+}\r
+\r
+struct sk_buff *rtw_alloc_skb_premem(void)\r
+{\r
+       struct sk_buff *skb = NULL;\r
+\r
+       skb = skb_dequeue(&rtk_skb_mem_q);\r
+\r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return skb;     \r
+}\r
+EXPORT_SYMBOL(rtw_alloc_skb_premem);\r
+\r
+int rtw_free_skb_premem(struct sk_buff *pskb)\r
+{\r
+       if(!pskb)\r
+               return -1;\r
+\r
+       if(skb_queue_len(&rtk_skb_mem_q) >= NR_PREALLOC_RECV_SKB)       \r
+               return -1;\r
+       \r
+       skb_queue_tail(&rtk_skb_mem_q, pskb);\r
+       \r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return 0;\r
+}\r
+EXPORT_SYMBOL(rtw_free_skb_premem);\r
+\r
+static int __init rtw_mem_init(void)\r
+{\r
+       int i;\r
+       SIZE_PTR tmpaddr=0;\r
+       SIZE_PTR alignment=0;\r
+       struct sk_buff *pskb=NULL;\r
+\r
+       printk("%s\n", __func__);\r
+\r
+#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+       for(i=0; i<NR_RECVBUFF; i++)\r\r
+       {\r\r
+               rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\r
+       }\r
+#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+\r
+       skb_queue_head_init(&rtk_skb_mem_q);\r
+\r
+       for(i=0; i<NR_PREALLOC_RECV_SKB; i++)\r
+       {\r
+               pskb = __dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\r
+               if(pskb)\r
+               {               \r
+                       tmpaddr = (SIZE_PTR)pskb->data;\r
+                       alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\r
+                       skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\r
+\r
+                       skb_queue_tail(&rtk_skb_mem_q, pskb);\r
+               }\r
+               else\r
+               {\r
+                       printk("%s, alloc skb memory fail!\n", __func__);\r
+               }\r
+\r
+               pskb=NULL;\r
+       }\r
+\r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return 0;\r
+       \r
+}\r
+\r
+static void __exit rtw_mem_exit(void)\r
+{\r
+       if (skb_queue_len(&rtk_skb_mem_q)) {\r
+               printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+       }\r
+\r
+       skb_queue_purge(&rtk_skb_mem_q);\r
+\r
+       printk("%s\n", __func__);\r
+}\r
+\r
+module_init(rtw_mem_init);\r
+module_exit(rtw_mem_exit);\r
+\r
index 0498b5b32c2aecc29bb7d836de33b3f3505bdb40..40eadc9c62072d70e1ace2187dbf579e03f77c12 100755 (executable)
 extern void indicate_wx_scan_complete_event(_adapter *padapter);
 extern u8 rtw_do_join(_adapter * padapter);
 
-#ifdef CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_2R_MCS13TO15_OFF[16];
-extern unsigned char   MCS_rate_2R[16];
-#else //CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_2R[16];
-#endif //CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_1R[16];
 
 sint   _rtw_init_mlme_priv (_adapter* padapter)
 {
@@ -540,15 +533,18 @@ void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork
 _func_enter_;          
        RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
        _rtw_free_network(pmlmepriv, pnetwork, is_freeall);
-_func_exit_;           
+_func_exit_;
 }
 
-void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork );
-void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork )
+void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork );
+void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork )
 {
 _func_enter_;          
        //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
-       _rtw_free_network_nolock(pmlmepriv, pnetwork);
+       _rtw_free_network_nolock(&(padapter->mlmepriv), pnetwork);
+#ifdef CONFIG_IOCTL_CFG80211
+       rtw_cfg80211_unlink_bss(padapter, pnetwork);
+#endif //CONFIG_IOCTL_CFG80211
 _func_exit_;           
 }
 
@@ -596,7 +592,6 @@ int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork)
        
 }
 
-inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b);
 inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b)
 {
        //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(%s,%d)(%s,%d)\n",
@@ -605,7 +600,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;
         
@@ -623,6 +618,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) &&
@@ -634,6 +637,45 @@ _func_exit_;
        
 }
 
+struct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network)
+{
+       _list *phead, *plist;
+       struct wlan_network *found = NULL;
+
+       phead = get_list_head(scanned_queue);
+       plist = get_next(phead);
+
+       while (plist != phead) {
+               found = LIST_CONTAINOR(plist, struct wlan_network ,list);
+
+               if (is_same_network(&network->network, &found->network,0))
+                       break;
+
+               plist = get_next(plist);
+       }
+
+       if(plist == phead)
+               found = NULL;
+exit:          
+       return found;
+}
+
+struct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network)
+{
+       _irqL irqL;
+       struct wlan_network *found = NULL;
+
+       if (scanned_queue == NULL || network == NULL)
+               goto exit;      
+
+       _enter_critical_bh(&scanned_queue->lock, &irqL);
+       found = _rtw_find_same_network(scanned_queue, network);
+       _exit_critical_bh(&scanned_queue->lock, &irqL);
+
+exit:
+       return found;
+}
+
 struct wlan_network    * rtw_get_oldest_wlan_network(_queue *scanned_queue)
 {
        _list   *plist, *phead;
@@ -700,7 +742,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;
@@ -791,7 +833,7 @@ _func_enter_;
                &(pmlmepriv->cur_network.network), 
                &(pmlmepriv->cur_network.network));
 
-       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");
 
@@ -820,10 +862,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_;
 
@@ -831,6 +876,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)
@@ -849,7 +899,7 @@ _func_enter_;
                }
 #endif
 
-               if (is_same_network(&(pnetwork->network), target))
+               if (is_same_network(&(pnetwork->network), target, feature))
                {
                        target_find = 1;
                        break;
@@ -875,7 +925,10 @@ _func_enter_;
                        /* If there are no more slots, expire the oldest */
                        //list_del_init(&oldest->list);
                        pnetwork = oldest;
-
+                       if(pnetwork==NULL){ 
+                               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n"));
+                               goto exit;
+                       }
 #ifdef CONFIG_ANTENNA_DIVERSITY
                        //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity
                        rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna));
@@ -1324,6 +1377,30 @@ _func_enter_;
 
        rtw_indicate_scan_done(adapter, _FALSE);
 
+#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211)
+       if (adapter->pbuddy_adapter) {
+               _adapter *buddy_adapter = adapter->pbuddy_adapter;
+               struct mlme_priv *buddy_mlme = &(buddy_adapter->mlmepriv);
+               struct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(buddy_adapter);
+               bool indicate_buddy_scan = _FALSE;
+
+               _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);
+               if (buddy_wdev_priv->scan_request && buddy_mlme->scanning_via_buddy_intf == _TRUE) {
+                       buddy_mlme->scanning_via_buddy_intf = _FALSE;
+                       clr_fwstate(buddy_mlme, _FW_UNDER_SURVEY);
+                       indicate_buddy_scan = _TRUE;
+               }
+               _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);
+
+               if (indicate_buddy_scan == _TRUE) {
+                       #ifdef CONFIG_IOCTL_CFG80211
+                       rtw_cfg80211_surveydone_event_callback(buddy_adapter);
+                       #endif
+                       rtw_indicate_scan_done(buddy_adapter, _FALSE);
+               }
+       }
+#endif /* CONFIG_CONCURRENT_MODE */
+
 _func_exit_;   
 
 }
@@ -1368,6 +1445,14 @@ _func_enter_;
        
 _func_exit_;
 }
+
+void rtw_reset_rx_info(struct debug_priv *pdbgpriv){
+       pdbgpriv->dbg_rx_ampdu_drop_count = 0;
+       pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
+       pdbgpriv->dbg_rx_ampdu_loss_count = 0;
+       pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
+       pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
+}
        
 /*
 *rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock
@@ -1376,9 +1461,12 @@ void rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue)
 {
        _irqL irqL;
        struct wlan_network* pwlan = NULL;
-       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
-       struct  sta_priv *pstapriv = &adapter->stapriv;
+       struct  mlme_priv *pmlmepriv = &adapter->mlmepriv;
+       struct  sta_priv *pstapriv = &adapter->stapriv;
        struct wlan_network *tgt_network = &pmlmepriv->cur_network;
+       struct dvobj_priv *psdpriv = adapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;        
+
        
 #ifdef CONFIG_TDLS
        struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
@@ -1396,7 +1484,7 @@ _func_enter_;
                psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress);
 
 #ifdef CONFIG_TDLS
-               if(ptdlsinfo->setup_state != TDLS_STATE_NONE)
+               if(ptdlsinfo->link_established == _TRUE)
                {
                        rtw_tdls_cmd(adapter, myid(&(adapter->eeprompriv)), TDLS_RS_RCR);
                        rtw_reset_tdls_info(adapter);
@@ -1473,7 +1561,7 @@ _func_enter_;
        if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1))
                /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/)
        {
-               rtw_free_network_nolock(pmlmepriv, pwlan); 
+               rtw_free_network_nolock(adapter, pwlan); 
        }
 
        if(lock_scanned_queue)
@@ -1481,6 +1569,8 @@ _func_enter_;
        
        adapter->securitypriv.key_mask = 0;
 
+       rtw_reset_rx_info(pdbgpriv);
+
 _func_exit_;   
        
 }
@@ -1624,7 +1714,7 @@ inline void rtw_indicate_scan_done( _adapter *padapter, bool aborted)
                struct pwrctrl_priv *pwrpriv;
 
                pwrpriv = adapter_to_pwrctl(padapter);
-               pwrpriv->ips_deny_time = rtw_get_current_time();
+               rtw_set_ips_deny(padapter, 0);
 #ifdef CONFIG_IPS_CHECK_IN_WD
                _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 1);
 #else // !CONFIG_IPS_CHECK_IN_WD
@@ -1727,6 +1817,7 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl
                        _rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));
                                                
                        _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
+                       psta->dot11txpn.val = psta->dot11txpn.val + 1;
 #ifdef CONFIG_IEEE80211W
                        _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48));
 #endif //CONFIG_IEEE80211W
@@ -1962,7 +2053,7 @@ _func_enter_;
                        }
                        else
                        {
-                               ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
+                               ptarget_wlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, pnetwork);
                                if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){
                                        if(ptarget_wlan)        ptarget_wlan->fixed = _TRUE;                    
                                }
@@ -1975,7 +2066,7 @@ _func_enter_;
                        }
                        else
                        {                       
-                               RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n"));
+                               DBG_871X_LEVEL(_drv_always_, "Can't find ptarget_wlan when joinbss_event callback\n");
                                _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
                                goto ignore_joinbss_callback;
                        }
@@ -2099,7 +2190,8 @@ _func_enter_;
 _func_exit_;
 }
 
-#if (RATE_ADAPTIVE_SUPPORT==1) //for 88E RA            
+#if 0
+//#if (RATE_ADAPTIVE_SUPPORT==1)       //for 88E RA            
 u8 search_max_mac_id(_adapter *padapter)
 {
        u8 mac_id, aid;
@@ -2168,7 +2260,7 @@ void rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstat
 
        #if (RATE_ADAPTIVE_SUPPORT==1)  //for 88E RA    
        {
-               u8 macid = search_max_mac_id(adapter);                          
+               u8 macid = rtw_search_max_mac_id(adapter);                              
                rtw_hal_set_hwreg(adapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&macid);
        }
        #endif
@@ -2234,6 +2326,10 @@ _func_enter_;
                        rtw_indicate_sta_assoc_event(adapter, psta);
 #endif //!CONFIG_IOCTL_CFG80211
 #endif //!CONFIG_AUTO_AP_MODE
+
+#ifdef CONFIG_BEAMFORMING
+                       beamforming_wk_cmd(adapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);
+#endif
                }               
                goto exit;
        }       
@@ -2296,7 +2392,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, _TRUE);
+       rtw_setstakey_cmd(adapter, psta, _FALSE, _TRUE);
 #endif
                
 exit:
@@ -2397,7 +2493,7 @@ _func_enter_;
                pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);   
                if (pwlan) {                    
                        pwlan->fixed = _FALSE;
-                       rtw_free_network_nolock(pmlmepriv, pwlan);
+                       rtw_free_network_nolock(adapter, pwlan);
                }
                _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
 
@@ -2427,7 +2523,7 @@ _func_enter_;
                        if(pwlan)       
                        {
                                pwlan->fixed = _FALSE;
-                               rtw_free_network_nolock(pmlmepriv, pwlan); 
+                               rtw_free_network_nolock(adapter, pwlan); 
                        }
                        _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
                        //re-create ibss
@@ -2487,6 +2583,17 @@ _func_exit_;
 
 }
 
+
+void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf)
+{
+_func_enter_;
+
+       WMMOnAssocRsp(padapter);
+
+_func_exit_;
+
+}
+
 /*
 * _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss
 * @adapter: pointer to _adapter structure
@@ -2585,11 +2692,33 @@ void rtw_scan_timeout_handler (_adapter *adapter)
 
        rtw_indicate_scan_done(adapter, _TRUE);
 
+#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211)
+       if (adapter->pbuddy_adapter) {
+               _adapter *buddy_adapter = adapter->pbuddy_adapter;
+               struct mlme_priv *buddy_mlme = &(buddy_adapter->mlmepriv);
+               struct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(buddy_adapter);
+               bool indicate_buddy_scan = _FALSE;
+
+               _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);
+               if (buddy_wdev_priv->scan_request && buddy_mlme->scanning_via_buddy_intf == _TRUE) {
+                       buddy_mlme->scanning_via_buddy_intf = _FALSE;
+                       clr_fwstate(buddy_mlme, _FW_UNDER_SURVEY);
+                       indicate_buddy_scan = _TRUE;
+               }
+               _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);
+
+               if (indicate_buddy_scan == _TRUE) {
+                       rtw_indicate_scan_done(buddy_adapter, _TRUE);
+               }
+       }
+#endif /* CONFIG_CONCURRENT_MODE */
 }
 
 void rtw_mlme_reset_auto_scan_int(_adapter *adapter)
 {
        struct mlme_priv *mlme = &adapter->mlmepriv;
+       struct mlme_ext_priv    *pmlmeext = &adapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
 
 #ifdef CONFIG_P2P
        if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {
@@ -2597,8 +2726,11 @@ void rtw_mlme_reset_auto_scan_int(_adapter *adapter)
                goto exit;
        }
 #endif 
-
-       if(adapter->registrypriv.wifi_spec) {
+       if(pmlmeinfo->VHT_enable) //disable auto scan when connect to 11AC AP
+       {
+               mlme->auto_scan_int_ms = 0;
+       }
+       else if(adapter->registrypriv.wifi_spec && is_client_associated_to_ap(adapter) == _TRUE) {
                mlme->auto_scan_int_ms = 60*1000;
 #ifdef CONFIG_LAYER2_ROAMING
        } else if(rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) {
@@ -2966,7 +3098,7 @@ static int rtw_check_join_candidate(struct mlme_priv *mlme
        }
 
        //check ssid, if needed
-       if(mlme->assoc_ssid.Ssid && mlme->assoc_ssid.SsidLength) {
+       if(mlme->assoc_ssid.Ssid[0] && mlme->assoc_ssid.SsidLength) {
                if(     competitor->network.Ssid.SsidLength != mlme->assoc_ssid.SsidLength
                        || _rtw_memcmp(competitor->network.Ssid.Ssid, mlme->assoc_ssid.Ssid, mlme->assoc_ssid.SsidLength) == _FALSE
                )
@@ -3676,19 +3808,35 @@ void    rtw_ht_use_default_setting(_adapter *padapter)
        rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, (u8 *)&bHwSupportBeamformer);
        rtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, (u8 *)&bHwSupportBeamformee);
        CLEAR_FLAGS(phtpriv->beamform_cap);
-       if(TEST_FLAG(pregistrypriv->beamform_cap, BIT0) && bHwSupportBeamformer)
+       if(TEST_FLAG(pregistrypriv->beamform_cap, BIT4) && bHwSupportBeamformer)
        {
                SET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);
                DBG_871X("[HT] Support Beamformer\n");
        }
-       if(TEST_FLAG(pregistrypriv->beamform_cap, BIT1) && bHwSupportBeamformee)
+       if(TEST_FLAG(pregistrypriv->beamform_cap, BIT5) && bHwSupportBeamformee)
        {
                SET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);
                DBG_871X("[HT] Support Beamformee\n");
        }
 }
 
-//the fucntion is >= passive_level 
+void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len)
+{
+       unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
+       int out_len;
+       u8 *pframe;
+
+       if(padapter->mlmepriv.qospriv.qos_option == 0)
+       {
+               out_len = *pout_len;
+               pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, 
+                                                       _WMM_IE_Length_, WMM_IE, pout_len);
+
+               padapter->mlmepriv.qospriv.qos_option = 1;
+       }
+}
+
+/* the fucntion is >= passive_level */
 unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel)
 {
        u32 ielen, out_len;
@@ -3696,165 +3844,191 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
        unsigned char *p, *pframe;
        struct rtw_ieee80211_ht_cap ht_capie;
        u8      cbw40_enable = 0, stbc_rx_enable = 0, rf_type = 0, operation_bw=0;
-       unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
        struct registry_priv *pregistrypriv = &padapter->registrypriv;
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
-       struct qos_priv         *pqospriv= &pmlmepriv->qospriv;
        struct ht_priv          *phtpriv = &pmlmepriv->htpriv;
-
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
 
        phtpriv->ht_option = _FALSE;
 
-       p = rtw_get_ie(in_ie+12, _HT_CAPABILITY_IE_, &ielen, in_len-12);
-
-       if(p && ielen>0)
-       {
-               if(pqospriv->qos_option == 0)
-               {
-                       out_len = *pout_len;
-                       pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, 
-                                                               _WMM_IE_Length_, WMM_IE, pout_len);
+       out_len = *pout_len;
 
-                       pqospriv->qos_option = 1;
-               }
+       _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap));
 
-               out_len = *pout_len;
+       ht_capie.cap_info = IEEE80211_HT_CAP_DSSSCCK40;
 
-               _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap));
+       if (phtpriv->sgi_20m)
+               ht_capie.cap_info |= IEEE80211_HT_CAP_SGI_20;
 
-               ht_capie.cap_info = IEEE80211_HT_CAP_DSSSCCK40;
-
-               if (phtpriv->sgi_20m)
-                       ht_capie.cap_info |= IEEE80211_HT_CAP_SGI_20;
-
-               // Get HT BW
-               p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12);
-               if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) {
+       /* Get HT BW */
+       if (in_ie == NULL) {
+               /* TDLS: TODO 20/40 issue */
+               if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+                       operation_bw = padapter->mlmeextpriv.cur_bwmode;
+                       if (operation_bw > CHANNEL_WIDTH_40)
+                               operation_bw = CHANNEL_WIDTH_40;
+               } else
+                       /* TDLS: TODO 40? */
+                       operation_bw = CHANNEL_WIDTH_40;
+       } else {
+               p = rtw_get_ie(in_ie, _HT_ADD_INFO_IE_, &ielen, in_len);
+               if (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) {
                        struct HT_info_element *pht_info = (struct HT_info_element *)(p+2);
                        if (pht_info->infos[0] & BIT(2)) {
                                switch (pht_info->infos[0] & 0x3) {
-                                       case 1:
-                                       case 3:
-                                               operation_bw = CHANNEL_WIDTH_40;
-                                               break;
-                                       default:
-                                               operation_bw = CHANNEL_WIDTH_20;
-                                               break;
+                               case 1:
+                               case 3:
+                                       operation_bw = CHANNEL_WIDTH_40;
+                                       break;
+                               default:
+                                       operation_bw = CHANNEL_WIDTH_20;
+                                       break;
                                }
                        } else {
                                operation_bw = CHANNEL_WIDTH_20;
                        }
                }
+       }
 
-               //to disable 40M Hz support while gd_bw_40MHz_en = 0
-               if (channel > 14) {
-                       if ((pregistrypriv->bw_mode & 0xf0) > 0)
-                               cbw40_enable = 1;
-               } else {
-                       if ((pregistrypriv->bw_mode & 0x0f) > 0)
-                               cbw40_enable = 1;
-               }
+       /* to disable 40M Hz support while gd_bw_40MHz_en = 0 */
+       if (channel > 14) {
+               if ((pregistrypriv->bw_mode & 0xf0) > 0)
+                       cbw40_enable = 1;
+       } else {
+               if ((pregistrypriv->bw_mode & 0x0f) > 0)
+                       cbw40_enable = 1;
+       }
 
-               if ((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) {
-                       ht_capie.cap_info |= IEEE80211_HT_CAP_SUP_WIDTH;
-                       if (phtpriv->sgi_40m)
-                               ht_capie.cap_info |= IEEE80211_HT_CAP_SGI_40;
-               }
+       if ((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) {
+               ht_capie.cap_info |= IEEE80211_HT_CAP_SUP_WIDTH;
+               if (phtpriv->sgi_40m)
+                       ht_capie.cap_info |= IEEE80211_HT_CAP_SGI_40;
+       }
 
-               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX))
-                       ht_capie.cap_info |= IEEE80211_HT_CAP_TX_STBC;
+       if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX))
+               ht_capie.cap_info |= IEEE80211_HT_CAP_TX_STBC;
 
-               //todo: disable SM power save mode
-               ht_capie.cap_info |= IEEE80211_HT_CAP_SM_PS;
+       /* todo: disable SM power save mode */
+       ht_capie.cap_info |= IEEE80211_HT_CAP_SM_PS;
 
-               if (TEST_FLAG(padapter->mlmepriv.htpriv.stbc_cap, STBC_HT_ENABLE_RX)) {
-                       if((pregistrypriv->rx_stbc == 0x3) ||//enable for 2.4/5 GHz     
-                               ((channel <= 14) && (pregistrypriv->rx_stbc == 0x1)) || //enable for 2.4GHz
-                               ((channel > 14) && (pregistrypriv->rx_stbc == 0x2)) || //enable for 5GHz
-                               (pregistrypriv->wifi_spec==1))
-                       {
-                               stbc_rx_enable = 1;
-                               DBG_871X("declare supporting RX STBC\n");
-                       }
+       if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) {
+               if((pregistrypriv->rx_stbc == 0x3) ||                                                   /* enable for 2.4/5 GHz */
+                       ((channel <= 14) && (pregistrypriv->rx_stbc == 0x1)) || /* enable for 2.4GHz */
+                       ((channel > 14) && (pregistrypriv->rx_stbc == 0x2)) ||          /* enable for 5GHz */
+                       (pregistrypriv->wifi_spec == 1)) {
+                       stbc_rx_enable = 1;
+                       DBG_871X("declare supporting RX STBC\n");
                }
+       }
 
-               rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
-#ifdef RTL8192C_RECONFIG_TO_1T1R
-               rf_type = RF_1T1R;
-#endif
-               switch(rf_type)
-               {
-                       case RF_1T1R:
-                       
-                               if (stbc_rx_enable)
-                                       ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;//RX STBC One spatial stream
-
-                               _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16);
-                               break;
+       //fill default supported_mcs_set
+       _rtw_memcpy(ht_capie.supp_mcs_set, pmlmeext->default_supported_mcs_set, 16);
 
-                       case RF_2T2R:
-                       case RF_1T2R:
-                       default:
+       //update default supported_mcs_set
+       rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 
-                               if (stbc_rx_enable)
-                                       ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_2R;//RX STBC two spatial stream
+       switch(rf_type)
+       {
+       case RF_1T1R:
+               
+               if (stbc_rx_enable)
+                       ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;//RX STBC One spatial stream
 
-                               #ifdef CONFIG_DISABLE_MCS13TO15
-                               if(((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec!=1))
-                                       _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R_MCS13TO15_OFF, 16);
-                               else
-                                       _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
-                               #else //CONFIG_DISABLE_MCS13TO15
-                               _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
-                               #endif //CONFIG_DISABLE_MCS13TO15
-                               break;
-               }
+                       set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_1R);                       
+                       break;
 
-               {
-                       u32 rx_packet_offset, max_recvbuf_sz;
-                       rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset);
-                       rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz);
-                       //if(max_recvbuf_sz-rx_packet_offset>(8191-256)) {
-                       //      DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__);
-                       //      ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU;
-                       //}
-               }
-               /*      
-               AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
-               AMPDU_para [4:2]:Min MPDU Start Spacing 
-               */
-
-               /*              
-               #if defined(CONFIG_RTL8188E )&& defined (CONFIG_SDIO_HCI)
-               ht_capie.ampdu_params_info = 2;
-               #else
-               ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03);
-               #endif
-               */
+       case RF_2T2R:
+       case RF_1T2R:
+       default:
 
-               rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
-               ht_capie.ampdu_params_info = (max_rx_ampdu_factor&0x03);
+               if (stbc_rx_enable)
+                       ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_2R;//RX STBC two spatial stream
 
-               if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )
-                       ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));
+               #ifdef CONFIG_DISABLE_MCS13TO15
+               if(((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec!=1))
+                               set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R_13TO15_OFF);    
                else
-                       ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);
+                               set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);       
+               #else //CONFIG_DISABLE_MCS13TO15
+                       set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);       
+               #endif //CONFIG_DISABLE_MCS13TO15
+               break;
+       }
+
+       {
+               u32 rx_packet_offset, max_recvbuf_sz;
+               rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset);
+               rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz);
+               //if(max_recvbuf_sz-rx_packet_offset>(8191-256)) {
+               //      DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__);
+               //      ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU;
+               //}
+       }
+       /*      
+       AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
+       AMPDU_para [4:2]:Min MPDU Start Spacing 
+       */
+
+       /*
+       #if defined(CONFIG_RTL8188E )&& defined (CONFIG_SDIO_HCI)
+       ht_capie.ampdu_params_info = 2;
+       #else
+       ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03);
+       #endif
+       */
 
+       if(padapter->driver_rx_ampdu_factor != 0xFF)
+               max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;
+       else
+       rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+                               
+       //rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+       ht_capie.ampdu_params_info = (max_rx_ampdu_factor&0x03);
 
-               pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, 
-                                                       sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len);
+       if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )
+               ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));
+       else
+               ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);
 
-               phtpriv->ht_option = _TRUE;
+#ifdef CONFIG_BEAMFORMING
+       ht_capie.tx_BF_cap_info = 0;
 
-               p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12);
+       // HT Beamformer
+       if(TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE))
+       {
+               // Transmit NDP Capable
+               SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(&ht_capie, 1);
+               // Explicit Compressed Steering Capable
+               SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(&ht_capie, 1);
+               // Compressed Steering Number Antennas
+               SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(&ht_capie, 1);
+       }
+
+       // HT Beamformee
+       if(TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE))
+       {
+               // Receive NDP Capable
+               SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(&ht_capie, 1);
+               // Explicit Compressed Beamforming Feedback Capable
+               SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(&ht_capie, 2);
+       }
+#endif
+
+       pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, 
+                                               sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len);
+
+       phtpriv->ht_option = _TRUE;
+
+       if(in_ie!=NULL)
+       {
+               p = rtw_get_ie(in_ie, _HT_ADD_INFO_IE_, &ielen, in_len);
                if(p && (ielen==sizeof(struct ieee80211_ht_addt_info)))
                {
                        out_len = *pout_len;            
                        pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len);
                }
-
        }
-       
+
        return (phtpriv->ht_option);
        
 }
@@ -3891,7 +4065,9 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
        {
                if(pregistrypriv->wifi_spec==1)
                {
-                       phtpriv->ampdu_enable = _FALSE;
+                       //remove this part because testbed AP should disable RX AMPDU
+                       //phtpriv->ampdu_enable = _FALSE;
+                       phtpriv->ampdu_enable = _TRUE;
                }
                else
                {
@@ -3900,7 +4076,8 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
        }
        else if(pregistrypriv->ampdu_enable==2)
        {
-               phtpriv->ampdu_enable = _TRUE;
+               //remove this part because testbed AP should disable RX AMPDU
+               //phtpriv->ampdu_enable = _TRUE;
        }
 
        
@@ -3943,34 +4120,31 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
                int i;
                u8      rf_type;
 
-               padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+               rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 
-               //update the MCS rates
+               //update the MCS set
                for (i = 0; i < 16; i++)
+                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];
+
+               //update the MCS rates
+               switch(rf_type)
                {
-                       if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
-                       {
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
-                       }
-                       else
-                       {
-                               #ifdef CONFIG_DISABLE_MCS13TO15
-                               if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )
-                               {
-                                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
-                               }
+                       case RF_1T1R:
+                       case RF_1T2R:
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);                                                        
+                               break;
+                       case RF_2T2R:                   
+                       default:
+#ifdef CONFIG_DISABLE_MCS13TO15
+                               if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )                          
+                                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);                             
                                else
-                                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                               #else
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                               #endif //CONFIG_DISABLE_MCS13TO15
-                       }
-                       #ifdef RTL8192C_RECONFIG_TO_1T1R
-                       {
-                               pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
-                       }
-                       #endif
+                                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#else //CONFIG_DISABLE_MCS13TO15
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#endif //CONFIG_DISABLE_MCS13TO15
                }
+
                //switch to the 40M Hz mode accoring to the AP
                //pmlmeext->cur_bwmode = CHANNEL_WIDTH_40;
                switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
@@ -4054,6 +4228,41 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
 
 }
 
+#ifdef CONFIG_TDLS
+void rtw_issue_addbareq_cmd_tdls(_adapter *padapter, struct xmit_frame *pxmitframe)
+{
+       struct pkt_attrib *pattrib =&pxmitframe->attrib;
+       struct sta_info *ptdls_sta = NULL;
+       u8 issued;
+       int priority;
+       struct ht_priv  *phtpriv;
+
+       priority = pattrib->priority;
+
+       if(pattrib->direct_link == _TRUE)
+       {
+               ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);
+               if((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_ESTABLISHED))
+               {
+                       phtpriv = &ptdls_sta->htpriv;
+
+                       if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) 
+                       {
+                               issued = (phtpriv->agg_enable_bitmap>>priority)&0x1;
+                               issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1;
+
+                               if(0==issued)
+                               {
+                                       DBG_871X("rtw_issue_addbareq_cmd, p=%d\n", priority);
+                                       ptdls_sta->htpriv.candidate_tid_bitmap |= BIT((u8)priority);
+                                       rtw_addbareq_cmd(padapter,(u8)priority, pattrib->dst);
+                               }
+                       }
+               }
+       }
+}
+#endif //CONFIG_TDLS
+
 void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe)
 {
        u8 issued;
@@ -4069,12 +4278,16 @@ void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe)
        
        priority = pattrib->priority;
 
+#ifdef CONFIG_TDLS
+       rtw_issue_addbareq_cmd_tdls(padapter, pxmitframe);
+#endif //CONFIG_TDLS
+
        psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
        if(pattrib->psta != psta)
        {
                DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
                return;
-       }       
+       }
        
        if(psta==NULL)
        {
@@ -4103,7 +4316,7 @@ void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe)
                        rtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra);
                }
        }
-       
+
 }
 
 void rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len)
@@ -4271,4 +4484,3 @@ u8 rtw_get_buddy_bBusyTraffic(_adapter *padapter)
 }
 
 #endif //CONFIG_CONCURRENT_MODE
-
index a5c1538b1a3744ae89dd4519817e52232a7cd98b..e3f4e811daa045efd0c2f6624297bcecbdc03059 100755 (executable)
@@ -44,6 +44,7 @@ struct mlme_handler mlme_sta_tbl[]={
        {WIFI_AUTH,                     "OnAuth",               &OnAuthClient},
        {WIFI_DEAUTH,           "OnDeAuth",             &OnDeAuth},
        {WIFI_ACTION,           "OnAction",             &OnAction},
+       {WIFI_ACTION_NOACK,"OnActionNoAck",     &OnAction},
 };
 
 #ifdef _CONFIG_NATIVEAP_MLME_
@@ -66,6 +67,7 @@ struct mlme_handler mlme_ap_tbl[]={
        {WIFI_AUTH,                     "OnAuth",               &OnAuth},
        {WIFI_DEAUTH,           "OnDeAuth",             &OnDeAuth},
        {WIFI_ACTION,           "OnAction",             &OnAction},
+       {WIFI_ACTION_NOACK,"OnActionNoAck",     &OnAction},
 };
 #endif
 
@@ -86,7 +88,8 @@ struct action_handler OnAction_tbl[]={
        //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_WMM, "ACTION_WMM", &OnAction_wmm},
+       {RTW_WLAN_CATEGORY_VHT, "ACTION_VHT", &OnAction_vht},
        {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p},   
 };
 
@@ -110,16 +113,6 @@ unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02};
 
 extern unsigned char REALTEK_96B_IE[];
 
-/********************************************************
-MCS rate definitions
-*********************************************************/
-#ifdef CONFIG_DISABLE_MCS13TO15
-unsigned char  MCS_rate_2R_MCS13TO15_OFF[16] = {0xff, 0x1f, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-unsigned char  MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-#else //CONFIG_DISABLE_MCS13TO15
-unsigned char  MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-#endif //CONFIG_DISABLE_MCS13TO15
-unsigned char  MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
 
 /********************************************************
 ChannelPlan definitions
@@ -342,18 +335,24 @@ int init_hw_mlme_ext(_adapter *padapter)
        return _SUCCESS;
 }
 
-static void init_mlme_ext_priv_value(_adapter* padapter)
+void init_mlme_default_rate_set(_adapter* padapter)
 {
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-#ifdef CONFIG_TDLS
-       u8 i;
-#endif
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 
-       //unsigned char default_channel_set[MAX_CHANNEL_NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0};
        unsigned char   mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff};
        unsigned char   mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, _12M_RATE_, _24M_RATE_, 0xff,};
+       unsigned char   supported_mcs_set[16] = {0xff, 0xff, 0x00, 0x00, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+
+       _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
+       _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
+
+       _rtw_memcpy(pmlmeext->default_supported_mcs_set, supported_mcs_set, sizeof(pmlmeext->default_supported_mcs_set));
+}
+
+static void init_mlme_ext_priv_value(_adapter* padapter)
+{
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
 
        ATOMIC_SET(&pmlmeext->event_seq, 0);
        pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode
@@ -370,10 +369,7 @@ static void init_mlme_ext_priv_value(_adapter* padapter)
 
        pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode;
 
-       //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len);
-       //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, MAX_CHANNEL_NUM);
-       _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
-       _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
+       init_mlme_default_rate_set(padapter);
 
        if(pmlmeext->cur_channel > 14)
                pmlmeext->tx_rate = IEEE80211_OFDM_RATE_6MB;
@@ -693,6 +689,8 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame)
        u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
        u8 *pframe = precv_frame->u.hdr.rx_data;
        struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe));
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
 
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
                 ("+mgt_dispatcher: type(0x%x) subtype(0x%x)\n",
@@ -731,13 +729,13 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame)
        if((index << 4)==WIFI_ACTION){
                //category==public (4), action==TDLS_DISCOVERY_RESPONSE
                if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){
-                       DBG_871X("recv tdls discovery response frame\n");
+                       DBG_871X("recv tdls discovery response frame from "MAC_FMT"\n", MAC_ARG(GetAddr2Ptr(pframe)));
                        On_TDLS_Dis_Rsp(padapter, precv_frame);
                }
        }
 #endif //CONFIG_TDLS
 
-       if (index > 13)
+       if (index >= (sizeof(mlme_sta_tbl) /sizeof(struct mlme_handler)))
        {
                RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Currently we do not support reserved sub-fr-type=%d\n", index));
                return;
@@ -752,6 +750,7 @@ void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame)
                        if (precv_frame->u.hdr.attrib.seq_num == psta->RxMgmtFrameSeqNum)
                        {
                                /* drop the duplicate management frame */
+                               pdbgpriv->dbg_rx_dup_mgt_frame_drop_count++;
                                DBG_871X("Drop duplicate management frame with seq_num = %d.\n", precv_frame->u.hdr.attrib.seq_num);
                                return;
                        }
@@ -1303,7 +1302,10 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame)
                        pmlmeext->bcn_cnt = 0;
                        _rtw_memset(pmlmeext->bcn_delay_cnt, 0, sizeof(pmlmeext->bcn_delay_cnt));
                        _rtw_memset(pmlmeext->bcn_delay_ratio, 0, sizeof(pmlmeext->bcn_delay_ratio));
-                       
+
+#ifdef CONFIG_P2P_PS
+                       process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN));
+#endif //CONFIG_P2P_PS
 
                        //start auth
                        start_clnt_auth(padapter);
@@ -2229,6 +2231,10 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame)
                if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) {
                        _rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1);
                }
+               else // for Frame without Operating Mode notify ie; default: 80M
+               {
+                       pstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;
+               }
        }
        else {
                pstat->flags &= ~WLAN_STA_VHT;
@@ -2845,6 +2851,9 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame)
        u8 *pframe = precv_frame->u.hdr.rx_data;
        struct sta_priv *pstapriv = &padapter->stapriv;
 #ifdef CONFIG_80211N_HT
+
+       DBG_871X("%s\n", __FUNCTION__);
+
        //check RA matches or not       
        if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
                return _SUCCESS;
@@ -2854,7 +2863,6 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame)
        if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN))
                return _SUCCESS;
 */
-       DBG_871X("%s\n", __FUNCTION__);
 
        if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) 
                if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))
@@ -2874,9 +2882,9 @@ unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame)
 #ifdef CONFIG_TDLS
                if((psta->tdls_sta_state & TDLS_LINKED_STATE) && 
                        (psta->htpriv.ht_option==_TRUE) &&
-                       (psta->htpriv.ampdu_enable==_TRUE) )
+                       (psta->htpriv.ampdu_enable==_TRUE))
                {
-                       //do nothing; just don't want to return _SUCCESS;
+                       DBG_871X("Recv [%s] from direc link\n", __FUNCTION__);
                }
                else
 #endif //CONFIG_TDLS
@@ -3174,7 +3182,7 @@ void issue_p2p_GO_request(_adapter *padapter, u8* raddr)
 
        //      Value:
        //      Todo the tie breaker bit.
-       p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
+       p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) &  0xFE );
 
        //      Configuration Timeout
        //      Type:
@@ -5803,14 +5811,13 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
 
                                //      Commented by Kurt 20120113
                                //      Get peer_dev_addr here if peer doesn't issue prov_disc frame.
-                               if( _rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN) );
+                               if( _rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN) )
                                        _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);
 
                                result = process_p2p_group_negotation_req( pwdinfo, frame_body, len );
                                issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result );
 #ifdef CONFIG_INTEL_WIDI
-                               if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
-                               {
+                               if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
                                        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, 0);
@@ -6059,8 +6066,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                        _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) )
-                               {
+                               if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
                                        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, 0);
@@ -6145,8 +6151,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
                                _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
 #ifdef CONFIG_INTEL_WIDI
-                               if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
-                               {
+                               if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
                                        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, 0);
@@ -6253,6 +6258,33 @@ exit:
 
 unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame)
 {
+       u8 *pframe = precv_frame->u.hdr.rx_data;
+       uint frame_len = precv_frame->u.hdr.len;
+       u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
+       u8 category, action;
+
+       /* check RA matches or not */
+       if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))
+               goto exit;
+
+       category = frame_body[0];
+       if(category != RTW_WLAN_CATEGORY_HT)
+               goto exit;
+
+       action = frame_body[1];
+       switch (action) {
+       case RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING:
+#ifdef CONFIG_BEAMFORMING
+               //DBG_871X("RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING\n");
+               beamforming_get_report_frame(padapter, precv_frame);
+#endif //CONFIG_BEAMFORMING
+               break;
+       default:
+               break;
+       }
+
+exit:
+
        return _SUCCESS;
 }
 
@@ -6300,6 +6332,49 @@ unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame)
        return _SUCCESS;
 }
 
+unsigned int OnAction_vht(_adapter *padapter, union recv_frame *precv_frame)
+{
+#ifdef CONFIG_80211AC_VHT
+       struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib;
+       u8 *pframe = precv_frame->u.hdr.rx_data;
+       uint frame_len = precv_frame->u.hdr.len;
+       u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
+       u8 category, action;
+       struct sta_info *psta = NULL;
+
+       /* check RA matches or not */
+       if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))
+               goto exit;
+
+       category = frame_body[0];
+       if(category != RTW_WLAN_CATEGORY_VHT)
+               goto exit;
+
+       action = frame_body[1];
+       switch (action) {
+       case RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING:
+#ifdef CONFIG_BEAMFORMING
+               //DBG_871X("RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING\n");
+               beamforming_get_report_frame(padapter, precv_frame);
+#endif //CONFIG_BEAMFORMING
+               break;
+       case RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION:
+               // CategoryCode(1) + ActionCode(1) + OpModeNotification(1)
+               //DBG_871X("RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION\n");
+               psta = rtw_get_stainfo(&padapter->stapriv, prxattrib->ta);
+               if (psta)
+                       rtw_process_vht_op_mode_notify(padapter, &frame_body[2], psta);
+               break;
+       default:
+               break;
+       }
+
+exit:
+#endif //CONFIG_80211AC_VHT
+
+       return _SUCCESS;
+}
+
 unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)
 {
 #ifdef CONFIG_P2P
@@ -6308,10 +6383,7 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)
        u8 *pframe = precv_frame->u.hdr.rx_data;
        uint len = precv_frame->u.hdr.len;
        struct  wifidirect_info *pwdinfo = &( padapter->wdinfo );
-       
 
-       DBG_871X("%s\n", __FUNCTION__);
-       
        //check RA matches or not
        if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
                return _SUCCESS;
@@ -6478,6 +6550,7 @@ void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
        else
                wireless_mode = WIRELESS_11G;
        pattrib->raid =  rtw_get_mgntframe_raid(padapter, wireless_mode);
+       pattrib->rate = pmlmeext->tx_rate;
 
        pattrib->encrypt = _NO_PRIVACY_;
        pattrib->bswenc = _FALSE;       
@@ -6652,7 +6725,11 @@ void issue_beacon(_adapter *padapter, int timeout_ms)
 
        //DBG_871X("%s\n", __FUNCTION__);
 
+#ifdef CONFIG_BCN_ICF
+       if ((pmgntframe = rtw_alloc_bcnxmitframe(pxmitpriv)) == NULL)
+#else
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
+#endif
        {
                DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__);
                return;
@@ -7151,7 +7228,9 @@ 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)
+               /* IOT issue, When wifi_spec is not set, send probe_resp with P2P IE even if probe_req has no P2P IE */
+               && (is_valid_p2p_probereq || !padapter->registrypriv.wifi_spec))
        {
                u32 len;
 #ifdef CONFIG_IOCTL_CFG80211
@@ -7237,7 +7316,7 @@ void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probe
 
 }
 
-int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, int wait_ack)
+int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, bool append_wps, int wait_ack)
 {
        int ret = _FAIL;
        struct xmit_frame               *pmgntframe;
@@ -7315,25 +7394,19 @@ int _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, int wai
                pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));
        }
 
-#if 0
-       //add wps_ie for wps2.0
-       if(pmlmepriv->probereq_wpsie_len>0 && pmlmepriv->probereq_wpsie_len<MAX_WPS_IE_LEN)
-       {
-               _rtw_memcpy(pframe, pmlmepriv->probereq_wpsie, pmlmepriv->probereq_wpsie_len);
-               pframe += pmlmepriv->probereq_wpsie_len;
-               pattrib->pktlen += pmlmepriv->probereq_wpsie_len;
-               //pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero            
-       }       
-#else
-       //add wps_ie for wps2.0
-       if(pmlmepriv->wps_probe_req_ie_len>0 && pmlmepriv->wps_probe_req_ie)
-       {
-               _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);
-               pframe += pmlmepriv->wps_probe_req_ie_len;
-               pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
-               //pmlmepriv->wps_probe_req_ie_len = 0 ;//reset to zero          
-       }       
-#endif
+       if (ch)
+               pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, &ch, &pattrib->pktlen);
+
+       if (append_wps) {
+               //add wps_ie for wps2.0
+               if(pmlmepriv->wps_probe_req_ie_len>0 && pmlmepriv->wps_probe_req_ie)
+               {
+                       _rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);
+                       pframe += pmlmepriv->wps_probe_req_ie_len;
+                       pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
+                       //pmlmepriv->wps_probe_req_ie_len = 0 ;//reset to zero
+               }
+       }
 
        pattrib->last_txcmdsz = pattrib->pktlen;
 
@@ -7352,10 +7425,10 @@ exit:
 
 inline void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da)
 {
-       _issue_probereq(padapter, pssid, da, _FALSE);
+       _issue_probereq(padapter, pssid, da, 0, 1, _FALSE);
 }
 
-int issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da,
+int issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, bool append_wps,
        int try_cnt, int wait_ms)
 {
        int ret;
@@ -7364,7 +7437,7 @@ int issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da,
 
        do
        {
-               ret = _issue_probereq(padapter, pssid, da, wait_ms>0?_TRUE:_FALSE);
+               ret = _issue_probereq(padapter, pssid, da, ch, append_wps, wait_ms>0?_TRUE:_FALSE);
 
                i++;
 
@@ -7769,6 +7842,7 @@ void issue_assocreq(_adapter *padapter)
        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        int     bssrate_len = 0, sta_bssrate_len = 0;
+       u8      vs_ie_length = 0;
 #ifdef CONFIG_P2P
        struct wifidirect_info  *pwdinfo = &(padapter->wdinfo);
        u8                                      p2pie[ 255 ] = { 0x00 };
@@ -7780,6 +7854,10 @@ void issue_assocreq(_adapter *padapter)
 
 #ifdef CONFIG_DFS
        u16     cap;
+
+       /* Dot H */
+       u8 pow_cap_ele[2] = { 0x00 };
+       u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2;      //For supported channel
 #endif //CONFIG_DFS
 
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
@@ -7812,7 +7890,7 @@ void issue_assocreq(_adapter *padapter)
 
 #ifdef CONFIG_DFS
        _rtw_memcpy(&cap, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
-       cap |= BIT(8);
+       cap |= cap_SpecMgmt;
        _rtw_memcpy(pframe, &cap, 2);
 #else
        _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);
@@ -7831,6 +7909,33 @@ void issue_assocreq(_adapter *padapter)
        //SSID
        pframe = rtw_set_ie(pframe, _SSID_IE_,  pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen));
 
+#ifdef CONFIG_DFS
+       /* Dot H */
+       if(pmlmeext->cur_channel > 14)
+       {
+               pow_cap_ele[0] = 13;    // Minimum transmit power capability
+               pow_cap_ele[1] = 21;    // Maximum transmit power capability
+               pframe = rtw_set_ie(pframe, EID_PowerCap, 2, pow_cap_ele, &(pattrib->pktlen));
+
+               //supported channels
+               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 );
+               pframe = rtw_set_ie(pframe, EID_SupportedChannels, idx_5g, sup_ch, &(pattrib->pktlen));
+       }
+#endif //CONFIG_DFS
+
        //supported rate & extended supported rate
 
 #if 1  // Check if the AP's supported rates are also supported by STA.
@@ -7924,17 +8029,18 @@ void issue_assocreq(_adapter *padapter)
                                if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) ||
                                                (_rtw_memcmp(pIE->data, WMM_OUI, 4)) ||
                                                (_rtw_memcmp(pIE->data, WPS_OUI, 4)))
-                               {
-                                       if(!padapter->registrypriv.wifi_spec)
+                               {       
+                                       vs_ie_length = pIE->Length;
+                                       if((!padapter->registrypriv.wifi_spec) && (_rtw_memcmp(pIE->data, WPS_OUI, 4)))
                                        {
                                                //Commented by Kurt 20110629
                                                //In some older APs, WPS handshake
                                                //would be fail if we append vender extensions informations to AP
-                                               if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){
-                                                       pIE->Length=14;
-                                               }
+
+                                               vs_ie_length = 14;
                                        }
-                                       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen));
+                                       
+                                       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, vs_ie_length, pIE->data, &(pattrib->pktlen));
                                }
                                break;
 
@@ -8878,7 +8984,11 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
                                #endif
                                */
+                               if(padapter->driver_rx_ampdu_factor != 0xFF)
+                                       max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;
+                               else
                                rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+                               
                                if(MAX_AMPDU_FACTOR_64K == max_rx_ampdu_factor)
                                        BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
                                else if(MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor)
@@ -8891,7 +9001,8 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                        BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size       
 
 #ifdef CONFIG_BT_COEXIST
-                               if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE)
+                               if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE && 
+                                       padapter->driver_rx_ampdu_factor == 0xFF)
                                {
                                        // max buffer size is 8 MSDU
                                        BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
@@ -8905,6 +9016,10 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
                                        BA_para_set = cpu_to_le16(BA_para_set | BIT(0));
                                else //auto
                                        BA_para_set = cpu_to_le16(BA_para_set);
+                                       
+                               //set amsdu_ampdu to auto during wifi logo test
+                               if (padapter->registrypriv.wifi_spec)
+                                       BA_para_set = cpu_to_le16(BA_para_set);
                                
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
                                pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen));
@@ -9239,6 +9354,7 @@ void site_survey(_adapter *padapter)
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        u32 initialgain = 0;
+       u32 channel_scan_time_ms = 0,val32 = 0;
 
 #ifdef CONFIG_P2P
 
@@ -9394,43 +9510,62 @@ void site_survey(_adapter *padapter)
                                int i;
                                for(i=0;i<RTW_SSID_SCAN_AMOUNT;i++){
                                        if(pmlmeext->sitesurvey_res.ssid[i].SsidLength) {
-                                               //todo: to issue two probe req???
-                                               issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
-                                               //rtw_msleep_os(SURVEY_TO>>1);
+                                               /* IOT issue, When wifi_spec is not set, send one probe req without WPS IE. */
+                                               if (padapter->registrypriv.wifi_spec)
+                                                       issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
+                                               else
+                                                       issue_probereq_ex(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL, 0, 0, 0, 0);
                                                issue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);
                                        }
                                }
 
                                if(pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
-                                       //todo: to issue two probe req???
-                                       issue_probereq(padapter, NULL, NULL);
-                                       //rtw_msleep_os(SURVEY_TO>>1);
+                                       /* IOT issue, When wifi_spec is not set, send one probe req without WPS IE. */
+                                       if (padapter->registrypriv.wifi_spec)
+                                               issue_probereq(padapter, NULL, NULL);
+                                       else
+                                               issue_probereq_ex(padapter, NULL, NULL, 0, 0, 0, 0);
                                        issue_probereq(padapter, NULL, NULL);
                                }
                        }
                }
+
 #if  defined(CONFIG_ATMEL_RC_PATCH)
                // treat wlan0 & p2p0 in same way, may be changed in near feature.
                // assume home channel is 6, channel switch sequence will be 
                //      1,2-6-3,4-6-5,6-6-7,8-6-9,10-6-11,12-6-13,14
                //if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)==_TRUE)
 
-               if( stay_buddy_ch == 1 )
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
+               if( stay_buddy_ch == 1 ){
+                       channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND;                   
+               }
                else {
                        if( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
-                               set_survey_timer(pmlmeext, 20);
+                               channel_scan_time_ms = 20;
                        else
-                               set_survey_timer(pmlmeext, 40);
+                               channel_scan_time_ms = 40
                }
 #elif defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE)
                if( stay_buddy_ch == 1 )
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
-               else
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                       channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND ;
+               else            
+                       channel_scan_time_ms = pmlmeext->chan_scan_time;
 #else
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                       channel_scan_time_ms = pmlmeext->chan_scan_time;
 #endif
+
+               set_survey_timer(pmlmeext, channel_scan_time_ms);
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               {
+                       struct noise_info info;
+                       info.bPauseDIG = _FALSE;
+                       info.IGIValue = 0;
+                       info.max_time = channel_scan_time_ms/2;//ms
+                       info.chan = survey_channel;
+                       rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);     
+               }
+#endif
+
        }
        else
        {
@@ -9445,7 +9580,7 @@ void site_survey(_adapter *padapter)
                if (rtw_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0)
                {
                        if (0)
-                       DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n",
+                       DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
                                FUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset);
                }
                #ifdef CONFIG_IOCTL_CFG80211
@@ -10576,6 +10711,52 @@ void report_join_res(_adapter *padapter, int res)
 
 }
 
+void report_wmm_edca_update(_adapter *padapter)
+{
+       struct cmd_obj *pcmd_obj;
+       u8      *pevtcmd;
+       u32 cmdsz;
+       struct wmm_event                *pwmm_event;
+       struct C2HEvent_Header  *pc2h_evt_hdr;
+       struct mlme_ext_priv            *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
+
+       if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
+       {
+               return;
+       }
+
+       cmdsz = (sizeof(struct wmm_event) + sizeof(struct C2HEvent_Header));
+       if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
+       {
+               rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
+               return;
+       }
+
+       _rtw_init_listhead(&pcmd_obj->list);
+
+       pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
+       pcmd_obj->cmdsz = cmdsz;
+       pcmd_obj->parmbuf = pevtcmd;
+
+       pcmd_obj->rsp = NULL;
+       pcmd_obj->rspsz  = 0;
+
+       pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
+       pc2h_evt_hdr->len = sizeof(struct wmm_event);
+       pc2h_evt_hdr->ID = GEN_EVT_CODE(_WMM);
+       pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
+
+       pwmm_event = (struct wmm_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
+       pwmm_event->wmm =0;
+       
+       rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
+
+       return;
+
+}
+
 void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason)
 {
        struct cmd_obj *pcmd_obj;
@@ -10798,6 +10979,8 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta)
 
                psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable;
 
+               psta->htpriv.rx_ampdu_min_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;
+
                if (support_short_GI(padapter, &(pmlmeinfo->HT_caps), CHANNEL_WIDTH_20))
                        psta->htpriv.sgi_20m = _TRUE;
 
@@ -10806,6 +10989,10 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta)
 
                psta->qos_option = _TRUE;
 
+               psta->htpriv.ldpc_cap = pmlmepriv->htpriv.ldpc_cap;
+               psta->htpriv.stbc_cap = pmlmepriv->htpriv.stbc_cap;
+               psta->htpriv.beamform_cap = pmlmepriv->htpriv.beamform_cap;
+
                _rtw_memcpy(&psta->htpriv.ht_cap, &pmlmeinfo->HT_caps, sizeof(struct rtw_ieee80211_ht_cap));
        }
        else
@@ -10840,6 +11027,8 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta)
        _rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv));
 #endif //CONFIG_80211AC_VHT
 
+       update_ldpc_stbc_cap(psta);
+
        _enter_critical_bh(&psta->lock, &irqL);
        psta->state = _FW_LINKED;
        _exit_critical_bh(&psta->lock, &irqL);
@@ -10851,10 +11040,27 @@ static void rtw_mlmeext_disconnect(_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 = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
        u8 state_backup = (pmlmeinfo->state&0x03);
 
        //set_opmode_cmd(padapter, infra_client_with_mlme);
 
+#if 1
+       /*
+        * For safety, prevent from keeping macid sleep.
+        * If we can sure all power mode enter/leave are paired,
+        * this check can be removed.
+        * Lucas@20131113
+        */
+       /* wakeup macid after disconnect. */
+       {
+               struct sta_info *psta;
+               psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
+               if (psta)
+                       rtw_hal_macid_wakeup(padapter, psta->mac_id);
+       }
+#endif 
+
        rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
        rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
 
@@ -10992,6 +11198,10 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)
                set_sta_rate(padapter, psta);
                
                rtw_sta_media_status_rpt(padapter, psta, 1);
+
+               /* wakeup macid after join bss successfully to ensure 
+                       the subsequent data frames can be sent out normally */
+               rtw_hal_macid_wakeup(padapter, psta->mac_id);
        }
 
        if (rtw_port_switch_chk(padapter) == _TRUE)
@@ -11014,7 +11224,8 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)
 #endif
 
 #ifdef CONFIG_BEAMFORMING
-       beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);
+       if (psta)
+               beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);
 #endif
 
 exit_mlmeext_joinbss_event_callback:
@@ -11114,38 +11325,17 @@ void _linked_info_dump(_adapter *padapter)
        u8 mac_id;
        int UndecoratedSmoothedPWDB;
        struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
-       #if 0
-       DBG_871X("============ linked status check ===================\n");
-       DBG_871X("pathA Rx SNRdb:%d, pathB Rx SNRdb:%d\n",padapter->recvpriv.RxSNRdB[0], padapter->recvpriv.RxSNRdB[1]);
-       DBG_871X("pathA Rx PWDB:%d\n",padapter->recvpriv.rxpwdb);               
-       rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);
-       DBG_871X("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB);
-       DBG_871X("Rx RSSI:%d\n",padapter->recvpriv.rssi);
-       DBG_871X("Rx Signal_strength:%d\n",padapter->recvpriv.signal_strength);
-       DBG_871X("Rx Signal_qual:%d \n",padapter->recvpriv.signal_qual);
-       if ( check_fwstate( &padapter->mlmepriv,  _FW_LINKED ) )
-       {
-               DBG_871X("bw mode: %d, channel: %d\n", padapter->mlmeextpriv.cur_bwmode, padapter->mlmeextpriv.cur_channel );
-               DBG_871X("received bytes = %d\n", (u32) (padapter->recvpriv.rx_bytes - padapter->recvpriv.last_rx_bytes ) );
-       }       
-       DBG_871X("============ linked status check ===================\n");
-       DBG_871X("============ RX GAIN / FALSE ALARM  ===================\n");
-       DBG_871X(" DIG PATH-A(0x%02x), PATH-B(0x%02x)\n",rtw_read8(padapter,0xc50),rtw_read8(padapter,0xc58));
-       DBG_871X(" OFDM -Alarm DA2(0x%04x),DA4(0x%04x),DA6(0x%04x),DA8(0x%04x)\n",
-               rtw_read16(padapter,0xDA2),rtw_read16(padapter,0xDA4),rtw_read16(padapter,0xDA6),rtw_read16(padapter,0xDA8));
-
-       DBG_871X(" CCK -Alarm A5B(0x%02x),A5C(0x%02x)\n",rtw_read8(padapter,0xA5B),rtw_read8(padapter,0xA5C));
-       #endif
        
        if(padapter->bLinkInfoDump){
 
-               DBG_871X("\n============ linked status check ===================\n");
-               
+               DBG_871X("\n============["ADPT_FMT"] linked status check ===================\n",ADPT_ARG(padapter));    
+
                if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)
                {
                        rtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);      
                
-                       DBG_871X("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB);
+                       DBG_871X("AP[" MAC_FMT "] - UndecoratedSmoothedPWDB:%d\n",
+                               MAC_ARG(padapter->mlmepriv.cur_network.network.MacAddress),UndecoratedSmoothedPWDB);
                }
                else if((pmlmeinfo->state&0x03) == _HW_STATE_AP_)
                {
@@ -11161,10 +11351,10 @@ void _linked_info_dump(_adapter *padapter)
                        while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
                        {
                                psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
-                               plist = get_next(plist);
-       
-                               DBG_871X("STA:UndecoratedSmoothedPWDB:%d\n", 
-                                       psta->rssi_stat.UndecoratedSmoothedPWDB);
+                               plist = get_next(plist);                        
+                               
+                               DBG_871X("STA[" MAC_FMT "]:UndecoratedSmoothedPWDB:%d\n", 
+                                       MAC_ARG(psta->hwaddr),psta->rssi_stat.UndecoratedSmoothedPWDB);
                        }
                        _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);            
                        
@@ -11178,6 +11368,9 @@ void _linked_info_dump(_adapter *padapter)
                                        rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &i);                 
                        }
                }
+               rtw_hal_set_def_var(padapter, HAL_DEF_DBG_RX_INFO_DUMP, NULL);
+                       
+               
        }
              
 
@@ -11227,6 +11420,115 @@ u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta)
        return ret;
 }
 
+#ifdef CONFIG_TDLS
+void linked_status_chk_tdls(_adapter *padapter)
+{
+struct candidate_pool{
+       struct sta_info *psta;
+       u8 addr[ETH_ALEN];
+};
+       struct sta_priv *pstapriv = &padapter->stapriv;
+       _irqL irqL;
+       u8 ack_chk;
+       struct sta_info *psta;
+       int i, num_teardown=0, num_checkalive=0;
+       _list   *plist, *phead;
+       struct tdls_txmgmt txmgmt;
+       struct candidate_pool checkalive[NUM_STA];
+       struct candidate_pool teardown[NUM_STA];
+#define ALIVE_MIN 2
+#define ALIVE_MAX 5
+
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
+       _rtw_memset(checkalive, 0x00, sizeof(checkalive));
+       _rtw_memset(teardown, 0x00, sizeof(teardown));
+
+       if((padapter->tdlsinfo.link_established == _TRUE)){
+               _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);
+                               plist = get_next(plist);
+
+                               if(psta->tdls_sta_state & TDLS_LINKED_STATE)
+                               {
+                                       psta->alive_count++;
+                                       if(psta->alive_count >= ALIVE_MIN)
+                                       {
+#ifdef CONFIG_XMIT_ACK
+                                               if(psta->sta_stats.last_rx_data_pkts >= psta->sta_stats.rx_data_pkts)
+#else
+                                               if((psta->sta_stats.last_rx_data_pkts >= psta->sta_stats.rx_data_pkts) &&
+                                                       (!(psta->tdls_sta_state & TDLS_ALIVE_STATE)) )
+#endif
+                                               {
+                                                       if(psta->alive_count < ALIVE_MAX)
+                                                       {
+                                                               _rtw_memcpy(checkalive[num_checkalive].addr, psta->hwaddr, ETH_ALEN);
+                                                               checkalive[num_checkalive].psta = psta;
+                                                               num_checkalive++;
+                                                       }
+                                                       else
+                                                       {
+                                                               _rtw_memcpy(teardown[num_teardown].addr, psta->hwaddr, ETH_ALEN);
+                                                               teardown[num_teardown].psta = psta;
+                                                               num_teardown++;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       psta->tdls_sta_state &= (~TDLS_ALIVE_STATE);
+                                                       psta->alive_count = 0;
+                                               }
+                                       }
+                                       psta->sta_stats.last_rx_data_pkts = psta->sta_stats.rx_data_pkts;
+                               }
+                       }
+               }
+               _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
+
+               if(num_checkalive > 0)
+               {
+                       for(i=0; i< num_checkalive; i++)
+                       {
+#ifdef CONFIG_XMIT_ACK
+                               //TDLS: Should we set wait_ms to 300 for keeping alive?
+                               ack_chk = issue_nulldata_to_TDLS_peer_STA(padapter,     checkalive[i].addr, 0, 3, 300);
+
+                               if(ack_chk == _SUCCESS)
+                               {
+                                       checkalive[i].psta->alive_count = 0;
+                               }
+#else
+                               checkalive[i].psta->tdls_sta_state &= (~TDLS_ALIVE_STATE);
+                               _rtw_memcpy(txmgmt.peer, checkalive[i].addr, ETH_ALEN);
+                               issue_tdls_dis_req(padapter, &txmgmt);
+                               issue_tdls_dis_req(padapter, &txmgmt);
+                               issue_tdls_dis_req(padapter, &txmgmt);
+#endif //CONFIG_XMIT_ACK
+                       }
+               }
+
+               if(num_teardown > 0)
+               {
+                       for(i=0; i< num_teardown; i++)
+                       {
+                               DBG_871X("[%s %d] Send teardown to "MAC_FMT" \n", __FUNCTION__, __LINE__, MAC_ARG(teardown[i].addr));
+                               txmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_;
+                               _rtw_memcpy(txmgmt.peer, teardown[i].addr, ETH_ALEN);
+                               issue_tdls_teardown(padapter, &txmgmt, _FALSE);
+                       }
+               }
+       }
+
+}
+#endif //CONFIG_TDLS
+
 void linked_status_chk(_adapter *padapter)
 {
        u32     i;
@@ -11291,7 +11593,7 @@ void linked_status_chk(_adapter *padapter)
                                }
 
                                if (rx_chk != _SUCCESS)
-                                       issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, psta->hwaddr, 3, 1);
+                                       issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, psta->hwaddr, 0, 0, 3, 1);
 
                                if ((tx_chk != _SUCCESS && pmlmeinfo->link_count++ == link_count_limit) || rx_chk != _SUCCESS) {
                                        tx_chk = issue_nulldata(padapter, psta->hwaddr, 0, 3, 1);
@@ -11313,9 +11615,9 @@ void linked_status_chk(_adapter *padapter)
                                                #ifdef DBG_EXPIRATION_CHK
                                                DBG_871X("issue_probereq to trigger probersp, retry=%d\n", pmlmeext->retry);
                                                #endif
-                                               issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress);
-                                               issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress);
-                                               issue_probereq(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress);
+                                               issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0);
+                                               issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0);
+                                               issue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0);
                                        }
                                }
 
@@ -11348,6 +11650,11 @@ void linked_status_chk(_adapter *padapter)
                        }
 
                } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL)
+
+#if defined (CONFIG_TDLS) && defined (CONFIG_TDLS_AUTOCHECKALIVE)
+               linked_status_chk_tdls(padapter);
+#endif //CONFIG_TDLS
+
        }
        else if (is_client_associated_to_ibss(padapter))
        {
@@ -11880,49 +12187,6 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
        //u32   acparm;
        u8 ch, bw, offset;
 
-
-#if 1
-       /*
-        * For safety, prevent from keeping macid sleep.
-        * If we can sure all power mode enter/leave are paired,
-        * this check can be removed.
-        * Lucas@20131113
-        */
-       {
-       struct sta_info *psta;
-       psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
-       if (psta)
-               rtw_hal_macid_wakeup(padapter, psta->mac_id);
-       }
-#endif
-
-#ifdef CONFIG_BT_COEXIST
-{
-       static u8 bw_mode = 0;
-
-       if (0 == bw_mode)
-       {
-               bw_mode = pregpriv->bw_mode; // keep original bw_mode
-               DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Save bw_mode(0x%02x)\n",
-                       FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
-       }
-
-       if ((rtw_btcoex_1Ant(padapter) == _TRUE)
-               && (rtw_btcoex_IsBtLinkExist(padapter) == _TRUE))
-       {
-               pregpriv->bw_mode = 0x00;
-               DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Change bw_mode to 20MHz(0x%02x)\n",
-                       FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
-       }
-       else
-       {
-               pregpriv->bw_mode = bw_mode;
-               DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Restore bw_mode(0x%02x)\n",
-                       FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
-       }
-}
-#endif // CONFIG_BT_COEXIST
-
        //check already connecting to AP or not
        if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
        {
@@ -12138,22 +12402,6 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
        WLAN_BSSID_EX           *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
        u8 val8;
 
-
-#if 1
-       /*
-        * For safety, prevent from keeping macid sleep.
-        * If we can sure all power mode enter/leave are paired,
-        * this check can be removed.
-        * Lucas@20131113
-        */
-       {
-       struct sta_info *psta;
-       psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
-       if (psta)
-               rtw_hal_macid_wakeup(padapter, psta->mac_id);
-       }
-#endif
-
        if (is_client_associated_to_ap(padapter))
        {
 #ifdef CONFIG_DFS
@@ -12453,33 +12701,48 @@ u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf)
 
 u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
 {
-       unsigned short                          ctrl;
+       u16     ctrl = 0;
+       s16 cam_id = 0;
        struct setkey_parm              *pparm = (struct setkey_parm *)pbuf;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       unsigned char                                   null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+       unsigned char null_addr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+       u8 *addr;
 
        //main tx key for wep.
        if(pparm->set_tx)
                pmlmeinfo->key_index = pparm->keyid;
-       
-       //write cam
-       ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;      
 
-       DBG_871X_LEVEL(_drv_always_, "set group key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) "
-                       "keyid:%d\n", pparm->algorithm, pparm->keyid);
-       write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key);
-       
+       cam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid);
+
+       if (cam_id < 0){
+       } else {
+               if (cam_id > 3) /* not default key, searched by A2 */
+                       addr = get_bssid(&padapter->mlmepriv);
+               else
+                       addr = null_addr;
+               
+               ctrl = BIT(15) | BIT6 |((pparm->algorithm) << 2) | pparm->keyid;
+               write_cam(padapter, cam_id, ctrl, addr, pparm->key);
+               DBG_871X_LEVEL(_drv_always_, "set group key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n"
+                       ,cam_id, MAC_ARG(addr), pparm->keyid, security_type_str(pparm->algorithm));
+       }
+
+       #ifdef DYNAMIC_CAMID_ALLOC
+       if (cam_id >=0 && cam_id <=3)
+               rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_TRUE);
+       #endif
+
        //allow multicast packets to driver
-        padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
+       padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
 
        return H2C_SUCCESS;
 }
 
 u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
 {
-       u16 ctrl=0;
-       u8 cam_id = 0;//cam_entry
+       u16 ctrl = 0;
+       s16 cam_id = 0;
        u8 ret = H2C_SUCCESS;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
@@ -12490,96 +12753,38 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
        struct tdls_info        *ptdlsinfo = &padapter->tdlsinfo;
 #endif //CONFIG_TDLS
 
-       //cam_entry:
-       //0~3 for default key
+       if(pparm->algorithm == _NO_PRIVACY_)
+               goto write_to_cam;
 
-       //for concurrent mode (ap+sta, sta+sta):
-       //default key is disable, using sw encrypt/decrypt
-       //camid 0, 1, 2, 3 is default entry for default key/group key
-       //macid = 1 is for bc/mc stainfo, no mapping to camid
-       //macid = 0 mapping to camid 4
-       //for macid >=2, camid = macid+3;
-
-
-       if(pparm->algorithm == _NO_PRIVACY_)    // clear cam entry
-       {
-               clear_cam_entry(padapter, pparm->id);
-               ret = H2C_SUCCESS;
-               goto exit_set_stakey_hdl;
+       psta = rtw_get_stainfo(pstapriv, pparm->addr);
+       if (!psta) {
+               DBG_871X_LEVEL(_drv_always_, "%s sta:"MAC_FMT" not found\n", __func__, MAC_ARG(pparm->addr));
+               ret = H2C_REJECTED;
+               goto exit;
        }
 
-       if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
-       {
-               psta = rtw_get_stainfo(pstapriv, pparm->addr);
-               if(psta)
-               {
-                       ctrl = (BIT(15) | ((pparm->algorithm) << 2));
-
-                       DBG_871X("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm);
-
-                       if((psta->mac_id == 1) || (psta->mac_id>(NUM_STA-4)))
-                       {
-                               DBG_871X("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id);
-                               ret = H2C_REJECTED;
-                               goto exit_set_stakey_hdl;
-                       }
-
-                       cam_id = (u8)rtw_get_camid(psta->mac_id);//0~3 for default key, cmd_id=macid + 3;
-
-                       DBG_871X("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0],
-                                               pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4],
-                                               pparm->addr[5], cam_id);
-
-                       write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
-
-                       ret = H2C_SUCCESS_RSP;
-                       goto exit_set_stakey_hdl;
+       pmlmeinfo->enc_algo = pparm->algorithm;
+       cam_id = rtw_camid_alloc(padapter, psta, 0);
+       if (cam_id < 0)
+               goto exit;
 
+write_to_cam:
+       if(pparm->algorithm == _NO_PRIVACY_) {
+               while((cam_id = rtw_camid_search(padapter, pparm->addr, -1)) >= 0) {
+                       DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), cam_id);
+                       clear_cam_entry(padapter, cam_id);
+                       rtw_camid_free(padapter,cam_id);
                }
-               else
-               {
-                       DBG_871X("r871x_set_stakey_hdl(): sta has been free\n");
-                       ret = H2C_REJECTED;
-                       goto exit_set_stakey_hdl;
-               }
-
-       }
-
-
-       //below for sta mode
-
-       if((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)))
-               cam_id = (u8)rtw_get_camid(psta->mac_id);
-       else
-               cam_id = 4;
-
-       ctrl = BIT(15) | ((pparm->algorithm) << 2);
-
-#ifdef CONFIG_TDLS
-       if(ptdlsinfo->clear_cam!=0){
-               clear_cam_entry(padapter, ptdlsinfo->clear_cam);
-               ptdlsinfo->clear_cam=0;
-               ret = H2C_SUCCESS;
-               goto exit_set_stakey_hdl;
-       }
-
-       psta = rtw_get_stainfo(pstapriv, pparm->addr);//Get TDLS Peer STA
-       if( psta->tdls_sta_state&TDLS_LINKED_STATE ){
-               write_cam(padapter, psta->mac_id, ctrl, pparm->addr, pparm->key);
-       }
-       else
-#endif //CONFIG_TDLS
+       } else {
+               DBG_871X_LEVEL(_drv_always_, "set pairwise key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n",
+                       cam_id, MAC_ARG(pparm->addr), pparm->keyid, security_type_str(pparm->algorithm));
+               ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;
                write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
+       }
+       ret = H2C_SUCCESS_RSP;
 
-       pmlmeinfo->enc_algo = pparm->algorithm;
-
-exit_set_stakey_hdl:
-
-       DBG_871X_LEVEL(_drv_always_, "set pairwise key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:%d\n",
-                       pparm->algorithm, cam_id);
-
+exit:
        return ret;
-
 }
 
 u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf)
@@ -12622,6 +12827,32 @@ u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf)
        return  H2C_SUCCESS;
 }
 
+
+u8 chk_bmc_sleepq_cmd(_adapter* padapter)
+{
+       struct cmd_obj *ph2c;
+       struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
+       u8 res = _SUCCESS;
+
+_func_enter_;
+
+       if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
+       {
+               res= _FAIL;
+               goto exit;
+       }
+
+       init_h2fwcmd_w_parm_no_parm_rsp(ph2c, GEN_CMD_CODE(_ChkBMCSleepq));
+
+       res = rtw_enqueue_cmd(pcmdpriv, ph2c);
+
+exit:
+
+_func_exit_;
+
+       return res;
+}
+
 u8 set_tx_beacon_cmd(_adapter* padapter)
 {
        struct cmd_obj  *ph2c;
@@ -12633,13 +12864,13 @@ u8 set_tx_beacon_cmd(_adapter* padapter)
        int len_diff = 0;
        
 _func_enter_;  
-       
+
        if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
        {
                res= _FAIL;
                goto exit;
        }
-       
+
        if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL)
        {
                rtw_mfree((unsigned char *)ph2c, sizeof(struct  cmd_obj));
@@ -12648,14 +12879,14 @@ _func_enter_;
        }
 
        _rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX));
-       
+
        len_diff = update_hidden_ssid(
                ptxBeacon_parm->network.IEs+_BEACON_IE_OFFSET_
                , ptxBeacon_parm->network.IELength-_BEACON_IE_OFFSET_
                , pmlmeinfo->hidden_ssid_mode
        );
        ptxBeacon_parm->network.IELength += len_diff;
-               
+
        init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon));
 
        res = rtw_enqueue_cmd(pcmdpriv, ph2c);
@@ -12677,6 +12908,9 @@ u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf)
        void (*event_callback)(_adapter *dev, u8 *pbuf);
        struct evt_priv *pevt_priv = &(padapter->evtpriv);
 
+       if (pbuf == NULL)
+               goto _abort_event_;
+
        peventbuf = (uint*)pbuf;
        evt_sz = (u16)(*peventbuf&0xffff);
        evt_seq = (u8)((*peventbuf>>24)&0x7f);
@@ -12741,87 +12975,87 @@ u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf)
        return H2C_SUCCESS;
 }
 
-u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf)
+u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
 {
-       if(send_beacon(padapter)==_FAIL)
-       {
-               DBG_871X("issue_beacon, fail!\n");
-               return H2C_PARAMETERS_ERROR;
-       }
 #ifdef CONFIG_AP_MODE
-       else //tx bc/mc frames after update TIM 
-       {       
-               _irqL irqL;
-               struct sta_info *psta_bmc;
-               _list   *xmitframe_plist, *xmitframe_phead;
-               struct xmit_frame *pxmitframe=NULL;
-               struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-               struct sta_priv  *pstapriv = &padapter->stapriv;
-               
-               //for BC/MC Frames
-               psta_bmc = rtw_get_bcmc_stainfo(padapter);
-               if(!psta_bmc)
-                       return H2C_SUCCESS;
-       
-               if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0))
-               {                               
+       _irqL irqL;
+       struct sta_info *psta_bmc;
+       _list   *xmitframe_plist, *xmitframe_phead;
+       struct xmit_frame *pxmitframe=NULL;
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       struct sta_priv  *pstapriv = &padapter->stapriv;
+
+       //for BC/MC Frames
+       psta_bmc = rtw_get_bcmc_stainfo(padapter);
+       if(!psta_bmc)
+               return H2C_SUCCESS;
+
+       if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0))
+       {
 #ifndef CONFIG_PCI_HCI
-                       rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows
+               rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows
 #endif
-                       //_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
-                       _enter_critical_bh(&pxmitpriv->lock, &irqL);
+               //_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);
+               xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
+               xmitframe_plist = get_next(xmitframe_phead);
 
-                       while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
-                       {                       
-                               pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
+               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);
+                       xmitframe_plist = get_next(xmitframe_plist);
 
-                               rtw_list_delete(&pxmitframe->list);
+                       rtw_list_delete(&pxmitframe->list);
 
-                               psta_bmc->sleepq_len--;
-                               if(psta_bmc->sleepq_len>0)
-                                       pxmitframe->attrib.mdata = 1;
-                               else
-                                       pxmitframe->attrib.mdata = 0;
+                       psta_bmc->sleepq_len--;
+                       if(psta_bmc->sleepq_len>0)
+                               pxmitframe->attrib.mdata = 1;
+                       else
+                               pxmitframe->attrib.mdata = 0;
 
-                               pxmitframe->attrib.triggered=1;
+                       pxmitframe->attrib.triggered=1;
 
+                       if (xmitframe_hiq_filter(pxmitframe) == _TRUE)
                                pxmitframe->attrib.qsel = 0x11;//HIQ
 
-#if 0
-                               _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
-                               if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
-                               {               
-                                       rtw_os_xmit_complete(padapter, pxmitframe);
-                               }
-                               _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
-
-#endif
-                               rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
+                       #if 0
+                       _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+                       if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
+                       {
+                               rtw_os_xmit_complete(padapter, pxmitframe);
+                       }
+                       _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+                       #endif
+                       rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
+               }
 
-                               //pstapriv->tim_bitmap &= ~BIT(0);                              
-               
-                       }       
-       
-                       //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);    
-                       _exit_critical_bh(&pxmitpriv->lock, &irqL);
+               //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+               _exit_critical_bh(&pxmitpriv->lock, &irqL);
 
-//#if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+               if (padapter->interface_type != RTW_PCIE) {
+                       /* check hi queue and bmc_sleepq */
                        rtw_chk_hi_queue_cmd(padapter);
+               }
+       }
 #endif
 
-               }
+       return H2C_SUCCESS;
+}
 
+u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf)
+{
+       if(send_beacon(padapter)==_FAIL)
+       {
+               DBG_871X("issue_beacon, fail!\n");
+               return H2C_PARAMETERS_ERROR;
        }
-#endif
+
+       /* tx bc/mc frames after update TIM */
+       chk_bmc_sleepq_hdl(padapter, NULL);
 
        return H2C_SUCCESS;
-       
 }
 
 void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork)
@@ -13861,6 +14095,7 @@ int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset)
 
                connect_allow = chbw_allow;
 
+#ifdef CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT
                #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)
@@ -13869,6 +14104,9 @@ int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset)
                        connect_allow = _TRUE;
                }
                #endif /* CONFIG_P2P && CONFIG_IOCTL_CFG80211 */
+#else
+               connect_allow = _TRUE;
+#endif /* CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT */
 
                DBG_871X("start_clnt_join: connect_allow:%d, chbw_allow:%d\n", connect_allow, chbw_allow);
                if (connect_allow == _TRUE && chbw_allow == _FALSE) {
@@ -13897,7 +14135,7 @@ exit:
        return connect_allow == _TRUE ? _SUCCESS : _FAIL;
 }
 
-/* Find union about ch, bw, ch_offset of all linked interfaces */
+/* Find union about ch, bw, ch_offset of all linked/linking interfaces */
 int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
 {
        struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
@@ -13917,7 +14155,7 @@ int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
                iface = dvobj->padapters[i];
                mlmeext = &iface->mlmeextpriv;
 
-               if (!check_fwstate(&iface->mlmepriv, _FW_LINKED))
+               if (!check_fwstate(&iface->mlmepriv, _FW_LINKED|_FW_UNDER_LINKING))
                        continue;
 
                if (num == 0) {
@@ -14056,8 +14294,7 @@ u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf)
 
 }
 
-// TDLS_WRCR           : write RCR DATA BIT
-// TDLS_SD_PTI         : issue peer traffic indication
+// TDLS_ESTABLISHED    : write RCR DATA BIT
 // TDLS_CS_OFF         : go back to the channel linked with AP, terminating channel switch procedure
 // TDLS_INIT_CH_SEN    : init channel sensing, receive all data and mgnt frame
 // TDLS_DONE_CH_SEN: channel sensing and report candidate channel
@@ -14066,9 +14303,7 @@ u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf)
 // TDLS_P_OFF_CH       : periodically go to off channel
 // TDLS_P_BASE_CH      : periodically go back to base channel
 // TDLS_RS_RCR         : restore RCR
-// TDLS_CKALV_PH1      : check alive timer phase1
-// TDLS_CKALV_PH2      : check alive timer phase2
-// TDLS_FREE_STA       : free tdls sta
+// TDLS_TEAR_STA       : free tdls sta
 u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)
 {
 #ifdef CONFIG_TDLS
@@ -14098,18 +14333,57 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)
        DBG_871X("[%s] option:%d\n", __FUNCTION__, option);
                
        switch(option){
-               case TDLS_WRCR:
+               case TDLS_ESTABLISHED:
+               {
+                       u8 sta_band = 0;
+                       
+                       //leave ALL PS when TDLS is established
+                       rtw_pwr_wakeup(padapter);
+                       
                        //As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0
-                       //such we can receive all kinds of data frames.
+                       //so we can receive all kinds of data frames.                   
                        rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_WRCR, 0);
-                       DBG_871X("TDLS with "MAC_FMT"\n", MAC_ARG(ptdls_sta->hwaddr));
+                       DBG_871X("Created Direct Link with "MAC_FMT"\n", MAC_ARG(ptdls_sta->hwaddr));
 
                        pmlmeinfo->FW_sta_info[ptdls_sta->mac_id].psta = ptdls_sta;
                        //set TDLS sta rate.
+                       //update station supportRate
+                       rtw_hal_update_sta_rate_mask(padapter, ptdls_sta);
+                       if(padapter->mlmeextpriv.cur_channel > 14) {
+                               if (ptdls_sta->ra_mask & 0xffff000)
+                                       sta_band |= WIRELESS_11_5N ;
+
+                               if (ptdls_sta->ra_mask & 0xff0)
+                                       sta_band |= WIRELESS_11A;
+
+                               // 5G band
+                               #ifdef CONFIG_80211AC_VHT
+                               if (ptdls_sta->vhtpriv.vht_option)  {
+                                       sta_band = WIRELESS_11_5AC;
+                               }               
+                               #endif
+                               
+                       } else {
+                               if (ptdls_sta->ra_mask & 0xffff000)
+                                       sta_band |= WIRELESS_11_24N;
+
+                               if (ptdls_sta->ra_mask & 0xff0)
+                                       sta_band |= WIRELESS_11G;
+
+                               if (ptdls_sta->ra_mask & 0x0f)
+                                       sta_band |= WIRELESS_11B;
+                       }
+                       ptdls_sta->wireless_mode = sta_band;
+                       ptdls_sta->raid = rtw_hal_networktype_to_raid(padapter,ptdls_sta);
                        set_sta_rate(padapter, ptdls_sta);
+                       //sta mode
+                       rtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,ptdls_sta,_TRUE);
                        break;
+               }
                case TDLS_SD_PTI:
+                       ptdls_sta->tdls_sta_state |= TDLS_WAIT_PTR_STATE;
                        issue_tdls_peer_traffic_indication(padapter, ptdls_sta);
+                       _set_timer(&ptdls_sta->pti_timer, TDLS_PTI_TIME);
                        break;
                case TDLS_CS_OFF:
                        _cancel_timer_ex(&ptdls_sta->base_ch_timer);
@@ -14203,7 +14477,7 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)
                        DBG_871X("change channel to off ch:%02x\n", ptdls_sta->off_ch);
                        ptdls_sta->tdls_sta_state |= TDLS_AT_OFF_CH_STATE;
                        if((ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){
-                               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta0);
+                               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 3, 300);
                        }
                        _set_timer(&ptdls_sta->base_ch_timer, TDLS_STAY_TIME);  
                        break;
@@ -14211,13 +14485,7 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)
                        rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_RS_RCR, 0);
                        DBG_871X("wirte REG_RCR, set bit6 on\n");
                        break;
-               case TDLS_CKALV_PH1:
-                       _set_timer(&ptdls_sta->alive_timer2, TDLS_ALIVE_TIMER_PH2);
-                       break;
-               case TDLS_CKALV_PH2:
-                       _set_timer(&ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1);
-                       break;
-               case TDLS_FREE_STA:
+               case TDLS_TEAR_STA:
                        free_tdls_sta(padapter, ptdls_sta);
                        break;
                        
index ee36942021a44791820275edbb4f9611d7544924..dbc1f40fb26b015fc9821224796007dc20e9f01f 100755 (executable)
@@ -292,7 +292,8 @@ s32 init_mp_priv(PADAPTER padapter)
        pmppriv->tx.stop = 1;
        pmppriv->bSetTxPower=0;         //for  manually set tx power
        pmppriv->bTxBufCkFail=_FALSE;
-
+       pmppriv->pktInterval=1;
+       
        mp_init_xmit_attrib(&pmppriv->tx, padapter);
 
        switch (padapter->registrypriv.rf_config) {
@@ -442,7 +443,23 @@ void mpt_InitHWConfig(PADAPTER Adapter)
 #endif //CONFIG_RTL8812A_8821A
 
 #ifdef CONFIG_RTL8723B
-#define PHY_IQCalibrate(a,b)   PHY_IQCalibrate_8723B(a,b)
+static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)
+{
+       PHAL_DATA_TYPE pHalData;
+       u8 b2ant;       //false:1ant, true:2-ant
+       u8 RF_Path;     //0:S1, 1:S0
+
+
+       pHalData = GET_HAL_DATA(padapter);
+       b2ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE;
+       RF_Path = 0;
+#ifdef CONFIG_USB_HCI
+       RF_Path = 1;
+#endif
+
+       PHY_IQCalibrate_8723B(padapter, bReCovery, _FALSE, b2ant, RF_Path);
+}
+
 #define PHY_LCCalibrate(a)     PHY_LCCalibrate_8723B(&(GET_HAL_DATA(a)->odmpriv))
 #define PHY_SetRFPathSwitch(a,b)       PHY_SetRFPathSwitch_8723B(a,b)
 #endif
@@ -533,7 +550,7 @@ MPT_InitializeAdapter(
        
        PHY_LCCalibrate(pAdapter);
        PHY_IQCalibrate(pAdapter, _FALSE);
-       dm_CheckTXPowerTracking(&pHalData->odmpriv);    //trigger thermal meter
+       //dm_CheckTXPowerTracking(&pHalData->odmpriv);  //trigger thermal meter
        
        PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main
        
@@ -543,15 +560,14 @@ MPT_InitializeAdapter(
 #ifdef CONFIG_RTL8188E
        pMptCtx->backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
        pMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
+       rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);
+       rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);
 #endif
 
        //set ant to wifi side in mp mode
        rtw_write16(pAdapter, 0x870, 0x300);
        rtw_write16(pAdapter, 0x860, 0x110);
 
-       if (pAdapter->registrypriv.mp_mode == 1)
-               pmlmepriv->fw_state = WIFI_MP_STATE;
-
        return  rtStatus;
 }
 
@@ -662,9 +678,9 @@ static void disable_dm(PADAPTER padapter)
 #endif
        Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, _TRUE);
 
-#ifdef CONFIG_BT_COEXIST
-       rtw_btcoex_Switch(padapter, 0);
-#endif
+//#ifdef CONFIG_BT_COEXIST
+//     rtw_btcoex_Switch(padapter, 0); //remove for BT MP Down.
+//#endif
 }
 
 
@@ -674,8 +690,7 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;
        PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;
 
-       //Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, bstart);
-       if (bstart==1){
+       if (bstart==1){\r
                DBG_871X("in MPT_PwrCtlDM start \n");           
                Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK, _TRUE);
                pdmpriv->InitODMFlag |= ODM_RF_TX_PWR_TRACK ;
@@ -683,6 +698,9 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
                pdmpriv->TxPowerTrackControl = _TRUE;
                pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
                padapter->mppriv.mp_dm =1;
+               odm_TXPowerTrackingInit(pDM_Odm);
+               ODM_ClearTxPowerTrackingState(pDM_Odm);
+               
        }else{
                DBG_871X("in MPT_PwrCtlDM stop \n");
                disable_dm(padapter);
@@ -690,6 +708,15 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
                pdmpriv->TxPowerTrackControl = _FALSE;
                pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
                padapter->mppriv.mp_dm = 0;
+               {
+                       TXPWRTRACK_CFG  c;
+                       u1Byte  chnl =0 ;
+               
+                       ConfigureTxpowerTrack(pDM_Odm, &c);
+                       ODM_ClearTxPowerTrackingState(pDM_Odm);
+                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl);
+                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl);
+               }
        }
                
 }
@@ -738,21 +765,18 @@ u32 mp_join(PADAPTER padapter,u8 mode)
 
        _enter_critical_bh(&pmlmepriv->lock, &irqL);
 
-       //if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
-       //              goto end_of_mp_start_test;
-#if 0
+       if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
+               goto end_of_mp_start_test;
+
        //init mp_start_test status
        if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
-                       rtw_disassoc_cmd(padapter, 0, _TRUE);
+               rtw_disassoc_cmd(padapter, 500, _TRUE);
                rtw_indicate_disconnect(padapter);
                rtw_free_assoc_resources(padapter, 1);
        }
-       rtw_msleep_os(500);
-
        pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
-       if (padapter->registrypriv.mp_mode == 1)
-               pmlmepriv->fw_state = WIFI_MP_STATE;
-
+       pmlmepriv->fw_state = WIFI_MP_STATE;
+#if 0
        if (pmppriv->mode == _LOOPBOOK_MODE_) {
                set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc
                RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n"));
@@ -761,9 +785,7 @@ u32 mp_join(PADAPTER padapter,u8 mode)
        }
 #endif
        set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
-       set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
 
-       #if 1
        //3 2. create a new psta for mp driver
        //clear psta in the cur_network, if any
        psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
@@ -776,7 +798,7 @@ u32 mp_join(PADAPTER padapter,u8 mode)
                res = _FAIL;
                goto end_of_mp_start_test;
        }
-       #endif  
+
        //3 3. join psudo AdHoc
        tgt_network->join_res = 1;
        tgt_network->aid = psta->aid = 1;
@@ -789,26 +811,26 @@ end_of_mp_start_test:
 
        _exit_critical_bh(&pmlmepriv->lock, &irqL);
 
-               if(1) //(res == _SUCCESS)
+       if(1) //(res == _SUCCESS)
        {
                // set MSR to WIFI_FW_ADHOC_STATE
-                       if( mode==WIFI_FW_ADHOC_STATE ){
+               if( mode==WIFI_FW_ADHOC_STATE ){
 
-               val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
-               val8 |= WIFI_FW_ADHOC_STATE;
-               rtw_write8(padapter, MSR, val8); // Link in ad hoc network
-                       
-                       else {
-                               Set_MSR(padapter, WIFI_FW_STATION_STATE);
+                       val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
+                       val8 |= WIFI_FW_ADHOC_STATE;
+                       rtw_write8(padapter, MSR, val8); // Link in ad hoc network
+               } 
+               else {
+                       Set_MSR(padapter, WIFI_FW_STATION_STATE);
 
-                               DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__,
-                                                               pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);
+                       DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__,
+                                               pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);
 
-                               rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
-                       }
+                       rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
                }
-               pmlmepriv->fw_state = WIFI_MP_STATE;
-                       return res;
+       }
+
+       return res;
 }
 //This function initializes the DUT to the MP test mode
 s32 mp_start_test(PADAPTER padapter)
@@ -1246,14 +1268,17 @@ static thread_return mp_xmit_packet_thread(thread_context context)
                                goto exit;
                        }
                        else {
-                               rtw_msleep_os(1);
+                               rtw_usleep_os(100);
                                continue;
                        }
                }
                _rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size);
                _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));
 
+               
+               rtw_usleep_os(padapter->mppriv.pktInterval);
                dump_mpframe(padapter, pxmitframe);
+               
                pmptx->sended++;
                pmp_priv->tx_pktcount++;
 
@@ -1332,7 +1357,7 @@ void fill_tx_desc_8188e(PADAPTER padapter)
        u32     pkt_size = pattrib->last_txcmdsz;
        s32 bmcast = IS_MCAST(pattrib->ra);
 // offset 0
-#if !defined(CONFIG_RTL8188E_SDIO)
+#if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)
        desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
        desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size
        desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc
@@ -1414,7 +1439,7 @@ void fill_tx_desc_8812a(PADAPTER padapter)
                SET_TX_DESC_SEQ_8812(pDesc, pattrib->seqnum);
        }
        
-       if ((pmp_priv->bandwidth >= 0) && (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)) {
+       if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160) {
                SET_TX_DESC_DATA_BW_8812(pDesc, pmp_priv->bandwidth);
        } else {
                DBG_871X("%s:Err: unknown bandwidth %d, use 20M\n", __func__,pmp_priv->bandwidth);
@@ -1463,7 +1488,7 @@ void fill_tx_desc_8192e(PADAPTER padapter)
                SET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum);
        }
                
-       if ((pmp_priv->bandwidth >= CHANNEL_WIDTH_20) && (pmp_priv->bandwidth <= CHANNEL_WIDTH_40)) {
+       if ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40)) {
                SET_TX_DESC_DATA_BW_92E(pDesc, pmp_priv->bandwidth);
        } else {
                DBG_871X("%s:Err: unknown bandwidth %d, use 20M\n", __func__,pmp_priv->bandwidth);
@@ -1513,6 +1538,21 @@ void fill_tx_desc_8723b(PADAPTER padapter)
 }
 #endif
 
+static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)
+{
+
+       rtw_write32(padapter, 0x508 , 0x00a422); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval
+       //DBG_871X("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508));
+       PHY_SetMacReg(padapter, 0x458 ,bMaskDWord , 0x0);
+       //DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));
+       PHY_SetMacReg(padapter, 0x460 ,bMaskLWord , 0x0);//fast EDCA queue packet interval & time out vaule
+       //PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);
+       //PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);
+       //PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);
+       DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));
+
+}
+
 void SetPacketTx(PADAPTER padapter)
 {
        u8 *ptr, *pkt_start, *pkt_end,*fctrl;
@@ -1652,6 +1692,9 @@ void SetPacketTx(PADAPTER padapter)
                DBG_871X("Create PktTx Thread Fail !!!!!\n");
 }
 #endif
+
+       Rtw_MPSetMacTxEDCA(padapter);
+
 }
 
 void SetPacketRx(PADAPTER pAdapter, u8 bStartRx)
@@ -1813,8 +1856,8 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
        } else {
                sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);
        }
-
-       _rtw_memset(data, '\0', sizeof(data));
+       
+       data[0]='\0';
 
        i = psd_start;
        while (i < psd_stop)
@@ -1838,7 +1881,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
 }
 
 
-
+#if 0
 void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
 {
           int i,res;
@@ -1905,7 +1948,7 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
                pxmitbuf->padapter = padapter;
                pxmitbuf->buf_tag = XMITBUF_MGNT;
 
-               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _FALSE)) == _FAIL) {
+               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
                        res= _FAIL;
                        goto exit;
                }
@@ -1930,7 +1973,7 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
 exit:
        ;
 }
-
+#endif
 
 
 ULONG getPowerDiffByRate8188E(
@@ -2399,8 +2442,5 @@ void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCap)
                PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));   
        }
 }
-
-
-
 #endif
 
index 848bd58422ad8ddf3a2d0f506801eae287b90ba5..936ce36ff6f02b8715bb695a6243980a9404034a 100755 (executable)
@@ -132,7 +132,7 @@ void rtw_odm_dbg_level_msg(void *sel, _adapter *adapter)
        int i;
 
        rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level);
-       DBG_871X_SEL_NL(sel, "odm.DebugDebugLevel = %u\n", dbg_level);
+       DBG_871X_SEL_NL(sel, "odm.DebugLevel = %u\n", dbg_level);
        for (i=0;i<RTW_ODM_DBG_LEVEL_NUM;i++) {
                if (odm_dbg_level_str[i])
                        DBG_871X_SEL_NL(sel, "%u %s\n", i, odm_dbg_level_str[i]);
@@ -197,3 +197,11 @@ void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_H
        odm->IGI_LowerBound = IGI_LowerBound;
 }
 
+void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)
+{
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &(hal_data->odmpriv);   
+       
+       DBG_871X_SEL_NL(sel,"RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", 
+       HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);     
+}
\ No newline at end of file
index 1287a29365ea272ef1ea43758f5fb45eedc19ec2..92423bb339f0c45a2656be0814991847dde2eb9c 100755 (executable)
@@ -532,6 +532,7 @@ u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
+       u16 val16=0;
        u32 len=0, wfdielen = 0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
@@ -568,19 +569,22 @@ u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
                if ( is_any_client_associated( pwdinfo->padapter ) )
                {
                        //      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery)
-                       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD );                  
+                       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD;
+                       RTW_PUT_BE16(wfdie + wfdielen, val16);                  
                }
                else
                {
                        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery)
-                       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+                       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+                       RTW_PUT_BE16(wfdie + wfdielen, val16);
                }
 
        }
        else
        {
                //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-               RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+               val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+               RTW_PUT_BE16(wfdie + wfdielen, val16);
        }
        
        wfdielen += 2;
@@ -640,7 +644,7 @@ u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
        wfdie[ wfdielen++ ] = 0;
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -649,6 +653,7 @@ u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
+       u16 val16=0;
        u32 len=0, wfdielen = 0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
@@ -683,17 +688,19 @@ u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        if ( 1 == pwdinfo->wfd_tdls_enable )
        {
                //      WFD primary sink + available for WFD session + WiFi TDLS mode + WSC ( WFD Service Discovery )   
-               RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | 
+               val16 = pwfd_info->wfd_device_type | 
                                                WFD_DEVINFO_SESSION_AVAIL | 
                                                WFD_DEVINFO_WSD |
-                                               WFD_DEVINFO_PC_TDLS );
+                                               WFD_DEVINFO_PC_TDLS;
+               RTW_PUT_BE16(wfdie + wfdielen, val16 );
        }
        else
        {
                //      WFD primary sink + available for WFD session + WiFi Direct mode + WSC ( WFD Service Discovery ) 
-               RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type |
+               val16 = pwfd_info->wfd_device_type |
                                                WFD_DEVINFO_SESSION_AVAIL | 
-                                               WFD_DEVINFO_WSD );
+                                               WFD_DEVINFO_WSD;
+               RTW_PUT_BE16(wfdie + wfdielen, val16 );
        }
 
        wfdielen += 2;
@@ -753,7 +760,7 @@ u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
        wfdie[ wfdielen++ ] = 0;
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -957,6 +964,7 @@ u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunnel
 u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
+       u16 val16=0;
        u32 len=0, wfdielen = 0;
        _adapter                                        *padapter = NULL;
        struct mlme_priv                        *pmlmepriv = NULL;
@@ -997,7 +1005,8 @@ u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1055,7 +1064,7 @@ u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
        wfdie[ wfdielen++ ] = 0;
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1065,6 +1074,7 @@ u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1095,7 +1105,8 @@ u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1153,7 +1164,7 @@ u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
        wfdie[ wfdielen++ ] = 0;
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1163,6 +1174,7 @@ u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1193,7 +1205,8 @@ u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL);
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1251,7 +1264,7 @@ u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
        wfdie[ wfdielen++ ] = 0;
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1261,6 +1274,7 @@ u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1291,7 +1305,8 @@ u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL);
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1350,7 +1365,7 @@ u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
 
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1360,6 +1375,7 @@ u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1390,7 +1406,8 @@ u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL);
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1459,6 +1476,7 @@ u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1489,7 +1507,8 @@ u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1562,7 +1581,7 @@ u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 
        }
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1571,6 +1590,7 @@ u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
+       u16 val16=0;
        u32 len=0, wfdielen = 0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
@@ -1602,7 +1622,8 @@ u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1675,7 +1696,7 @@ u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 
        }
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1685,6 +1706,7 @@ u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1715,7 +1737,8 @@ u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1774,7 +1797,7 @@ u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
 
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -1784,6 +1807,7 @@ u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
 {
        u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
        u32 len=0, wfdielen = 0;
+       u16 val16=0;
        _adapter *padapter = pwdinfo->padapter;
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
        struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
@@ -1814,7 +1838,8 @@ u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        //      Value1:
        //      WFD device information
        //      WFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )
-       RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD );
+       val16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;
+       RTW_PUT_BE16(wfdie + wfdielen, val16);
        wfdielen += 2;
 
        //      Value2:
@@ -1872,7 +1897,7 @@ u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
        wfdie[ wfdielen++ ] = 0;
        wfdie[ wfdielen++ ] = 0;
 
-       pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
+       rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);
 
        return len;
        
@@ -3557,7 +3582,7 @@ _func_enter_;
 
        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",
+               DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
                        FUNC_ADPT_ARG(padapter), ch, bw, offset);
        }
        else if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->listen_channel) {
@@ -4056,7 +4081,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
 
                                                //pwdev_priv->provdisc_req_issued = _FALSE;
 
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                if(check_buddy_fwstate(padapter, _FW_LINKED))
                                                        rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
                                                #endif
@@ -4085,7 +4110,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                                        (tx==_TRUE)?"Tx":"Rx", dialogToken, (intent>>1), intent&0x1 ? "+" : "-", listen_ch, op_ch, ch_list_buf);
 
                                        if (!tx) {
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                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)
                                                {
@@ -4102,7 +4127,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                        struct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;
 
                                        if (tx) {
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                if(check_buddy_fwstate(padapter, _FW_LINKED))
                                                        rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
                                                #endif
@@ -4132,7 +4157,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
 
                                        if (!tx) {
                                                pwdev_priv->provdisc_req_issued = _FALSE;
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                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)
                                                {
@@ -4150,7 +4175,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                        bool is_go = _FALSE;
 
                                        if (tx) {
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                if(check_buddy_fwstate(padapter, _FW_LINKED))
                                                        rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
                                                #endif
@@ -4169,7 +4194,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                                nego_info->state = 2;
 
                                                if (status == 0) {
-                                                       if (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) && tx)
+                                                       if (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) ^ !tx)
                                                                is_go = _TRUE;
                                                }
 
@@ -4191,7 +4216,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                        int flags = -1;
 
                                        if (tx) {
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                if(check_buddy_fwstate(padapter, _FW_LINKED))
                                                        rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
                                                #endif
@@ -4216,10 +4241,9 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                        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 && padapter->cfg80211_wdinfo.chk_invite_ch_list == _TRUE) {
-                                               #ifdef CONFIG_CONCURRENT_MODE
-                                               if(check_buddy_fwstate(padapter, _FW_LINKED))
-                                               {
+                                       if (!tx) {
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
+                                               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);
@@ -4238,7 +4262,7 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
                                        struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
 
                                        if (tx) {
-                                               #ifdef CONFIG_CONCURRENT_MODE
+                                               #if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)
                                                if(check_buddy_fwstate(padapter, _FW_LINKED))
                                                        rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
                                                #endif
@@ -4371,11 +4395,7 @@ void rtw_init_cfg80211_wifidirect_info( _adapter*        padapter)
        struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
 
        _rtw_memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info) );
-#ifdef CONFIG_P2P_CHK_INVITE_CH_LIST
-       pcfg80211_wdinfo->chk_invite_ch_list = _TRUE;
-#else
-       pcfg80211_wdinfo->chk_invite_ch_list = _FALSE;
-#endif //CONFIG_P2P_CHK_INVITE_CH_LIST
+    
        _init_timer( &pcfg80211_wdinfo->remain_on_ch_timer, padapter->pnetdev, ro_ch_timer_process, padapter );
 }
 #endif //CONFIG_IOCTL_CFG80211 
@@ -4832,7 +4852,7 @@ void reset_global_wifidirect_info( _adapter* padapter )
        pwdinfo->persistent_supported = 0;
        pwdinfo->session_available = _TRUE;
        pwdinfo->wfd_tdls_enable = 0;
-       pwdinfo->wfd_tdls_weaksec = 0;
+       pwdinfo->wfd_tdls_weaksec = _TRUE;
 }
 
 #ifdef CONFIG_WFD
@@ -5257,10 +5277,6 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                        adapter_wdev_data(padapter)->p2p_enabled = _FALSE;
 #endif //CONFIG_IOCTL_CFG80211
 
-               if (_FAIL == rtw_pwr_wakeup(padapter)) {
-                       ret = _FAIL;
-                       goto exit;
-               }
 
                //Disable P2P function
                if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
@@ -5279,6 +5295,10 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                        rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE);
                        rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
                        _rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
+
+                       /* Remove profiles in wifidirect_info structure. */
+                       _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );
+                       pwdinfo->profileindex = 0;
                }
 
                rtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_FALSE);
@@ -5286,6 +5306,11 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                rtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_FALSE);
                #endif
 
+               if (_FAIL == rtw_pwr_wakeup(padapter)) {
+                       ret = _FAIL;
+                       goto exit;
+               }
+
                //Restore to initial setting.
                update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
 
index d4f73bda86539e144b5c8d55c14b620074c9a663..2076e152be1457be60c351a358edeecee9b23632 100755 (executable)
@@ -654,16 +654,23 @@ _func_enter_;
 _func_exit_;
 }
 
-u8 PS_RDY_CHECK(_adapter * padapter);
 u8 PS_RDY_CHECK(_adapter * padapter)
 {
        u32 curr_time, delta_time;
        struct pwrctrl_priv     *pwrpriv = adapter_to_pwrctl(padapter);
        struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
+#ifdef CONFIG_P2P
+       struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
+#ifdef CONFIG_IOCTL_CFG80211
+       struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
+#endif /* CONFIG_IOCTL_CFG80211 */
+#endif /* CONFIG_P2P */
 
-#ifdef CONFIG_WOWLAN
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
        if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_mode)
                return _TRUE;
+       else if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_ap_mode)
+               return _TRUE;
        else if (_TRUE == pwrpriv->bInSuspend)
                return _FALSE;
 #else
@@ -680,12 +687,21 @@ u8 PS_RDY_CHECK(_adapter * padapter)
                return _FALSE;
        }
 
-       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) )
+       if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR)
+               || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
+               || check_fwstate(pmlmepriv, WIFI_AP_STATE)
+               || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
+               #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)
+               || pcfg80211_wdinfo->is_ro_ch
+               #elif defined(CONFIG_P2P)
+               || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
+               #endif
+               || rtw_is_scan_deny(padapter)
+#ifdef CONFIG_TDLS
+               // TDLS link is established.
+               || ( padapter->tdlsinfo.link_established == _TRUE )
+#endif // CONFIG_TDLS          
+       )
                return _FALSE;
 
        if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) )
@@ -693,7 +709,7 @@ u8 PS_RDY_CHECK(_adapter * padapter)
                DBG_871X("Group handshake still in progress !!!\n");
                return _FALSE;
        }
-       
+
 #ifdef CONFIG_IOCTL_CFG80211
        if (!rtw_cfg80211_pwr_mgmt(padapter))
                return _FALSE;
@@ -782,7 +798,7 @@ _func_enter_;
                                        ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
 
                                        if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE )
-                                               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0);
+                                               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0);
                                        plist = get_next(plist);
                                }
                        }
@@ -793,8 +809,9 @@ _func_enter_;
                        pwrpriv->pwr_mode = ps_mode;
                        rtw_set_rpwm(padapter, PS_STATE_S4);
                        
-#ifdef CONFIG_WOWLAN
-                       if (pwrpriv->wowlan_mode == _TRUE)
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
+                       if (pwrpriv->wowlan_mode == _TRUE ||
+                                       pwrpriv->wowlan_ap_mode == _TRUE)
                        {
                                u32 start_time, delay_ms;
                                u8 val8;
@@ -827,7 +844,7 @@ _func_enter_;
        }
        else
        {
-               if (PS_RDY_CHECK(padapter)
+               if ((PS_RDY_CHECK(padapter) && check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE))
 #ifdef CONFIG_BT_COEXIST
                        || ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE)
                                && (rtw_btcoex_IsLpsOn(padapter) == _TRUE))
@@ -852,7 +869,7 @@ _func_enter_;
                                        ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
 
                                        if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE )
-                                               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 1);
+                                               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 0, 0);
                                        plist = get_next(plist);
                                }
                        }
@@ -964,9 +981,12 @@ s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms)
 //
 void LPS_Enter(PADAPTER padapter, const char *msg)
 {
-       struct pwrctrl_priv     *pwrpriv = adapter_to_pwrctl(padapter);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct pwrctrl_priv     *pwrpriv = dvobj_to_pwrctl(dvobj);
        struct mlme_priv        *pmlmepriv = &(padapter->mlmepriv);
        _adapter *buddy = padapter->pbuddy_adapter;
+       int n_assoc_iface = 0;
+       int i;
        char buf[32] = {0};
 
 _func_enter_;
@@ -978,39 +998,21 @@ _func_enter_;
                return;
 #endif
 
-#ifdef CONFIG_CONCURRENT_MODE
-       if (padapter->iface_type != IFACE_PORT0)
-               return; /* Skip power saving for concurrent mode port 1*/
-
-       /* consider buddy, if exist */
-       if (buddy) {
-               struct mlme_priv *b_pmlmepriv = &(buddy->mlmepriv);
-               #ifdef CONFIG_P2P
-               struct wifidirect_info *b_pwdinfo = &(buddy->wdinfo);
-               #ifdef CONFIG_IOCTL_CFG80211            
-               struct cfg80211_wifidirect_info *b_pcfg80211_wdinfo = &buddy->cfg80211_wdinfo;
-               #endif
-               #endif
-               
-               if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
-                       || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
-                       || check_fwstate(b_pmlmepriv, WIFI_AP_STATE)
-                       || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
-                       #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)
-                       || b_pcfg80211_wdinfo->is_ro_ch
-                       #elif defined(CONFIG_P2P)
-                       || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)
-                       #endif
-                       || rtw_is_scan_deny(buddy)
-               ) {
-                       return;
-               }
+       /* Skip lps enter request if number of assocated adapters is not 1 */
+       for (i = 0; i < dvobj->iface_nums; i++) {
+               if (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))
+                       n_assoc_iface++;
        }
-#endif
+       if (n_assoc_iface != 1)
+               return;
 
-       if (PS_RDY_CHECK(padapter) == _FALSE)
-       {
+       /* Skip lps enter request for adapter not port0 */
+       if (get_iface_type(padapter) != IFACE_PORT0)
                return;
+
+       for (i = 0; i < dvobj->iface_nums; i++) {
+               if (PS_RDY_CHECK(dvobj->padapters[i]) == _FALSE)
+                       return;
        }
 
        if (pwrpriv->bLeisurePs)
@@ -1042,12 +1044,12 @@ void LPS_Leave(PADAPTER padapter, const char *msg)
 {
 #define LPS_LEAVE_TIMEOUT_MS 100
 
-       struct pwrctrl_priv     *pwrpriv = adapter_to_pwrctl(padapter);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct pwrctrl_priv     *pwrpriv = dvobj_to_pwrctl(dvobj);
        u32 start_time;
        u8 bAwake = _FALSE;
        char buf[32] = {0};
-       struct dvobj_priv *psdpriv = padapter->dvobj;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+       struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
 
 _func_enter_;
 
@@ -1058,9 +1060,6 @@ _func_enter_;
                return;
 #endif
 
-       if (get_iface_type(padapter) != IFACE_PORT0)
-               return; /* Skip power saving for concurrent mode port 1*/
-
        if (pwrpriv->bLeisurePs)
        {
                if(pwrpriv->pwr_mode != PS_MODE_ACTIVE)
@@ -1117,7 +1116,7 @@ _func_enter_;
                )
        { //connect
 
-               if(pwrpriv->power_mgnt == PS_MODE_ACTIVE) {
+               if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) {
                        DBG_871X("%s: Driver Already Leave LPS\n",__FUNCTION__);
                        return;
                }
@@ -1150,7 +1149,7 @@ _func_enter_;
                                pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE;
 #ifdef DBG_CHECK_FW_PS_STATE
                                DBG_871X("%s: polling cpwm OK! cpwm_orig=%02x, cpwm_now=%02x, 0x100=0x%x \n"
-                               , __FUNCTION__, cpwm_orig, cpwm_now, rtw_read8(padapter, REG_CR));
+                               , __FUNCTION__, cpwm_orig, cpwm_now, rtw_read8(Adapter, REG_CR));
                                if(rtw_fw_ps_state(Adapter) == _FAIL)
                                {
                                        DBG_871X("%s: leave 32k but fw state in 32k\n", __FUNCTION__);
@@ -1202,7 +1201,7 @@ _func_enter_;
                        else
                        #endif
                        {
-#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || (defined(CONFIG_PLATFORM_SPRD) && defined(CONFIG_RTL8188E))
+#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_RTL8188E)
                                #ifdef CONFIG_IPS
                                if(_FALSE == ips_leave(pri_padapter))
                                {
@@ -1210,8 +1209,8 @@ _func_enter_;
                                }
                                #endif
 #endif //CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E)
-                       }                               
-               }       
+                       }
+               }
        }
 
 _func_exit_;
@@ -1223,8 +1222,11 @@ _func_exit_;
 //
 void LeaveAllPowerSaveMode(IN PADAPTER Adapter)
 {
+       struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
        struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
        u8      enqueue = 0;
+       int n_assoc_iface = 0;
+       int i;
 
 _func_enter_;
 
@@ -1244,7 +1246,12 @@ _func_enter_;
                return;
        }
 
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
+       for (i = 0; i < dvobj->iface_nums; i++) {
+               if (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))
+                       n_assoc_iface++;
+       }
+
+       if (n_assoc_iface)
        { //connect
 #ifdef CONFIG_LPS_LCLK
                enqueue = 1;
@@ -2139,6 +2146,9 @@ _func_enter_;
 
        rtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler);
 
+       pwrctrlpriv->wowlan_mode = _FALSE;
+       pwrctrlpriv->wowlan_ap_mode = _FALSE;
+
        #ifdef CONFIG_RESUME_IN_WORKQUEUE
        _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL);
        pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue");
@@ -2150,9 +2160,11 @@ _func_enter_;
        #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER
 
 #ifdef CONFIG_PNO_SUPPORT
+       pwrctrlpriv->pno_inited = _FALSE;
        pwrctrlpriv->pnlo_info = NULL;
        pwrctrlpriv->pscan_info = NULL;
        pwrctrlpriv->pno_ssid_list = NULL;
+       pwrctrlpriv->pno_in_resume = _TRUE;
 #endif
 
 _func_exit_;
@@ -2214,12 +2226,16 @@ static void resume_workitem_callback(struct work_struct *work)
        DBG_871X("%s\n",__FUNCTION__);
 
        rtw_resume_process(adapter);
+
+       rtw_resume_unlock_suspend();
 }
 
 void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv)
 {
        // accquire system's suspend lock preventing from falliing asleep while resume in workqueue
-       rtw_lock_suspend();
+       //rtw_lock_suspend();
+
+       rtw_resume_lock_suspend();
        
        #if 1
        queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work);      
@@ -2247,9 +2263,7 @@ inline void rtw_set_do_late_resume(struct pwrctrl_priv *pwrpriv, bool enable)
 #endif
 
 #ifdef CONFIG_HAS_EARLYSUSPEND
-#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
 extern int rtw_resume_process(_adapter *padapter);
-#endif
 static void rtw_early_suspend(struct early_suspend *h)
 {
        struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);
@@ -2267,10 +2281,8 @@ static void rtw_late_resume(struct early_suspend *h)
        DBG_871X("%s\n",__FUNCTION__);
 
        if(pwrpriv->do_late_resume) {
-               #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
                rtw_set_do_late_resume(pwrpriv, _FALSE);
                rtw_resume_process(adapter);
-               #endif
        }
 }
 
@@ -2377,28 +2389,19 @@ 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 = adapter_to_pwrctl(padapter);
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;      
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);
+       struct mlme_priv *pmlmepriv;
        int ret = _SUCCESS;
+       int i;
        u32 start = rtw_get_current_time();
 
-#ifdef CONFIG_CONCURRENT_MODE
-       if (padapter->iface_type != IFACE_PORT0 && padapter->pbuddy_adapter)
-               LeaveAllPowerSaveMode(padapter->pbuddy_adapter);
-       else
-#endif //CONFIG_CONCURRENT_MODE
-               LeaveAllPowerSaveMode(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
-       //if (padapter->pbuddy_adapter)
-       //      LeaveAllPowerSaveMode(padapter->pbuddy_adapter);
+       /* for LPS */
+       LeaveAllPowerSaveMode(padapter);
 
-       if ((padapter->isprimary == _FALSE) && padapter->pbuddy_adapter){
-               padapter = padapter->pbuddy_adapter;
-               pwrpriv = adapter_to_pwrctl(padapter);
-               pmlmepriv = &padapter->mlmepriv;
-       }
-#endif ////CONFIG_CONCURRENT_MODE
+       /* IPS still bound with primary adapter */
+       padapter = GET_PRIMARY_ADAPTER(padapter);
+       pmlmepriv = &padapter->mlmepriv;
 
        if (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))
                pwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);
@@ -2426,12 +2429,6 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
        }
 #endif
 
-       //System suspend is not allowed to wakeup
-       if((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend )){
-               ret = _FAIL;
-               goto exit;
-       }
-
        if (pwrpriv->bInternalAutoSuspend == _FALSE && pwrpriv->bInSuspend) {
                DBG_871X("%s wait bInSuspend...\n", __func__);
                while (pwrpriv->bInSuspend 
@@ -2446,6 +2443,12 @@ int _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)
                        DBG_871X("%s wait bInSuspend done\n", __func__);
        }
 
+       //System suspend is not allowed to wakeup
+       if((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend )){
+               ret = _FAIL;
+               goto exit;
+       }
+
        //block???
        if((pwrpriv->bInternalAutoSuspend == _TRUE)  && (padapter->net_closed == _TRUE)) {
                ret = _FAIL;
index 46b9f804e7396e114fa3eb4e8082e1e92d0586db..bee356f8cc3d0e6eb3b91472d7063bb9391abced 100755 (executable)
@@ -606,8 +606,11 @@ union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame)
        struct security_priv *psecuritypriv=&padapter->securitypriv;
        union recv_frame *return_packet=precv_frame;
        u32      res=_SUCCESS;
+
 _func_enter_;
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt);
+
        RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt));
 
        if(prxattrib->encrypt>0)
@@ -642,23 +645,31 @@ _func_enter_;
                psecuritypriv->hw_decrypted=_FALSE;
 
                #ifdef DBG_RX_DECRYPTOR
-               DBG_871X("prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n"
-                       , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted);
+               DBG_871X("[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n",
+                       __FUNCTION__,
+                       __LINE__,
+                       prxattrib->bdecrypted,
+                       prxattrib->encrypt,
+                       psecuritypriv->hw_decrypted);
                #endif
 
                switch(prxattrib->encrypt){
                case _WEP40_:
                case _WEP104_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wep);
                        rtw_wep_decrypt(padapter, (u8 *)precv_frame);
                        break;
                case _TKIP_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_tkip);
                        res = rtw_tkip_decrypt(padapter, (u8 *)precv_frame);
                        break;
                case _AES_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_aes);
                        res = rtw_aes_decrypt(padapter, (u8 * )precv_frame);
                        break;
 #ifdef CONFIG_WAPI_SUPPORT
                case _SMS4_:
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wapi);
                        rtw_sms4_decrypt(padapter, (u8 * )precv_frame);
                        break;
 #endif
@@ -686,18 +697,29 @@ _func_enter_;
                else
 #endif
                {
+                       DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_hw);
+
                        psecuritypriv->hw_decrypted=_TRUE;
                        #ifdef DBG_RX_DECRYPTOR
-                       DBG_871X("prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n"
-                       , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted);
-                       #endif
+                       DBG_871X("[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n",
+                               __FUNCTION__,
+                               __LINE__,
+                               prxattrib->bdecrypted,
+                               prxattrib->encrypt,
+                               psecuritypriv->hw_decrypted);
 
+                       #endif
                }
        }
        else {
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_unknown);
                #ifdef DBG_RX_DECRYPTOR
-               DBG_871X("prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  psecuritypriv->hw_decrypted:%d\n"
-               , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted);
+               DBG_871X("[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\n",
+                       __FUNCTION__,
+                       __LINE__,
+                       prxattrib->bdecrypted,
+                       prxattrib->encrypt,
+                       psecuritypriv->hw_decrypted);
                #endif
        }
        
@@ -787,16 +809,15 @@ _func_enter_;
 
                        prtnframe=precv_frame;
                        //check is the EAPOL frame or not (Rekey)
-                       if(ether_type == eapol_type){
-
-                               RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("########portctrl:ether_type == 0x888e\n"));
+                       //if(ether_type == eapol_type){
+                       //      RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("########portctrl:ether_type == 0x888e\n"));
                                //check Rekey
 
-                               prtnframe=precv_frame;
-                       }
-                       else{
-                               RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:ether_type=0x%04x\n", ether_type));
-                       }
+                       //      prtnframe=precv_frame;
+                       //}
+                       //else{
+                       //      RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:ether_type=0x%04x\n", ether_type));
+                       //}
                }
        }
        else
@@ -984,7 +1005,7 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame)
                        + PAYLOAD_TYPE_LEN 
                        + category_field;
 
-       if(ptdlsinfo->enable == 0)
+       if(ptdlsinfo->tdls_enable == _FALSE)
        {
                DBG_871X("recv tdls frame, "
                                "but tdls haven't enabled\n");
@@ -994,25 +1015,29 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame)
        
        switch(*paction){
                case TDLS_SETUP_REQUEST:
-                       DBG_871X("recv tdls setup request frame\n");
+                       DBG_871X("recv tdls setup request frame from "MAC_FMT"\n", MAC_ARG(pattrib->src));
                        ret=On_TDLS_Setup_Req(adapter, precv_frame);
                        break;
                case TDLS_SETUP_RESPONSE:
-                       DBG_871X("recv tdls setup response frame\n");                   
+                       DBG_871X("recv tdls setup response frame from "MAC_FMT"\n", MAC_ARG(pattrib->src));
                        ret=On_TDLS_Setup_Rsp(adapter, precv_frame);
                        break;
                case TDLS_SETUP_CONFIRM:
-                       DBG_871X("recv tdls setup confirm frame\n");
+                       DBG_871X("recv tdls setup confirm frame from "MAC_FMT"\n", MAC_ARG(pattrib->src));
                        ret=On_TDLS_Setup_Cfm(adapter, precv_frame);
                        break;
                case TDLS_TEARDOWN:
-                       DBG_871X("recv tdls teardown, free sta_info\n");
+                       DBG_871X("recv tdls teardown, free sta_info from "MAC_FMT"\n", MAC_ARG(pattrib->src));
                        ret=On_TDLS_Teardown(adapter, precv_frame);
                        break;
                case TDLS_DISCOVERY_REQUEST:
-                       DBG_871X("recv tdls discovery request frame\n");
+                       DBG_871X("recv tdls discovery request frame from "MAC_FMT"\n", MAC_ARG(pattrib->src));
                        ret=On_TDLS_Dis_Req(adapter, precv_frame);
                        break;
+               case TDLS_PEER_TRAFFIC_INDICATION:
+                       DBG_871X("recv tdls peer traffic indication frame\n");
+                       ret=On_TDLS_Peer_Traffic_Indication(adapter, precv_frame);
+                       break;
                case TDLS_PEER_TRAFFIC_RESPONSE:
                        DBG_871X("recv tdls peer traffic response frame\n");
                        ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame);
@@ -1046,7 +1071,7 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame)
                        break;
 #endif //CONFIG_WFD
                default:
-                       DBG_871X("receive TDLS frame but not supported\n");
+                       DBG_871X("receive TDLS frame %d but not support\n", *paction);
                        ret=_FAIL;
                        break;
        }
@@ -1086,6 +1111,21 @@ void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_in
 
                pstats->rx_data_pkts++;
                pstats->rx_bytes += sz;
+
+#ifdef CONFIG_TDLS
+
+               if(psta->tdls_sta_state & TDLS_LINKED_STATE)
+               {
+                       struct sta_info *pap_sta = NULL;
+                       pap_sta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
+                       if(pap_sta)
+                       {
+                               pstats = &pap_sta->sta_stats;
+                               pstats->rx_data_pkts++;
+                               pstats->rx_bytes += sz;
+                       }
+               }
+#endif //CONFIG_TDLS
        }
 
 #ifdef CONFIG_CHECK_LEAVE_LPS
@@ -1125,6 +1165,8 @@ sint sta2sta_data_frame(
 
 _func_enter_;
 
+       //DBG_871X("[%s] %d, seqnum:%d\n", __FUNCTION__, __LINE__, pattrib->seq_num);
+
        if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
                (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
        {
@@ -1156,7 +1198,7 @@ _func_enter_;
 #ifdef CONFIG_TDLS
 
                //direct link data transfer
-               if(ptdlsinfo->setup_state == TDLS_LINKED_STATE){
+               if(ptdlsinfo->link_established == _TRUE){
                        ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);
                        if(ptdls_sta==NULL)
                        {
@@ -1165,17 +1207,6 @@ _func_enter_;
                        }
                        else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE)
                        {
-
-                               //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data
-                               if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE)
-                               {
-                                       if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6)))
-                                       {
-                                               DBG_871X("drop QoS-Sybtype Data\n");
-                                       ret= _FAIL;
-                                       goto exit;
-                                       }
-                               }
                                // filter packets that SA is myself or multicast or broadcast
                                if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){
                                        ret= _FAIL;
@@ -1200,13 +1231,13 @@ _func_enter_;
                                process_pwrbit_data(adapter, precv_frame);
 
                                // if NULL-frame, check pwrbit
-                               if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL)
+                               if ((GetFrameSubType(ptr) & WIFI_DATA_NULL) == WIFI_DATA_NULL)
                                {
                                        //NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA
                                        if(GetPwrMgt(ptr))
                                        {
                                                DBG_871X("TDLS: recv peer null frame with pwr bit 1\n");
-                                               ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE;
+                                               //ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE;
                                        // it would be triggered when we are off channel and receiving NULL DATA
                                        // we can confirm that peer STA is at off channel
                                        }
@@ -1214,21 +1245,31 @@ _func_enter_;
                                        {
                                                if((ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE)
                                                {
-                                                       issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta, 0);
+                                                       issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta->hwaddr, 0, 0, 0);
                                                        ptdls_sta->tdls_sta_state |= TDLS_PEER_AT_OFF_STATE;
                                                        On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame);
                                                }
                                        }
 
+                                       //[TDLS] TODO: Updated BSSID's seq.
+                                       DBG_871X("drop Null Data\n");
+                                       ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);
                                        ret= _FAIL;
                                        goto exit;
                                }
+
                                //receive some of all TDLS management frames, process it at ON_TDLS
                                if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))){
                                        ret= OnTDLS(adapter, precv_frame);
                                        goto exit;
                                }
-                               
+
+                               if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {
+                                       process_wmmps_data(adapter, precv_frame);
+                               }
+
+                               ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);
+
                        }
 
                        sta_addr = pattrib->src;
@@ -1295,7 +1336,9 @@ _func_enter_;
 
 #ifdef CONFIG_TDLS
        if(ptdls_sta != NULL)
+       {
                *psta = ptdls_sta;
+       }
 #endif //CONFIG_TDLS
 
        if (*psta == NULL) {
@@ -1454,9 +1497,20 @@ _func_enter_;
                        *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info
                        if (*psta == NULL)
                        {
-                               DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
        
-                               issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
+                               //for AP multicast issue , modify by yiwei 
+                               static u32 send_issue_deauth_time=0;
+                       
+                               //DBG_871X("After send deauth , %u ms has elapsed.\n", rtw_get_passing_time_ms(send_issue_deauth_time));
+                               
+                               if(rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0 )
+                               {
+                                       send_issue_deauth_time = rtw_get_current_time(); 
+                                       
+                                       DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
+                                       
+                                       issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
+                               }
                        }
                }       
        
@@ -1549,10 +1603,10 @@ _func_exit_;
 sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame);
 sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
 {
-#ifdef CONFIG_AP_MODE
        struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
        struct sta_priv *pstapriv = &padapter->stapriv;
        u8 *pframe = precv_frame->u.hdr.rx_data;
+       struct sta_info *psta=NULL;
        //uint len = precv_frame->u.hdr.len;
                
        //DBG_871X("+validate_recv_ctrl_frame\n");
@@ -1568,24 +1622,28 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
                return _FAIL;
        }
 
+       psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
+       if (psta==NULL)
+       {
+               return _FAIL;
+       }
+
+       //for rx pkt statistics
+       psta->sta_stats.rx_ctrl_pkts++;
+
        //only handle ps-poll
        if(GetFrameSubType(pframe) == WIFI_PSPOLL)
        {
+#ifdef CONFIG_AP_MODE
                u16 aid;
                u8 wmmps_ac=0;  
-               struct sta_info *psta=NULL;
        
                aid = GetAid(pframe);
-               psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));
-               
-               if((psta==NULL) || (psta->aid!=aid))
+               if(psta->aid!=aid)
                {
                        return _FAIL;
                }
 
-               //for rx pkt statistics
-               psta->sta_stats.rx_ctrl_pkts++;
-
                switch(pattrib->priority)
                {
                        case 1:
@@ -1642,20 +1700,20 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
 
                                if(psta->sleepq_len>0)
                                        pxmitframe->attrib.mdata = 1;
-                                else
+                               else
                                        pxmitframe->attrib.mdata = 0;
 
                                pxmitframe->attrib.triggered = 1;
 
-                               //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
+                               //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
 
 #if 0
-                                _exit_critical_bh(&psta->sleep_q.lock, &irqL); 
+                               _exit_critical_bh(&psta->sleep_q.lock, &irqL);
                                if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
-                               {               
+                               {
                                        rtw_os_xmit_complete(padapter, pxmitframe);
                                }
-                                _enter_critical_bh(&psta->sleep_q.lock, &irqL);        
+                               _enter_critical_bh(&psta->sleep_q.lock, &irqL); 
 #endif
                                rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
 
@@ -1701,14 +1759,15 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
                                        //update_BCNTIM(padapter);
                                        update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
                                }
-                               
                        }                               
-                       
                }
-               
+#endif //CONFIG_AP_MODE
        }
-       
+       else if(GetFrameSubType(pframe) == WIFI_NDPA) {
+#ifdef CONFIG_BEAMFORMING
+               beamforming_get_ndpa_frame(padapter, precv_frame);
 #endif
+       }
 
        return _FAIL;
 
@@ -1831,9 +1890,6 @@ sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame)
        struct sta_priv         *pstapriv = &adapter->stapriv;
        struct security_priv    *psecuritypriv = &adapter->securitypriv;        
        sint ret = _SUCCESS;
-#ifdef CONFIG_TDLS
-       struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
-#endif //CONFIG_TDLS
 
 _func_enter_;
 
@@ -2112,6 +2168,17 @@ validate_80211w_fail:
 }
 #endif //CONFIG_IEEE80211W
 
+static inline void dump_rx_packet(u8 *ptr)
+{
+       int i;
+
+       DBG_871X("############################# \n");
+       for(i=0; i<64;i=i+8)
+               DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
+               *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
+       DBG_871X("############################# \n");
+}
+
 sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame);
 sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
 {
@@ -2144,7 +2211,6 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
 
 _func_enter_;
 
-
 #ifdef CONFIG_FIND_BEST_CHANNEL
        if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
                int ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter));
@@ -2178,6 +2244,7 @@ _func_enter_;
        if(ver!=0){
                RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n"));
                retval= _FAIL;
+               DBG_COUNTER(adapter->rx_logs.core_rx_pre_ver_err);
                goto exit;
        }
 
@@ -2202,46 +2269,23 @@ _func_enter_;
 {
        u8 bDumpRxPkt;
        rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
-       if(bDumpRxPkt ==1){//dump all rx packets
-               int i;
-               DBG_871X("############################# \n");
-               
-               for(i=0; i<64;i=i+8)
-                       DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
-                       *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
-               DBG_871X("############################# \n");
-       }
-       else if(bDumpRxPkt ==2){
-               if(type== WIFI_MGT_TYPE){
-                       int i;
-                       DBG_871X("############################# \n");
-
-                       for(i=0; i<64;i=i+8)
-                               DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
-                               *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
-                       DBG_871X("############################# \n");
-               }
-       }
-       else if(bDumpRxPkt ==3){
-               if(type== WIFI_DATA_TYPE){
-                       int i;
-                       DBG_871X("############################# \n");
-                       
-                       for(i=0; i<64;i=i+8)
-                               DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
-                               *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
-                       DBG_871X("############################# \n");
-               }
-       }
+       if (bDumpRxPkt == 1) //dump all rx packets
+               dump_rx_packet(ptr);
+       else if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE))
+               dump_rx_packet(ptr);
+       else if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE))
+               dump_rx_packet(ptr);
 }
 #endif
        switch (type)
        {
                case WIFI_MGT_TYPE: //mgnt
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt);
 #ifdef CONFIG_IEEE80211W
                        if(validate_80211w_mgmt(adapter, precv_frame) == _FAIL)
                        {
                                retval = _FAIL;
+                               DBG_COUNTER(padapter->rx_logs.core_rx_pre_mgmt_err_80211w);
                                break;
                        }
 #endif //CONFIG_IEEE80211W
@@ -2250,18 +2294,22 @@ _func_enter_;
                        if (retval == _FAIL)
                        {
                                RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n"));
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err);
                        }
                        retval = _FAIL; // only data frame return _SUCCESS
                        break;
                case WIFI_CTRL_TYPE: //ctrl
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl);
                        retval = validate_recv_ctrl_frame(adapter, precv_frame);
                        if (retval == _FAIL)
                        {
                                RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n"));
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err);
                        }
                        retval = _FAIL; // only data frame return _SUCCESS
                        break;
                case WIFI_DATA_TYPE: //data
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_data);
 #ifdef CONFIG_WAPI_SUPPORT
                        if(pattrib->qos)
                                external_len = 2;
@@ -2280,6 +2328,7 @@ _func_enter_;
                                else
                                {
                                        retval = _FAIL;
+                                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err);
                                        break;
                                }
                        }
@@ -2288,6 +2337,7 @@ _func_enter_;
                                        if(rtw_wapi_drop_for_key_absent(adapter,GetAddr2Ptr(ptr))){
                                                retval=_FAIL;
                                                WAPI_TRACE(WAPI_RX,"drop for key absent for rx \n");
+                                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err);
                                                break;
                                        }
                        }
@@ -2301,9 +2351,30 @@ _func_enter_;
                                struct recv_priv *precvpriv = &adapter->recvpriv;
                                //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n"));
                                precvpriv->rx_drop++;
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err);
+                       }
+                       else if (retval == _SUCCESS)
+                       {
+#ifdef DBG_RX_DUMP_EAP
+                               u8 bDumpRxPkt;
+                               u16 eth_type;
+
+                               // dump eapol
+                               rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
+                               // get ether_type
+                               _rtw_memcpy(&eth_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2);
+                               eth_type = ntohs((unsigned short) eth_type);
+                               if ((bDumpRxPkt == 4) && (eth_type == 0x888e))
+                                       dump_rx_packet(ptr);
+#endif
+                       }
+                       else
+                       {
+                               DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled);
                        }
                        break;
                default:
+                       DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown);
                        RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type));
                        #ifdef DBG_RX_DROP_FRAME
                        DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type);
@@ -2932,6 +3003,9 @@ int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe)
 int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);
 int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
 {
+       PADAPTER padapter = preorder_ctrl->padapter;
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
        u8      wsize = preorder_ctrl->wsize_b;
        u16     wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096;
 
@@ -2972,6 +3046,7 @@ int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
        if( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) )
        {
                preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
+
                #ifdef DBG_RX_SEQ
                DBG_871X("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
                        preorder_ctrl->indicate_seq, seq_num);
@@ -2987,7 +3062,7 @@ int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
                        preorder_ctrl->indicate_seq = seq_num + 1 -wsize;
                else
                        preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;
-
+               pdbgpriv->dbg_rx_ampdu_window_shift_cnt++;
                #ifdef DBG_RX_SEQ
                DBG_871X("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
                        preorder_ctrl->indicate_seq, seq_num);
@@ -3061,6 +3136,19 @@ int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union rec
 
 }
 
+void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq);
+void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq)
+{
+       if(current_seq < prev_seq)
+       {
+               pdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq);
+
+       }
+       else
+       {
+               pdbgpriv->dbg_rx_ampdu_loss_count+= (current_seq - prev_seq);
+       }
+}
 int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced);
 int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced)
 {
@@ -3073,6 +3161,10 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre
        int bPktInBuf = _FALSE;
        struct recv_priv *precvpriv = &padapter->recvpriv;
        _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_in_oder);
 
        //DbgPrint("+recv_indicatepkts_in_order\n");
 
@@ -3091,6 +3183,7 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre
        // Handling some condition for forced indicate case.
        if(bforced==_TRUE)
        {
+               pdbgpriv->dbg_rx_ampdu_forced_indicate_count++;
                if(rtw_is_list_empty(phead))
                {
                        // _exit_critical_ex(&ppending_recvframe_queue->lock, &irql);
@@ -3098,14 +3191,14 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre
                        return _TRUE;
                }
        
-                prframe = LIST_CONTAINOR(plist, union recv_frame, u);
-               pattrib = &prframe->u.hdr.attrib;       
+               prframe = LIST_CONTAINOR(plist, union recv_frame, u);
+               pattrib = &prframe->u.hdr.attrib;       
 
                #ifdef DBG_RX_SEQ
                DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
                        preorder_ctrl->indicate_seq, pattrib->seq_num);
                #endif
-                       
+               recv_indicatepkts_pkt_loss_cnt(pdbgpriv,preorder_ctrl->indicate_seq,pattrib->seq_num);
                preorder_ctrl->indicate_seq = pattrib->seq_num;         
                
        }
@@ -3241,6 +3334,10 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
        struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
        struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl;
        _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_reoder);
 
        if(!pattrib->amsdu)
        {
@@ -3337,6 +3434,7 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
        //s2. check if winstart_b(indicate_seq) needs to been updated
        if(!check_indicate_seq(preorder_ctrl, pattrib->seq_num))
        {
+               pdbgpriv->dbg_rx_ampdu_drop_count++;
                //pHTInfo->RxReorderDropCounter++;
                //ReturnRFDList(Adapter, pRfd);
                //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("RxReorderIndicatePacket() ==> Packet Drop!!\n"));
@@ -3446,6 +3544,8 @@ int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe)
 #ifdef CONFIG_80211N_HT
 
        struct ht_priv  *phtpriv = &pmlmepriv->htpriv;
+       
+       DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate);
 
 #ifdef CONFIG_TDLS
        if( (phtpriv->ht_option==_TRUE) ||
@@ -3549,10 +3649,14 @@ 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;
+       struct mp_priv *pmppriv = &padapter->mppriv;
+#endif //CONFIG_MP_INCLUDED
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_pre);
+
+#ifdef CONFIG_MP_INCLUDED
        if (padapter->registrypriv.mp_mode == 1)
        {
                if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
@@ -3568,13 +3672,16 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
                                
                        }
 
-                       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;
+                       if(pmppriv->rx_bindicatePkt == _FALSE)
+                       {
+                               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
 
@@ -3598,13 +3705,11 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
        struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
        struct recv_priv *precvpriv = &padapter->recvpriv;
        _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
-       
-
 #ifdef CONFIG_TDLS
        u8 *psnap_type, *pcategory;
-       struct sta_info *ptdls_sta = NULL;
 #endif //CONFIG_TDLS
 
+       DBG_COUNTER(padapter->rx_logs.core_rx_post);
 
        // DATA FRAME
        rtw_led_control(padapter, LED_CTL_RX);
@@ -3616,6 +3721,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__);
                #endif
                ret = _FAIL;
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_err);
                goto _recv_data_drop;
        }
 
@@ -3637,14 +3743,15 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
 
 #ifdef CONFIG_TDLS
        //check TDLS frame
-       psnap_type = get_recvframe_data(orig_prframe);
-       psnap_type+=pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
+       psnap_type = get_recvframe_data(orig_prframe) + pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
        pcategory = psnap_type + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
 
        if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, ETH_TYPE_LEN)) &&
                ((*pcategory==RTW_WLAN_CATEGORY_TDLS) || (*pcategory==RTW_WLAN_CATEGORY_P2P))){
                ret = OnTDLS(padapter, prframe);        //all of functions will return _FAIL
-               goto _exit_recv_func;
+               if(ret == _FAIL)
+                       goto _exit_recv_func;
+               //goto _exit_recv_func;
        }
 #endif //CONFIG_TDLS
 
@@ -3654,6 +3761,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                #ifdef DBG_RX_DROP_FRAME
                DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__);
                #endif
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_defrag_err);
                goto _recv_data_drop;           
        }
 
@@ -3664,16 +3772,11 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__);
                #endif
                ret = _FAIL;
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_portctrl_err);
                goto _recv_data_drop;
        }
 
-#ifdef CONFIG_TDLS
-       if(padapter->tdlsinfo.setup_state == TDLS_LINKED_STATE)
-               ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->src);
-       count_rx_stats(padapter, prframe, ptdls_sta);
-#else
        count_rx_stats(padapter, prframe, NULL);
-#endif //CONFIG_TDLS
 
 #ifdef CONFIG_WAPI_SUPPORT
        rtw_wapi_update_info(padapter, prframe);
@@ -3688,6 +3791,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
                DBG_871X("DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\n", __FUNCTION__);
                #endif
                rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame
+               DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_err);
                goto _recv_data_drop;
        }
 #else // CONFIG_80211N_HT
@@ -3778,6 +3882,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
 
                while((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {
                        cnt++;
+                       DBG_COUNTER(padapter->rx_logs.core_rx_dequeue);
                        recv_func_posthandle(padapter, pending_frame);
                }
 
@@ -3786,6 +3891,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
                                FUNC_ADPT_ARG(padapter), cnt);
        }
 
+       DBG_COUNTER(padapter->rx_logs.core_rx);
        ret = recv_func_prehandle(padapter, rframe);
 
        if(ret == _SUCCESS) {
@@ -3797,6 +3903,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
                        psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK &&
                        !psecuritypriv->busetkipkey)
                {
+                       DBG_COUNTER(padapter->rx_logs.core_rx_enqueue);
                        rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
                        //DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
 
index 4fc5489c2ff2edc1534fe7104a7c399c777638ee..9841568494ecf248916e632c668c841a517f57d6 100755 (executable)
 
 #include <drv_types.h>
 
+static const char *_security_type_str[] = {
+       "N/A",
+       "WEP40",
+       "TKIP",
+       "TKIP_WM",
+       "AES",
+       "WEP104",
+       "SMS4",
+       "WEP_WPA",
+       "BIP",
+};
+
+const char *security_type_str(u8 value)
+{
+#ifdef CONFIG_IEEE80211W
+       if (value <= _BIP_)
+#else
+       if (value <= _WEP_WPA_MIXED_)
+#endif
+               return _security_type_str[value];
+       return NULL;
+}
+
+#ifdef DBG_SW_SEC_CNT
+#define WEP_SW_ENC_CNT_INC(sec, ra) \
+       if (is_broadcast_mac_addr(ra)) \
+               sec->wep_sw_enc_cnt_bc++; \
+       else if (is_multicast_mac_addr(ra)) \
+               sec->wep_sw_enc_cnt_mc++; \
+       else \
+               sec->wep_sw_enc_cnt_uc++;
+
+#define WEP_SW_DEC_CNT_INC(sec, ra) \
+       if (is_broadcast_mac_addr(ra)) \
+               sec->wep_sw_dec_cnt_bc++; \
+       else if (is_multicast_mac_addr(ra)) \
+               sec->wep_sw_dec_cnt_mc++; \
+       else \
+               sec->wep_sw_dec_cnt_uc++;
+
+#define TKIP_SW_ENC_CNT_INC(sec, ra) \
+       if (is_broadcast_mac_addr(ra)) \
+               sec->tkip_sw_enc_cnt_bc++; \
+       else if (is_multicast_mac_addr(ra)) \
+               sec->tkip_sw_enc_cnt_mc++; \
+       else \
+               sec->tkip_sw_enc_cnt_uc++;
+
+#define TKIP_SW_DEC_CNT_INC(sec, ra) \
+       if (is_broadcast_mac_addr(ra)) \
+               sec->tkip_sw_dec_cnt_bc++; \
+       else if (is_multicast_mac_addr(ra)) \
+               sec->tkip_sw_dec_cnt_mc++; \
+       else \
+               sec->tkip_sw_dec_cnt_uc++;
+
+#define AES_SW_ENC_CNT_INC(sec, ra) \
+       if (is_broadcast_mac_addr(ra)) \
+               sec->aes_sw_enc_cnt_bc++; \
+       else if (is_multicast_mac_addr(ra)) \
+               sec->aes_sw_enc_cnt_mc++; \
+       else \
+               sec->aes_sw_enc_cnt_uc++;
+
+#define AES_SW_DEC_CNT_INC(sec, ra) \
+       if (is_broadcast_mac_addr(ra)) \
+               sec->aes_sw_dec_cnt_bc++; \
+       else if (is_multicast_mac_addr(ra)) \
+               sec->aes_sw_dec_cnt_mc++; \
+       else \
+               sec->aes_sw_dec_cnt_uc++;
+#else
+#define WEP_SW_ENC_CNT_INC(sec, ra)
+#define WEP_SW_DEC_CNT_INC(sec, ra)
+#define TKIP_SW_ENC_CNT_INC(sec, ra)
+#define TKIP_SW_DEC_CNT_INC(sec, ra)
+#define AES_SW_ENC_CNT_INC(sec, ra)
+#define AES_SW_DEC_CNT_INC(sec, ra)
+#endif /* DBG_SW_SEC_CNT */
 
 //=====WEP related===== 
 
@@ -229,7 +308,8 @@ _func_enter_;
                        }
                        
                }               
-                                               
+
+               WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
        }
        
 _func_exit_;                                           
@@ -277,8 +357,9 @@ _func_enter_;
                {
                        RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
                                                crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
-               }       
-                                               
+               }
+
+               WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
        }
        
 _func_exit_;           
@@ -753,7 +834,7 @@ _func_enter_;
                                }
                        }
 
-
+                       TKIP_SW_ENC_CNT_INC(psecuritypriv,pattrib->ra);
                }
 /*
                else{
@@ -845,7 +926,6 @@ _func_enter_;
                        }
                        else
                        {
-                               RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n"));
                                prwskey=&stainfo->dot118021x_UncstKey.skey[0];
                                prwskeylen=16;
                        }
@@ -875,8 +955,8 @@ _func_enter_;
                                                crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
                                res=_FAIL;
                        }
-                                               
-               
+
+                       TKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
                }
                else{
                        RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n"));
@@ -1684,7 +1764,7 @@ _func_enter_;
                                }
                        }
 
-
+                       AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
                }
 /*
                else{
@@ -1692,7 +1772,7 @@ _func_enter_;
                        DBG_871X("%s, psta==NUL\n", __func__);
                        res=_FAIL;
                }
-*/                                             
+*/
        }
 
 
@@ -2009,7 +2089,6 @@ _func_enter_;
                                static u32 no_gkey_bc_cnt = 0;
                                static u32 no_gkey_mc_cnt = 0;
 
-                               //in concurrent we should use sw descrypt in group key, so we remove this message                       
                                //DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n");
                                //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
                                if(psecuritypriv->binstallGrpkey==_FALSE)
@@ -2085,10 +2164,10 @@ _func_enter_;
 
                        res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length);
 
-
+                       AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
                }
                else{
-                       RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
+                       RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo==NULL!!!\n"));
                        res=_FAIL;
                }
                                                
@@ -3119,9 +3198,9 @@ void rtw_sec_restore_wep_key(_adapter *adapter)
                for(keyid=0;keyid<4;keyid++){
                        if(securitypriv->key_mask & BIT(keyid)){
                                if(keyid == securitypriv->dot11PrivacyKeyIndex)
-                                       rtw_set_key(adapter,securitypriv, keyid, 1, _TRUE);
+                                       rtw_set_key(adapter,securitypriv, keyid, 1, _FALSE);
                                else
-                                       rtw_set_key(adapter,securitypriv, keyid, 0, _TRUE);
+                                       rtw_set_key(adapter,securitypriv, keyid, 0, _FALSE);
                        }
                }
        }
index 108833b379119b039a48d314d715c82200eaa87f..82db59c670dd46557fd3124e339184ea66d2be2b 100755 (executable)
@@ -162,7 +162,7 @@ void sreset_restore_security_station(_adapter *padapter)
                else\r
                {\r
                        //pairwise key\r
-                       rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE);\r
+                       rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE);\r
                        //group key\r
                        rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE);\r
                }\r
@@ -331,10 +331,10 @@ void sreset_reset(_adapter *padapter)
 \r
        psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;\r
 \r
-       \r
-#ifdef CONFIG_POWER_SAVING\r
+\r
+#ifdef CONFIG_LPS\r
        rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET");\r
-#endif\r
+#endif//#ifdef CONFIG_LPS\r
        \r
        _enter_pwrlock(&pwrpriv->lock);\r
 \r
index 105d664c96b44701b6fe15dede795003e862981a..f03f727d9ee6e8e59e1ac9d19013e98d67302577 100755 (executable)
@@ -392,13 +392,7 @@ _func_enter_;
                init_addba_retry_timer(pstapriv->padapter, psta);
 
 #ifdef CONFIG_TDLS
-               psta->padapter = pstapriv->padapter;
-               init_TPK_timer(pstapriv->padapter, psta);
-               init_ch_switch_timer(pstapriv->padapter, psta);
-               init_base_ch_timer(pstapriv->padapter, psta);
-               init_off_ch_timer(pstapriv->padapter, psta);
-               init_handshake_timer(pstapriv->padapter, psta);
-               init_tdls_alive_timer(pstapriv->padapter, psta);
+               rtw_init_tdls_timer(pstapriv->padapter, psta);
 #endif //CONFIG_TDLS
 
                //for A-MPDU Rx reordering buffer control
@@ -538,12 +532,7 @@ _func_enter_;
        _cancel_timer_ex(&psta->addba_retry_timer);
 
 #ifdef CONFIG_TDLS
-       _cancel_timer_ex(&psta->TPK_timer);
-       _cancel_timer_ex(&psta->option_timer);
-       _cancel_timer_ex(&psta->base_ch_timer);
-       _cancel_timer_ex(&psta->off_ch_timer);
-       _cancel_timer_ex(&psta->alive_timer1);
-       _cancel_timer_ex(&psta->alive_timer2);
+       rtw_free_tdls_timer(psta);
 #endif //CONFIG_TDLS
 
        //for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer
index 32c0723ec0bd2281aad0036bdf74121ad248eadb..21f9fcc8342b9269398afb27a9b260f65308fea0 100755 (executable)
 #include <drv_types.h>\r
 \r
 #ifdef CONFIG_TDLS\r
-extern unsigned char MCS_rate_2R[16];\r
-extern unsigned char MCS_rate_1R[16];\r
 extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);\r
-extern s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe);\r
 \r
 void rtw_reset_tdls_info(_adapter* padapter)\r
 {\r
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
 \r
        ptdlsinfo->ap_prohibited = _FALSE;\r
-       ptdlsinfo->setup_state = TDLS_STATE_NONE;\r
+       ptdlsinfo->link_established = _FALSE;\r
        ptdlsinfo->sta_cnt = 0;\r
        ptdlsinfo->sta_maximum = _FALSE;\r
-       ptdlsinfo->macid_index= 6;\r
-       ptdlsinfo->clear_cam= 0;\r
        ptdlsinfo->ch_sensing = 0;\r
        ptdlsinfo->cur_channel = 0;\r
        ptdlsinfo->candidate_ch = 1;    //when inplement channel switching, default candidate channel is 1\r
@@ -53,7 +48,7 @@ int rtw_init_tdls_info(_adapter* padapter)
        int     res = _SUCCESS;\r
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
 \r
-       ptdlsinfo->enable = 1;\r
+       ptdlsinfo->tdls_enable = _TRUE;\r
        rtw_reset_tdls_info(padapter);\r
 \r
        _rtw_spinlock_init(&ptdlsinfo->cmd_lock);\r
@@ -72,8 +67,9 @@ void rtw_free_tdls_info(struct tdls_info *ptdlsinfo)
 \r
 }\r
 \r
-void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode)\r
+int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack)\r
 {\r
+       int ret = _FAIL;\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        unsigned char                                   *pframe;\r
@@ -85,12 +81,13 @@ void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_
 \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
 \r
        //update attribute\r
        pattrib = &pmgntframe->attrib;\r
        update_mgntframe_attrib(padapter, pattrib);\r
+       pattrib->retry_ctrl = _FALSE;\r
 \r
        _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\r
 \r
@@ -99,146 +96,98 @@ void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_
 \r
        fctrl = &(pwlanhdr->frame_ctl);\r
        *(fctrl) = 0;\r
-//     SetToDs(fctrl);\r
+\r
+       //      SetToDs(fctrl);\r
+\r
        if (power_mode)\r
        {\r
                SetPwrMgt(fctrl);\r
        }\r
 \r
-       _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\r
        _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
        _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
 \r
-       ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;\r
-       ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;\r
-       pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];\r
-       SetSeqNum(pwlanhdr, pattrib->seqnum);\r
-\r
+       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\r
+       pmlmeext->mgnt_seq++;\r
        SetFrameSubType(pframe, WIFI_DATA_NULL);\r
 \r
        pframe += sizeof(struct rtw_ieee80211_hdr_3addr);\r
        pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\r
 \r
        pattrib->last_txcmdsz = pattrib->pktlen;\r
-       dump_mgntframe(padapter, pmgntframe);\r
 \r
-       return;\r
-}\r
-\r
-s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)\r
-{\r
-\r
-       struct sta_info *psta = NULL;\r
-       struct sta_priv         *pstapriv = &padapter->stapriv;\r
-       struct security_priv    *psecuritypriv = &padapter->securitypriv;\r
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
-       struct qos_priv         *pqospriv= &pmlmepriv->qospriv;\r
-\r
-       s32 res=_SUCCESS;\r
-       sint bmcast;\r
-\r
-       bmcast = IS_MCAST(pattrib->ra);\r
-       \r
-       psta = rtw_get_stainfo(pstapriv, pattrib->ra);\r
-       if (psta == NULL)       { \r
-               res =_FAIL;\r
-               goto exit;\r
+       if(wait_ack)\r
+       {\r
+               ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\r
+       }\r
+       else\r
+       {\r
+               dump_mgntframe(padapter, pmgntframe);\r
+               ret = _SUCCESS;\r
        }\r
 \r
-       pattrib->mac_id = psta->mac_id;\r
-                               \r
-       pattrib->psta = psta;\r
+exit:\r
+       return ret;\r
+\r
+}\r
 \r
-       pattrib->ack_policy = 0;\r
-       // get ether_hdr_len\r
-       pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag\r
+int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)\r
+{\r
+       int ret;\r
+       int i = 0;\r
+       u32 start = rtw_get_current_time();\r
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
 \r
-       if (pqospriv->qos_option &&  psta->qos_option) {\r
-               pattrib->priority = 1;  //tdls management frame should be AC_BK\r
-               pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;\r
-               pattrib->subtype = WIFI_QOS_DATA_TYPE;\r
+       //[TDLS] UAPSD : merge this from issue_nulldata() and mark it first.\r
+       #if 0\r
+       psta = rtw_get_stainfo(&padapter->stapriv, da);\r
+       if (psta) {\r
+               if (power_mode)\r
+                       rtw_hal_macid_sleep(padapter, psta->mac_id);\r
+               else\r
+                       rtw_hal_macid_wakeup(padapter, psta->mac_id);\r
        } else {\r
-               pattrib->hdrlen = WLAN_HDR_A3_LEN;\r
-               pattrib->subtype = WIFI_DATA_TYPE;      \r
-               pattrib->priority = 0;\r
+               DBG_871X(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n",\r
+                       FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode?"sleep":"wakeup");\r
+               rtw_warn_on(1);\r
        }\r
+       #endif\r
 \r
-       if (psta->ieee8021x_blocked == _TRUE)\r
-       {\r
-               pattrib->encrypt = 0;\r
-       }\r
-       else\r
+       do\r
        {\r
-               GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);\r
+               ret = _issue_nulldata_to_TDLS_peer_STA(padapter, da, power_mode, wait_ms>0 ? _TRUE : _FALSE);\r
 \r
-               switch(psecuritypriv->dot11AuthAlgrthm)\r
-               {\r
-                       case dot11AuthAlgrthm_Open:\r
-                       case dot11AuthAlgrthm_Shared:\r
-                       case dot11AuthAlgrthm_Auto:                             \r
-                               pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;\r
-                               break;\r
-                       case dot11AuthAlgrthm_8021X:\r
-                               pattrib->key_idx = 0;\r
-                               break;\r
-                       default:\r
-                               pattrib->key_idx = 0;\r
-                               break;\r
-               }\r
-       }\r
+               i++;\r
 \r
-       switch (pattrib->encrypt)\r
-       {\r
-               case _WEP40_:\r
-               case _WEP104_:\r
-                       pattrib->iv_len = 4;\r
-                       pattrib->icv_len = 4;\r
+               if (padapter->bDriverStopped || padapter->bSurpriseRemoved)\r
                        break;\r
-               case _TKIP_:\r
-                       pattrib->iv_len = 8;\r
-                       pattrib->icv_len = 4;\r
-                       if(padapter->securitypriv.busetkipkey==_FAIL)\r
-                       {\r
-                               res =_FAIL;\r
-                               goto exit;\r
-                       }\r
-                       break;                  \r
-               case _AES_:\r
-                       pattrib->iv_len = 8;\r
-                       pattrib->icv_len = 8;\r
-                       break;\r
-               default:\r
-                       pattrib->iv_len = 0;\r
-                       pattrib->icv_len = 0;\r
-                       break;\r
-       }\r
 \r
-       if (pattrib->encrypt &&\r
-           ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))\r
-       {\r
-               pattrib->bswenc = _TRUE;\r
-       } else {\r
-               pattrib->bswenc = _FALSE;\r
-       }\r
+               if(i < try_cnt && wait_ms > 0 && ret==_FAIL)\r
+                       rtw_msleep_os(wait_ms);\r
 \r
-       //qos_en, ht_en, init rate, ,bw, ch_offset, sgi\r
-       pattrib->qos_en = psta->qos_option;\r
-       pattrib->ht_en = psta->htpriv.ht_option;\r
-       pattrib->raid = psta->raid;\r
-       pattrib->bwmode = psta->bw_mode;\r
-       pattrib->ch_offset = psta->htpriv.ch_offset;\r
-       pattrib->sgi= query_ra_short_GI(psta);\r
-       pattrib->ampdu_en = _FALSE;\r
-       \r
-       //if(pattrib->ht_en && psta->htpriv.ampdu_enable)\r
-       //{\r
-       //      if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))\r
-       //              pattrib->ampdu_en = _TRUE;\r
-       //}     \r
+       }while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\r
 \r
-exit:\r
+       if (ret != _FAIL) {\r
+               ret = _SUCCESS;\r
+               #ifndef DBG_XMIT_ACK\r
+               goto exit;\r
+               #endif\r
+       }\r
 \r
-       return res;\r
+       if (try_cnt && wait_ms) {\r
+               if (da)\r
+                       DBG_871X(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d in %u ms\n",\r
+                               FUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),\r
+                               ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));\r
+               else\r
+                       DBG_871X(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",\r
+                               FUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),\r
+                               ret==_SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start));\r
+       }\r
+exit:\r
+       return ret;\r
 }\r
 \r
 void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta)\r
@@ -252,20 +201,18 @@ void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta)
        if(ptdlsinfo->sta_cnt != 0)\r
                ptdlsinfo->sta_cnt--;\r
        _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
-       if( ptdlsinfo->sta_cnt < (NUM_STA - 2) )        // -2: AP + BC/MC sta\r
+       if( ptdlsinfo->sta_cnt < (NUM_STA - 2 - 4) )    // -2: AP + BC/MC sta, -4: default key\r
        {\r
                ptdlsinfo->sta_maximum = _FALSE;\r
                _rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) );\r
        }\r
-       //ready to clear cam\r
-       if(ptdls_sta->mac_id!=0){\r
-               ptdlsinfo->clear_cam=ptdls_sta->mac_id;\r
-               rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE, _TRUE);\r
-       }\r
+\r
+       //clear cam\r
+       rtw_clearstakey_cmd(padapter, ptdls_sta, _TRUE);\r
 \r
        if(ptdlsinfo->sta_cnt==0){\r
                rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR);\r
-               ptdlsinfo->setup_state=TDLS_STATE_NONE;\r
+               ptdlsinfo->link_established = _FALSE;\r
        }\r
        else\r
                DBG_871X("Remain tdls sta:%02x\n", ptdlsinfo->sta_cnt);\r
@@ -274,28 +221,18 @@ void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta)
        \r
 }\r
 \r
-// cam entry will be the same as mac_id\r
-void rtw_tdls_set_mac_id(struct tdls_info *ptdlsinfo, struct sta_info *ptdls_sta)\r
-{\r
-       if(ptdls_sta->mac_id==0)\r
-       {\r
-               ptdls_sta->mac_id = ptdlsinfo->macid_index;\r
-               if( (++ptdlsinfo->macid_index) > (NUM_STA -2) )\r
-                       ptdlsinfo->macid_index= TDLS_INI_MACID_ENTRY;\r
-       }\r
-}\r
 \r
 //TDLS encryption(if needed) will always be CCMP\r
-void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta)\r
+void rtw_tdls_set_key(_adapter *padapter, struct rx_pkt_attrib *prx_pkt_attrib, struct sta_info *ptdls_sta)\r
 {\r
        if(prx_pkt_attrib->encrypt)\r
        {\r
                ptdls_sta->dot118021XPrivacy=_AES_;\r
-               rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE, _TRUE);\r
+               rtw_setstakey_cmd(padapter, ptdls_sta, _TRUE, _TRUE);\r
        }\r
 }\r
 \r
-void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)\r
+void rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)\r
 {\r
        /* save HT capabilities in the sta object */\r
        _rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap));\r
@@ -312,7 +249,7 @@ void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *
 \r
        if(ptdls_sta->flags & WLAN_STA_HT)\r
        {\r
-               if(adapter->registrypriv.ht_enable == _TRUE)\r
+               if(padapter->registrypriv.ht_enable == _TRUE)\r
                {\r
                        ptdls_sta->htpriv.ht_option = _TRUE;\r
                }\r
@@ -327,7 +264,7 @@ void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *
        if(ptdls_sta->htpriv.ht_option)\r
        {\r
                //check if sta supports rx ampdu\r
-               if(adapter->registrypriv.ampdu_enable==1)\r
+               if(padapter->registrypriv.ampdu_enable==1)\r
                        ptdls_sta->htpriv.ampdu_enable = _TRUE;\r
 \r
                //check if sta support s Short GI 20M\r
@@ -344,75 +281,68 @@ void rtw_tdls_process_ht_cap(_adapter *adapter, struct sta_info *ptdls_sta, u8 *
                // bwmode would still followed AP's setting\r
                if(ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))\r
                {\r
-                       if (adapter->mlmeextpriv.cur_bwmode >= CHANNEL_WIDTH_40)\r
+                       if (padapter->mlmeextpriv.cur_bwmode >= CHANNEL_WIDTH_40)\r
                                ptdls_sta->bw_mode = CHANNEL_WIDTH_40;\r
-                       ptdls_sta->htpriv.ch_offset = adapter->mlmeextpriv.cur_ch_offset;\r
+                       ptdls_sta->htpriv.ch_offset = padapter->mlmeextpriv.cur_ch_offset;\r
                }\r
        }\r
+\r
 }\r
 \r
-u8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\r
+int rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\r
 {\r
-       struct rtw_ieee80211_ht_cap ht_capie;\r
-       u8 rf_type;\r
+       int tmplen;\r
 \r
-       //HT capabilities\r
-       _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap));\r
-\r
-       ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS |\r
-                                               IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40;\r
+       rtw_ht_use_default_setting(padapter);\r
 \r
-       {\r
-               u32 rx_packet_offset, max_recvbuf_sz;\r
-               rx_packet_offset = 0;\r
-               padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset);\r
-               max_recvbuf_sz = 0;\r
-               padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz);\r
-               if(max_recvbuf_sz-rx_packet_offset>(8191-256))\r
-                       ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU;\r
-       }\r
-       \r
-       ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03);\r
+       tmplen = pattrib->pktlen;\r
+       rtw_restructure_ht_ie(padapter, NULL, pframe, 0, &(pattrib->pktlen), padapter->mlmeextpriv.cur_channel);\r
 \r
-       padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\r
-       switch(rf_type)\r
-       {\r
-               case RF_1T1R:\r
-                       ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream\r
-                       _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16);\r
-                       break;\r
+       return (pattrib->pktlen - tmplen);\r
 \r
-               case RF_2T2R:\r
-               case RF_1T2R:\r
-               default:\r
-                       ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream\r
-                       _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);\r
-                       break;\r
-       }\r
-                       \r
-       return(rtw_set_ie(pframe, _HT_CAPABILITY_IE_, \r
-                                               sizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)));\r
 }\r
 \r
 u8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib)\r
 {\r
-       u8 sup_ch[ 30 * 2 ] = { 0x00 }, sup_ch_idx = 0, idx_5g = 2;     //For supported channel\r
+       u8 sup_ch[ 30 * 2 ] = { 0x00 }, ch_set_idx = 0; //For supported channel\r
+       u8 ch_24g = 0, b1 = 0, b4 = 0;\r
+       u8 bit_table = 0, sup_ch_idx = 0;\r
+\r
        do{\r
-               if( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 )\r
+               if( pmlmeext->channel_set[ch_set_idx].ChannelNum >= 1 &&\r
+                       pmlmeext->channel_set[ch_set_idx].ChannelNum <= 14 )\r
+               {\r
+                       ch_24g = 1;     // 2.4 G channels\r
+               }\r
+               else if( pmlmeext->channel_set[ch_set_idx].ChannelNum >= 36 && \r
+                       pmlmeext->channel_set[ch_set_idx].ChannelNum <= 48)\r
+               {\r
+                       b1 = 1; // 5 G band1\r
+               }\r
+               else if( pmlmeext->channel_set[ch_set_idx].ChannelNum >= 149 && \r
+                       pmlmeext->channel_set[ch_set_idx].ChannelNum <= 165)\r
                {\r
-                       sup_ch[0] = 1;  //First channel number\r
-                       sup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum;       //Number of channel\r
+                       b4 = 1; // 5 G band4\r
                }\r
                else\r
                {\r
-                       sup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum;\r
-                       sup_ch[idx_5g++] = 1;\r
+                       ch_set_idx++;   // We don't claim that we support DFS channels.\r
+                       continue;\r
                }\r
-               \r
-               sup_ch_idx++;\r
+\r
+               sup_ch_idx = (ch_24g + b1 + b4 - 1) * 2;\r
+               if( sup_ch_idx >= 0)\r
+               {\r
+                       if(sup_ch[sup_ch_idx] == 0)\r
+                               sup_ch[sup_ch_idx] = pmlmeext->channel_set[ch_set_idx].ChannelNum;\r
+                       sup_ch[sup_ch_idx+1]++; //Number of channel\r
+               }\r
+\r
+               ch_set_idx++;\r
        }\r
-       while( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 );\r
-       return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, idx_5g, sup_ch, &(pattrib->pktlen)));\r
+       while( pmlmeext->channel_set[ch_set_idx].ChannelNum != 0 && ch_set_idx < MAX_CHANNEL_NUM );\r
+\r
+       return(rtw_set_ie(pframe, _SUPPORTED_CH_IE_, sup_ch_idx+2, sup_ch, &(pattrib->pktlen)));\r
 }\r
 \r
 #ifdef CONFIG_WFD\r
@@ -455,19 +385,24 @@ void rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length)
        }\r
 }\r
 \r
-void issue_tunneled_probe_req(_adapter *padapter)\r
+int issue_tunneled_probe_req(_adapter *padapter)\r
 {\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
        struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);\r
        u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; \r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _FAIL;\r
 \r
        DBG_871X("[%s]\n", __FUNCTION__);\r
-       \r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       txmgmt.action_code = TUNNELED_PROBE_REQ;\r
+\r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
@@ -477,39 +412,41 @@ void issue_tunneled_probe_req(_adapter *padapter)
        pattrib->ether_type = 0x890d;\r
 \r
        _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN);\r
-       \r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_REQ) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
-\r
+       dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame)\r
+int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
        struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);\r
-       struct rx_pkt_attrib    *rx_pkt_pattrib = &precv_frame->u.hdr.attrib;\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _FAIL;\r
 \r
        DBG_871X("[%s]\n", __FUNCTION__);\r
-       \r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       txmgmt.action_code = TUNNELED_PROBE_RSP;\r
+\r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
@@ -518,29 +455,27 @@ void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame)
        pmgntframe->frame_tag = DATA_FRAMETAG;\r
        pattrib->ether_type = 0x890d;\r
 \r
-       _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN);\r
-       \r
+       _rtw_memcpy(pattrib->dst, precv_frame->u.hdr.attrib.src, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TUNNELED_PROBE_RSP) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
-\r
+       dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 #endif //CONFIG_WFD\r
 \r
-void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr)\r
+int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack)\r
 {\r
        struct tdls_info        *ptdlsinfo = &padapter->tdlsinfo;\r
        struct xmit_frame                       *pmgntframe;\r
@@ -551,77 +486,81 @@ void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr)
        struct sta_info *ptdls_sta= NULL;\r
        _irqL irqL;\r
        static u8 dialogtoken = 0;\r
+       int ret = _FAIL;\r
        u32 timeout_interval= TPK_RESEND_COUNT * 1000;  //retry timer should set at least 301 sec, using TPK_count counting 301 times.\r
 \r
+       ptxmgmt->action_code = TDLS_SETUP_REQUEST;\r
        if(ptdlsinfo->ap_prohibited == _TRUE)\r
                goto exit;\r
 \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
        pattrib = &pmgntframe->attrib;\r
-\r
        pmgntframe->frame_tag = DATA_FRAMETAG;\r
        pattrib->ether_type = 0x890d;\r
 \r
-       _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
 \r
        //init peer sta_info\r
-       ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr);\r
+       ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer);\r
        if(ptdls_sta==NULL)\r
        {\r
-               ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr);\r
-               if(ptdls_sta)\r
-               {\r
-                       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);  \r
-                       if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))\r
-                               ptdlsinfo->sta_cnt++;\r
-                       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);   \r
-                       if( ptdlsinfo->sta_cnt == (NUM_STA - 2) )       // -2: AP + BC/MC sta\r
-                       {\r
-                               ptdlsinfo->sta_maximum  = _TRUE;\r
-                       }\r
-               }\r
-               else\r
+               ptdls_sta = rtw_alloc_stainfo(pstapriv, ptxmgmt->peer);\r
+               if(ptdls_sta==NULL)\r
                {\r
+                       DBG_871X("[%s] rtw_alloc_stainfo fail\n", __FUNCTION__);        \r
                        rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\r
                        rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                        goto exit;\r
                }\r
        }\r
        \r
-       if(ptdls_sta){  \r
-               ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE;\r
-               //for tdls; ptdls_sta->aid is used to fill dialogtoken\r
-               ptdls_sta->dialog = dialogtoken;\r
-               dialogtoken = (dialogtoken+1)%256;\r
-               ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;\r
-               _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME );\r
+       if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))\r
+               ptdlsinfo->sta_cnt++;\r
+       if( ptdlsinfo->sta_cnt == (NUM_STA - 2 - 4) )   // -2: AP + BC/MC sta, -4: default key\r
+       {\r
+               ptdlsinfo->sta_maximum  = _TRUE;\r
        }\r
 \r
-       pattrib->qsel=pattrib->priority;\r
-       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){\r
+       ptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE;\r
+       //for tdls; ptdls_sta->aid is used to fill dialogtoken\r
+       ptdls_sta->dialog = dialogtoken;\r
+       dialogtoken = (dialogtoken+1)%256;\r
+       ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;\r
+       _set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME );\r
+\r
+       pattrib->qsel = pattrib->priority;\r
+\r
+       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS ){\r
                rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
+\r
+       if (wait_ack) {\r
+               ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\r
+       } else {\r
+               dump_mgntframe(padapter, pmgntframe);\r
+               ret = _SUCCESS;\r
+       }\r
+\r
+       ret = _SUCCESS;\r
 \r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr)\r
+int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack)\r
 {\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
@@ -630,18 +569,18 @@ void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr)
        struct sta_priv *pstapriv = &padapter->stapriv;\r
        struct sta_info *ptdls_sta=NULL;\r
        _irqL irqL;\r
+       int ret = _FAIL;\r
 \r
-       ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr);\r
+       ptxmgmt->action_code = TDLS_TEARDOWN;\r
+       ptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer);\r
        if(ptdls_sta==NULL){\r
-               DBG_871X("issue tdls teardown unsuccessful\n");\r
-               return;\r
-       }else{\r
-               ptdls_sta->tdls_sta_state=TDLS_STATE_NONE;\r
+               DBG_871X("Np tdls_sta for tearing down\n");\r
+               goto exit;\r
        }\r
 \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
@@ -650,172 +589,170 @@ void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr)
        pmgntframe->frame_tag = DATA_FRAMETAG;\r
        pattrib->ether_type = 0x890d;\r
 \r
-       _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
 \r
-       if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){\r
-               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
+       if (wait_ack) {\r
+               ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\r
+       } else {\r
+               dump_mgntframe(padapter, pmgntframe);\r
+               ret = _SUCCESS;\r
        }\r
-       \r
-       if( ptdls_sta->timer_flag == 1 )\r
+\r
+       if(ret == _SUCCESS)\r
        {\r
-               _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL);\r
-               ptdls_sta->timer_flag = 2;\r
-               _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL);\r
+               if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){\r
+                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
+               }\r
+               \r
+               if( ptdls_sta->timer_flag == 1 )\r
+               {\r
+                       _enter_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL);\r
+                       ptdls_sta->timer_flag = 2;\r
+                       _exit_critical_bh(&(padapter->tdlsinfo.hdl_lock), &irqL);\r
+               }\r
+               else\r
+                       rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEAR_STA );\r
        }\r
-       else\r
-               rtw_tdls_cmd(padapter, mac_addr, TDLS_FREE_STA );\r
-\r
 \r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr)\r
+int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)\r
 {\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
        struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);\r
-       u8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; \r
+       int ret = _FAIL;\r
        \r
+       ptxmgmt->action_code = TDLS_DISCOVERY_REQUEST;\r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
-       \r
+\r
        //update attribute\r
        pattrib = &pmgntframe->attrib;\r
-\r
        pmgntframe->frame_tag = DATA_FRAMETAG;\r
        pattrib->ether_type = 0x890d;\r
 \r
-       if(mac_addr == NULL)\r
-               _rtw_memcpy(pattrib->dst, baddr, ETH_ALEN);\r
-       else\r
-               _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);\r
-       \r
+       _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
+       dump_mgntframe(padapter, pmgntframe);\r
        DBG_871X("issue tdls dis req\n");\r
 \r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame)\r
+int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)\r
 {\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       struct rx_pkt_attrib    *rx_pkt_pattrib = &precv_frame->u.hdr.attrib;\r
-       _irqL irqL;\r
+       int ret = _FAIL;\r
 \r
+       ptxmgmt->action_code = TDLS_SETUP_RESPONSE;             \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
        pattrib = &pmgntframe->attrib;\r
-\r
        pmgntframe->frame_tag = DATA_FRAMETAG;\r
        pattrib->ether_type = 0x890d;\r
 \r
-       _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
-       _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->ra, get_bssid(&(padapter->mlmepriv)), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
 \r
+       dump_mgntframe(padapter, pmgntframe);\r
+\r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 \r
 }\r
 \r
-void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame)\r
+int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)\r
 {\r
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);\r
-       struct sta_info         *ptdls_sta=NULL;\r
-       _irqL irqL;\r
-\r
-       struct rx_pkt_attrib    *rx_pkt_pattrib = & precv_frame->u.hdr.attrib;\r
+       int ret = _FAIL;\r
        \r
+       ptxmgmt->action_code = TDLS_SETUP_CONFIRM;\r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
        pattrib = &pmgntframe->attrib;\r
-\r
        pmgntframe->frame_tag = DATA_FRAMETAG;\r
        pattrib->ether_type = 0x890d;\r
 \r
-       _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN);\r
-       _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
-       _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->src, myid(&padapter->eeprompriv), ETH_ALEN);\r
+       _rtw_memcpy(pattrib->ra, get_bssid(&padapter->mlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;              \r
        }\r
 \r
-       rtw_dump_xframe(padapter, pmgntframe);\r
+       dump_mgntframe(padapter, pmgntframe);\r
 \r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 \r
 }\r
 \r
 //TDLS Discovery Response frame is a management action frame\r
-void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 dialog)\r
+int issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy)\r
 {\r
        struct xmit_frame               *pmgntframe;\r
        struct pkt_attrib               *pattrib;\r
@@ -824,12 +761,11 @@ void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 di
        unsigned short          *fctrl;\r
        struct xmit_priv                *pxmitpriv = &(padapter->xmitpriv);\r
        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-\r
-       struct rx_pkt_attrib    *rx_pkt_pattrib = &precv_frame->u.hdr.attrib;\r
+       int ret = _FAIL;\r
 \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
 \r
        //update attribute\r
@@ -845,13 +781,11 @@ void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 di
        *(fctrl) = 0;\r
 \r
        //      unicast probe request frame\r
-       _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr1, ptxmgmt->peer, ETH_ALEN);\r
        _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN);\r
-       \r
-       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN);\r
-\r
-       _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN);\r
+       _rtw_memcpy(pwlanhdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN);\r
        \r
        SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\r
@@ -860,29 +794,80 @@ void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame, u8 di
 \r
        pframe += sizeof (struct rtw_ieee80211_hdr_3addr);\r
        pattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\r
-       \r
-       rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, dialog);\r
+\r
+       rtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, ptxmgmt->dialog_token, privacy);\r
 \r
        pattrib->nr_frags = 1;\r
        pattrib->last_txcmdsz = pattrib->pktlen;\r
 \r
        dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
 \r
-       return;\r
+exit:\r
+       return ret;\r
 }\r
 \r
-void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta)\r
+int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *ptdls_sta)\r
+{\r
+       struct xmit_frame       *pmgntframe;\r
+       struct pkt_attrib       *pattrib;\r
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
+       struct xmit_priv        *pxmitpriv = &(padapter->xmitpriv);\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _FAIL;\r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       txmgmt.action_code = TDLS_PEER_TRAFFIC_RESPONSE;\r
+\r
+       if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
+       {\r
+               goto exit;\r
+       }\r
+       \r
+       //update attribute\r
+       pattrib = &pmgntframe->attrib;\r
+\r
+       pmgntframe->frame_tag = DATA_FRAMETAG;\r
+       pattrib->ether_type = 0x890d;\r
+\r
+       _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN);\r
+       _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
+       _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
+       _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
+\r
+       update_tdls_attrib(padapter, pattrib);\r
+       pattrib->qsel = pattrib->priority;\r
+\r
+       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS ){\r
+               rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\r
+               rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
+               goto exit;      \r
+       }\r
+\r
+       dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
+\r
+exit:\r
+\r
+       return ret;\r
+}\r
+\r
+int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta)\r
 {\r
        struct xmit_frame                       *pmgntframe;\r
        struct pkt_attrib                       *pattrib;\r
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
        struct xmit_priv                        *pxmitpriv = &(padapter->xmitpriv);\r
-\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _FAIL;\r
        static u8 dialogtoken=0;\r
-       \r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       txmgmt.action_code = TDLS_PEER_TRAFFIC_INDICATION;\r
+\r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
@@ -893,7 +878,6 @@ void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptd
 \r
        _rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
@@ -904,29 +888,36 @@ void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptd
        pattrib->priority = 7; \r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-       pattrib->qsel=pattrib->priority;\r
-       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) {\r
+       pattrib->qsel = pattrib->priority;\r
+       if (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {\r
                rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
+\r
+       dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
        \r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr)\r
+int issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr)\r
 {\r
        struct xmit_frame       *pmgntframe;\r
        struct pkt_attrib       *pattrib;\r
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
        struct xmit_priv        *pxmitpriv = &(padapter->xmitpriv);\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _FAIL;\r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       txmgmt.action_code = TDLS_CHANNEL_SWITCH_REQUEST;\r
 \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
@@ -937,37 +928,39 @@ void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr)
 \r
        _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-\r
-       pattrib->qsel=pattrib->priority;\r
-       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){\r
+       pattrib->qsel = pattrib->priority;\r
+       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS ){\r
                rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;\r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
 \r
+       dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr)\r
+int issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr)\r
 {\r
        struct xmit_frame       *pmgntframe;\r
        struct pkt_attrib       *pattrib;\r
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
        struct xmit_priv        *pxmitpriv = &(padapter->xmitpriv);\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _FAIL;\r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       txmgmt.action_code = TDLS_CHANNEL_SWITCH_RESPONSE;\r
 \r
-        _irqL irqL;    \r
-               \r
        if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\r
        {\r
-               return;\r
+               goto exit;\r
        }\r
        \r
        //update attribute\r
@@ -978,13 +971,11 @@ void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr)
 \r
        _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN);\r
        _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
        _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\r
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\r
 \r
        update_tdls_attrib(padapter, pattrib);\r
-\r
-       pattrib->qsel=pattrib->priority;\r
+       pattrib->qsel = pattrib->priority;\r
 /*\r
        _enter_critical_bh(&pxmitpriv->lock, &irqL);\r
        if(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){\r
@@ -992,35 +983,37 @@ void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr)
                return _FALSE;\r
        }\r
 */\r
-       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){\r
+       if(rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS ){\r
                rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\r
                rtw_free_xmitframe(pxmitpriv, pmgntframe);\r
                goto exit;      \r
        }\r
-       rtw_dump_xframe(padapter, pmgntframe);\r
-\r
+       dump_mgntframe(padapter, pmgntframe);\r
+       ret = _SUCCESS;\r
 exit:\r
 \r
-       return;\r
+       return ret;\r
 }\r
 \r
-sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame)\r
+int On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
-       struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(adapter->stapriv), get_bssid(&(adapter->mlmepriv)));\r
-       struct recv_priv *precvpriv = &(adapter->recvpriv);\r
+       struct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(padapter->stapriv), get_bssid(&(padapter->mlmepriv)));\r
+       struct recv_priv *precvpriv = &(padapter->recvpriv);\r
        u8 *ptr = precv_frame->u.hdr.rx_data, *psa;\r
        struct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib);\r
-       struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo);\r
+       struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);\r
        u8 empty_addr[ETH_ALEN] = { 0x00 };\r
        int UndecoratedSmoothedPWDB;\r
-       \r
+       struct tdls_txmgmt txmgmt;      \r
+       int ret = _SUCCESS;\r
 \r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
        //WFDTDLS: for sigma test, not to setup direct link automatically\r
        ptdlsinfo->dev_discovered = 1;\r
-       \r
-#ifdef CONFIG_TDLS_AUTOSETUP   \r
+\r
+#ifdef CONFIG_TDLS_AUTOSETUP\r
        psa = get_sa(ptr);\r
-       ptdls_sta = rtw_get_stainfo(&(adapter->stapriv), psa);\r
+       ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), psa);\r
 \r
        if(ptdls_sta != NULL)\r
        {\r
@@ -1042,7 +1035,7 @@ sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                                        ptdlsinfo->ss_record.RxPWDBAll = pattrib->RxPWDBAll;\r
                                }\r
                        }\r
-       }\r
+               }\r
 \r
        }\r
        else\r
@@ -1052,49 +1045,55 @@ sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                        if( _rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN ) )\r
                        {\r
                                //All traffics are busy, do not set up another direct link.\r
-                               return _FAIL;\r
+                               ret = _FAIL;\r
+                               goto exit;\r
                        }\r
                        else\r
                        {\r
                                if( pattrib->RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll )\r
                                {\r
-                                       issue_tdls_teardown(adapter, ptdlsinfo->ss_record.macaddr);\r
+                                       _rtw_memcpy(txmgmt.peer, ptdlsinfo->ss_record.macaddr, ETH_ALEN);\r
+                                       //issue_tdls_teardown(padapter, ptdlsinfo->ss_record.macaddr, _FALSE);\r
                                }\r
                                else\r
                                {\r
-                                       return _FAIL;\r
+                                       ret = _FAIL;\r
+                                       goto exit;\r
                                }\r
                        }\r
                }\r
 \r
-               adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);\r
+               padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);\r
 \r
                if( pattrib->RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB);\r
                {\r
                        DBG_871X("pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\n", pattrib->RxPWDBAll, UndecoratedSmoothedPWDB);\r
-                       issue_tdls_setup_req(adapter, psa);\r
+                       _rtw_memcpy(txmgmt.peer, psa, ETH_ALEN);\r
+                       issue_tdls_setup_req(padapter, &txmgmt, _FALSE);\r
                }\r
        }\r
 #endif //CONFIG_TDLS_AUTOSETUP\r
 \r
-       return _SUCCESS;\r
+exit:\r
+       return ret;\r
+\r
 }\r
 \r
-sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)\r
+sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
-       struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\r
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
        u8 *psa, *pmyid;\r
        struct sta_info *ptdls_sta= NULL;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
-       struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\r
-       struct security_priv *psecuritypriv = &adapter->securitypriv;\r
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\r
+       struct security_priv *psecuritypriv = &padapter->securitypriv;\r
        _irqL irqL;\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
        u8 *prsnie, *ppairwise_cipher;\r
-       u8 i, k, pairwise_count;\r
-       u8 ccmp_have=0, rsnie_have=0;\r
-       u16 j;\r
+       u8 i, k;\r
+       u8 ccmp_included=0, rsnie_included=0;\r
+       u16 j, pairwise_count;\r
        u8 SNonce[32];\r
        u32 *timeout_interval=NULL;\r
        sint parsing_length;    //frame body length, without icv_len\r
@@ -1102,11 +1101,13 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
        u8 FIXED_IE = 5;\r
        unsigned char           supportRate[16];\r
        int                             supportRateNum = 0;\r
+       struct tdls_txmgmt txmgmt;\r
 \r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
        psa = get_sa(ptr);\r
        ptdls_sta = rtw_get_stainfo(pstapriv, psa);\r
 \r
-       pmyid=myid(&(adapter->eeprompriv));\r
+       pmyid=myid(&(padapter->eeprompriv));\r
        ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;\r
        parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\r
                        -prx_pkt_attrib->hdrlen\r
@@ -1143,10 +1144,10 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
                                if(*(pmyid+i)==*(psa+i)){\r
                                }\r
                                else if(*(pmyid+i)>*(psa+i)){\r
-                                       goto exit;\r
-                               }else if(*(pmyid+i)<*(psa+i)){\r
                                        ptdls_sta->tdls_sta_state=TDLS_INITIATOR_STATE;\r
                                        break;\r
+                               }else if(*(pmyid+i)<*(psa+i)){\r
+                                       goto exit;\r
                                }\r
                        }\r
                }\r
@@ -1180,17 +1181,18 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
                                case _SUPPORTED_CH_IE_:\r
                                        break;\r
                                case _RSN_IE_2_:\r
-                                       rsnie_have=1;\r
+                                       rsnie_included=1;\r
                                        if(prx_pkt_attrib->encrypt){\r
                                                prsnie=(u8*)pIE;\r
                                                //check whether initiator STA has CCMP pairwise_cipher.\r
                                                ppairwise_cipher=prsnie+10;\r
-                                               _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1);\r
+                                               _rtw_memcpy(ptdls_sta->TDLS_RSNIE, pIE->data, pIE->Length);\r
+                                               pairwise_count = *(u16*)(ppairwise_cipher-2);\r
                                                for(k=0;k<pairwise_count;k++){\r
                                                        if(_rtw_memcmp( ppairwise_cipher+4*k, RSN_CIPHER_SUITE_CCMP, 4)==_TRUE)\r
-                                                               ccmp_have=1;\r
+                                                               ccmp_included=1;\r
                                                }\r
-                                               if(ccmp_have==0){\r
+                                               if(ccmp_included==0){\r
                                                        //invalid contents of RSNIE\r
                                                        ptdls_sta->stat_code=72;\r
                                                }\r
@@ -1211,7 +1213,7 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
                                case _RIC_Descriptor_IE_:\r
                                        break;\r
                                case _HT_CAPABILITY_IE_:\r
-                                       rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length);\r
+                                       rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);\r
                                        break;\r
                                case EID_BSSCoexistence:\r
                                        break;\r
@@ -1230,18 +1232,14 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
                        \r
                }\r
 \r
-               //update station supportRate    \r
-               ptdls_sta->bssratelen = supportRateNum;\r
-               _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);\r
-\r
                //check status code\r
                //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject\r
                if(ptdls_sta->stat_code == 0 )\r
                {\r
-                       if(rsnie_have && (prx_pkt_attrib->encrypt==0)){\r
+                       if(rsnie_included && (prx_pkt_attrib->encrypt==0)){\r
                                //security disabled\r
                                ptdls_sta->stat_code = 5;\r
-                       }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){\r
+                       }else if(rsnie_included==0 && (prx_pkt_attrib->encrypt)){\r
                                //request haven't RSNIE\r
                                ptdls_sta->stat_code = 38;\r
                        }\r
@@ -1249,9 +1247,9 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
 #ifdef CONFIG_WFD\r
                        //WFD test plan version 0.18.2 test item 5.1.5\r
                        //SoUT does not use TDLS if AP uses weak security\r
-                       if ( adapter->wdinfo.wfd_tdls_enable )\r
+                       if ( padapter->wdinfo.wfd_tdls_enable )\r
                        {\r
-                               if(rsnie_have && (prx_pkt_attrib->encrypt != _AES_))\r
+                               if(rsnie_included && (prx_pkt_attrib->encrypt != _AES_))\r
                                {\r
                                        ptdls_sta->stat_code = 5;\r
                                }\r
@@ -1264,11 +1262,14 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
                        _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32);\r
                        _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4);\r
                }\r
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          \r
+\r
+               //update station supportRate    \r
+               ptdls_sta->bssratelen = supportRateNum;\r
+               _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);\r
+\r
                if(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))\r
                        ptdlsinfo->sta_cnt++;\r
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);   \r
-               if( ptdlsinfo->sta_cnt == (NUM_STA - 2) )       // -2: AP + BC/MC sta\r
+               if( ptdlsinfo->sta_cnt == (NUM_STA - 2 - 4) )   // -2: AP + BC/MC sta, -4: default key\r
                {\r
                        ptdlsinfo->sta_maximum = _TRUE;\r
                }\r
@@ -1283,7 +1284,8 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
                goto exit;\r
        }\r
 \r
-       issue_tdls_setup_rsp(adapter, precv_frame);\r
+       _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN);\r
+       issue_tdls_setup_rsp(padapter, &txmgmt);\r
 \r
        if(ptdls_sta->stat_code==0)\r
        {\r
@@ -1291,19 +1293,19 @@ sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame)
        }\r
        else            //status code!=0 ; setup unsuccess\r
        {\r
-               free_tdls_sta(adapter, ptdls_sta);\r
+               free_tdls_sta(padapter, ptdls_sta);\r
        }\r
                \r
 exit:\r
        \r
-       return _FAIL;\r
+       return _SUCCESS;\r
 }\r
 \r
-sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)\r
+int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
-       struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\r
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
        struct sta_info *ptdls_sta= NULL;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
        _irqL irqL;\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
@@ -1312,18 +1314,23 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        sint parsing_length;    //frame body length, without icv_len\r
        PNDIS_802_11_VARIABLE_IEs       pIE;\r
        u8 FIXED_IE =7;\r
+       u8 ANonce[32];\r
        u8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL, *ppairwise_cipher=NULL;\r
        u16 pairwise_count, j, k;\r
        u8 verify_ccmp=0;\r
        unsigned char           supportRate[16];\r
        int                             supportRateNum = 0;\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _SUCCESS;\r
 \r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
        psa = get_sa(ptr);\r
        ptdls_sta = rtw_get_stainfo(pstapriv, psa);\r
 \r
        if ( NULL == ptdls_sta )\r
        {\r
-               return _FAIL;\r
+               ret = _FAIL;\r
+               goto exit;\r
        }\r
 \r
        ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;\r
@@ -1341,8 +1348,9 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        if(stat_code!=0)\r
        {\r
                DBG_871X( "[%s] status_code = %d, free_tdls_sta\n", __FUNCTION__, stat_code );\r
-               free_tdls_sta(adapter, ptdls_sta);\r
-               return _FAIL;\r
+               free_tdls_sta(padapter, ptdls_sta);\r
+               ret = _FAIL;\r
+               goto exit;\r
        }\r
 \r
        stat_code = 0;\r
@@ -1384,7 +1392,8 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                                break;\r
                        case _FTIE_:\r
                                pftie=(u8*)pIE;\r
-                               _rtw_memcpy(ptdls_sta->ANonce, (ptr+j+20), 32);\r
+                               //_rtw_memcpy(ptdls_sta->ANonce, (ptr+j+20), 32);\r
+                               _rtw_memcpy(ANonce, (ptr+j+20), 32);\r
                                break;\r
                        case _TIMEOUT_ITVL_IE_:\r
                                ptimeout_ie=(u8*)pIE;\r
@@ -1392,7 +1401,7 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                        case _RIC_Descriptor_IE_:\r
                                break;\r
                        case _HT_CAPABILITY_IE_:\r
-                               rtw_tdls_process_ht_cap(adapter, ptdls_sta, pIE->data, pIE->Length);\r
+                               rtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);\r
                                break;\r
                        case EID_BSSCoexistence:\r
                                break;\r
@@ -1407,10 +1416,12 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                \r
        }\r
 \r
-       //update station supportRate    \r
+       //update station's supportRate  \r
        ptdls_sta->bssratelen = supportRateNum;\r
        _rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);\r
 \r
+       _rtw_memcpy(ptdls_sta->ANonce, ANonce, 32);\r
+\r
 #ifdef CONFIG_WFD\r
        rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);\r
 #endif // CONFIG_WFD\r
@@ -1425,12 +1436,13 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                {\r
                        if(verify_ccmp==1)\r
                        {\r
-                               wpa_tdls_generate_tpk(adapter, ptdls_sta);\r
+                               wpa_tdls_generate_tpk(padapter, ptdls_sta);\r
                                ptdls_sta->stat_code=0;\r
                                if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0)   //0: Invalid, 1: valid\r
                                {\r
-                                       free_tdls_sta(adapter, ptdls_sta);\r
-                                       return _FAIL;\r
+                                       free_tdls_sta(padapter, ptdls_sta);\r
+                                       ret = _FAIL;\r
+                                       goto exit;\r
                                }\r
                        }\r
                        else\r
@@ -1444,41 +1456,35 @@ sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        }\r
 \r
        DBG_871X("issue_tdls_setup_cfm\n");\r
-       issue_tdls_setup_cfm(adapter, precv_frame);\r
+       _rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN);\r
+       issue_tdls_setup_cfm(padapter, &txmgmt);\r
 \r
        if(ptdls_sta->stat_code==0)\r
        {\r
-               ptdlsinfo->setup_state = TDLS_LINKED_STATE;\r
+               ptdlsinfo->link_established = _TRUE;\r
 \r
                if( ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE )\r
                {\r
                        ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;\r
                        _cancel_timer_ex( &ptdls_sta->handshake_timer);\r
-#ifdef CONFIG_TDLS_AUTOCHECKALIVE\r
-                       _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1);\r
-#endif //CONFIG_TDLS_AUTOSETUP\r
                }\r
 \r
-               rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta);\r
-               rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta);\r
+               rtw_tdls_set_key(padapter, prx_pkt_attrib, ptdls_sta);\r
 \r
-               rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR);\r
+               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED);\r
 \r
        }\r
-       else //status code!=0 ; setup unsuccessful\r
-       {\r
-               free_tdls_sta(adapter, ptdls_sta);\r
-       }\r
 \r
-       return _FAIL;\r
+exit:\r
+       return ret;\r
 \r
 }\r
 \r
-sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame)\r
+int On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
-       struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\r
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
        struct sta_info *ptdls_sta= NULL;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
        _irqL irqL;\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
@@ -1489,10 +1495,18 @@ sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame)
        u8 FIXED_IE =5;\r
        u8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL, *ppairwise_cipher=NULL;\r
        u16 j, pairwise_count;\r
+       int ret = _SUCCESS;\r
 \r
        psa = get_sa(ptr);\r
        ptdls_sta = rtw_get_stainfo(pstapriv, psa);\r
 \r
+       if(ptdls_sta == NULL)\r
+       {\r
+               DBG_871X( "[%s] Direct Link Peer = "MAC_FMT" not found\n", __FUNCTION__, MAC_ARG(psa) );\r
+               ret = _FAIL;\r
+               goto exit;\r
+       }\r
+\r
        ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;\r
        parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\r
                        -prx_pkt_attrib->hdrlen\r
@@ -1506,8 +1520,9 @@ sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame)
 \r
        if(stat_code!=0){\r
                DBG_871X( "[%s] stat_code = %d\n, free_tdls_sta", __FUNCTION__, stat_code );\r
-               free_tdls_sta(adapter, ptdls_sta);\r
-               return _FAIL;\r
+               free_tdls_sta(padapter, ptdls_sta);\r
+               ret = _FAIL;\r
+               goto exit;\r
        }\r
 \r
        if(prx_pkt_attrib->encrypt){\r
@@ -1544,45 +1559,47 @@ sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame)
 \r
                //verify mic in FTIE MIC field\r
                if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){  //0: Invalid, 1: Valid\r
-                       free_tdls_sta(adapter, ptdls_sta);\r
-                       return _FAIL;\r
+                       free_tdls_sta(padapter, ptdls_sta);\r
+                       ret = _FAIL;\r
+                       goto exit;\r
                }\r
 \r
        }\r
 \r
-       ptdlsinfo->setup_state = TDLS_LINKED_STATE;\r
+       ptdlsinfo->link_established = _TRUE;\r
        if( ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE )\r
        {\r
                ptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE;\r
                _cancel_timer_ex( &ptdls_sta->handshake_timer);\r
-#ifdef CONFIG_TDLS_AUTOCHECKALIVE\r
-               _set_timer( &ptdls_sta->alive_timer1, TDLS_ALIVE_TIMER_PH1);\r
-#endif //CONFIG_TDLS_AUTOCHECKALIVE\r
        }\r
 \r
-       rtw_tdls_set_mac_id(ptdlsinfo, ptdls_sta);\r
-       rtw_tdls_set_key(adapter, prx_pkt_attrib, ptdls_sta);\r
+       rtw_tdls_set_key(padapter, prx_pkt_attrib, ptdls_sta);\r
 \r
-       rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_WRCR);\r
-       \r
-       return _FAIL;\r
+       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED);\r
+\r
+exit:\r
+       return ret;\r
 \r
 }\r
 \r
-sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame)\r
+int On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        struct sta_info *psta_ap;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
        sint parsing_length;    //frame body length, without icv_len\r
        PNDIS_802_11_VARIABLE_IEs       pIE;\r
-       u8 FIXED_IE = 3, *dst, *pdialog = NULL;\r
+       u8 FIXED_IE = 3, *dst;\r
        u16 j;\r
+       struct tdls_txmgmt txmgmt;\r
+       int ret = _SUCCESS;\r
 \r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
        ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1;\r
-       pdialog=ptr+2;\r
-\r
+       txmgmt.dialog_token = *(ptr+2);\r
+       _rtw_memcpy(&txmgmt.peer, precv_frame->u.hdr.attrib.src, ETH_ALEN);\r
+       txmgmt.action_code = TDLS_DISCOVERY_RESPONSE;\r
        parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\r
                        -prx_pkt_attrib->hdrlen\r
                        -prx_pkt_attrib->iv_len\r
@@ -1606,7 +1623,7 @@ sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame)
                                        goto exit;\r
                                }\r
                                dst = pIE->data + 12;\r
-                               if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(adapter->eeprompriv)), dst, 6) == _FALSE) )\r
+                               if( (MacAddr_isBcst(dst) == _FALSE) && (_rtw_memcmp(myid(&(padapter->eeprompriv)), dst, 6) == _FALSE) )\r
                                {\r
                                        goto exit;\r
                                }\r
@@ -1619,24 +1636,21 @@ sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame)
                \r
        }\r
 \r
-       //check frame contents\r
-\r
-       issue_tdls_dis_rsp(adapter, precv_frame, *(pdialog) );\r
+       issue_tdls_dis_rsp(padapter, &txmgmt, prx_pkt_attrib->privacy);\r
 \r
 exit:\r
-\r
-       return _FAIL;\r
+       return ret;\r
        \r
 }\r
 \r
-sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame)\r
+int On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
        u8 *psa;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
-       struct mlme_ext_priv    *pmlmeext = &(adapter->mlmeextpriv);    \r
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);   \r
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       struct sta_priv         *pstapriv = &adapter->stapriv;\r
+       struct sta_priv         *pstapriv = &padapter->stapriv;\r
        struct sta_info *ptdls_sta= NULL;\r
        _irqL irqL;\r
 \r
@@ -1645,12 +1659,12 @@ sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame)
        ptdls_sta = rtw_get_stainfo(pstapriv, psa);\r
        if(ptdls_sta!=NULL){\r
                if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE){\r
-                       rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
+                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
                }\r
-               free_tdls_sta(adapter, ptdls_sta);\r
+               free_tdls_sta(padapter, ptdls_sta);\r
        }\r
                \r
-       return _FAIL;\r
+       return _SUCCESS;\r
        \r
 }\r
 \r
@@ -1667,13 +1681,37 @@ u8 TDLS_check_ch_state(uint state){
                return 0;\r
 }\r
 \r
+int On_TDLS_Peer_Traffic_Indication(_adapter *padapter, union recv_frame *precv_frame)\r
+{\r
+       struct rx_pkt_attrib    *pattrib = &precv_frame->u.hdr.attrib;\r
+       struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->src); \r
+       u8 *ptr = precv_frame->u.hdr.rx_data;\r
+\r
+       ptr +=pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE + 1;\r
+\r
+       if(ptdls_sta != NULL)\r
+       {\r
+               ptdls_sta->dialog = *(ptr+2);\r
+               issue_tdls_peer_traffic_rsp(padapter, ptdls_sta);\r
+\r
+               //issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0);\r
+       }\r
+       else\r
+       {\r
+               DBG_871X("from unknown sta:"MAC_FMT"\n", MAC_ARG(pattrib->src));\r
+               return _FAIL;\r
+       }\r
+\r
+       return _SUCCESS;\r
+}\r
+\r
 //we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here\r
-sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)\r
+int On_TDLS_Peer_Traffic_Rsp(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
-       struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\r
-       struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\r
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\r
        struct rx_pkt_attrib    *pattrib = & precv_frame->u.hdr.attrib;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        //get peer sta infomation\r
        struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);\r
        u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state);\r
@@ -1681,16 +1719,18 @@ sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        \r
        ptdls_sta->sta_stats.rx_data_pkts++;\r
 \r
+       ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);\r
+\r
        //receive peer traffic response frame, sleeping STA wakes up\r
        //ptdls_sta->tdls_sta_state &= ~(TDLS_PEER_SLEEP_STATE);\r
-       process_wmmps_data( adapter, precv_frame);\r
+       //process_wmmps_data( padapter, precv_frame);\r
 \r
        // if noticed peer STA wakes up by receiving peer traffic response\r
        // and we want to do channel swtiching, then we will transmit channel switch request first\r
        if(ptdls_sta->tdls_sta_state & TDLS_APSD_CHSW_STATE){\r
-               issue_tdls_ch_switch_req(adapter, pattrib->src);\r
+               issue_tdls_ch_switch_req(padapter, pattrib->src);\r
                ptdls_sta->tdls_sta_state &= ~(TDLS_APSD_CHSW_STATE);\r
-               return  _FAIL;\r
+               return  _SUCCESS;\r
        }\r
 \r
        //check 4-AC queue bit\r
@@ -1699,7 +1739,9 @@ sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
 \r
        //if it's a direct link and have buffered frame\r
        if(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE){\r
-               if(wmmps_ac && state)\r
+               //[TDLS] UAPSD\r
+               //if(wmmps_ac && state)\r
+               if(wmmps_ac && 1)\r
                {\r
                        _irqL irqL;      \r
                        _list   *xmitframe_plist, *xmitframe_phead;\r
@@ -1718,6 +1760,7 @@ sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                                rtw_list_delete(&pxmitframe->list);\r
 \r
                                ptdls_sta->sleepq_len--;\r
+                               ptdls_sta->sleepq_ac_len--;\r
                                if(ptdls_sta->sleepq_len>0){\r
                                        pxmitframe->attrib.mdata = 1;\r
                                        pxmitframe->attrib.eosp = 0;\r
@@ -1725,11 +1768,10 @@ sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                                        pxmitframe->attrib.mdata = 0;\r
                                        pxmitframe->attrib.eosp = 1;\r
                                }\r
-                               //pxmitframe->attrib.triggered = 1;     //maybe doesn't need in TDLS\r
-                               if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE)\r
-                               {               \r
-                                       rtw_os_xmit_complete(adapter, pxmitframe);\r
-                               }\r
+                               pxmitframe->attrib.triggered = 1;\r
+\r
+                               rtw_hal_xmitframe_enqueue(padapter, pxmitframe);\r
+\r
 \r
                        }\r
 \r
@@ -1739,11 +1781,11 @@ sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
                                //on U-APSD + CH. switch state, when there is no buffered date to xmit,\r
                                // we should go back to base channel\r
                                if(state==2){\r
-                                       rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
+                                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
                                }else if(ptdls_sta->tdls_sta_state&TDLS_SW_OFF_STATE){\r
                                                ptdls_sta->tdls_sta_state &= ~(TDLS_SW_OFF_STATE);\r
                                                ptdlsinfo->candidate_ch= pmlmeext->cur_channel;\r
-                                               issue_tdls_ch_switch_req(adapter, pattrib->src);\r
+                                               issue_tdls_ch_switch_req(padapter, pattrib->src);\r
                                                DBG_871X("issue tdls ch switch req back to base channel\n");\r
                                }\r
                                \r
@@ -1760,13 +1802,13 @@ sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame)
 \r
        }\r
 \r
-       return _FAIL;\r
+       return _SUCCESS;\r
 }\r
 \r
-sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame)\r
+sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
        struct sta_info *ptdls_sta= NULL;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
        u8 *psa; \r
@@ -1774,7 +1816,7 @@ sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame)
        PNDIS_802_11_VARIABLE_IEs       pIE;\r
        u8 FIXED_IE =3;\r
        u16 j;\r
-       struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\r
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\r
 \r
        psa = get_sa(ptr);\r
        ptdls_sta = rtw_get_stainfo(pstapriv, psa);\r
@@ -1819,27 +1861,27 @@ sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame)
        ptdls_sta->stat_code=0;\r
        ptdls_sta->tdls_sta_state |= TDLS_CH_SWITCH_ON_STATE;\r
 \r
-       issue_nulldata(adapter, NULL, 1, 0, 0);\r
+       issue_nulldata(padapter, NULL, 1, 0, 0);\r
 \r
-       issue_tdls_ch_switch_rsp(adapter, psa);\r
+       issue_tdls_ch_switch_rsp(padapter, psa);\r
 \r
        DBG_871X("issue tdls channel switch response\n");\r
 \r
        if((ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){\r
                DBG_871X("back to base channel %x\n", pmlmeext->cur_channel);\r
-               ptdls_sta->option=7;\r
-               rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_BASE_CH);\r
+               ptdls_sta->option=TDLS_BASE_CH;\r
+               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_BASE_CH);\r
        }else{          \r
-               ptdls_sta->option=6;\r
-               rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH);\r
+               ptdls_sta->option=TDLS_OFF_CH;\r
+               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_OFF_CH);\r
        }\r
-       return _FAIL;\r
+       return _SUCCESS;\r
 }\r
 \r
-sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame)\r
+sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame)\r
 {\r
        struct sta_info *ptdls_sta= NULL;\r
-       struct sta_priv *pstapriv = &adapter->stapriv;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
        u8 *ptr = precv_frame->u.hdr.rx_data;\r
        struct rx_pkt_attrib    *prx_pkt_attrib = &precv_frame->u.hdr.attrib;\r
        u8 *psa; \r
@@ -1847,7 +1889,8 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        PNDIS_802_11_VARIABLE_IEs       pIE;\r
        u8 FIXED_IE =4;\r
        u16 stat_code, j, switch_time, switch_timeout;\r
-       struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\r
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\r
+       int ret = _SUCCESS;\r
 \r
        psa = get_sa(ptr);\r
        ptdls_sta = rtw_get_stainfo(pstapriv, psa);\r
@@ -1857,19 +1900,23 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        if(ptdls_sta->tdls_sta_state & TDLS_CH_SWITCH_ON_STATE ){\r
                if(pmlmeext->cur_channel==ptdls_sta->off_ch){\r
                        DBG_871X("back to base channel %x\n", pmlmeext->cur_channel);\r
-                       ptdls_sta->option=7;\r
-                       rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH);\r
+                       ptdls_sta->option=TDLS_BASE_CH;\r
+                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_BASE_CH);\r
                }else{\r
                        DBG_871X("receive unsolicited channel switch response \n");\r
-                       rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
+                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CS_OFF);\r
                }\r
-               return _FAIL;\r
+               ret = _FAIL;\r
+               goto exit;\r
        }\r
 \r
        //avoiding duplicated or unconditional ch. switch. rsp\r
-       if((ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE)\r
-               return _FAIL;\r
-       \r
+       if(!(ptdls_sta->tdls_sta_state & TDLS_CH_SW_INITIATOR_STATE))\r
+       {\r
+               ret = _FAIL;\r
+               goto exit;\r
+       }\r
+\r
        ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1;\r
        parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\r
                        -prx_pkt_attrib->hdrlen\r
@@ -1883,7 +1930,8 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        _rtw_memcpy(&stat_code, ptr+2, 2);\r
 \r
        if(stat_code!=0){\r
-               return _FAIL;\r
+               ret = _FAIL;\r
+               goto exit;\r
        }\r
        \r
        //parsing information element\r
@@ -1916,10 +1964,11 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame)
        ptdls_sta->tdls_sta_state |=TDLS_CH_SWITCH_ON_STATE;\r
 \r
        //goto set_channel_workitem_callback()\r
-       ptdls_sta->option=6;\r
-       rtw_tdls_cmd(adapter, ptdls_sta->hwaddr, TDLS_OFF_CH);\r
+       ptdls_sta->option=TDLS_OFF_CH;\r
+       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_OFF_CH);\r
 \r
-       return _FAIL;   \r
+exit:\r
+       return ret;\r
 }\r
 \r
 #ifdef CONFIG_WFD\r
@@ -2012,7 +2061,7 @@ void wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen )
 }\r
 #endif //CONFIG_WFD\r
 \r
-void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
+void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\r
 {\r
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;\r
        struct mlme_ext_info    *pmlmeinfo = &pmlmeext->mlmext_info;\r
@@ -2027,13 +2076,13 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
        int     bssrate_len = 0, i = 0 ;\r
        u8 more_supportedrates = 0;\r
        unsigned int ie_len;\r
-       u8 *p;\r
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;\r
        u8 link_id_addr[18] = {0};\r
        u8 iedata=0;\r
        u8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2;      //For supported channel\r
        u8 timeout_itvl[5];     //set timeout interval to maximum value\r
        u32 time;\r
+       u8 *pframe_head;\r
 \r
        //SNonce        \r
        if(pattrib->encrypt){\r
@@ -2043,6 +2092,8 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
                }\r
        }\r
 \r
+       pframe_head = pframe;   // For rtw_tdls_set_ht_cap()\r
+\r
        //payload type\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));\r
        //category, action, dialog token\r
@@ -2054,13 +2105,23 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
        _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);\r
 \r
        if(pattrib->encrypt)\r
-               *pframe =*pframe | BIT(4);\r
+               *pframe =*pframe | cap_Privacy;\r
        pframe += 2;\r
        pattrib->pktlen += 2;\r
 \r
        //supported rates\r
-       rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);\r
-       bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;\r
+       if(pmlmeext->cur_channel < 14 )\r
+       {\r
+               rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);\r
+               bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;\r
+       }\r
+       else\r
+       {\r
+               rtw_set_supported_rate(bssrate, WIRELESS_11A_5N);\r
+               bssrate_len = IEEE80211_NUM_OFDM_RATESLEN;\r
+       }\r
+\r
+       //country(optional)\r
 \r
        if (bssrate_len > 8)\r
        {\r
@@ -2072,7 +2133,6 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
                pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));\r
        }\r
 \r
-       //country(optional)\r
        //extended supported rates\r
        if(more_supportedrates==1){\r
                pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));\r
@@ -2082,17 +2142,17 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
        pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);\r
        \r
        //      SRC IE\r
-       pframe = rtw_set_ie( pframe, _SRC_IE_, 16, TDLS_SRC, &(pattrib->pktlen));\r
+       pframe = rtw_set_ie( pframe, _SRC_IE_, sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen));\r
        \r
        //RSNIE\r
        if(pattrib->encrypt)\r
-               pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));\r
+               pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen));\r
        \r
        //extended capabilities\r
-       pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen));\r
+       pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen));\r
 \r
        //QoS capability(WMM_IE)\r
-       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE,  &(pattrib->pktlen));\r
+       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE,  &(pattrib->pktlen));\r
 \r
 \r
        if(pattrib->encrypt){\r
@@ -2112,7 +2172,7 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
 \r
        //Sup_reg_classes(optional)\r
        //HT capabilities\r
-       pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib);\r
+       pframe += rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib);\r
 \r
        //20/40 BSS coexistence\r
        if(pmlmepriv->num_FortyMHzIntolerant>0)\r
@@ -2131,7 +2191,7 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit
 \r
 }\r
 \r
-void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
+void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\r
 {\r
        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
@@ -2155,6 +2215,7 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit
        u8 k;           //for random ANonce\r
        u8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL;\r
        u32 time;\r
+       u8 *pframe_head;\r
 \r
        ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst);\r
 \r
@@ -2171,6 +2232,8 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit
                }\r
        }\r
 \r
+       pframe_head = pframe;\r
+\r
        //payload type\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));      \r
        //category, action, status code\r
@@ -2191,13 +2254,22 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit
        _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);\r
 \r
        if(pattrib->encrypt )\r
-               *pframe =*pframe | BIT(4);\r
+               *pframe =*pframe | cap_Privacy;\r
        pframe += 2;\r
        pattrib->pktlen += 2;\r
 \r
        //supported rates\r
-       rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);\r
-       bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;\r
+       //supported rates\r
+       if(pmlmeext->cur_channel < 14 )\r
+       {\r
+               rtw_set_supported_rate(bssrate, WIRELESS_11BG_24N);\r
+               bssrate_len = IEEE80211_CCK_RATE_LEN + IEEE80211_NUM_OFDM_RATESLEN;\r
+       }\r
+       else\r
+       {\r
+               rtw_set_supported_rate(bssrate, WIRELESS_11A_5N);\r
+               bssrate_len = IEEE80211_NUM_OFDM_RATESLEN;\r
+       }\r
 \r
        if (bssrate_len > 8)\r
        {\r
@@ -2219,19 +2291,19 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit
        pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);\r
        \r
        // SRC IE\r
-       pframe = rtw_set_ie(pframe, _SRC_IE_ , 16, TDLS_SRC, &(pattrib->pktlen));\r
+       pframe = rtw_set_ie(pframe, _SRC_IE_ , sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen));\r
 \r
        //RSNIE\r
        if(pattrib->encrypt){\r
                prsnie = pframe;\r
-               pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));\r
+               pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(ptdls_sta->TDLS_RSNIE), ptdls_sta->TDLS_RSNIE, &(pattrib->pktlen));\r
        }\r
 \r
        //extended capabilities\r
-       pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen));\r
+       pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen));\r
 \r
        //QoS capability(WMM_IE)\r
-       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, TDLS_WMMIE,  &(pattrib->pktlen));\r
+       pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE,  &(pattrib->pktlen));\r
 \r
        if(pattrib->encrypt){\r
                wpa_tdls_generate_tpk(padapter, ptdls_sta);\r
@@ -2256,7 +2328,7 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit
 \r
        //Sup_reg_classes(optional)\r
        //HT capabilities\r
-       pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib);\r
+       pframe += rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib);\r
 \r
        //20/40 BSS coexistence\r
        if(pmlmepriv->num_FortyMHzIntolerant>0)\r
@@ -2280,7 +2352,7 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit
 \r
 }\r
 \r
-void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
+void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\r
 {\r
 \r
        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
@@ -2295,6 +2367,7 @@ void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmit
        unsigned int ie_len;\r
        unsigned char *p;\r
        u8 timeout_itvl[5];     //set timeout interval to maximum value\r
+       u8 wmm_param_ele[24] = {0};\r
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;\r
        u8      link_id_addr[18] = {0};\r
        u8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL;\r
@@ -2313,7 +2386,7 @@ void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmit
        //RSNIE\r
        if(pattrib->encrypt){\r
                prsnie = pframe;\r
-               pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));\r
+               pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen));\r
        }\r
        \r
        //EDCA param set; WMM param ele.\r
@@ -2346,46 +2419,52 @@ void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmit
        _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
        pframe = rtw_set_ie(pframe, _LINK_ID_IE_,  18, link_id_addr, &(pattrib->pktlen));\r
 \r
-       //fill FTIE mic\r
+       //FTIE mic\r
        if(pattrib->encrypt)\r
                wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);\r
 \r
+       //WMM Parameter Set\r
+       if(&pmlmeinfo->WMM_param)\r
+       {\r
+               _rtw_memcpy(wmm_param_ele, WMM_PARA_OUI, 6);\r
+               _rtw_memcpy(wmm_param_ele+6, (u8 *)&pmlmeinfo->WMM_param, sizeof(pmlmeinfo->WMM_param));\r
+               pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_,  24, wmm_param_ele, &(pattrib->pktlen));              \r
+       }\r
+\r
 }\r
 \r
-void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
+void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\r
 {\r
 \r
-       struct pkt_attrib       *pattrib = &pxmitframe->attrib;\r
+       struct pkt_attrib *pattrib = &pxmitframe->attrib;\r
        u8 payload_type = 0x02;\r
        unsigned char category = RTW_WLAN_CATEGORY_TDLS;\r
-       unsigned char action = TDLS_TEARDOWN;\r
-       u8      link_id_addr[18] = {0};\r
-       \r
+       u8 action = ptxmgmt->action_code;\r
+       u8 link_id_addr[18] = {0};\r
        struct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst);\r
-       struct sta_priv         *pstapriv = &padapter->stapriv;\r
 \r
        //payload type\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));      \r
        //category, action, reason code\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\r
-       pframe = rtw_set_fixed_ie(pframe, 1, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen));\r
+       pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptxmgmt->status_code, &(pattrib->pktlen));\r
 \r
        //Link identifier\r
        if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){   \r
-               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
-               _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
-               _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
-       }else  if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){\r
                _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
                _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\r
                _rtw_memcpy((link_id_addr+12), pattrib->src, 6);\r
+       }else  if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){\r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
        }\r
        pframe = rtw_set_ie(pframe, _LINK_ID_IE_,  18, link_id_addr, &(pattrib->pktlen));\r
        \r
 }\r
 \r
-void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
+void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\r
 {\r
 \r
        struct pkt_attrib       *pattrib = &pxmitframe->attrib;\r
@@ -2400,8 +2479,12 @@ void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitfr
        //category, action, reason code\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\r
-       pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen));\r
-       dialogtoken = (dialogtoken+1)%256;\r
+       if(ptxmgmt->external_support == _TRUE) {\r
+               pframe = rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->dialog_token), &(pattrib->pktlen));\r
+       } else {\r
+               pframe = rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen));\r
+               dialogtoken = (dialogtoken+1)%256;\r
+       }\r
 \r
        //Link identifier\r
        _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
@@ -2411,7 +2494,7 @@ void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitfr
        \r
 }\r
 \r
-void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog)\r
+void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog, u8 privacy)\r
 {\r
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;\r
        struct mlme_ext_info    *pmlmeinfo = &pmlmeext->mlmext_info;\r
@@ -2429,7 +2512,11 @@ void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitfr
        u8 iedata=0;\r
        u8 timeout_itvl[5];     //set timeout interval to maximum value\r
        u32 timeout_interval= TPK_RESEND_COUNT * 1000;\r
-       \r
+       u8 *pframe_head, pktlen_index;\r
+\r
+       pktlen_index = pattrib->pktlen; // For mgmt frame, pattrib->pktlen would count frame header\r
+       pframe_head = pframe;\r
+\r
        //category, action, dialog token\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\r
@@ -2438,8 +2525,8 @@ void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitfr
        //capability\r
        _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);\r
 \r
-       if(pattrib->encrypt)\r
-               *pframe =*pframe | BIT(4);\r
+       if(privacy)\r
+               *pframe =*pframe | cap_Privacy;\r
        pframe += 2;\r
        pattrib->pktlen += 2;\r
 \r
@@ -2466,13 +2553,13 @@ void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitfr
        pframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);\r
 \r
        //RSNIE\r
-       if(pattrib->encrypt)\r
-               pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, TDLS_RSNIE, &(pattrib->pktlen));\r
-       \r
+       if(privacy)\r
+               pframe = rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen));\r
+\r
        //extended capability\r
-       pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, TDLS_EXT_CAPIE, &(pattrib->pktlen));\r
+       pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen));\r
 \r
-       if(pattrib->encrypt){\r
+       if(privacy){\r
                //FTIE\r
                _rtw_memset(pframe, 0, 84);     //All fields shall be set to 0\r
                _rtw_memset(pframe, _FTIE_, 1); //version\r
@@ -2488,7 +2575,7 @@ void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitfr
 \r
        //Sup_reg_classes(optional)\r
        //HT capabilities\r
-       pframe = rtw_tdls_set_ht_cap(padapter, pframe, pattrib);\r
+       pframe += rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib);\r
 \r
        //20/40 BSS coexistence\r
        if(pmlmepriv->num_FortyMHzIntolerant>0)\r
@@ -2500,7 +2587,7 @@ void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitfr
        _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\r
        _rtw_memcpy((link_id_addr+12), pattrib->src, 6);\r
        pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));\r
-       \r
+\r
 }\r
 \r
 void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
@@ -2513,8 +2600,7 @@ void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit
 \r
        u8      link_id_addr[18] = {0};\r
        u8 AC_queue=0;\r
-       struct sta_priv         *pstapriv = &padapter->stapriv; \r
-       struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);\r
+       struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);\r
 \r
        //payload type\r
        pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));      \r
@@ -2524,9 +2610,15 @@ void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit
        pframe = rtw_set_fixed_ie(pframe, 1, &(ptdls_sta->dialog), &(pattrib->pktlen));\r
 \r
        //Link identifier\r
-       _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
-       _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
-       _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){   \r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->src, 6);\r
+       }else  if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){\r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       }\r
        pframe = rtw_set_ie(pframe, _LINK_ID_IE_,  18, link_id_addr, &(pattrib->pktlen));\r
 \r
        //PTI control\r
@@ -2543,6 +2635,38 @@ void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit
        \r
 }\r
 \r
+void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
+{\r
+\r
+       struct pkt_attrib       *pattrib = &pxmitframe->attrib;\r
+       u8 payload_type = 0x02;\r
+       u8 category = RTW_WLAN_CATEGORY_TDLS;\r
+       u8 action = TDLS_PEER_TRAFFIC_RESPONSE;\r
+       u8      link_id_addr[18] = {0};\r
+       struct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);\r
+       static u8 dialogtoken=0;\r
+\r
+       //payload type\r
+       pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));              \r
+       //category, action, reason code\r
+       pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\r
+       pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\r
+       pframe = rtw_set_fixed_ie(pframe, 1, &ptdls_sta->dialog, &(pattrib->pktlen));\r
+\r
+       //Link identifier\r
+       if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){   \r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->src, 6);\r
+       }else  if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){\r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       }\r
+       pframe = rtw_set_ie(pframe, _LINK_ID_IE_,  18, link_id_addr, &(pattrib->pktlen));\r
+\r
+}\r
+\r
 void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\r
 {\r
 \r
@@ -2565,9 +2689,15 @@ void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * p
        pframe = rtw_set_fixed_ie(pframe, 1, &(ptdlsinfo->candidate_ch), &(pattrib->pktlen));\r
 \r
        //Link identifier\r
-       _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
-       _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
-       _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){   \r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->src, 6);\r
+       }else  if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){\r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       }\r
        pframe = rtw_set_ie(pframe, _LINK_ID_IE_,  18, link_id_addr, &(pattrib->pktlen));\r
 \r
        //ch switch timing\r
@@ -2604,9 +2734,15 @@ void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * p
        pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen));\r
 \r
        //Link identifier\r
-       _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
-       _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
-       _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       if(ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE){   \r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->src, 6);\r
+       }else  if(ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE){\r
+               _rtw_memcpy(link_id_addr, pattrib->ra, 6);\r
+               _rtw_memcpy((link_id_addr+6), pattrib->src, 6);\r
+               _rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\r
+       }\r
        pframe = rtw_set_ie(pframe, _LINK_ID_IE_,  18, link_id_addr, &(pattrib->pktlen));\r
 \r
        //ch switch timing\r
@@ -2686,32 +2822,28 @@ void rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * p
 }\r
 #endif //CONFIG_WFD\r
 \r
-void _TPK_timer_hdl(void *FunctionContext)\r
+void _tdls_tpk_timer_hdl(void *FunctionContext)\r
 {\r
        struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\r
+       struct tdls_txmgmt txmgmt;\r
 \r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
        ptdls_sta->TPK_count++;\r
        //TPK_timer set 1000 as default\r
        //retry timer should set at least 301 sec.\r
        if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){\r
                ptdls_sta->TPK_count=0;\r
-               issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr);\r
+               _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);\r
+               issue_tdls_setup_req(ptdls_sta->padapter, &txmgmt, _FALSE);\r
        }\r
        \r
        _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT);\r
 }\r
 \r
-void init_TPK_timer(_adapter *padapter, struct sta_info *psta)\r
-{\r
-       psta->padapter=padapter;\r
-\r
-       _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta);\r
-}\r
-\r
 // TDLS_DONE_CH_SEN: channel sensing and report candidate channel\r
 // TDLS_OFF_CH: first time set channel to off channel\r
 // TDLS_BASE_CH: when go back to the channel linked with AP, send null data to peer STA as an indication\r
-void _ch_switch_timer_hdl(void *FunctionContext)\r
+void _tdls_ch_switch_timer_hdl(void *FunctionContext)\r
 {\r
 \r
        struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\r
@@ -2720,42 +2852,24 @@ void _ch_switch_timer_hdl(void *FunctionContext)
        if( ptdls_sta->option == TDLS_DONE_CH_SEN ){\r
                rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_DONE_CH_SEN);\r
        }else if( ptdls_sta->option == TDLS_OFF_CH ){\r
-               issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0);\r
+               issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0);\r
                _set_timer(&ptdls_sta->base_ch_timer, 500);\r
        }else if( ptdls_sta->option == TDLS_BASE_CH){\r
-               issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0);\r
+               issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0);\r
        }\r
 }\r
 \r
-void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta)\r
-{\r
-       psta->padapter=padapter;\r
-       _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta);\r
-}\r
-\r
-void _base_ch_timer_hdl(void *FunctionContext)\r
+void _tdls_base_ch_timer_hdl(void *FunctionContext)\r
 {\r
        struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\r
        rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_OFF_CH);\r
 }\r
 \r
-void init_base_ch_timer(_adapter *padapter, struct sta_info *psta)\r
-{\r
-       psta->padapter=padapter;\r
-       _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta);\r
-}\r
-\r
-void _off_ch_timer_hdl(void *FunctionContext)\r
+void _tdls_off_ch_timer_hdl(void *FunctionContext)\r
 {\r
        struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\r
        rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_P_BASE_CH );\r
 }\r
-       \r
-void init_off_ch_timer(_adapter *padapter, struct sta_info *psta)\r
-{\r
-       psta->padapter=padapter;\r
-       _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta);\r
-}\r
 \r
 void _tdls_handshake_timer_hdl(void *FunctionContext)\r
 {\r
@@ -2766,103 +2880,50 @@ void _tdls_handshake_timer_hdl(void *FunctionContext)
                if( !(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) )\r
                {\r
                        DBG_871X("tdls handshake time out\n");\r
-                       free_tdls_sta(ptdls_sta->padapter, ptdls_sta);\r
+                       rtw_tdls_cmd(ptdls_sta->padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA );\r
                }\r
        }\r
 }\r
 \r
-void init_handshake_timer(_adapter *padapter, struct sta_info *psta)\r
-{\r
-       psta->padapter=padapter;\r
-       _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta);\r
-}\r
-\r
-//Check tdls peer sta alive.\r
-void _tdls_alive_timer_phase1_hdl(void *FunctionContext)\r
+void _tdls_pti_timer_hdl(void *FunctionContext)\r
 {\r
-       _irqL irqL;\r
        struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\r
        _adapter *padapter = ptdls_sta->padapter;\r
-       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
-       \r
-       _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL);\r
-       ptdls_sta->timer_flag = 1;\r
-       _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);\r
-\r
-       ptdls_sta->tdls_sta_state &= (~TDLS_ALIVE_STATE);\r
-\r
-       DBG_871X("issue_tdls_dis_req to check alive\n");\r
-       issue_tdls_dis_req( padapter, ptdls_sta->hwaddr);\r
-       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH1);\r
-       sta_update_last_rx_pkts(ptdls_sta);\r
-\r
-       if (    ptdls_sta->timer_flag == 2 )\r
-               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA);               \r
-       else\r
-       {\r
-               _enter_critical_bh(&ptdlsinfo->hdl_lock, &irqL);\r
-               ptdls_sta->timer_flag = 0;\r
-               _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);\r
-       }\r
-\r
-}\r
+       struct tdls_txmgmt txmgmt;\r
 \r
-void _tdls_alive_timer_phase2_hdl(void *FunctionContext)\r
-{\r
-       _irqL irqL;\r
-       struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\r
-       _adapter *padapter = ptdls_sta->padapter;\r
-       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\r
-       \r
-       _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);\r
-       ptdls_sta->timer_flag = 1;\r
-       _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);\r
+       txmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_;\r
 \r
-       if( (ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) && \r
-               (sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)) )\r
-       {\r
-               DBG_871X("TDLS STA ALIVE, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n",\r
-                       sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta));\r
-\r
-               ptdls_sta->alive_count = 0;\r
-               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2);\r
-       }\r
-       else\r
+       if(ptdls_sta != NULL)\r
        {\r
-               if( !(ptdls_sta->tdls_sta_state & TDLS_ALIVE_STATE) )\r
-                       DBG_871X("TDLS STA TOO FAR\n");\r
-               if( !(sta_last_rx_pkts(ptdls_sta) + 3 <= sta_rx_pkts(ptdls_sta)))\r
-                       DBG_871X("TDLS LINK WITH LOW TRAFFIC, ptdls_sta->sta_stats.last_rx_pkts:%llu, ptdls_sta->sta_stats.rx_pkts:%llu\n",\r
-                               sta_last_rx_pkts(ptdls_sta), sta_rx_pkts(ptdls_sta));\r
-\r
-               ptdls_sta->alive_count++;\r
-               if( ptdls_sta->alive_count == TDLS_ALIVE_COUNT )\r
-               {\r
-                       ptdls_sta->stat_code = _RSON_TDLS_TEAR_TOOFAR_;\r
-                       issue_tdls_teardown(padapter, ptdls_sta->hwaddr);\r
-               }\r
-               else\r
+               if( ptdls_sta->tdls_sta_state & TDLS_WAIT_PTR_STATE )\r
                {\r
-                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CKALV_PH2);\r
+                       DBG_871X("Doesn't receive PTR from peer dev:"MAC_FMT"; Send TDLS Tear Down\n", MAC_ARG(ptdls_sta->hwaddr));\r
+                       issue_tdls_teardown(padapter, &txmgmt, _FALSE);\r
                }\r
        }\r
-\r
-       if (    ptdls_sta->timer_flag == 2 )\r
-               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_FREE_STA);               \r
-       else\r
-       {\r
-               _enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);\r
-               ptdls_sta->timer_flag = 0;\r
-               _exit_critical_bh(&ptdlsinfo->hdl_lock, &irqL);\r
 }\r
 \r
+void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta)\r
+{\r
+       psta->padapter=padapter;\r
+       _init_timer(&psta->TPK_timer, padapter->pnetdev, _tdls_tpk_timer_hdl, psta);\r
+       _init_timer(&psta->option_timer, padapter->pnetdev, _tdls_ch_switch_timer_hdl, psta);\r
+       _init_timer(&psta->base_ch_timer, padapter->pnetdev, _tdls_base_ch_timer_hdl, psta);\r
+       _init_timer(&psta->off_ch_timer, padapter->pnetdev, _tdls_off_ch_timer_hdl, psta);\r
+       _init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta);\r
+       _init_timer(&psta->pti_timer, padapter->pnetdev, _tdls_pti_timer_hdl, psta);\r
 }\r
 \r
-void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta)\r
+void rtw_free_tdls_timer(struct sta_info *psta)\r
 {\r
-       psta->padapter=padapter;\r
-       _init_timer(&psta->alive_timer1, padapter->pnetdev, _tdls_alive_timer_phase1_hdl, psta);\r
-       _init_timer(&psta->alive_timer2, padapter->pnetdev, _tdls_alive_timer_phase2_hdl, psta);\r
+       _cancel_timer_ex(&psta->TPK_timer);\r
+       _cancel_timer_ex(&psta->option_timer);\r
+       _cancel_timer_ex(&psta->base_ch_timer);\r
+       _cancel_timer_ex(&psta->off_ch_timer);\r
+       _cancel_timer_ex(&psta->handshake_timer);\r
+       _cancel_timer_ex(&psta->pti_timer);\r
 }\r
 \r
 u8     update_sgi_tdls(_adapter *padapter, struct sta_info *psta)\r
index f8cdff8d6568b41d2b14e284f3c77ea7d62d3882..ce971d5a5ed335b0fc23c8f61bfb4b38cf7c860e 100755 (executable)
@@ -44,7 +44,7 @@ const u16 VHT_MCS_DATA_RATE[3][2][30] =
                        195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 2340} }       // Short GI, 80MHz
        };
 
-u8     rtw_get_vht_highest_rate(_adapter *padapter, u8 *pvht_mcs_map)
+u8     rtw_get_vht_highest_rate(u8 *pvht_mcs_map)
 {
        u8      i, j;
        u8      bit_map;
@@ -68,7 +68,56 @@ u8   rtw_get_vht_highest_rate(_adapter *padapter, u8 *pvht_mcs_map)
        return vht_mcs_rate;
 }
 
-u16    rtw_vht_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate)
+u8     rtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map)
+{
+       u8      i, j;
+       u8      bit_map;
+       u8      nss = 0;
+       
+       for(i = 0; i < 2; i++)
+       {
+               if(pvht_mcs_map[i] != 0xff)
+               {
+                       for(j = 0; j < 8; j += 2)
+                       {
+                               bit_map = (pvht_mcs_map[i] >> j) & 3;
+                               
+                               if(bit_map != 3)
+                                       nss++;
+                       }
+               }
+       }
+       
+       //DBG_871X("%s : %dSS\n", __FUNCTION__, nss);
+       return nss;
+}
+
+void   rtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map)
+{
+       u8      i, j;
+       u8      cur_rate, target_rate;
+       
+       for(i = 0; i < 2; i++)
+       {
+               target_mcs_map[i] = 0;
+               for(j = 0; j < 8; j+=2)
+               {
+                       cur_rate = (cur_mcs_map[i] >> j) & 3;
+                       if(cur_rate == 3)  //0x3 indicates not supported that num of SS
+                               target_rate = 3;
+                       else if(nss <= ((j/2)+i*4))
+                               target_rate = 3;
+                       else    
+                               target_rate = cur_rate;
+
+                       target_mcs_map[i] |= (target_rate << j);
+               }
+       }
+       
+       //DBG_871X("%s : %dSS\n", __FUNCTION__, nss);
+}
+
+u16    rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate)
 {
        if(vht_mcs_rate > MGN_VHT2SS_MCS9)
                vht_mcs_rate = MGN_VHT2SS_MCS9;
@@ -183,7 +232,7 @@ void        rtw_vht_use_default_setting(_adapter *padapter)
                pvhtpriv->vht_mcs_map[0] = 0xf4;        // support 1SS MCS 0-7 2SS MCS 0~8
        }
 
-       pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(padapter, pvhtpriv->vht_mcs_map);
+       pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map);
 }
 
 u32    rtw_vht_rate_to_bitmap(u8 *pVHTRate)
@@ -232,15 +281,18 @@ void      update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
        }
 
        bw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify);
-       if (bw_mode > psta->bw_mode)
-               psta->bw_mode = bw_mode;
+       
+       //if (bw_mode > psta->bw_mode)
+       psta->bw_mode = bw_mode;
 
        // B4 Rx LDPC
-       if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX)) {
-               SET_FLAG(cur_ldpc_cap, GET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap) ? (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX) : 0);
+       if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && 
+               GET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap))
+       {
+               SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));
+               DBG_871X("Current STA(%d) VHT LDPC = %02X\n", psta->aid, cur_ldpc_cap);
        }
        pvhtpriv_sta->ldpc_cap = cur_ldpc_cap;
-       DBG_871X("Current STA VHT LDPC = %02X\n", cur_ldpc_cap);
 
        if (psta->bw_mode > pmlmeext->cur_bwmode)
                psta->bw_mode = pmlmeext->cur_bwmode;
@@ -248,11 +300,11 @@ void      update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
        if (psta->bw_mode == CHANNEL_WIDTH_80) {
                // B5 Short GI for 80 MHz
                pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE;
-               DBG_871X("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m);
+               //DBG_871X("Current STA ShortGI80MHz = %d\n", pvhtpriv_sta->sgi_80m);
        } else if (psta->bw_mode >= CHANNEL_WIDTH_160) {
                // B5 Short GI for 80 MHz
                pvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE;
-               DBG_871X("Current STA ShortGI160MHz = %d\n", pvhtpriv_sta->sgi_80m);
+               //DBG_871X("Current STA ShortGI160MHz = %d\n", pvhtpriv_sta->sgi_80m);
        }
 
        // B8 B9 B10 Rx STBC
@@ -260,9 +312,9 @@ void        update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
                GET_VHT_CAPABILITY_ELE_RX_STBC(pvhtpriv_sta->vht_cap))
        {
                SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); 
+               DBG_871X("Current STA(%d) VHT STBC = %02X\n", psta->aid, cur_stbc_cap);
        }
        pvhtpriv_sta->stbc_cap = cur_stbc_cap;
-       DBG_871X("Current STA VHT STBC = %02X\n", cur_stbc_cap);
 
        // B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee
        if (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && 
@@ -278,7 +330,9 @@ void        update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
                SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);
        }
        pvhtpriv_sta->beamform_cap = cur_beamform_cap;
-       DBG_871X("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap);
+       if (cur_beamform_cap) {
+               DBG_871X("Current STA(%d) VHT Beamforming Setting = %02X\n", psta->aid, cur_beamform_cap);
+       }
 
        // B23 B24 B25 Maximum A-MPDU Length Exponent
        pvhtpriv_sta->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pvhtpriv_sta->vht_cap);
@@ -286,7 +340,7 @@ void        update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
        pcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pvhtpriv_sta->vht_cap);
        _rtw_memcpy(pvhtpriv_sta->vht_mcs_map, pcap_mcs, 2);
 
-       pvhtpriv_sta->vht_highest_rate = rtw_get_vht_highest_rate(padapter, pvhtpriv_sta->vht_mcs_map);
+       pvhtpriv_sta->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv_sta->vht_mcs_map);
 
 }
 
@@ -321,24 +375,26 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
        pmlmeinfo->VHT_enable = 1;
 
        // B4 Rx LDPC
-       if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX)) {
-               SET_FLAG(cur_ldpc_cap, GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data) ? (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX) : 0);
+       if (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && 
+               GET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data))
+       {
+               SET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));
+               DBG_871X("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap);
        }
        pvhtpriv->ldpc_cap = cur_ldpc_cap;
-       DBG_871X("Current VHT LDPC Setting = %02X\n", cur_ldpc_cap);
 
        // B5 Short GI for 80 MHz
        pvhtpriv->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pIE->data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE;
-       DBG_871X("Current ShortGI80MHz = %d\n", pvhtpriv->sgi_80m);
+       //DBG_871X("Current ShortGI80MHz = %d\n", pvhtpriv->sgi_80m);
 
        // B8 B9 B10 Rx STBC
        if (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && 
                GET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data))
        {
                SET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX)); 
+               DBG_871X("Current VHT STBC Setting = %02X\n", cur_stbc_cap);
        }
        pvhtpriv->stbc_cap = cur_stbc_cap;
-       DBG_871X("Current VHT STBC Setting = %02X\n", cur_stbc_cap);
 
        // B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee
        if (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && 
@@ -354,7 +410,9 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
                SET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);
        }
        pvhtpriv->beamform_cap = cur_beamform_cap;
-       DBG_871X("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap);
+       if (cur_beamform_cap) {
+               DBG_871X("Current VHT Beamforming Setting = %02X\n", cur_beamform_cap);
+       }
 
        // B23 B24 B25 Maximum A-MPDU Length Exponent
        pvhtpriv->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pIE->data);
@@ -370,21 +428,56 @@ void VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
 
        _rtw_memcpy(pvhtpriv->vht_mcs_map, vht_mcs, 2);
 
-       pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(padapter, pvhtpriv->vht_mcs_map);
+       pvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map);
 }
 
 void VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
 {
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct ht_priv                  *phtpriv = &pmlmepriv->htpriv;
        struct vht_priv         *pvhtpriv = &pmlmepriv->vhtpriv;
-       struct registry_priv    *pregistrypriv = &padapter->registrypriv;
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
 
        if(pIE==NULL) return;
 
        if(pvhtpriv->vht_option == _FALSE)      return;
+}
 
+void rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta)
+{
+       struct sta_info         *psta = (struct sta_info *)sta;
+       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
+       struct vht_priv         *pvhtpriv = &pmlmepriv->vhtpriv;
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       u8      target_bw;
+       u8      target_rxss, current_rxss;
+       u8      update_ra = _FALSE;
+       u8      vht_mcs_map[2] = {};
+
+       if(pvhtpriv->vht_option == _FALSE)
+               return;
+
+       target_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(pframe);
+       target_rxss = (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe)+1);
+
+       if (target_bw != psta->bw_mode) {
+               if (target_bw <= (padapter->registrypriv.bw_mode >> 4)) {
+                       update_ra = _TRUE;
+                       psta->bw_mode = target_bw;
+               }
+       }
+
+       current_rxss = rtw_vht_mcsmap_to_nss(psta->vhtpriv.vht_mcs_map);
+       if (target_rxss != current_rxss) {
+               update_ra = _TRUE;
+
+               rtw_vht_nss_to_mcsmap(target_rxss, vht_mcs_map, psta->vhtpriv.vht_mcs_map);
+               _rtw_memcpy(psta->vhtpriv.vht_mcs_map, vht_mcs_map, 2);
+               
+               rtw_hal_update_sta_rate_mask(padapter, psta);
+       }
+
+       if (update_ra) {
+               rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta);
+       }
 }
 
 u32    rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel)
@@ -417,9 +510,10 @@ u32        rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel)
        //center frequency
        SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(operation, center_freq);//Todo: need to set correct center channel
        SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(operation,0);
-       SET_VHT_OPERATION_ELE_BASIC_MCS_SET(operation, 0xFFFF);
+       operation[3] = 0xff;
+       operation[4] = 0xff;
 
-       pbuf = rtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len);
+       rtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len);
 
        return len;
 }
@@ -445,6 +539,8 @@ u32 rtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw)
        SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss-1));
        SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, 0); //Todo
 
+       pvhtpriv->vht_op_mode_notify = opmode;
+
        pbuf = rtw_set_ie(pbuf, EID_OpModeNotification, 1, &opmode, &len);
 
        return len;
index 6c6268c0a56f43977a097e5405a35a1e7e67e64e..d4835daadb969ecd4c1daad6955a2e3bb0c8f753 100755 (executable)
@@ -390,7 +390,7 @@ u8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data)
        //YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4.\r
        if ((pkt_data[1]&0x40) !=0)\r
        {\r
-               DBG_871X("data is privacy \n");\r
+               //DBG_871X("data is privacy \n");\r
                return 0;\r
        }\r
        \r
index 7d04122371bb20f0744b67e88b6e8cec36472eab..e3f1fed10f8d8f3575d29bee657d1f727230bb21 100755 (executable)
@@ -21,7 +21,7 @@
 
 #include <drv_types.h>
 
-#ifdef CONFIG_WOWLAN
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 #include <linux/inetdevice.h>
 #endif
 
@@ -40,11 +40,6 @@ unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5};
 
 unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};
 
-extern unsigned char   MCS_rate_2R[16];
-#ifdef CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_2R_MCS13TO15_OFF[16];
-#endif //CONFIG_DISABLE_MCS13TO15
-extern unsigned char   MCS_rate_1R[16];
 extern unsigned char RTW_WPA_OUI[];
 extern unsigned char WPA_TKIP_CIPHER[4];
 extern unsigned char RSN_TKIP_CIPHER[4];
@@ -55,6 +50,9 @@ extern unsigned char RSN_TKIP_CIPHER[4];
 #define WAIT_FOR_BCN_TO_MIN    (6000)
 #define WAIT_FOR_BCN_TO_MAX    (20000)
 
+#define DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS 1000
+#define DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD 3
+
 static u8 rtw_basic_rate_cck[4] = {
        IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
        IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK
@@ -393,6 +391,19 @@ void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len)
        _rtw_memcpy(pbssrate, supportedrates, *bssrate_len);
 }
 
+void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask)
+{
+       u8 mcs_rate_1r = (u8)(mask&0xff);
+       u8 mcs_rate_2r = (u8)((mask>>8)&0xff);
+       u8 mcs_rate_3r = (u8)((mask>>16)&0xff);
+       u8 mcs_rate_4r = (u8)((mask>>24)&0xff);
+
+       mcs_set[0] &= mcs_rate_1r;
+       mcs_set[1] &= mcs_rate_2r;
+       mcs_set[2] &= mcs_rate_3r;
+       mcs_set[3] &= mcs_rate_4r;
+}
+
 void UpdateBrateTbl(
        IN PADAPTER             Adapter,
        IN u8                   *mBratesOS
@@ -493,10 +504,39 @@ 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();
+#ifdef DBG_CH_SWITCH
+       const int len = 128;
+       char msg[128] = {0};
+       int cnt = 0;
+       int i = 0;
+#endif  /* DBG_CH_SWITCH */
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       
+       if (dvobj->oper_channel != ch) {
+               dvobj->on_oper_ch_time = rtw_get_current_time();
+
+#ifdef DBG_CH_SWITCH
+               cnt += snprintf(msg+cnt, len-cnt, "switch to ch %3u", ch);
+
+               for (i = 0; i < dvobj->iface_nums; i++) {
+                       _adapter *iface = dvobj->padapters[i];
+                       cnt += snprintf(msg+cnt, len-cnt, " ["ADPT_FMT":", ADPT_ARG(iface));
+                       if (iface->mlmeextpriv.cur_channel == ch)
+                               cnt += snprintf(msg+cnt, len-cnt, "C");
+                       else
+                               cnt += snprintf(msg+cnt, len-cnt, "_");
+                       if (iface->wdinfo.listen_channel == ch && !rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_NONE))
+                               cnt += snprintf(msg+cnt, len-cnt, "L");
+                       else
+                               cnt += snprintf(msg+cnt, len-cnt, "_");
+                       cnt += snprintf(msg+cnt, len-cnt, "]");
+               }
 
-       adapter_to_dvobj(adapter)->oper_channel = ch;
+               DBG_871X(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(adapter), msg);
+#endif /* DBG_CH_SWITCH */
+       }
+
+       dvobj->oper_channel = ch;
 }
 
 inline u8 rtw_get_oper_bw(_adapter *adapter)
@@ -819,7 +859,16 @@ void CAM_empty_entry(
 
 void invalidate_cam_all(_adapter *padapter)
 {
+       struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+
        rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+       cam_ctl->bitmap = 0;
+       _rtw_memset(dvobj->cam_cache, 0, sizeof(struct cam_entry_cache)*TOTAL_CAM_ENTRY);
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
 }
 #if 1
 static u32 _ReadCAM(_adapter *padapter ,u32 addr)
@@ -853,79 +902,310 @@ void read_cam(_adapter *padapter ,u8 entry, u8 *get_key)
 }
 #endif
 
-void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
+void _write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
 {
-       unsigned int    i, val, addr;
-       //unsigned int    cmd;
+       unsigned int i, val, addr;
        int j;
        u32     cam_val[2];
 
        addr = entry << 3;
 
-       for (j = 5; j >= 0; j--)
-       {       
-               switch (j)
-               {
-                       case 0:
-                               val = (ctrl | (mac[0] << 16) | (mac[1] << 24) );
-                               break;
-                               
-                       case 1:
-                               val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
-                               break;
-                       
-                       default:
-                               i = (j - 2) << 2;
-                               val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
-                               break;
-                               
+       for (j = 5; j >= 0; j--) {
+               switch (j) {
+               case 0:
+                       val = (ctrl | (mac[0] << 16) | (mac[1] << 24) );
+                       break;
+               case 1:
+                       val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
+                       break;
+               default:
+                       i = (j - 2) << 2;
+                       val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
+                       break;
                }
 
                cam_val[0] = val;
                cam_val[1] = addr + (unsigned int)j;
 
                rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
-               
-               //rtw_write32(padapter, WCAMI, val);
-               
-               //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j);
-               //rtw_write32(padapter, RWCAM, cmd);
-               
-               //DBG_871X("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val);
-               
        }
+}
 
+void _clear_cam_entry(_adapter *padapter, u8 entry)
+{
+       unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+       unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
+
+       _write_cam(padapter, entry, 0, null_sta, null_key);
 }
 
-void clear_cam_entry(_adapter *padapter, u8 entry)
-{      
-#if 0
-       u32     addr, val=0;
-       u32     cam_val[2];
+inline void write_cam(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)
+{
+#ifdef CONFIG_WRITE_CACHE_ONLY
+       write_cam_cache(adapter, id ,ctrl, mac, key);
+#else
+       _write_cam(adapter, id, ctrl, mac, key);
+       write_cam_cache(adapter, id ,ctrl, mac, key);
+#endif
+}
 
-       addr = entry << 3;
+inline void clear_cam_entry(_adapter *adapter, u8 id)
+{
+       _clear_cam_entry(adapter, id);
+       clear_cam_cache(adapter, id);
+}
+
+inline void write_cam_from_cache(_adapter *adapter, u8 id)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+       struct cam_entry_cache cache;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+       _rtw_memcpy(&cache, &dvobj->cam_cache[id], sizeof(struct cam_entry_cache));
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+       _write_cam(adapter, id, cache.ctrl, cache.mac, cache.key);
+}
+
+void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+       dvobj->cam_cache[id].ctrl = ctrl;
+       _rtw_memcpy(dvobj->cam_cache[id].mac, mac, ETH_ALEN);
+       _rtw_memcpy(dvobj->cam_cache[id].key, key, 16);
+
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
+}
+
+void clear_cam_cache(_adapter *adapter, u8 id)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+       _rtw_memset(&(dvobj->cam_cache[id]), 0, sizeof(struct cam_entry_cache));
+
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
+}
+
+s16 rtw_get_camid(_adapter *adapter, struct sta_info *sta, s16 kid)
+{
+       u8 macid;
+       s16 camid;
+
+       //cam_entry:
+       //0~3 for default key
+
+       //for concurrent mode (ap+sta, sta+sta):
+       //default key is disable, using sw encrypt/decrypt
+       //camid 0, 1, 2, 3 is default entry for default key/group key
+       //macid = 1 is for bc/mc stainfo, no mapping to camid
+       //macid = 0 mapping to camid 4
+       //for macid >=2, camid = macid+3;
+
+       if (sta) {
+               struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;
+               macid = sta->mac_id;
+
+               if((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {
+                       if((macid == 1) || (macid>(NUM_STA-4))){
+                               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" failed, mac_id=%d\n", FUNC_ADPT_ARG(adapter), macid);
+                               camid = -1;
+                               goto exit;
+                       }
+               }
+
+               if(macid==0)
+                       camid = 4;
+               else if(macid >=2)
+                       camid = macid + 3;
+               else
+                       camid = 4;
+       }
+       else {
+               /* default key is disabled */
+               camid = -1;
+       }
+
+exit:
+       return (s16)camid;
+}
+
+bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       bool ret = _FALSE;
+
+       if (cam_id >= TOTAL_CAM_ENTRY)
+               goto exit;
+
+       if (!(cam_ctl->bitmap & BIT(cam_id)))
+               goto exit;
        
+       ret = (dvobj->cam_cache[cam_id].ctrl&BIT6)?_TRUE:_FALSE;
 
-       cam_val[0] = val;
-       cam_val[1] = addr + (unsigned int)0;
+exit:
+       return ret;
+}
 
-       rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
+bool rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+       bool ret;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+       ret = _rtw_camid_is_gk(adapter, cam_id);
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+       return ret;
+}
+
+s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       int i;
+       s16 cam_id = -1;
+
+       for (i=0;i<TOTAL_CAM_ENTRY;i++) {
+               if (addr && _rtw_memcmp(dvobj->cam_cache[i].mac, addr, ETH_ALEN) == _FALSE)
+                       continue;
+               if (kid >= 0 && kid != (dvobj->cam_cache[i].ctrl&0x03))
+                       continue;
+
+               cam_id = i;
+               break;
+       }
+
+       if (0) {
+               if (addr)
+                       DBG_871X(FUNC_ADPT_FMT" addr:"MAC_FMT" kid:%d, return cam_id:%d\n"
+                               , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid, cam_id);
+               else
+                       DBG_871X(FUNC_ADPT_FMT" addr:%p kid:%d, return cam_id:%d\n"
+                               , FUNC_ADPT_ARG(adapter), addr, kid, cam_id);
+       }
 
+       return cam_id;
+}
 
+s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+       s16 cam_id = -1;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+       cam_id = _rtw_camid_search(adapter, addr, kid);
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
 
-       cam_val[0] = val;
-       cam_val[1] = addr + (unsigned int)1;
+       return cam_id;
+}
+
+s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+       s16 cam_id = -1;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+#ifdef DYNAMIC_CAMID_ALLOC
+       {
+               struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;
 
-       rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
+               if((((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) || ((mlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))
+                       && !sta) {
+                       /* AP/Ad-hoc mode group key: static alloction to default key by key ID */
+                       if (kid > 3) {
+                               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key with invalid key id:%u\n"
+                                       , FUNC_ADPT_ARG(adapter), kid);
+                               rtw_warn_on(1);
+                               goto bitmap_handle;
+                       }
+
+                       cam_id = kid;
+               }
+               else {
+                       int i;
+                       u8 *addr = sta?sta->hwaddr:NULL;
+
+                       if(!sta) {
+                               if (!(mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {
+                                       /* bypass STA mode group key setting before connected(ex:WEP) because bssid is not ready */
+                                       goto bitmap_handle;
+                               }
+
+                               addr = get_bssid(&adapter->mlmepriv);
+                       }
+
+                       if ((i = _rtw_camid_search(adapter, addr, kid)) >= 0) {
+                               /* Fix issue that pairwise and group key have same key id. Pairwise key first, group key can overwirte group only(ex: rekey) */
+                               if (sta || _rtw_camid_is_gk(adapter, i) == _TRUE)
+                                       cam_id = i;
+                               else
+                                       DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u the same key id as pairwise key\n"
+                                               , FUNC_ADPT_ARG(adapter), kid);
+                               goto bitmap_handle;
+                       }
+
+                       for (i=4;i<TOTAL_CAM_ENTRY;i++)
+                               if (!(cam_ctl->bitmap & BIT(i)))
+                                       break;
+
+                       if (i == TOTAL_CAM_ENTRY) {
+                               if (sta)
+                                       DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u no room\n"
+                                       , FUNC_ADPT_ARG(adapter), MAC_ARG(sta->hwaddr), kid);
+                               else
+                                       DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u no room\n"
+                                       , FUNC_ADPT_ARG(adapter), kid);
+                               rtw_warn_on(1);
+                               goto bitmap_handle;
+                       }
+
+                       cam_id = i;
+               }
+       }
 #else
+       cam_id = rtw_get_camid(adapter, sta, kid);
+#endif /* DYNAMIC_CAMID_ALLOC */
 
-       unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+bitmap_handle:
+       if (cam_id >= 0)
+               cam_ctl->bitmap |= BIT(cam_id);
 
-       unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
 
-       write_cam(padapter, entry, 0, null_sta, null_key);
+       return cam_id;
+}
 
-#endif
+void rtw_camid_free(_adapter *adapter, u8 cam_id)
+{
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+       _irqL irqL;
+
+       _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+       if (cam_id < TOTAL_CAM_ENTRY)
+               cam_ctl->bitmap &= ~(BIT(cam_id));
+
+       _exit_critical_bh(&cam_ctl->lock, &irqL);
 }
 
 int allocate_fw_sta_entry(_adapter *padapter)
@@ -949,49 +1229,58 @@ int allocate_fw_sta_entry(_adapter *padapter)
 
 void flush_all_cam_entry(_adapter *padapter)
 {
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-#ifdef CONFIG_CONCURRENT_MODE
-
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
        struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
 
-       //if(check_buddy_mlmeinfo_state(padapter, _HW_STATE_NOLINK_))   
-       if(check_buddy_fwstate(padapter, _FW_LINKED) == _FALSE)
-       {
-               rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);         
-       }
-       else
+#ifdef CONFIG_CONCURRENT_MODE
+       if(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE)
        {
                if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
                {
                        struct sta_priv *pstapriv = &padapter->stapriv;
                        struct sta_info *psta;
-                       u8 cam_id;//cam_entry
 
                        psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
                        if(psta) {
                                if(psta->state & WIFI_AP_STATE)
                                {}   //clear cam when ap free per sta_info        
                                else {
-
-                                       cam_id = (u8)rtw_get_camid(psta->mac_id);
-
-                                       //clear_cam_entry(padapter, cam_id);
-                                       rtw_clearstakey_cmd(padapter, (u8*)psta, cam_id, _FALSE);
-                               }                               
+                                       rtw_clearstakey_cmd(padapter, psta, _FALSE);
+                               }
                        }
                }
                else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
                {
-                       //clear cam when ap free per sta_info 
-               }                       
-       }
-#else //CONFIG_CONCURRENT_MODE
+                       /* clear default key */
+                       int i, cam_id;
+                       u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};
+
+                       for (i=0;i<4;i++) {
+                               cam_id = rtw_camid_search(padapter, null_addr, i);
+                               if (cam_id >= 0) {
+                                       clear_cam_entry(padapter, cam_id);
+                                       rtw_camid_free(padapter, cam_id);
+                               }
+                       }
 
-       rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0); 
+                       /* clear default key related key search setting */
+                       #ifdef DYNAMIC_CAMID_ALLOC
+                       rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+                       #endif
 
+                       /* leave pairwise key when ap free per sta_info */
+               }
+       }
+       else
 #endif //CONFIG_CONCURRENT_MODE
+       {
+               invalidate_cam_all(padapter);
+               /* clear default key related key search setting */
+               #ifdef DYNAMIC_CAMID_ALLOC
+               rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+               #endif
+       }
 
        _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
        
@@ -1043,11 +1332,18 @@ int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs     pIE)
        if(pmlmepriv->qospriv.qos_option==0)
        {
                pmlmeinfo->WMM_enable = 0;
-               return _FAIL;
+               return _FALSE;
        }       
-
+       
+       if(_rtw_memcmp(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)))
+       {
+               return _FALSE;
+       }
+       else
+       {
+               _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
+       }
        pmlmeinfo->WMM_enable = 1;
-       _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
        return _TRUE;
 
        /*if (pregpriv->wifi_spec == 1)
@@ -1322,12 +1618,11 @@ static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pI
                                psta->bw_mode = CHANNEL_WIDTH_20;
                                phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
                        }
-                       
+
+                       rtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta);
                }
 
                //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it!
-
-               rtw_dm_ra_mask_wk_cmd(padapter);
        }       
 #endif //CONFIG_80211N_HT
 }
@@ -1338,6 +1633,7 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
        unsigned int    i;
        u8      rf_type;
        u8      max_AMPDU_len, min_MPDU_spacing;
+       u8      cur_ldpc_cap=0, cur_stbc_cap=0, cur_beamform_cap=0;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;       
@@ -1391,32 +1687,95 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
 
        rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
 
-       //update the MCS rates
+
+       //update the MCS set
        for (i = 0; i < 16; i++)
+               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];
+                       
+       //update the MCS rates
+       switch(rf_type)
        {
-               if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
+               case RF_1T1R:
+               case RF_1T2R:
+                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);                                                        
+                       break;
+               case RF_2T2R:           
+               default:
+#ifdef CONFIG_DISABLE_MCS13TO15
+                       if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )                          
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);                             
+                       else
+                               set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#else //CONFIG_DISABLE_MCS13TO15
+                       set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#endif //CONFIG_DISABLE_MCS13TO15
+       }
+
+       if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
+               // Config STBC setting
+               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAPABILITY_ELE_TX_STBC(pIE->data))
                {
-                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
+                       SET_FLAG(cur_stbc_cap, STBC_HT_ENABLE_TX);
+                       DBG_871X("Enable HT Tx STBC !\n");
                }
-               else
+               phtpriv->stbc_cap = cur_stbc_cap;
+
+#ifdef CONFIG_BEAMFORMING
+               // Config Tx beamforming setting
+               if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && 
+                       GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data))
                {
-                       #ifdef CONFIG_DISABLE_MCS13TO15
-                       if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && (pregistrypriv->wifi_spec!=1))
-                               pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
-                       else
-                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                       #else
-                       pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
-                       #endif //CONFIG_DISABLE_MCS13TO15
+                       SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);
                }
-               #ifdef RTL8192C_RECONFIG_TO_1T1R
+
+               if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) &&
+                       GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data))
                {
-                       pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
+                       SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);
                }
-               #endif
+               phtpriv->beamform_cap = cur_beamform_cap;
+               if (cur_beamform_cap) {
+                       DBG_871X("AP HT Beamforming Cap = 0x%02X\n", cur_beamform_cap);
+               }
+#endif //CONFIG_BEAMFORMING
+       } else {
+               // Config LDPC Coding Capability
+               if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAPABILITY_ELE_LDPC_CAP(pIE->data))
+               {
+                       SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));
+                       DBG_871X("Enable HT Tx LDPC!\n");
+               }
+               phtpriv->ldpc_cap = cur_ldpc_cap;
+
+               // Config STBC setting
+               if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAPABILITY_ELE_RX_STBC(pIE->data))
+               {
+                       SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) );
+                       DBG_871X("Enable HT Tx STBC!\n");
+               }
+               phtpriv->stbc_cap = cur_stbc_cap;
+
+#ifdef CONFIG_BEAMFORMING
+               // Config Tx beamforming setting
+               if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && 
+                       GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data))
+               {
+                       SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);
+               }
+
+               if (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) &&
+                       GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data))
+               {
+                       SET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);
+               }
+               phtpriv->beamform_cap = cur_beamform_cap;
+               if (cur_beamform_cap) {
+                       DBG_871X("Client HT Beamforming Cap = 0x%02X\n", cur_beamform_cap);
+               }
+#endif //CONFIG_BEAMFORMING
        }
+
 #endif //CONFIG_80211N_HT
-       return;
 }
 
 void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
@@ -1589,6 +1948,34 @@ void VCS_update(_adapter *padapter, struct sta_info *psta)
        }
 }
 
+void   update_ldpc_stbc_cap(struct sta_info *psta)
+{
+#ifdef CONFIG_80211N_HT
+
+#ifdef CONFIG_80211AC_VHT
+       if (psta->vhtpriv.vht_option) {
+               if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX))
+                       psta->ldpc = 1;
+
+               if(TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX))
+                       psta->stbc = 1;
+       }
+       else
+#endif //CONFIG_80211AC_VHT
+       if (psta->htpriv.ht_option) {
+               if(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX))
+                       psta->ldpc = 1;
+
+               if(TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX))
+                       psta->stbc = 1;
+       } else {
+               psta->ldpc = 0;
+               psta->stbc = 0;
+       }
+
+#endif //CONFIG_80211N_HT
+}
+
 #ifdef CONFIG_TDLS
 int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len)
 {
@@ -1628,6 +2015,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        u32 bcn_channel;
        unsigned short  ht_cap_info;
        unsigned char   ht_info_infos_0;
+       struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
 
        if (is_client_associated_to_ap(Adapter) == _FALSE)
                return _TRUE;
@@ -1646,6 +2034,16 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        }
 
        bssid = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
+       if (bssid == NULL) {
+               DBG_871X("%s rtw_zmalloc fail !!!\n", __func__);
+               return _TRUE;
+       }
+
+       if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS))
+       {
+               pmlmepriv->timeBcnInfoChkStart = 0;
+               pmlmepriv->NumOfBcnInfoChkFail = 0;
+       }
 
        subtype = GetFrameSubType(pframe) >> 4;
 
@@ -1681,7 +2079,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                                                        ht_cap_info, ht_info_infos_0);
                        DBG_871X("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
                                                        cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0);
-                       DBG_871X("%s bw mode change, disconnect\n", __func__);
+                       DBG_871X("%s bw mode change\n", __func__);
                        {       
                                //bcn_info_update
                                cur_network->BcnInfo.ht_cap_info = ht_cap_info;
@@ -1696,7 +2094,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        if (p) {
                        bcn_channel = *(p + 2);
        } else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */
-                       p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
+                       rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);
                        if(pht_info) {
                                        bcn_channel = pht_info->primary_channel;
                        } else { /* we don't find channel IE, so don't check it */
@@ -1734,7 +2132,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        if (_rtw_memcmp(bssid->Ssid.Ssid, cur_network->network.Ssid.Ssid, 32) == _FALSE ||
                        bssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) {
                if (bssid->Ssid.Ssid[0] != '\0' && bssid->Ssid.SsidLength != 0) { /* not hidden ssid */
-                       DBG_871X("%s(), SSID is not match return FAIL\n", __func__);
+                       DBG_871X("%s(), SSID is not match\n", __func__);
                        goto _mismatch;
                }
        }
@@ -1751,7 +2149,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                        ("%s(): cur_network->network.Privacy is %d, bssid.Privacy is %d\n",
                         __func__, cur_network->network.Privacy,bssid->Privacy));
        if (cur_network->network.Privacy != bssid->Privacy) {
-               DBG_871X("%s(), privacy is not match return FAIL\n",__func__);
+               DBG_871X("%s(), privacy is not match\n",__func__);
                goto _mismatch;
        }
 
@@ -1767,7 +2165,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        }
 
        if (cur_network->BcnInfo.encryp_protocol != encryp_protocol) {
-               DBG_871X("%s(): enctyp is not match ,return FAIL\n",__func__);
+               DBG_871X("%s(): enctyp is not match\n",__func__);
                goto _mismatch;
        }
 
@@ -1794,14 +2192,14 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
                                ("%s cur_network->group_cipher is %d: %d\n",__func__, cur_network->BcnInfo.group_cipher, group_cipher));
                if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) {
-                       DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match ,return FAIL\n",__func__,
+                       DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n",__func__,
                                        pairwise_cipher, cur_network->BcnInfo.pairwise_cipher,
                                        group_cipher, cur_network->BcnInfo.group_cipher);
                        goto _mismatch;
                }
 
                if (is_8021x != cur_network->BcnInfo.is_8021x) {
-                       DBG_871X("%s authentication is not match ,return FAIL\n", __func__);
+                       DBG_871X("%s authentication is not match\n", __func__);
                        goto _mismatch;
                }
        }
@@ -1811,9 +2209,26 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
 
 _mismatch:
        rtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX));
-       return _FAIL;
 
-       _func_exit_;
+       if (pmlmepriv->NumOfBcnInfoChkFail == 0)
+       {
+               pmlmepriv->timeBcnInfoChkStart = rtw_get_current_time();
+       }
+
+       pmlmepriv->NumOfBcnInfoChkFail++;
+       DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe));
+
+       if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS) 
+               && (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD))
+       {
+               DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, 
+                       DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD, rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart));
+               pmlmepriv->timeBcnInfoChkStart = 0;
+               pmlmepriv->NumOfBcnInfoChkFail = 0;
+               return _FAIL;
+       }
+
+       return _SUCCESS;
 }
 
 void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
@@ -1835,21 +2250,24 @@ void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta
                
                switch (pIE->ElementID)
                {
-#if 0                  
                        case _VENDOR_SPECIFIC_IE_:              
-                               //todo: to update WMM paramter set while receiving beacon                       
-                               if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6))    //WMM
+                               //to update WMM paramter set while receiving beacon
+                               if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6) && pIE->Length == WLAN_WMM_LEN)     //WMM
                                {
-                                       (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0;
-                               }                               
+                                       (WMM_param_handler(padapter, pIE))? report_wmm_edca_update(padapter): 0;
+                               }
+
                                break;
-#endif
 
                        case _HT_EXTRA_INFO_IE_:        //HT info                               
                                //HT_info_handler(padapter, pIE);
                                bwmode_update_check(padapter, pIE);
                                break;
-
+#ifdef CONFIG_80211AC_VHT
+                       case EID_OpModeNotification:
+                               rtw_process_vht_op_mode_notify(padapter, pIE->data, psta);
+                               break;
+#endif //CONFIG_80211AC_VHT
                        case _ERPINFO_IE_:
                                ERP_IE_handler(padapter, pIE);
                                VCS_update(padapter, psta);
@@ -2746,25 +3164,6 @@ void beacon_timing_control(_adapter *padapter)
        rtw_hal_bcn_related_reg_setting(padapter);
 }
 
-uint rtw_get_camid(uint macid)
-{
-       uint camid;
-
-       //camid 0, 1, 2, 3 is default entry for default key/group key
-       //macid = 1 is for bc/mc stainfo, no mapping to camid
-       //macid = 0 mapping to camid 4
-       //for macid >=2, camid = macid+3;
-
-       if(macid==0)
-               camid = 4;
-       else if(macid >=2)
-               camid = macid + 3;
-       else
-               camid = 4;
-
-       return camid;
-}
-
 void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta)
 {
        int i;
@@ -2836,6 +3235,27 @@ void rtw_release_macid(_adapter *padapter, struct sta_info *psta)
        _exit_critical_bh(&pdvobj->lock, &irqL);
 
 }
+//For 8188E RA
+u8 rtw_search_max_mac_id(_adapter *padapter)
+{
+       u8 max_mac_id=0;
+       struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
+       int i;
+       _irqL   irqL;   
+       _enter_critical_bh(&pdvobj->lock, &irqL);
+       for(i=(NUM_STA-1); i>=0 ; i--)
+       {
+               if(pdvobj->macid[i] == _TRUE)
+               {                       
+                       break;
+               }
+       }
+       max_mac_id = i;
+       _exit_critical_bh(&pdvobj->lock, &irqL);
+
+       return max_mac_id;
+
+}              
 
 #if 0
 unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame)
@@ -3009,7 +3429,197 @@ _adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj)
        return port0_iface;
 }
 
-#ifdef CONFIG_WOWLAN
+/*
+ * Description:
+ * rtw_check_invalid_mac_address: 
+ * This is only used for checking mac address valid or not.
+ *
+ * Input:
+ * adapter: mac_address pointer.
+ *
+ * Output:
+ * _TRUE: The mac address is invalid.
+ * _FALSE: The mac address is valid.
+ *
+ * Auther: Isaac.Li
+ */
+u8 rtw_check_invalid_mac_address(u8 *mac_addr) {
+       u8 null_mac_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
+       u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+       u8 res = _FALSE;
+
+       if (_rtw_memcmp(mac_addr, null_mac_addr, ETH_ALEN)) {
+               res = _TRUE;
+               goto func_exit;
+       }
+
+       if (_rtw_memcmp(mac_addr, multi_mac_addr, ETH_ALEN)) {
+               res = _TRUE;
+               goto func_exit;
+       }
+
+       if (mac_addr[0] & BIT0) {
+               res = _TRUE;
+               goto func_exit;
+       }
+
+       if (mac_addr[0] & BIT1) {
+               res = _TRUE;
+               goto func_exit;
+       }
+
+func_exit:
+       return res;
+}
+
+/*
+ * Description:
+ * dump_TX_FIFO: This is only used to dump TX_FIFO for debug WoW mode offload
+ * contant.
+ *
+ * Input:
+ * adapter: adapter pointer.
+ * page_num: The max. page number that user want to dump. 
+ * page_size: page size of each page. eg. 128 bytes, 256 bytes.
+ */
+void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){
+
+       int i;
+       u8 val = 0;
+       u8 base = 0;
+       u32 addr = 0;
+       u32 count = (page_size / 8);
+
+       if (page_num <= 0) {
+               DBG_871X("!!%s: incorrect input page_num paramter!\n", __func__);
+               return;
+       }
+
+       if (page_size < 128 || page_size > 256) {
+               DBG_871X("!!%s: incorrect input page_size paramter!\n", __func__);
+               return;
+       }
+
+       DBG_871X("+%s+\n", __func__);
+       val = rtw_read8(padapter, 0x106);
+       rtw_write8(padapter, 0x106, 0x69);
+       DBG_871X("0x106: 0x%02x\n", val);
+       base = rtw_read8(padapter, 0x209);
+       DBG_871X("0x209: 0x%02x\n", base);
+
+       addr = ((base) * page_size)/8;
+       for (i = 0 ; i < page_num * count ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+}
+
+#ifdef CONFIG_GPIO_API
+int rtw_get_gpio(struct net_device *netdev, int gpio_num)
+{
+       u8 value;
+       u8 direction;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
+
+       rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+       DBG_871X("rf_pwrstate=0x%02x\n", pwrpriv->rf_pwrstate);
+       LeaveAllPowerSaveModeDirect(adapter);
+
+       /* Read GPIO Direction */
+       direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
+
+       /* According the direction to read register value */
+       if( direction )
+               value =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1)& BIT(gpio_num)) >> gpio_num;
+       else
+               value =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL)& BIT(gpio_num)) >> gpio_num;
+
+       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+       DBG_871X("%s direction=%d value=%d\n",__FUNCTION__,direction,value);
+
+       return value;
+}
+EXPORT_SYMBOL(rtw_get_gpio);
+
+int  rtw_set_gpio_output_value(struct net_device *netdev, int gpio_num, BOOLEAN isHigh)
+{
+       u8 direction = 0;
+       u8 res = -1;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+
+       /* Check GPIO is 4~7 */
+       if( gpio_num > 7 || gpio_num < 4)
+       {
+               DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
+               return -1;
+       }
+
+       rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+       LeaveAllPowerSaveModeDirect(adapter);
+
+       /* Read GPIO direction */
+       direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
+
+       /* If GPIO is output direction, setting value. */
+       if( direction )
+       {
+               if(isHigh)
+                       rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) | BIT(gpio_num));
+               else
+                       rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(gpio_num));
+
+               DBG_871X("%s Set gpio %x[%d]=%d\n",__FUNCTION__,REG_GPIO_PIN_CTRL+1,gpio_num,isHigh );
+               res = 0;
+       }
+       else
+       {
+               DBG_871X("%s The gpio is input,not be set!\n",__FUNCTION__);
+               res = -1;
+       }
+
+       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+       return res;
+}
+EXPORT_SYMBOL(rtw_set_gpio_output_value);
+
+int rtw_config_gpio(struct net_device *netdev, int gpio_num, BOOLEAN isOutput)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+
+       if( gpio_num > 7 || gpio_num < 4)
+       {
+               DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
+               return -1;
+       }
+
+       DBG_871X("%s gpio_num =%d direction=%d\n",__FUNCTION__,gpio_num,isOutput);
+
+       rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+       LeaveAllPowerSaveModeDirect(adapter);
+
+       if( isOutput )
+       {
+               rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) | BIT(gpio_num));
+       }
+       else
+       {
+               rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) & ~BIT(gpio_num));
+       }
+
+       rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+
+       return 0;
+}
+EXPORT_SYMBOL(rtw_config_gpio);
+#endif
+
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip)
 {
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
@@ -3017,7 +3627,8 @@ void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip)
        struct in_device *my_ip_ptr = padapter->pnetdev->ip_ptr;
        u8 ipaddress[4];
        
-       if ( (pmlmeinfo->state & WIFI_FW_LINKING_STATE) ) {
+       if ( (pmlmeinfo->state & WIFI_FW_LINKING_STATE) ||
+                       pmlmeinfo->state & WIFI_FW_AP_STATE) {
                if ( my_ip_ptr != NULL ) {
                        struct in_ifaddr *my_ifa_list  = my_ip_ptr->ifa_list ;
                        if ( my_ifa_list != NULL ) {
@@ -3032,6 +3643,8 @@ void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip)
                }
        }
 }
+#endif
+#ifdef CONFIG_WOWLAN
 void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr)
 {
        struct sta_info         *psta;
@@ -3070,27 +3683,25 @@ void rtw_set_sec_pn(PADAPTER padapter)
 
         if(psta)
         {
-                       if (pwrpriv->wowlan_fw_iv > psta->dot11txpn.val)
-                       {
-#ifdef CONFIG_RTL8188E
-                               /* TODO: update 8188E FW to remove this workaround.*/
-                               psta->dot11txpn.val += 4;
-                               DBG_871X("%s: workaround only for 8188e, txpn +=4\n", __func__);
-#else
-                               if (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_)
-                                       psta->dot11txpn.val = pwrpriv->wowlan_fw_iv + 2;
-#endif
-                       } 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);
+               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
 
 #ifdef CONFIG_PNO_SUPPORT
 #define        CSCAN_TLV_TYPE_SSID_IE  'S'
+#define CIPHER_IE "key_mgmt="
+#define CIPHER_NONE "NONE"
+#define CIPHER_WPA_PSK "WPA-PSK"
+#define CIPHER_WPA_EAP "WPA-EAP IEEE8021X"
 /*
  *  SSIDs list parsing from cscan tlv list
  */
@@ -3163,20 +3774,95 @@ int rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid,
        return idx;
 }
 
+int rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char* list_str) {
+
+       char *pch, *pnext, *pend;
+       u8 key_len = 0, index = 0;
+
+       pch = list_str;
+
+       if (nlo_info == NULL || list_str == NULL) {
+               DBG_871X("%s error paramters\n", __func__);
+               return -1;
+       }
+
+       while (strlen(pch) != 0) {
+               pnext = strstr(pch, "key_mgmt=");
+               if (pnext != NULL) {
+                       pch = pnext + strlen(CIPHER_IE);
+                       pend = strstr(pch, "}");
+                       if (strncmp(pch, CIPHER_NONE,
+                                               strlen(CIPHER_NONE)) == 0) {
+                               nlo_info->ssid_cipher_info[index] = 0x00;
+                       } else if (strncmp(pch, CIPHER_WPA_PSK,
+                                               strlen(CIPHER_WPA_PSK)) == 0) {
+                               nlo_info->ssid_cipher_info[index] = 0x66;
+                       } else if (strncmp(pch, CIPHER_WPA_EAP,
+                                               strlen(CIPHER_WPA_EAP)) == 0) {
+                               nlo_info->ssid_cipher_info[index] = 0x01;
+                       }
+                       index ++;
+                       pch = pend + 1;
+               } else {
+                       break;
+               }
+       }
+       return 0;
+}
+
 int rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid,
        int num, int pno_time, int pno_repeat, int pno_freq_expo_max) {
 
        int i = 0;
+       struct file *fp;
+       mm_segment_t fs;
+       loff_t pos = 0;
+       u8 *source = NULL;
+       long len = 0;
+
+       DBG_871X("+%s+\n", __func__);
+
        nlo_info->fast_scan_period = pno_time;
        nlo_info->ssid_num = num & BIT_LEN_MASK_32(8);
        nlo_info->slow_scan_period = (pno_time * 2);
        nlo_info->fast_scan_iterations = 5;
 
-       //TODO: chiper array, channel list and probe index is all empty.
+       //TODO: channel list and probe index is all empty.
        for (i = 0 ; i < num ; i++) {
                nlo_info->ssid_length[i]
                        = ssid[i].SSID_len;
        }
+
+       /* cipher array */
+       fp = filp_open("/data/misc/wifi/wpa_supplicant.conf", O_RDONLY,  0644);
+       if (IS_ERR(fp)) {
+               DBG_871X("Error, wpa_supplicant.conf doesn't exist.\n");
+               DBG_871X("Error, cipher array using default value.\n");
+               return 0;
+       }
+
+       len = i_size_read(fp->f_path.dentry->d_inode);
+       if (len < 0 || len > 2048) {
+               DBG_871X("Error, file size is bigger than 2048.\n");
+               DBG_871X("Error, cipher array using default value.\n");
+               return 0;
+       }
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+
+       source = rtw_zmalloc(2048);
+
+       if (source != NULL) {
+               len = vfs_read(fp, source, len, &pos);
+               rtw_parse_cipher_list(nlo_info, source);
+               rtw_mfree(source, 2048);
+       }
+
+       set_fs(fs);
+       filp_close(fp, NULL);
+
+       DBG_871X("-%s-\n", __func__);
        return 0;
 }
 
@@ -3256,9 +3942,12 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
                pwrctl->pscan_info == NULL ||
                pwrctl->pno_ssid_list == NULL){
                DBG_871X("%s, ERROR: alloc nlo_info, ssid_list, scan_info fail\n", __func__);
-               return -1;
+               goto failing;
        }
 
+       pwrctl->pno_in_resume = _FALSE;
+
+       pwrctl->pno_inited = _TRUE;
        /* NLO Info */
        ret = rtw_dev_nlo_info_set(pwrctl->pnlo_info, ssid, num,
                        pno_time, pno_repeat, pno_freq_expo_max);
@@ -3274,6 +3963,22 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
                 __func__, num, pno_time, pno_repeat, pno_freq_expo_max);
 
        return 0;
+
+failing:
+       if (pwrctl->pnlo_info) {
+               rtw_mfree(pwrctl->pnlo_info, sizeof(pno_nlo_info_t));
+               pwrctl->pnlo_info = NULL;
+       }
+       if (pwrctl->pno_ssid_list) {
+               rtw_mfree(pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));
+               pwrctl->pno_ssid_list = NULL;
+       }
+       if (pwrctl->pscan_info) {
+               rtw_mfree(pwrctl->pscan_info, sizeof(pno_scan_info_t));
+               pwrctl->pscan_info = NULL;
+       }
+
+       return -1;
 }
 
 #ifdef CONFIG_PNO_SET_DEBUG
@@ -3294,9 +3999,9 @@ void rtw_dev_pno_debug(struct net_device *net) {
        }
        DBG_871X("\n");
 
-       DBG_871X("chiper_info: ");
+       DBG_871X("cipher_info: ");
        for (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) {
-               DBG_871X("%d, ", pwrctl->pnlo_info->ssid_chiper_info[i]);
+               DBG_871X("%d, ", pwrctl->pnlo_info->ssid_cipher_info[i]);
        }
        DBG_871X("\n");
 
index 3202a86572df99c5121d150815ef56245c395245..83876c02f093fdf77262dcd3c0a3ba5c3d56247a 100755 (executable)
@@ -68,9 +68,7 @@ s32   _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
        struct xmit_buf *pxmitbuf;
        struct xmit_frame *pxframe;
        sint    res=_SUCCESS;   
-       u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
-       u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-
+       
 _func_enter_;          
 
        // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
@@ -201,7 +199,7 @@ _func_enter_;
        /* init xframe_ext queue,  the same count as extbuf  */
        _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
        
-       pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
+       pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
        
        if (pxmitpriv->xframe_ext_alloc_addr  == NULL){
                pxmitpriv->xframe_ext = NULL;
@@ -212,7 +210,7 @@ _func_enter_;
        pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
        pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
 
-       for (i = 0; i < num_xmit_extbuf; i++) {
+       for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
                _rtw_init_listhead(&(pxframe->list));
 
                pxframe->padapter = padapter;
@@ -229,12 +227,12 @@ _func_enter_;
 
                pxframe++;
        }
-       pxmitpriv->free_xframe_ext_cnt = num_xmit_extbuf;
+       pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
 
        // Init xmit extension buff
        _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
 
-       pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
+       pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
        
        if (pxmitpriv->pallocated_xmit_extbuf  == NULL){
                RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n"));
@@ -246,7 +244,7 @@ _func_enter_;
 
        pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;
 
-       for (i = 0; i < num_xmit_extbuf; i++)
+       for (i = 0; i < NR_XMIT_EXTBUFF; i++)
        {
                _rtw_init_listhead(&pxmitbuf->list);
 
@@ -254,14 +252,14 @@ _func_enter_;
                pxmitbuf->padapter = padapter;
                pxmitbuf->buf_tag = XMITBUF_MGNT;
 
-               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
+               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
                        res= _FAIL;
                        goto exit;
                }
                
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
                pxmitbuf->phead = pxmitbuf->pbuf;
-               pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;
+               pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
                pxmitbuf->len = 0;
                pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
 #endif
@@ -274,29 +272,30 @@ _func_enter_;
                
        }
 
-       pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
+       pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
 
+       for (i = 0; i<CMDBUF_MAX; i++) {
+               pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
+               if (pxmitbuf) {
+                       _rtw_init_listhead(&pxmitbuf->list);
 
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
-       if (pxmitbuf) {
-               _rtw_init_listhead(&pxmitbuf->list);
+                       pxmitbuf->priv_data = NULL;
+                       pxmitbuf->padapter = padapter;
+                       pxmitbuf->buf_tag = XMITBUF_CMD;
 
-               pxmitbuf->priv_data = NULL;
-               pxmitbuf->padapter = padapter;
-               pxmitbuf->buf_tag = XMITBUF_CMD;
-
-               if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
-                       res= _FAIL;
-                       goto exit;
-               }
+                       if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
+                               res= _FAIL;
+                               goto exit;
+                       }
 
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-               pxmitbuf->phead = pxmitbuf->pbuf;
-               pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
-               pxmitbuf->len = 0;
-               pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
+                       pxmitbuf->phead = pxmitbuf->pbuf;
+                       pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
+                       pxmitbuf->len = 0;
+                       pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
 #endif
-               pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
+                       pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
+               }
        }
 
        rtw_alloc_hwxmits(padapter);
@@ -363,15 +362,7 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
       _adapter *padapter = pxmitpriv->adapter;
        struct xmit_frame       *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
        struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
-       u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
-       u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-#if defined(CONFIG_MP_INCLUDED) && (defined(CONFIG_RTL8723A) ||defined(CONFIG_RTL8723B))
-       if (padapter->registrypriv.mp_mode) {
-               max_xmit_extbuf_size = 20000;
-               num_xmit_extbuf = 1;
-       }
-#endif
-
+       
  _func_enter_;   
 
        rtw_hal_free_xmit_priv(padapter);
@@ -406,33 +397,35 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
 
        /* free xframe_ext queue,  the same count as extbuf  */
        if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
-               for (i=0; i<num_xmit_extbuf; i++) {
+               for (i=0; i<NR_XMIT_EXTBUFF; i++) {
                        rtw_os_xmit_complete(padapter, pxmitframe);
                        pxmitframe++;
                }
        }
        if (pxmitpriv->xframe_ext_alloc_addr)
-               rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
+               rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
        _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
 
        // free xmit extension buff
        _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
 
        pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
-       for(i=0; i<num_xmit_extbuf; i++)
+       for(i=0; i<NR_XMIT_EXTBUFF; i++)
        {
-               rtw_os_xmit_resource_free(padapter, pxmitbuf,(max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _TRUE);
+               rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
                
                pxmitbuf++;
        }
 
        if(pxmitpriv->pallocated_xmit_extbuf) {
-               rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
+               rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
        }
 
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
-       if(pxmitbuf!=NULL)
-               rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
+       for (i=0; i<CMDBUF_MAX; i++) {
+               pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
+               if(pxmitbuf!=NULL)
+                       rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
+       }
 
        rtw_free_hwxmits(padapter);
 
@@ -612,40 +605,53 @@ static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitf
                        break;
                }
        }
+
+       //for debug : force driver control vrtl_carrier_sense.
+       if(padapter->driver_vcs_en==1)
+       {
+               //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+               //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+               pattrib->vcs_mode = padapter->driver_vcs_type;
+       }       
+       
 }
 
-static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta)
+static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
 {
+       struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
+
        pattrib->rtsen = psta->rtsen;
        pattrib->cts2self = psta->cts2self;
        
        pattrib->mdata = 0;
        pattrib->eosp = 0;
        pattrib->triggered=0;
+       pattrib->ampdu_spacing = 0;
        
        //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
        pattrib->qos_en = psta->qos_option;
        
        pattrib->raid = psta->raid;
 
-       pattrib->bwmode = psta->bw_mode;
+       if (mlmeext->cur_bwmode < psta->bw_mode)
+               pattrib->bwmode = mlmeext->cur_bwmode;
+       else
+               pattrib->bwmode = psta->bw_mode;
 
        pattrib->sgi = query_ra_short_GI(psta);
 
-#ifdef CONFIG_80211N_HT
-#ifdef CONFIG_80211AC_VHT
-       if (psta->vhtpriv.vht_option) {
-               if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX))
-                       pattrib->ldpc = 1;
-
-               if(TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX))
-                       pattrib->stbc = 1;
-       }
-#endif //CONFIG_80211AC_VHT
+       pattrib->ldpc = psta->ldpc;
+       pattrib->stbc = psta->stbc;
 
+#ifdef CONFIG_80211N_HT
        pattrib->ht_en = psta->htpriv.ht_option;
        pattrib->ch_offset = psta->htpriv.ch_offset;
        pattrib->ampdu_en = _FALSE;
+
+       if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx
+               pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
+       else
+               pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
 #endif //CONFIG_80211N_HT
        //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
        //{
@@ -672,6 +678,7 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib
 
        _rtw_memset(pattrib->dot118021x_UncstKey.skey,  0, 16);         
        _rtw_memset(pattrib->dot11tkiptxmickey.skey,  0, 16);
+       pattrib->mac_id = psta->mac_id;
 
        if (psta->ieee8021x_blocked == _TRUE)
        {
@@ -798,7 +805,7 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib
                RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
        }
 
-#ifdef CONFIG_CONCURRENT_MODE
+#if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
        if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
        {
                pattrib->bswenc = _TRUE;//force using sw enc.
@@ -810,6 +817,19 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib
                pattrib->bswenc = _FALSE;
 #endif
 
+#ifdef CONFIG_TDLS
+       if(pattrib->direct_link == _TRUE)
+       {
+               pattrib->mac_id = pattrib->ptdls_sta->mac_id;
+               if(pattrib->encrypt>0)
+               {
+                       pattrib->encrypt= _AES_;
+                       pattrib->iv_len=8;
+                       pattrib->icv_len=8;
+                       pattrib->bswenc = _FALSE;
+               }
+       }
+#endif //CONFIG_TDLS
 exit:
 
        return res;
@@ -876,6 +896,74 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
        pattrib->subtype = WIFI_QOS_DATA_TYPE;
 }
 
+#ifdef CONFIG_TDLS
+void rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib)
+{
+       pattrib->ptdls_sta = NULL;
+
+       pattrib->direct_link = _FALSE;
+       if((padapter->tdlsinfo.link_established == _TRUE)){
+               pattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);
+               if((pattrib->ptdls_sta!=NULL)&&
+                       (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&
+                       (pattrib->ether_type!=0x0806)){
+                               pattrib->direct_link = _TRUE;
+                               //DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
+               }
+       }
+}
+
+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;
+       
+       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
+
+       // [TDLS] TODO: setup req/rsp should be AC_BK
+       if (pqospriv->qos_option &&  psta->qos_option) {
+               pattrib->priority = 4;  //tdls management frame should be AC_VI
+               pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
+               pattrib->subtype = WIFI_QOS_DATA_TYPE;
+       } else {
+               pattrib->priority = 0;
+               pattrib->hdrlen = WLAN_HDR_A3_LEN;
+               pattrib->subtype = WIFI_DATA_TYPE;      
+       }
+
+       //TODO:_lock
+       if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
+       {
+               res = _FAIL;
+               goto exit;
+       }
+
+       update_attrib_phy_info(padapter, pattrib, psta);
+
+
+exit:
+
+       return res;
+}
+
+#endif //CONFIG_TDLS
+
 static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
 {
        uint i;
@@ -892,6 +980,8 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
  _func_enter_;
 
+       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
+
        _rtw_open_pktfile(pkt, &pktfile);
        i = _rtw_pktfile_read(&pktfile, (u8*)&etherhdr, ETH_HLEN);
 
@@ -906,15 +996,24 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
                _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
                _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
        }
        else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
                _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
                _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
        }
        else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
                _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
                _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
-       }
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
+       } 
+       else
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
+
+#ifdef CONFIG_TDLS
+       rtw_check_tdls_established(padapter, pattrib);
+#endif //CONFIG_TDLS
 
        pattrib->pktlen = pktfile.pkt_len;
 
@@ -945,6 +1044,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                                        //      pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; 
                                        //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate)); 
                                        pattrib->dhcp_pkt = 1;
+                                       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
                                }
                        }
                }
@@ -955,7 +1055,10 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
                        pattrib->icmp_pkt = 0;  
                        if(piphdr->protocol == 0x1) // protocol type in ip header 0x1 is ICMP                   
+                       {
                                pattrib->icmp_pkt = 1;
+                               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
+                       }
                }       
 
                
@@ -985,6 +1088,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 #endif 
 #endif
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
                rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
        }
 #endif //CONFIG_LPS
@@ -996,7 +1100,8 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                psta = rtw_get_bcmc_stainfo(padapter);
        } else {
                psta = rtw_get_stainfo(pstapriv, pattrib->ra);
-               if (psta == NULL)       { // if we cannot get psta => drrp the pkt
+               if (psta == NULL)       { // if we cannot get psta => drop the pkt
+                       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
                        RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
                        #ifdef DBG_TX_DROP_FRAME
                        DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
@@ -1006,6 +1111,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                }
                else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED)))
                {
+                       DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
                        res =_FAIL;
                        goto exit;
                }
@@ -1013,6 +1119,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
        if(psta == NULL)
        {               // if we cannot get psta => drop the pkt
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
                #ifdef DBG_TX_DROP_FRAME
                DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
@@ -1023,6 +1130,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
        if(!(psta->state &_FW_LINKED))
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
                DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state);
                return _FAIL;
        }
@@ -1032,13 +1140,13 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
        //TODO:_lock
        if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
                res = _FAIL;
                goto exit;
        }
 
-       update_attrib_phy_info(pattrib, psta);
+       update_attrib_phy_info(padapter, pattrib, psta);
 
-       pattrib->mac_id = psta->mac_id;
        //DBG_8192C("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id );
        
        pattrib->psta = psta;
@@ -1287,8 +1395,6 @@ s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)
 #ifdef CONFIG_TDLS
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
        struct sta_priv         *pstapriv = &padapter->stapriv;
-       struct sta_info *ptdls_sta=NULL, *psta_backup=NULL;
-       u8 direct_link=0;
 #endif //CONFIG_TDLS
 
        sint res = _SUCCESS;
@@ -1329,27 +1435,19 @@ _func_enter_;
        {
                if ((check_fwstate(pmlmepriv,  WIFI_STATION_STATE) == _TRUE)) {
                        //to_ds = 1, fr_ds = 0;
+
 #ifdef CONFIG_TDLS
-                       if((ptdlsinfo->setup_state == TDLS_LINKED_STATE)){
-                               ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
-                               if((ptdls_sta!=NULL)&&(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&(pattrib->ether_type!=0x0806)){
-                                       //TDLS data transfer, ToDS=0, FrDs=0
-                                       _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
-                                       _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
-                                       _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
-                                       direct_link=1;
-                               }else{
-                                       // 1.Data transfer to AP
-                                       // 2.Arp pkt will relayed by AP
-                                       SetToDs(fctrl);                                                 
-                                       _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
-                                       _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
-                                       _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
-                               } 
-                       }else
+                       if(pattrib->direct_link == _TRUE){
+                               //TDLS data transfer, ToDS=0, FrDs=0
+                               _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
+                               _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
+                               _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
+                       } 
+                       else
 #endif //CONFIG_TDLS
                        {
-                               //Data transfer to AP
+                               // 1.Data transfer to AP
+                               // 2.Arp pkt will relayed by AP
                                SetToDs(fctrl);                                                 
                                _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
                                _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
@@ -1426,20 +1524,31 @@ _func_enter_;
                                DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
                                return _FAIL;
                        }
+
                
-                       //if(psta)
+                       if(psta)
                        {
 #ifdef CONFIG_TDLS
-                               if(direct_link==1)
+                               if(pattrib->direct_link==_TRUE)
                                {
-                                       psta_backup = psta;
-                                       psta = ptdls_sta;
+                                       psta = pattrib->ptdls_sta;
+
+                                       //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
+                                       //pattrib->qos_en = ptdls_sta->qos_option;
+
+                                       pattrib->raid = psta->raid;
+#ifdef CONFIG_80211N_HT
+                                       pattrib->bwmode = psta->bw_mode;
+                                       pattrib->ht_en = psta->htpriv.ht_option;
+                                       pattrib->ch_offset = psta->htpriv.ch_offset;
+                                       pattrib->sgi= query_ra_short_GI(psta);
+#endif //CONFIG_80211N_HT
                                }
 #endif //CONFIG_TDLS
 
+
                                psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
                                psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
-
                                pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
 
                                SetSeqNum(hdr, pattrib->seqnum);
@@ -1480,31 +1589,6 @@ _func_enter_;
 
                                }
 #endif //CONFIG_80211N_HT
-#ifdef CONFIG_TDLS
-                               if(direct_link==1)
-                               {
-                                       if (pattrib->encrypt){
-                                               pattrib->encrypt= _AES_;
-                                               pattrib->iv_len=8;
-                                               pattrib->icv_len=8;
-                                       }
-
-                                       //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
-                                       //pattrib->qos_en = ptdls_sta->qos_option;
-                                       
-                                       pattrib->raid = ptdls_sta->raid;
-#ifdef CONFIG_80211N_HT
-                                       pattrib->bwmode = ptdls_sta->bw_mode;
-                                       pattrib->ht_en = ptdls_sta->htpriv.ht_option;
-                                       pattrib->ch_offset = ptdls_sta->htpriv.ch_offset;
-                                       pattrib->sgi= query_ra_short_GI(ptdls_sta);
-#endif //CONFIG_80211N_HT
-                                       pattrib->mac_id = ptdls_sta->mac_id;
-
-                                       psta = psta_backup;
-                               }
-#endif //CONFIG_TDLS
-
                        }
                }
                
@@ -1593,25 +1677,25 @@ s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)
 
 #ifdef CONFIG_TDLS
 
-int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 action)
+int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
 {
        int res=_SUCCESS;
 
-       switch(action){
+       switch(ptxmgmt->action_code){
                case TDLS_SETUP_REQUEST:
-                       rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe);
+                       rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
                        break;
                case TDLS_SETUP_RESPONSE:
-                       rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe);
+                       rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
                        break;
                case TDLS_SETUP_CONFIRM:
-                       rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe);
+                       rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt);
                        break;
                case TDLS_TEARDOWN:
-                       rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe);
+                       rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt);
                        break;
                case TDLS_DISCOVERY_REQUEST:
-                       rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe);
+                       rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
                        break;                  
                case TDLS_PEER_TRAFFIC_INDICATION:
                        rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe);
@@ -1622,6 +1706,9 @@ int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *
                case TDLS_CHANNEL_SWITCH_RESPONSE:
                        rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe);
                        break;
+               case TDLS_PEER_TRAFFIC_RESPONSE:
+                       rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe);
+                       break;
 #ifdef CONFIG_WFD                      
                case TUNNELED_PROBE_REQ:
                        rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);
@@ -1638,7 +1725,7 @@ int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *
        return res;
 }
 
-s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, u8 action)
+s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
 {
        u16 *qc;
        struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
@@ -1657,16 +1744,16 @@ _func_enter_;
 
        SetFrameSubType(fctrl, pattrib->subtype);
 
-       switch(action){
+       switch(ptxmgmt->action_code){
                case TDLS_SETUP_REQUEST:
                case TDLS_SETUP_RESPONSE:
                case TDLS_SETUP_CONFIRM:
-               case TDLS_TEARDOWN:     //directly to peer STA or via AP
                case TDLS_PEER_TRAFFIC_INDICATION:
                case TDLS_PEER_PSM_REQUEST:     //directly to peer STA or via AP
                case TUNNELED_PROBE_REQ:
                case TUNNELED_PROBE_RSP:
-                       SetToDs(fctrl);                                                 
+               case TDLS_DISCOVERY_REQUEST:
+                       SetToDs(fctrl);
                        _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
                        _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
                        _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
@@ -1680,20 +1767,20 @@ _func_enter_;
                        _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
                        tdls_seq=1;
                        break;
-               case TDLS_DISCOVERY_REQUEST:    //unicast: directly to peer sta, Bcast: via AP
-                       if(_rtw_memcmp(pattrib->dst, baddr, ETH_ALEN) )
+               case TDLS_TEARDOWN:
+                       if(ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_)
                        {
-                               SetToDs(fctrl);                                                 
-                               _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
+                               _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
                                _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
-                               _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
+                               _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
+                               tdls_seq=1;
                        }
                        else
                        {
-                               _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
+                               SetToDs(fctrl);         
+                               _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
                                _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
-                               _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
-                               tdls_seq=1;
+                               _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
                        }
                        break;
        }
@@ -1701,6 +1788,11 @@ _func_enter_;
        if (pattrib->encrypt)
                SetPrivacy(fctrl);
 
+       if(ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE)
+       {
+               SetPwrMgt(fctrl);
+       }
+
        if (pqospriv->qos_option)
        {
                qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
@@ -1725,7 +1817,9 @@ _func_enter_;
                                pattrib->encrypt= _AES_;
                                pattrib->iv_len=8;
                                pattrib->icv_len=8;
+                               pattrib->bswenc = _FALSE;
                        }
+                       pattrib->mac_id = ptdls_sta->mac_id;
                }else{
                        res=_FAIL;
                        goto exit;
@@ -1745,7 +1839,7 @@ _func_exit_;
        return res;
 }
 
-s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, u8 action)
+s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, struct tdls_txmgmt *ptxmgmt)
 {
        s32 llc_sz;
 
@@ -1780,7 +1874,7 @@ _func_enter_;
        pbuf_start = pxmitframe->buf_addr;
        mem_start = pbuf_start + TXDESC_OFFSET;
 
-       if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, action) == _FAIL) {
+       if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, ptxmgmt) == _FAIL) {
                res = _FAIL;
                goto exit;
        }
@@ -1825,7 +1919,7 @@ _func_enter_;
        //pattrib->pktlen will be counted in rtw_build_tdls_ies
        pattrib->pktlen = 0;
 
-       rtw_build_tdls_ies(padapter, pxmitframe, pframe, action);
+       rtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt);
 
        if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
                pframe += pattrib->pktlen;
@@ -2444,6 +2538,14 @@ void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz
                        pstats->tx_pkts += pkt_num;
 
                        pstats->tx_bytes += sz;
+#ifdef CONFIG_TDLS
+                       if(pxmitframe->attrib.ptdls_sta != NULL)
+                       {
+                               pstats = &(pxmitframe->attrib.ptdls_sta->sta_stats);
+                               pstats->tx_pkts += pkt_num;
+                               pstats->tx_bytes += sz;
+                       }
+#endif //CONFIG_TDLS
                }
                
 #ifdef CONFIG_CHECK_LEAVE_LPS
@@ -2453,13 +2555,14 @@ void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz
        }
 }
 
-struct xmit_buf *rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv)
+static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
+               enum cmdbuf_type buf_type)
 {
        struct xmit_buf *pxmitbuf =  NULL;
 
 _func_enter_;
 
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
+       pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
        if (pxmitbuf !=  NULL) {
                pxmitbuf->priv_data = NULL;
 
@@ -2471,6 +2574,7 @@ _func_enter_;
 #endif
 #ifdef CONFIG_PCI_HCI
                pxmitbuf->len = 0;
+               pxmitbuf->desc = NULL;
 #endif
 
                if (pxmitbuf->sctx) {
@@ -2488,27 +2592,8 @@ _func_exit_;
        return pxmitbuf;
 }
 
-s32    rtw_free_cmd_xmitbuf(struct xmit_priv *pxmitpriv)
-{
-       struct xmit_buf *pxmitbuf =  NULL;
-
-_func_enter_;
-
-       pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
-       if (pxmitbuf==NULL) {
-               DBG_871X("%s fail, no xmitbuf available !!!\n", __func__);
-               return _FAIL;
-       } else {
-               rtw_os_xmit_resource_free(pxmitbuf->padapter, pxmitbuf, pxmitbuf->alloc_sz, _FALSE);
-               pxmitbuf->pallocated_buf = NULL;
-       }
-
-_func_exit_;
-
-       return _SUCCESS;
-}
-
-struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv)
+struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
+               enum cmdbuf_type buf_type)
 {
        struct xmit_frame               *pcmdframe;
        struct xmit_buf         *pxmitbuf;
@@ -2519,7 +2604,7 @@ struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv)
                return NULL;
        }
 
-       if ((pxmitbuf = rtw_alloc_cmd_xmitbuf(pxmitpriv)) == NULL) {
+       if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {
                DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__);
                rtw_free_xmitframe(pxmitpriv, pcmdframe);
                return NULL;
@@ -2574,9 +2659,11 @@ _func_enter_;
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
                pxmitbuf->len = 0;
                pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
+               pxmitbuf->agg_num = 1;
 #endif
 #ifdef CONFIG_PCI_HCI
                pxmitbuf->len = 0;
+               pxmitbuf->desc = NULL;
 #endif
 
                if (pxmitbuf->sctx) {
@@ -2666,6 +2753,7 @@ _func_enter_;
 #endif
 #ifdef CONFIG_PCI_HCI
                pxmitbuf->len = 0;
+               pxmitbuf->desc = NULL;
 #endif
 
                if (pxmitbuf->sctx) {
@@ -2973,6 +3061,7 @@ _func_exit_;
 
 s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
 {
+       DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
        if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
        {
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
@@ -3058,7 +3147,7 @@ _func_enter_;
                }
 #endif 
        
-#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
                for(j=0; j<4; j++)
                        inx[j] = pxmitpriv->wmm_para_seq[j];
 #endif
@@ -3239,6 +3328,8 @@ s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
 
 _func_enter_;
 
+       DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
+
 /*
        if (pattrib->psta) {
                psta = pattrib->psta;           
@@ -3251,11 +3342,13 @@ _func_enter_;
        psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
        if(pattrib->psta != psta)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
                DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
                return _FAIL;
        }
 
        if (psta == NULL) {
+               DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
                res = _FAIL;
                DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
                RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
@@ -3264,6 +3357,7 @@ _func_enter_;
 
        if(!(psta->state &_FW_LINKED))
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
                DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
                return _FAIL;
        }
@@ -3300,7 +3394,15 @@ void rtw_alloc_hwxmits(_adapter *padapter)
 
        pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
 
+       pxmitpriv->hwxmits = NULL;
+
        pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry);  
+
+       if(pxmitpriv->hwxmits == NULL)
+       {
+               DBG_871X("alloc hwxmits fail!...\n");
+               return;
+       }
        
        hwxmits = pxmitpriv->hwxmits;
 
@@ -3641,6 +3743,8 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
 
        s32 res;
 
+       DBG_COUNTER(padapter->tx_logs.core_tx);
+
        if (start == 0)
                start = rtw_get_current_time();
 
@@ -3656,6 +3760,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
        if (pxmitframe == NULL) {
                drop_cnt ++;
                RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
+               DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
                return -1;
        }
 
@@ -3675,6 +3780,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
                if (res == -1)
                {
                        rtw_free_xmitframe(pxmitpriv, pxmitframe);
+                       DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
                        return -1;
                }
        }       
@@ -3712,11 +3818,13 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
        if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
        {
                _exit_critical_bh(&pxmitpriv->lock, &irqL0);
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
                return 1;               
        }
        _exit_critical_bh(&pxmitpriv->lock, &irqL0);
 #endif
 
+       //pre_xmitframe
        if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
                return 1;
 
@@ -3744,7 +3852,7 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra
                {
                        ret = _TRUE;
                        return ret;
-                       }
+               }
 
                _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);    
                
@@ -3764,20 +3872,20 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra
                        {
                                case 1:
                                case 2:
-                                       ptdls_sta->uapsd_bk = ptdls_sta->uapsd_bk | BIT(1);
+                                       ptdls_sta->uapsd_bk |= BIT(1);
                                        break;
                                case 4:
                                case 5:
-                                       ptdls_sta->uapsd_vi = ptdls_sta->uapsd_vi | BIT(1);
+                                       ptdls_sta->uapsd_vi |= BIT(1);
                                        break;
                                case 6:
                                case 7:
-                                       ptdls_sta->uapsd_vo = ptdls_sta->uapsd_vo | BIT(1);
+                                       ptdls_sta->uapsd_vo |= BIT(1);
                                        break;
                                case 0:
                                case 3:
                                default:
-                                       ptdls_sta->uapsd_be = ptdls_sta->uapsd_be | BIT(1);
+                                       ptdls_sta->uapsd_be |= BIT(1);
                                        break;
                        }
 
@@ -3798,6 +3906,47 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra
 }
 #endif //CONFIG_TDLS
 
+#define RTW_HIQ_FILTER_ALLOW_ALL 0
+#define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
+#define RTW_HIQ_FILTER_DENY_ALL 2
+
+inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
+{
+       bool allow = _FALSE;
+       _adapter *adapter = xmitframe->padapter;
+       struct registry_priv *registry = &adapter->registrypriv;
+
+if (adapter->interface_type != RTW_PCIE) {
+
+       if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
+       
+               struct pkt_attrib *attrib = &xmitframe->attrib;
+
+               if (attrib->ether_type == 0x0806
+                       || attrib->ether_type == 0x888e
+                       #ifdef CONFIG_WAPI_SUPPORT
+                       || attrib->ether_type == 0x88B4
+                       #endif
+                       || attrib->dhcp_pkt
+               ) {
+                       if (0)
+                       DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
+                               , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
+                       allow = _TRUE;
+               }
+       }
+       else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
+               allow = _TRUE;
+       }
+       else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
+       }
+       else {
+               rtw_warn_on(1);
+       }
+}
+       return allow;
+}
+
 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
 
 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
@@ -3809,18 +3958,20 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
        struct pkt_attrib *pattrib = &pxmitframe->attrib;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        sint bmcst = IS_MCAST(pattrib->ra);
+       bool update_tim = _FALSE;
 #ifdef CONFIG_TDLS
-       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
 
-       if( ptdlsinfo->setup_state == TDLS_LINKED_STATE )
+       if( padapter->tdlsinfo.link_established == _TRUE )
        {
                ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);
-               return ret;
        }
 #endif //CONFIG_TDLS
 
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
+       {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
            return ret;
+       }
 /*
        if(pattrib->psta)
        {
@@ -3835,31 +3986,33 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
        psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
        if(pattrib->psta != psta)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
                DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
                return _FALSE;
        }
 
        if(psta==NULL)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
                DBG_871X("%s, psta==NUL\n", __func__);
                return _FALSE;
        }
 
        if(!(psta->state &_FW_LINKED))
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
                DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
                return _FALSE;
        }
 
        if(pattrib->triggered==1)
        {
+               DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
                //DBG_871X("directly xmit pspoll_triggered packet\n");
 
                //pattrib->triggered=0;
-
-               if(bmcst)
+               if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
                        pattrib->qsel = 0x11;//HIQ
-               
 
                return ret;
        }
@@ -3881,16 +4034,25 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
                        
                        psta->sleepq_len++;
 
+                       if (!(pstapriv->tim_bitmap & BIT(0)))
+                               update_tim = _TRUE;
+
                        pstapriv->tim_bitmap |= BIT(0);//
                        pstapriv->sta_dz_bitmap |= BIT(0);
-                       
+
                        //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
 
-                       update_beacon(padapter, _TIM_IE_, NULL, _TRUE);//tx bc/mc packets after upate bcn
-                       
+                       if (update_tim == _TRUE) {
+                               update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
+                       } else {
+                               chk_bmc_sleepq_cmd(padapter);
+                       }
+
                        //_exit_critical_bh(&psta->sleep_q.lock, &irqL);                                
                        
                        ret = _TRUE;                    
+
+                       DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
                        
                }
                
@@ -3943,11 +4105,14 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
 
                        if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))
                        {
+                               if (!(pstapriv->tim_bitmap & BIT(psta->aid)))
+                                       update_tim = _TRUE;
+
                                pstapriv->tim_bitmap |= BIT(psta->aid);
 
                                //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
 
-                               if(psta->sleepq_len==1)
+                               if(update_tim == _TRUE)
                                {
                                        //DBG_871X("sleepq_len==1, update BCNTIM\n");
                                        //upate BCN for TIM IE
@@ -3964,6 +4129,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
 
                        ret = _TRUE;
 
+                       DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
                }
 
        }
@@ -3991,14 +4157,16 @@ static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_
        {                       
                pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
 
-               plist = get_next(plist);        
+               plist = get_next(plist);
                
+               pattrib = &pxmitframe->attrib;
+
+               pattrib->triggered = 0;
+               
                ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe); 
 
                if(_TRUE == ret)
                {
-                       pattrib = &pxmitframe->attrib;
-
                        ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
 
                        ptxservq->qcnt--;
@@ -4160,6 +4328,41 @@ 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(&pxmitpriv->lock, &irqL);
+                       return;
+               }
+#endif //CONFIG_TDLS
+
+               if (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);
+               }
+
+               pstapriv->tim_bitmap &= ~BIT(psta->aid);
+
+               if(psta->state&WIFI_SLEEP_STATE)
+                       psta->state ^= WIFI_SLEEP_STATE;
+
+               if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
+               {
+                       DBG_871X("%s alive check\n", __func__);
+                       psta->expire_to = pstapriv->expire_to;
+                       psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
+               }
+
+               pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
+       }
+
        //for BC/MC Frames
        if(!psta_bmc)
                goto _exit;
@@ -4200,48 +4403,18 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
 
                if(psta_bmc->sleepq_len==0)
                {
+                       if (pstapriv->tim_bitmap & BIT(0)) {
+                               //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(1);
+                       }
                        pstapriv->tim_bitmap &= ~BIT(0);
                        pstapriv->sta_dz_bitmap &= ~BIT(0);
-
-                       //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(1);
                }
 
        }       
 
-       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)
-               {
-                       DBG_871X("%s alive check\n", __func__);
-                       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);    
@@ -4319,13 +4492,6 @@ void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
                }
 
                pxmitframe->attrib.triggered = 1;
-
-/*
-               if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
-               {               
-                       rtw_os_xmit_complete(padapter, pxmitframe);
-               }
-*/
                rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
 
                if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac))
@@ -4334,8 +4500,7 @@ void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
                        if(psta->tdls_sta_state & TDLS_LINKED_STATE )
                        {
                                //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
-                               _exit_critical_bh(&pxmitpriv->lock, &irqL);
-                               return;
+                               goto exit;
                        }
 #endif //CONFIG_TDLS
                        pstapriv->tim_bitmap &= ~BIT(psta->aid);
@@ -4348,10 +4513,12 @@ void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
                }
        
        }       
-       
+
+exit:
        //_exit_critical_bh(&psta->sleep_q.lock, &irqL);        
        _exit_critical_bh(&pxmitpriv->lock, &irqL);
 
+       return;
 }
 
 #endif
index 65cf94e1769ff820ccee76bcfec64d8a28985c37..9f691416a493a915788aaf85e040a24b07212773 100755 (executable)
@@ -1724,9 +1724,17 @@ halbtc8188c2ant_ActionPanA2dp(
 // extern function start with EXhalbtc8188c2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8188c2ant_InitHwConfig(\r
+EXhalbtc8188c2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8188c2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u1Byte  u1Tmp=0;\r
 \r
@@ -1775,13 +1783,6 @@ EXhalbtc8188c2ant_DisplayCoexInfo(
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index 086a87927bf0176347d05da820ad070a84c1efc2..ce7ec564414fc5cbde4b88f71d3d447103c50aa7 100755 (executable)
@@ -87,10 +87,15 @@ typedef struct _COEX_STA_8188C_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8188c2ant_InitHwConfig(\r
+EXhalbtc8188c2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8188c2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8188c2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index 0a3f310005240a039d503fe085105ff81693350e..239da74f52523ed985cae8e7709e637e86281516 100755 (executable)
@@ -1713,9 +1713,17 @@ halbtc8192d2ant_IsBtCoexistEnter(
 // extern function start with EXhalbtc8192d2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8192d2ant_InitHwConfig(\r
+EXhalbtc8192d2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8192d2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u1Byte  u1Tmp=0;\r
 \r
@@ -1781,13 +1789,6 @@ EXhalbtc8192d2ant_DisplayCoexInfo(
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index 4d3b83879081bff1656f9d4be4cf280ac5b84833..85fd6742ca2f6d63ea14cb843c31251aba30cbfd 100755 (executable)
@@ -108,10 +108,15 @@ typedef struct _COEX_STA_8192D_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8192d2ant_InitHwConfig(\r
+EXhalbtc8192d2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8192d2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8192d2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index a9b90c6acd63f6e505239316461463256c7c4f61..36a48d08213864db3e6bf89ec42427e5d323861a 100755 (executable)
@@ -2437,9 +2437,17 @@ halbtc8192e1ant_InitCoexDm(
 // extern function start with EXhalbtc8192e1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8192e1ant_InitHwConfig(\r
+EXhalbtc8192e1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8192e1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u4Byte  u4Tmp=0;\r
        u2Byte  u2Tmp=0;\r
@@ -2536,13 +2544,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index 7a1ce5ae1b1df70419a281bd42f4a34d7bc1978e..8792ec8d381caac737828f429c8a46a6c8105f58 100755 (executable)
@@ -140,10 +140,15 @@ typedef struct _COEX_STA_8192E_1ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8192e1ant_InitHwConfig(\r
+EXhalbtc8192e1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8192e1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8192e1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index a1b8f274e670a24477ee1f7e4137130b4e5deedd..b17ee766e581c6010e9cec585cf5f968c0ab9049 100755 (executable)
@@ -3791,9 +3791,17 @@ halbtc8192e2ant_InitHwConfig(
 // extern function start with EXhalbtc8192e2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8192e2ant_InitHwConfig(\r
+EXhalbtc8192e2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8192e2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        halbtc8192e2ant_InitHwConfig(pBtCoexist, TRUE);\r
 }\r
@@ -3837,13 +3845,6 @@ EXhalbtc8192e2ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);\r
index dc94c73b3f3a43ed16d869c84eac8bc470b5091d..58cddce87a412c4b5987d53ae09ae2264d4fb96b 100755 (executable)
@@ -143,10 +143,15 @@ typedef struct _COEX_STA_8192E_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8192e2ant_InitHwConfig(\r
+EXhalbtc8192e2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8192e2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8192e2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index d2476cda62e568b0548485e3f84a9d11d6446056..8cd3d15b3146a8320629aa5ee5ccb11ba93f1487 100755 (executable)
@@ -1077,13 +1077,6 @@ EXhalbtc8723a1ant_DisplayCoexInfo(
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index 2b72397b5285d8b7600687bf864f602089e7381c..3e115864cd21b8b27545be0682496291bf5ce3ce 100755 (executable)
@@ -58,6 +58,31 @@ halbtc8723a2ant_IsWifiIdle(
        return TRUE;\r
 }\r
 \r
+BOOLEAN\r
+halbtc8723a2ant_IsWifiConnectedIdle(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN         bWifiConnected=FALSE, bScan=FALSE, bLink=FALSE, bRoam=FALSE, bWifiBusy=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+\r
+       if(bScan)\r
+               return FALSE;\r
+       if(bLink)\r
+               return FALSE;\r
+       if(bRoam)\r
+               return FALSE;\r
+       if(bWifiConnected && !bWifiBusy)\r
+               return TRUE;\r
+       else \r
+               return FALSE;\r
+}\r
+\r
 u1Byte\r
 halbtc8723a2ant_BtRssiState(\r
        u1Byte                  levelNum,\r
@@ -629,6 +654,9 @@ halbtc8723a2ant_NeedToDecBtPwr(
        BOOLEAN         bRet=FALSE;\r
        BOOLEAN         bBtHsOn=FALSE, bWifiConnected=FALSE;\r
        s4Byte          btHsRssi=0;\r
+       u1Byte          btRssiState=BTC_RSSI_STATE_HIGH;\r
+\r
+       btRssiState = halbtc8723a2ant_BtRssiState(2, 42, 0);\r
 \r
        if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\r
                return FALSE;\r
@@ -636,6 +664,8 @@ halbtc8723a2ant_NeedToDecBtPwr(
                return FALSE;\r
        if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\r
                return FALSE;\r
+       if(BTC_RSSI_LOW(btRssiState))\r
+               return FALSE;\r
 \r
        if(bWifiConnected)\r
        {\r
@@ -1546,6 +1576,26 @@ halbtc8723a2ant_IsCommonAction(
                \r
                bCommon = TRUE;\r
        }\r
+       else if(halbtc8723a2ant_IsWifiConnectedIdle(pBtCoexist) && \r
+                       (BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected-idle + BT non-idle!!\n"));\r
+\r
+               halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               halbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\r
+\r
+               halbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+               halbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\r
+               halbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\r
+               \r
+               bCommon = TRUE;\r
+       }\r
        else\r
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-idle + BT non-idle!!\n"));\r
@@ -3332,9 +3382,17 @@ wa_halbtc8723a2ant_MonitorC2h(
 // extern function start with EXhalbtc8723a2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8723a2ant_InitHwConfig(\r
+EXhalbtc8723a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8723a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u4Byte  u4Tmp=0;\r
        u1Byte  u1Tmp=0;\r
@@ -3380,13 +3438,6 @@ EXhalbtc8723a2ant_DisplayCoexInfo(
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index c2733d89cea5040d42b5d15f9b8b5a5b0bfe58c9..f0cc8b546972c0856621c13fcb697e258fed4ee1 100755 (executable)
@@ -116,10 +116,15 @@ typedef struct _COEX_STA_8723A_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8723a2ant_InitHwConfig(\r
+EXhalbtc8723a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8723a2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index a09b7d8a245fa3270736ab2b109f4e5a53f6ae3d..a6a42b233ad0a1f629f20694990ce225ff76a316 100755 (executable)
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b1Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8723b1Ant=20130918;\r
-u4Byte GLCoexVer8723b1Ant=0x47;\r
+u4Byte GLCoexVerDate8723b1Ant=20140507;\r
+u4Byte GLCoexVer8723b1Ant=0x4e;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -411,6 +411,23 @@ halbtc8723b1ant_LimitedRx(
 \r
 }\r
 \r
+VOID\r
+halbtc8723b1ant_QueryBtInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+\r
+       pCoexSta->bC2hBtInfoReqSent = TRUE;\r
+\r
+       H2C_Parameter[0] |= BIT0;       // trigger\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", \r
+               H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\r
+}\r
+\r
 VOID\r
 halbtc8723b1ant_MonitorBtCtr(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -420,7 +437,20 @@ halbtc8723b1ant_MonitorBtCtr(
        u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
        u1Byte                  u1Tmp, u1Tmp1;\r
        s4Byte                  wifiRssi;\r
+       static u1Byte           NumOfBtCounterChk = 0;\r
        \r
+       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\r
+       //if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \r
+\r
+       if (pCoexSta->bUnderIps)\r
+       {\r
+               pCoexSta->highPriorityTx = 65535;\r
+               pCoexSta->highPriorityRx = 65535;\r
+               pCoexSta->lowPriorityTx = 65535;\r
+               pCoexSta->lowPriorityRx = 65535;\r
+               return;\r
+       }\r
+               \r
        regHPTxRx = 0x770;\r
        regLPTxRx = 0x774;\r
 \r
@@ -437,25 +467,122 @@ halbtc8723b1ant_MonitorBtCtr(
        pCoexSta->lowPriorityTx = regLPTx;\r
        pCoexSta->lowPriorityRx = regLPRx;\r
 \r
+       if( (pCoexSta->lowPriorityTx >= 1050)  && (!pCoexSta->bC2hBtInquiryPage))\r
+               pCoexSta->popEventCnt++;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",\r
+               regHPRx, regHPTx, regLPRx, regLPTx));\r
+\r
        // reset counter\r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\r
+\r
+       if ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))\r
+       {\r
+               NumOfBtCounterChk++;\r
+               if (NumOfBtCounterChk >= 3)\r
+{\r
+                       halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
+                       NumOfBtCounterChk = 0;\r
+               }\r
+       }\r
 }\r
 \r
+\r
 VOID\r
-halbtc8723b1ant_QueryBtInfo(\r
+halbtc8723b1ant_MonitorWiFiCtr(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte                  H2C_Parameter[1] ={0};\r
+       u4Byte  u4Tmp;\r
+       u2Byte  u2Tmp[3];\r
+       s4Byte  wifiRssi=0;\r
+       BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\r
+       static u1Byte nCCKLockCounter = 0;\r
 \r
-       pCoexSta->bC2hBtInfoReqSent = TRUE;\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
 \r
-       H2C_Parameter[0] |= BIT0;       // trigger\r
+       if (pCoexSta->bUnderIps)\r
+       {\r
+               pCoexSta->nCRCOK_CCK = 0;\r
+               pCoexSta->nCRCOK_11g = 0;\r
+               pCoexSta->nCRCOK_11n = 0;\r
+               pCoexSta->nCRCOK_11nAgg = 0;\r
 \r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", \r
-               H2C_Parameter[0]));\r
+               pCoexSta->nCRCErr_CCK = 0;\r
+               pCoexSta->nCRCErr_11g = 0;\r
+               pCoexSta->nCRCErr_11n = 0;\r
+               pCoexSta->nCRCErr_11nAgg = 0;   \r
+       }\r
+       else\r
+       {\r
+               pCoexSta->nCRCOK_CCK    = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\r
+               pCoexSta->nCRCOK_11g    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\r
+               pCoexSta->nCRCOK_11n    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\r
+               pCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\r
+\r
+               pCoexSta->nCRCErr_CCK    = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\r
+               pCoexSta->nCRCErr_11g    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\r
+               pCoexSta->nCRCErr_11n    = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\r
+               pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);                \r
+       }\r
+\r
+\r
+       //reset counter\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\r
+\r
+       if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))\r
+       {\r
+               if ( (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||\r
+                       (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||\r
+                       (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) )\r
+               {\r
+                       if (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + \r
+                               pCoexSta->nCRCOK_11nAgg) )\r
+                       {\r
+                               if (nCCKLockCounter < 5)\r
+                                nCCKLockCounter++;\r
+                       }\r
+                       else\r
+                       {\r
+                               if (nCCKLockCounter > 0)\r
+                                nCCKLockCounter--;\r
+                       }\r
+\r
+               }\r
+               else\r
+               {\r
+                       if (nCCKLockCounter > 0)\r
+                         nCCKLockCounter--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if (nCCKLockCounter > 0)\r
+                       nCCKLockCounter--;\r
+       }\r
+\r
+       if (!pCoexSta->bPreCCKLock)\r
+       {\r
+\r
+               if (nCCKLockCounter >= 5)\r
+                pCoexSta->bCCKLock = TRUE;\r
+               else\r
+                pCoexSta->bCCKLock = FALSE;                    \r
+       }\r
+       else\r
+       {\r
+               if (nCCKLockCounter == 0)\r
+                pCoexSta->bCCKLock = FALSE;\r
+               else\r
+                pCoexSta->bCCKLock = TRUE;             \r
+       }\r
+\r
+       pCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;    \r
+               \r
 \r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\r
 }\r
 \r
 BOOLEAN\r
@@ -920,6 +1047,10 @@ halbtc8723b1ant_CoexTableWithType(
        IN      u1Byte                          type\r
        )\r
 {\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type));\r
+       \r
+       pCoexSta->nCoexTableType = type;\r
+       \r
        switch(type)\r
        {\r
                case 0:\r
@@ -932,16 +1063,16 @@ halbtc8723b1ant_CoexTableWithType(
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 3:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaa5555, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 4:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5aaa5aaa, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 5:\r
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 6:\r
-                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
+                       halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 7:\r
                        halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\r
@@ -994,54 +1125,6 @@ halbtc8723b1ant_IgnoreWlanAct(
        pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\r
 }\r
 \r
-VOID\r
-halbtc8723b1ant_SetFwPstdma(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      u1Byte                  byte1,\r
-       IN      u1Byte                  byte2,\r
-       IN      u1Byte                  byte3,\r
-       IN      u1Byte                  byte4,\r
-       IN      u1Byte                  byte5\r
-       )\r
-{\r
-       u1Byte                  H2C_Parameter[5] ={0};\r
-       u1Byte                  realByte1=byte1, realByte5=byte5;\r
-       BOOLEAN                 bApEnable=FALSE;\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
-\r
-       if(bApEnable)\r
-       {\r
-               if(byte1&BIT4 && !(byte1&BIT5))\r
-               {                       \r
-                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));\r
-                       realByte1 &= ~BIT4;\r
-                       realByte1 |= BIT5;\r
-\r
-                       realByte5 |= BIT5;\r
-                       realByte5 &= ~BIT6;\r
-               }\r
-       }\r
-\r
-       H2C_Parameter[0] = realByte1;   \r
-       H2C_Parameter[1] = byte2;       \r
-       H2C_Parameter[2] = byte3;\r
-       H2C_Parameter[3] = byte4;\r
-       H2C_Parameter[4] = realByte5;\r
-\r
-       pCoexDm->psTdmaPara[0] = realByte1;\r
-       pCoexDm->psTdmaPara[1] = byte2;\r
-       pCoexDm->psTdmaPara[2] = byte3;\r
-       pCoexDm->psTdmaPara[3] = byte4;\r
-       pCoexDm->psTdmaPara[4] = realByte5;\r
-       \r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", \r
-               H2C_Parameter[0], \r
-               H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\r
-\r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\r
-}\r
-\r
 VOID\r
 halbtc8723b1ant_SetLpsRpwm(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1112,39 +1195,62 @@ halbtc8723b1ant_SetAntPath(
        )\r
 {\r
        PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\r
-       u4Byte                  fwVer=0, u4Tmp=0;\r
+       u4Byte                  fwVer=0, u4Tmp=0, cntBtCalChk=0;\r
        BOOLEAN                 bPgExtSwitch=FALSE;\r
        BOOLEAN                 bUseExtSwitch=FALSE;\r
-       u1Byte                  H2C_Parameter[2] ={0};\r
-       PADAPTER padapter=pBtCoexist->Adapter;\r
+       BOOLEAN                 bIsInMpMode = FALSE;\r
+       u1Byte                  H2C_Parameter[2] ={0}, u1Tmp = 0;\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);        // [31:16]=fw ver, [15:0]=fw sub ver\r
 \r
-\r
-       if((fwVer<0xc0000) || bPgExtSwitch)\r
+       if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\r
                bUseExtSwitch = TRUE;\r
 \r
        if(bInitHwCfg)\r
        {\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
-               \r
-               //Force GNT_BT to Normal\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0); \r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi TRx Mask on\r
+               pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on\r
 \r
+               if(fwVer >= 0x180000)\r
+               {\r
+               /* Use H2C to set GNT_BT to HIGH */\r
+               H2C_Parameter[0] = 1;\r
+               pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       // set grant_bt to high\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); \r
+               }\r
                //set wlan_act control by PTA\r
-               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); \r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); \r
+\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
 \r
-               //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); \r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\r
        }\r
        else if(bWifiOff)\r
        {\r
-       //Force GNT_BT to High\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);\r
-               \r
+               if(fwVer >= 0x180000)\r
+               {\r
+               /* Use H2C to set GNT_BT to HIGH */\r
+               H2C_Parameter[0] = 1;\r
+               pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       // set grant_bt to high\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); \r
+               }\r
                //set wlan_act to always low\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
                \r
-               if(padapter->registrypriv.mp_mode ==0)  \r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\r
+               if(!bIsInMpMode)        \r
                        pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\r
                else\r
                        pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
@@ -1155,6 +1261,46 @@ halbtc8723b1ant_SetAntPath(
                u4Tmp &= ~BIT24;\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
        }\r
+       else\r
+       {                       \r
+               /* Use H2C to set GNT_BT to LOW */\r
+               if(fwVer >= 0x180000)\r
+               {\r
+               if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765) != 0)\r
+               {               \r
+                       H2C_Parameter[0] = 0;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               }\r
+               else\r
+               {\r
+                       // BT calibration check\r
+                       while(cntBtCalChk <= 20)\r
+                       {\r
+                               u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d);\r
+                               cntBtCalChk++;\r
+                               if(u1Tmp & BIT0)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk));\r
+                                       delay_ms(50);\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk));\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       // set grant_bt to PTA\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\r
+               }\r
+\r
+               if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) != 0xc)\r
+               {\r
+                       //set wlan_act control by PTA\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); \r
+               }\r
+       }\r
        \r
        if(bUseExtSwitch)\r
        {\r
@@ -1166,10 +1312,10 @@ halbtc8723b1ant_SetAntPath(
                        u4Tmp |= BIT24;\r
                        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
 \r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
+\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\r
-       \r
                                //tell firmware "no antenna inverse"\r
                                H2C_Parameter[0] = 0;\r
                                H2C_Parameter[1] = 1;  //ext switch type\r
@@ -1177,8 +1323,6 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                        else\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
-               \r
                                //tell firmware "antenna inverse"\r
                                H2C_Parameter[0] = 1;\r
                                H2C_Parameter[1] = 1;  //ext switch type\r
@@ -1186,12 +1330,7 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                }\r
                \r
-               // fixed internal switch first\r
-               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
-               else\r
-                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT\r
-\r
+               \r
                // ext switch setting\r
                switch(antPosType)\r
                {\r
@@ -1227,9 +1366,11 @@ halbtc8723b1ant_SetAntPath(
                        u4Tmp &=~BIT24;       \r
                        pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
 \r
+                       //Fix Ext switch Main->S1, Aux->S0\r
+                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); \r
+\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Main Ant to  WiFi for IPS case 0x4c[23]=1\r
        \r
                                //tell firmware "no antenna inverse"\r
                                H2C_Parameter[0] = 0;\r
@@ -1238,7 +1379,6 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                        else\r
                        {\r
-                               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
                \r
                                //tell firmware "antenna inverse"\r
                                H2C_Parameter[0] = 1;\r
@@ -1247,38 +1387,116 @@ halbtc8723b1ant_SetAntPath(
                        }\r
                }\r
        \r
-               // fixed external switch first\r
-               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); //Main->WiFi, Aux->BT\r
-               else\r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); //Main->BT, Aux->WiFi\r
 \r
                // internal switch setting\r
                switch(antPosType)\r
                {\r
                        case BTC_ANT_PATH_WIFI:\r
                                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x0);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
                                else\r
-                                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x280);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
                                break;\r
                        case BTC_ANT_PATH_BT:\r
                                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x280);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
                                else\r
-                                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x0);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
                                break;\r
                        default:\r
                        case BTC_ANT_PATH_PTA:\r
                                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
-                                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x200);                                   \r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x200);                                   \r
                                else\r
-                                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x80);\r
+                                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x80);\r
                                break;\r
                }\r
        }\r
 }\r
 \r
+VOID\r
+halbtc8723b1ant_SetAntPathDCut(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bAntennaAux,    //For 1-Ant--> 1: Antenna at S0, 0: Antenna at S1. Set 0 for 2-Ant\r
+       IN      BOOLEAN                         bExtSwitch,             // 1: Ext Switch (SPDT) exist on module, 0: no Ext Switch (SPDT) exist on module\r
+       IN      BOOLEAN                         bTwoAntenna,    // 1: 2-Antenna, 0:1-Antenna\r
+       IN      u1Byte                          antennaPos,             //Set Antenna Pos, For 1-Ant: BTC_ANT_PATH_WIFI, BTC_ANT_PATH_BT, BTC_ANT_PATH_PTA, For 2-Ant:BTC_ANT_WIFI_AT_MAIN, BTC_ANT_WIFI_AT_Aux\r
+       IN      u1Byte                          wifiState               //BTC_WIFI_STAT_INIT, BTC_WIFI_STAT_IQK, BTC_WIFI_STAT_NORMAL_OFF, BTC_WIFI_STAT_MP_OFF, BTC_WIFI_STAT_NORMAL, BTC_WIFI_STAT_ANT_DIV\r
+       )\r
+{\r
+       u1Byte  dataLen=5;\r
+       u1Byte  buf[6] = {0};\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT Ant, bAntennaAux/bExtSwitch/bTwoAntenna/antennaPos/wifiState=%d/%d/%d/%d/%d\n",\r
+               bAntennaAux, bExtSwitch, bTwoAntenna, antennaPos, wifiState));\r
+\r
+       buf[0] = dataLen; \r
+       \r
+       if(bAntennaAux)\r
+               buf[1] = 0x1;\r
+       \r
+       if(bExtSwitch)\r
+               buf[2] = 0x1;                   \r
+       \r
+       if(bTwoAntenna)\r
+               buf[3] = 0x1;\r
+\r
+       buf[4] = antennaPos;\r
+\r
+       buf[5] = wifiState;\r
+       \r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_8723B_ANT, (PVOID)&buf[0]);    \r
+}\r
+\r
+VOID\r
+halbtc8723b1ant_SetFwPstdma(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  byte1,\r
+       IN      u1Byte                  byte2,\r
+       IN      u1Byte                  byte3,\r
+       IN      u1Byte                  byte4,\r
+       IN      u1Byte                  byte5\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[5] ={0};\r
+       u1Byte                  realByte1=byte1, realByte5=byte5;\r
+       BOOLEAN                 bApEnable=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
+\r
+       if(bApEnable)\r
+       {\r
+               if(byte1&BIT4 && !(byte1&BIT5))\r
+               {                       \r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));\r
+                       realByte1 &= ~BIT4;\r
+                       realByte1 |= BIT5;\r
+\r
+                       realByte5 |= BIT5;\r
+                       realByte5 &= ~BIT6;\r
+               }\r
+       }\r
+\r
+       H2C_Parameter[0] = realByte1;   \r
+       H2C_Parameter[1] = byte2;       \r
+       H2C_Parameter[2] = byte3;\r
+       H2C_Parameter[3] = byte4;\r
+       H2C_Parameter[4] = realByte5;\r
+\r
+       pCoexDm->psTdmaPara[0] = realByte1;\r
+       pCoexDm->psTdmaPara[1] = byte2;\r
+       pCoexDm->psTdmaPara[2] = byte3;\r
+       pCoexDm->psTdmaPara[3] = byte4;\r
+       pCoexDm->psTdmaPara[4] = realByte5;\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", \r
+               H2C_Parameter[0], \r
+               H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\r
+}\r
+\r
+\r
 VOID\r
 halbtc8723b1ant_PsTdma(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1288,8 +1506,11 @@ halbtc8723b1ant_PsTdma(
        )\r
 {\r
        PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\r
-       BOOLEAN                 bTurnOnByCnt=FALSE, bWifiBusy=FALSE;\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       BOOLEAN                 bTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;\r
        u1Byte                  psTdmaTypeByCnt=0, rssiAdjustVal=0;\r
+       u1Byte                  psTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val =  0x10;\r
+       s1Byte                  nWiFiDurationAdjust = 0x0;\r
        //u4Byte                        fwVer=0;\r
 \r
        //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", \r
@@ -1299,58 +1520,69 @@ halbtc8723b1ant_PsTdma(
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);      \r
 \r
-       if(!bForceExec)\r
+       if (pCoexDm->bCurPsTdmaOn)\r
        {\r
-               if (pCoexDm->bCurPsTdmaOn)\r
-               {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
                                pCoexDm->curPsTdma));\r
-               }\r
-               else\r
-               {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
                                pCoexDm->curPsTdma));\r
-               }\r
+       }\r
                        \r
-\r
+       if(!bForceExec)\r
+       {       \r
                if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\r
                        (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\r
                        return;\r
        }\r
+\r
+       if (pCoexSta->nScanAPNum <= 5)\r
+               nWiFiDurationAdjust = 5;\r
+       else if  (pCoexSta->nScanAPNum >= 40)\r
+               nWiFiDurationAdjust = -15;      \r
+       else if  (pCoexSta->nScanAPNum >= 20)\r
+               nWiFiDurationAdjust = -10;      \r
+       \r
+       if (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11\r
+       {\r
+               psTdmaByte0Val = 0x61;  //no null-pkt\r
+               psTdmaByte3Val = 0x11; // no tx-pause at BT-slot\r
+               psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle\r
+       }\r
+       \r
+       \r
        if(bTurnOn)\r
        {\r
+               if (pBtLinkInfo->bSlaveRole == TRUE)\r
+               {\r
+                       psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\r
+               }\r
+                \r
+               \r
                switch(type)\r
                {\r
                        default:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, 0x50);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);\r
                                break;\r
                        case 1:\r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x51);\r
-                               \r
-                               rssiAdjustVal = 11;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);                                                                \r
                                break;\r
                        case 2:\r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x51);\r
-                               rssiAdjustVal = 14;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);                                                        \r
                                break;\r
                        case 3:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10);\r
                                break;\r
                        case 4:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\r
-                               rssiAdjustVal = 17;\r
                                break;\r
                        case 5:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);\r
                                break;\r
                        case 6:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 7:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\r
@@ -1359,44 +1591,34 @@ halbtc8723b1ant_PsTdma(
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\r
                                break;\r
                        case 9: \r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);\r
-                               rssiAdjustVal = 18;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);                             \r
                                break;\r
                        case 10:        \r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\r
                                break;\r
                        case 11:        \r
-                               //if(bWifiBusy)\r
-                                       halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\r
-                               //else\r
-                               //      halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\r
-                               rssiAdjustVal = 20;\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);                    \r
                                break;\r
                        case 12:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\r
                                break;\r
                        case 13:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x15, 0x0, 0x50);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x10);\r
                                break;\r
                        case 14:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val);\r
                                break;\r
                        case 15:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\r
                                break;\r
                        case 16:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\r
-                               rssiAdjustVal = 18;\r
                                break;\r
                        case 18:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\r
-                               rssiAdjustVal = 14;\r
                                break;                  \r
                        case 20:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10);\r
                                break;\r
                        case 21:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\r
@@ -1406,23 +1628,18 @@ halbtc8723b1ant_PsTdma(
                                break;\r
                        case 23:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 24:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 25:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 26:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 27:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\r
-                               rssiAdjustVal = 22;\r
                                break;\r
                        case 28:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\r
@@ -1431,13 +1648,13 @@ halbtc8723b1ant_PsTdma(
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\r
                                break;\r
                        case 30:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x3, 0x10, 0x50);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\r
                                break;\r
                        case 31:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\r
                                break;\r
                        case 32:\r
-                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0xa, 0x3, 0x10, 0x0);\r
+                               halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 33:\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);\r
@@ -1459,22 +1676,24 @@ halbtc8723b1ant_PsTdma(
        }\r
        else\r
        {               \r
-               //pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);      // [31:16]=fw ver, [15:0]=fw sub ver\r
 \r
                // disable PS tdma\r
                switch(type)\r
                {\r
                        case 8: //PTA Control\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\r
+                               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_PTA, BTC_WIFI_STAT_NORMAL);\r
                                halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\r
                                break;\r
                        case 0:\r
                        default:  //Software control, Antenna at BT side\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\r
+                               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL);\r
                                halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\r
                                break;\r
                        case 9:   //Software control, Antenna at WiFi side\r
                                halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\r
+                               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_NORMAL);\r
                                halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);\r
                                break;                  \r
                }\r
@@ -1514,7 +1733,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n"));\r
                \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1523,7 +1742,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1532,7 +1751,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1541,7 +1760,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
                bCommon = TRUE;\r
        }\r
@@ -1550,7 +1769,7 @@ halbtc8723b1ant_IsCommonAction(
        {\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n"));\r
 \r
-               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
                \r
                bCommon = TRUE;\r
        }\r
@@ -1636,6 +1855,10 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl(
                //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));\r
                //BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", \r
                //      up, dn, m, n, WaitCount));\r
+\r
+               if ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\r
+                       retryCount++;   \r
+               \r
                result = 0;\r
                WaitCount++; \r
                  \r
@@ -1827,6 +2050,7 @@ halbtc8723b1ant_PowerSaveState(
                        bLowPwrDisable = FALSE;\r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = FALSE;\r
                        break;\r
                case BTC_PS_LPS_ON:\r
                        halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\r
@@ -1836,10 +2060,12 @@ halbtc8723b1ant_PowerSaveState(
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
                        // power save must executed before psTdma.                      \r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = TRUE;\r
                        break;\r
                case BTC_PS_LPS_OFF:\r
                        halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\r
+                       pCoexSta->bForceLpsOn = FALSE;\r
                        break;\r
                default:\r
                        break;\r
@@ -1924,6 +2150,8 @@ halbtc8723b1ant_MonitorBtEnableDisable(
 //=============================================\r
 \r
 // SCO only or SCO+PAN(HS)\r
+\r
+/*\r
 VOID\r
 halbtc8723b1ant_ActionSco(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -2009,6 +2237,8 @@ halbtc8723b1ant_ActionHidA2dp(
        halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\r
 }\r
 \r
+*/\r
+\r
 //=============================================\r
 //\r
 //     Non-Software Coex Mechanism start\r
@@ -2040,33 +2270,41 @@ halbtc8723b1ant_ActionBtInquiry(
        )\r
 {      \r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
-       BOOLEAN                 bWifiConnected=FALSE, bApEnable=FALSE;\r
+       BOOLEAN                 bWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\r
 \r
-       if(!bWifiConnected)\r
+       if ( (!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask) )\r
        {\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);          \r
        }\r
-       else if( (pBtLinkInfo->bScoExist) ||\r
-                       (pBtLinkInfo->bHidOnly) )\r
+       else if( (pBtLinkInfo->bScoExist) ||    (pBtLinkInfo->bHidExist) ||     (pBtLinkInfo->bA2dpExist)  )\r
        {\r
-               // SCO/HID-only busy\r
+               // SCO/HID/A2DP busy\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) )\r
+       {\r
+               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);               \r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);              \r
+               \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        else\r
        {\r
-               if(bApEnable)\r
-                       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               else\r
-                       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 30);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);          \r
        }\r
 }\r
 \r
@@ -2087,35 +2325,13 @@ halbtc8723b1ant_ActionBtScoHidOnlyBusy(
        if(pBtLinkInfo->bScoExist)\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\r
        }\r
        else //HID\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\r
        }\r
-/*\r
-       if(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist)\r
-       {\r
-               if(bWifiConnected)\r
-               {\r
-                       wifiRssiState = halbtc8723b1ant_WifiRssiState(pBtCoexist, 0, 2, 30, 0);\r
-                       if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                               (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 2, 1, 1, 1);\r
-                       }\r
-                       else\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
-               }\r
-       }\r
-*/\r
 }\r
 \r
 VOID\r
@@ -2129,6 +2345,15 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
        btRssiState = halbtc8723b1ant_BtRssiState(2, 28, 0);    \r
 \r
+       if ( (pCoexSta->lowPriorityRx >= 1000)  && (pCoexSta->lowPriorityRx != 65535) )\r
+       {\r
+               pBtLinkInfo->bSlaveRole = TRUE;\r
+       }\r
+       else\r
+       {\r
+               pBtLinkInfo->bSlaveRole = FALSE;\r
+       }\r
+\r
        if(pBtLinkInfo->bHidOnly)  //HID\r
        {\r
                halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\r
@@ -2139,56 +2364,47 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
        {\r
                if(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\r
                {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                        pCoexDm->bAutoTdmaAdjust = FALSE;\r
                }\r
-               else if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )     \r
+               else\r
                {\r
                        halbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else //for low BT RSSI\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
+#if 0\r
+                       if (pCoexSta->bCCKLock)\r
+                               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\r
+                       else\r
+#endif                         \r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+                       pCoexDm->bAutoTdmaAdjust = TRUE;\r
                }\r
        }\r
        else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\r
        {\r
-               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )     \r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
-                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
-               }\r
-               else //for low BT RSSI\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
-                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
-               }                       \r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+               pCoexDm->bAutoTdmaAdjust = FALSE;\r
 \r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)                 \r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }\r
        else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\r
                       (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }\r
        else\r
        {               \r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               //BT no-profile busy (0x9)\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);      \r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }       \r
 }\r
@@ -2202,7 +2418,7 @@ halbtc8723b1ant_ActionWifiNotConnected(
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
 }\r
 \r
@@ -2218,20 +2434,20 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
        // tdma and coex table\r
        if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
-               {\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+               {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else if(pBtLinkInfo->bPanOnly)\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
-               }\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
                else\r
                {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);                  \r
                }\r
        }\r
        else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
@@ -2242,9 +2458,6 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
        }\r
        else\r
        {\r
-               //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-\r
                //Bryant Add\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
@@ -2260,22 +2473,22 @@ halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(
        \r
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
-\r
-       if( (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ||(pBtLinkInfo->bScoExist) \r
-                           || (pBtLinkInfo->bHidOnly) || (pBtLinkInfo->bA2dpOnly) || (pBtLinkInfo->bPanOnly)  )\r
+       // tdma and coex table\r
+       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\r
        {\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
-               //delay_ms(50);\r
-               //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10);\r
-               //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
        }\r
-       else\r
+       else if (pBtLinkInfo->bPanExist)                        \r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
-\r
 }\r
 \r
 VOID\r
@@ -2290,20 +2503,20 @@ halbtc8723b1ant_ActionWifiConnectedScan(
        // tdma and coex table\r
        if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
-               {\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+               {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else if(pBtLinkInfo->bPanOnly)\r
-               {\r
-                       halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
-               }\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
                else\r
                {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        }\r
        else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
@@ -2314,9 +2527,6 @@ halbtc8723b1ant_ActionWifiConnectedScan(
        }\r
        else\r
        {\r
-               //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-\r
                //Bryant Add\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
@@ -2328,28 +2538,25 @@ halbtc8723b1ant_ActionWifiConnectedSpecialPacket(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       BOOLEAN                 bHsConnecting=FALSE;\r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_CONNECTING, &bHsConnecting);\r
-\r
-\r
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       if( (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ||(pBtLinkInfo->bScoExist) \r
-                           || (pBtLinkInfo->bHidOnly) || (pBtLinkInfo->bA2dpOnly) || (pBtLinkInfo->bPanOnly)  )\r
+       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) )\r
        {\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
-               //delay_ms(50);\r
-               //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10);\r
-               //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
        }\r
-       else\r
+       else if(pBtLinkInfo->bPanExist)\r
        {\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else\r
+       {\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
 \r
@@ -2388,11 +2595,28 @@ halbtc8723b1ant_ActionWifiConnected(
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       \r
        // power save state\r
        if(!bApEnable && BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\r
        {\r
-               if(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly)      //A2DP\r
+               if(pBtCoexist->btLinkInfo.bA2dpOnly)    //A2DP\r
+                       {                       \r
+                       if(!bWifiBusy)\r
+                               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);                               \r
+                       else //busy\r
+                       {\r
+                               if  (pCoexSta->nScanAPNum >= BT_8723B_1ANT_WIFI_NOISY_THRESH)  //no force LPS, no PS-TDMA, use pure TDMA\r
+                               {\r
                        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+                               }\r
+                               else\r
+                               {\r
+                                       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);                                   \r
+                               }\r
+                       }\r
+               }\r
+               else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))\r
+                       halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                else\r
                        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
        }\r
@@ -2416,7 +2640,11 @@ halbtc8723b1ant_ActionWifiConnected(
                else\r
                {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+                       \r
+                       if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\r
                        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+                       else\r
+                               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);           \r
                }\r
        }\r
        else\r
@@ -2435,7 +2663,11 @@ halbtc8723b1ant_ActionWifiConnected(
                else \r
                {\r
                        halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+                               \r
+                       if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\r
                        halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+                       else\r
+                               halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \r
                }\r
        }\r
 }\r
@@ -2460,43 +2692,43 @@ halbtc8723b1ant_RunSwCoexistMechanism(
                {\r
                        case BT_8723B_1ANT_COEX_ALGO_SCO:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n"));\r
-                               halbtc8723b1ant_ActionSco(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionSco(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_HID:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n"));\r
-                               halbtc8723b1ant_ActionHid(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionHid(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_A2DP:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n"));\r
-                               halbtc8723b1ant_ActionA2dp(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionA2dp(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n"));\r
-                               halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANEDR:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n"));\r
-                               halbtc8723b1ant_ActionPanEdr(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanEdr(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANHS:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n"));\r
-                               halbtc8723b1ant_ActionPanHs(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanHs(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n"));\r
-                               halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n"));\r
-                               halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n"));\r
-                               halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);\r
                                break;\r
                        case BT_8723B_1ANT_COEX_ALGO_HID_A2DP:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n"));\r
-                               halbtc8723b1ant_ActionHidA2dp(pBtCoexist);\r
+                               //halbtc8723b1ant_ActionHidA2dp(pBtCoexist);\r
                                break;\r
                        default:\r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n"));\r
@@ -2553,62 +2785,50 @@ halbtc8723b1ant_RunCoexistMechanism(
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
        numOfWifiLink = wifiLinkStatus>>16;\r
-       if(numOfWifiLink >= 2)\r
+       \r
+       if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\r
        {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) );\r
                halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
                halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+\r
+               if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) )\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex],  BT Is Inquirying \n") );   \r
+                       halbtc8723b1ant_ActionBtInquiry(pBtCoexist);\r
+               }\r
+               else\r
                halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);\r
+               \r
                return;\r
        }\r
 \r
-       if(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)\r
+       if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )\r
        {\r
-               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \r
+\r
+               if(pBtLinkInfo->bScoExist)\r
+                       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\r
+               else\r
+                       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\r
+\r
+               halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\r
+               halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\r
        }\r
        else\r
        {\r
-               if(bWifiConnected)\r
-               {\r
-                       wifiRssiState = halbtc8723b1ant_WifiRssiState(pBtCoexist, 1, 2, 30, 0);\r
-                       if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                               (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\r
-                       }\r
-                       else\r
-                       {\r
-                               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
-               }\r
+               halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
 \r
-       }\r
+               halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\r
 \r
-       if(pBtLinkInfo->bScoExist)\r
-       {\r
-               bBtCtrlAggBufSize = TRUE;\r
-               aggBufSize = 0x3;\r
-       }\r
-       else if(pBtLinkInfo->bHidExist)\r
-       {\r
-               bBtCtrlAggBufSize = TRUE;\r
-               aggBufSize = 0x5;\r
-       }\r
-       else if(pBtLinkInfo->bA2dpExist || pBtLinkInfo->bPanExist)\r
-       {\r
-               bBtCtrlAggBufSize = TRUE;\r
-               aggBufSize = 0x8;\r
+               halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
+               halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message\r
        }\r
-       halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
-\r
-       halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);\r
        \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex],  BT Is Inquirying \n") );           \r
                halbtc8723b1ant_ActionBtInquiry(pBtCoexist);\r
                return;\r
        }\r
@@ -2655,25 +2875,27 @@ halbtc8723b1ant_InitCoexDm(
        // sw all off\r
        halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\r
        \r
-       halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       //halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
+\r
+       pCoexSta->popEventCnt = 0;\r
 }\r
 \r
 VOID\r
 halbtc8723b1ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                         bBackUp\r
+       IN      BOOLEAN                         bBackUp,\r
+       IN      BOOLEAN                         bWifiOnly\r
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
        u4Byte                          u4Tmp=0;//, fwVer;\r
        u2Byte                          u2Tmp=0;\r
-       u1Byte                          u1Tmp=0;\r
+       u1Byte                          u1Tmp=0, u1Tmpa=0, u1Tmpb=0;\r
        u1Byte                          H2C_Parameter[2] ={0};\r
-       u4Byte                          cntBtCalChk=0;\r
 \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));\r
-\r
+#if 0//move to BTC_MEDIA_CONNECT\r
        if(bBackUp)\r
        {\r
                pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
@@ -2681,60 +2903,65 @@ halbtc8723b1ant_InitHwConfig(
                pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\r
                pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\r
        }\r
+#endif\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1);  //enable TBTT nterrupt\r
+\r
+       // 0x790[5:0]=0x5       \r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5);\r
        \r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\r
-       //pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\r
+       // Enable counter statistics\r
+       //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\r
 \r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
-       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\r
 \r
        //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
 \r
-       // BT calibration check\r
-       while(cntBtCalChk <= 20)\r
+       //Antenna config\r
+#if 1\r
+       if(bWifiOnly)\r
        {\r
-               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x49d);\r
-               cntBtCalChk++;\r
-               if(u4Tmp & BIT0)\r
-               {\r
-                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT calibration(cnt=%d) ###########\n", cntBtCalChk));\r
-                       delay_ms(50);\r
-               }\r
-               else\r
-               {\r
-                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT NOT calibration (cnt=%d)**********\n", cntBtCalChk));\r
-                       break;\r
-               }\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, TRUE, FALSE);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);\r
        }\r
+       else\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\r
+#endif \r
+\r
+\r
+#if 0\r
+       if(bWifiOnly)\r
+       {\r
+               halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_INIT);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);\r
+       }\r
+       else\r
+               halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_INIT);           \r
+#endif\r
 \r
-       // 0x790[5:0]=0x5\r
-       u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\r
-       u1Tmp &= 0xc0;\r
-       u1Tmp |= 0x5;\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\r
-       \r
-       // Enable counter statistics\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\r
-       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1); \r
 \r
-       //Antenna config\r
-       //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\r
-       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\r
 \r
        // PTA parameter\r
        halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
+       u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
+       u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",\r
+                       u4Tmp,  u1Tmpa, u1Tmpb));\r
 }\r
 \r
+/*\r
 VOID\r
 halbtc8723b1ant_WifiOffHwCfg(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
        // set wlan_act to low\r
-       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
+       //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
 }\r
+*/\r
 \r
 //============================================================\r
 // work around function start with wa_halbtc8723b1ant_\r
@@ -2743,11 +2970,77 @@ halbtc8723b1ant_WifiOffHwCfg(
 // extern function start with EXhalbtc8723b1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8723b1ant_InitHwConfig(\r
+EXhalbtc8723b1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE);\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u1Byte u1Tmp=0x0;\r
+       u2Byte u2Tmp=0x0;\r
+\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\r
+\r
+       // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\r
+       u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\r
+       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\r
+\r
+       // set GRAN_BT = 1\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\r
+       // set WLAN_ACT = 0\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);     \r
+\r
+       // \r
+       // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\r
+       // Local setting bit define\r
+       //      BIT0: "0" for no antenna inverse; "1" for antenna inverse \r
+       //      BIT1: "0" for internal switch; "1" for external switch\r
+       //      BIT2: "0" for one antenna; "1" for two antenna\r
+       // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\r
+       if(pBtCoexist->chipInterface == BTC_INTF_USB)\r
+       {\r
+               // fixed at S0 for USB interface\r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+\r
+               u1Tmp |= 0x1;   // antenna inverse\r
+               pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\r
+\r
+               pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
+       }\r
+       else\r
+       {\r
+               // for PCIE and SDIO interface, we check efuse 0xc3[6]\r
+               if(pBoardInfo->singleAntPath == 0)\r
+               {\r
+                       // set to S1\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
+                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\r
+               }\r
+               else if(pBoardInfo->singleAntPath == 1)\r
+               {\r
+                       // set to S0\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+                       u1Tmp |= 0x1;   // antenna inverse\r
+                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
+               }\r
+\r
+               if(pBtCoexist->chipInterface == BTC_INTF_PCI)\r
+               {       \r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\r
+               }\r
+               else if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\r
+               {\r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\r
+               }                       \r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\r
 }\r
 \r
 VOID\r
@@ -2776,12 +3069,13 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
        u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
        u2Byte                          u2Tmp[4];\r
        u4Byte                          u4Tmp[4];\r
-       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
+       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE, bWifiUnderBMode = FALSE;\r
        BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
        s4Byte                          wifiRssi=0, btHsRssi=0;\r
        u4Byte                          wifiBw, wifiTrafficDir, faOfdm, faCck, wifiLinkStatus;\r
-       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
+       u1Byte                          wifiDot11Chnl, wifiHsChnl, apNum;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
+       static u1Byte                   PopReportIn10s = 0;     \r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
@@ -2801,13 +3095,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\r
        CL_PRINTF(cliBuf);      \r
@@ -2837,24 +3124,26 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
-               wifiRssi, btHsRssi);\r
+               wifiRssi-100, btHsRssi-100);\r
        CL_PRINTF(cliBuf);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
-               bLink, bRoam, bScan);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %s", "Wifi bLink/ bRoam/ bScan/ bHi-Pri", \\r
+               bLink, bRoam, bScan,((pCoexSta->bWiFiIsHighPriTask)? "1":"0"));\r
        CL_PRINTF(cliBuf);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
+       \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s/ AP=%d/ %s ", "Wifi status", \\r
                (bWifiUnder5G? "5G":"2.4G"),\r
-               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
-               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+               ((bWifiUnderBMode)? "11b": ((BTC_WIFI_BW_LEGACY==wifiBw)? "11bg": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20")))),\r
+               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")), pCoexSta->nScanAPNum,( pCoexSta->bCCKLock)? "Lock":"noLock");\r
        CL_PRINTF(cliBuf);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
@@ -2864,17 +3153,36 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );\r
        CL_PRINTF(cliBuf);\r
        \r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
+\r
+       PopReportIn10s++;\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ", "BT [status/ rssi/ retryCnt/ popCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
-               pCoexSta->btRssi, pCoexSta->btRetryCnt);\r
+               pCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt);\r
        CL_PRINTF(cliBuf);\r
        \r
+       if (PopReportIn10s >= 5)\r
+       {\r
+               pCoexSta->popEventCnt = 0;      \r
+               PopReportIn10s = 0;\r
+       }\r
+       \r
                                \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \\r
                pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\r
        CL_PRINTF(cliBuf);\r
+\r
+       if (pStackInfo->bProfileNotified)\r
+       {\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);      \r
+       }\r
+       else\r
+       {\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Role", \\r
+               (pBtLinkInfo->bSlaveRole )? "Slave":"Master");\r
+               CL_PRINTF(cliBuf);      \r
+       }       \r
+\r
 \r
        btInfoExt = pCoexSta->btInfoExt;\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \\r
@@ -2930,13 +3238,19 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                        pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\r
                CL_PRINTF(cliBuf);\r
                \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Coex Table Type", \\r
+                       pCoexSta->nCoexTableType);\r
+               CL_PRINTF(cliBuf);\r
+               \r
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "IgnWlanAct", \\r
                        pCoexDm->bCurIgnoreWlanAct);\r
                CL_PRINTF(cliBuf);\r
        \r
+               /*\r
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \\r
                        pCoexDm->errorCondition);\r
                CL_PRINTF(cliBuf);\r
+               */\r
        }\r
 \r
        // Hw setting           \r
@@ -2964,9 +3278,10 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
 \r
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
        u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
-       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x765", \\r
-               u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), u1Tmp[1]);\r
+       u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x764);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x764 / 0x76e", \\r
+               u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), (u4Tmp[1] & 0xffff), u1Tmp[1]);\r
        CL_PRINTF(cliBuf);\r
 \r
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);\r
@@ -3012,6 +3327,15 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                u4Tmp[0]&0xffff, faOfdm, faCck);\r
        CL_PRINTF(cliBuf);\r
 \r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_OK CCK/11g/11n/11n-Agg", \\r
+               pCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_Err CCK/11g/11n/11n-Agg", \\r
+               pCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\r
+       CL_PRINTF(cliBuf);      \r
+\r
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\r
        u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\r
        u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\r
@@ -3026,7 +3350,7 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
                pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
        CL_PRINTF(cliBuf);\r
 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 1)\r
-       halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
+       //halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
 #endif\r
        pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
 }\r
@@ -3047,19 +3371,18 @@ EXhalbtc8723b1ant_IpsNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));\r
                pCoexSta->bUnderIps = TRUE;\r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+               \r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
-               halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);   \r
+               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
        }\r
        else if(BTC_IPS_LEAVE == type)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
                pCoexSta->bUnderIps = FALSE;\r
-               //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\r
-               //halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\r
 \r
-               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
                halbtc8723b1ant_InitCoexDm(pBtCoexist);\r
                halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3098,9 +3421,36 @@ EXhalbtc8723b1ant_ScanNotify(
        BOOLEAN bBtCtrlAggBufSize=FALSE;\r
        u1Byte  aggBufSize=5;\r
 \r
+       u1Byte u1Tmpa, u1Tmpb;\r
+       u4Byte u4Tmp;\r
+\r
        if(pBtCoexist->bManualControl ||\r
-               pBtCoexist->bStopCoexDm ||\r
-               pBtCoexist->btInfo.bBtDisabled )\r
+               pBtCoexist->bStopCoexDm )\r
+               return;\r
+\r
+       if(BTC_SCAN_START == type)\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\r
+               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
+               u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\r
+               u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\r
+          \r
+          \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",\r
+                       u4Tmp,  u1Tmpa, u1Tmpb));\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);              \r
+       }\r
+\r
+       if(pBtCoexist->btInfo.bBtDisabled)\r
                return;\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
@@ -3131,7 +3481,7 @@ EXhalbtc8723b1ant_ScanNotify(
 \r
        if(BTC_SCAN_START == type)\r
        {       \r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
                if(!bWifiConnected)     // non-connected scan\r
                {\r
                        halbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist);\r
@@ -3143,7 +3493,7 @@ EXhalbtc8723b1ant_ScanNotify(
        }\r
        else if(BTC_SCAN_FINISH == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
                if(!bWifiConnected)     // non-connected scan\r
                {\r
                        halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);\r
@@ -3172,6 +3522,19 @@ EXhalbtc8723b1ant_ConnectNotify(
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
+       if(BTC_ASSOCIATE_START == type)\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));        \r
+                pCoexDm->nArpCnt = 0;\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));       \r
+               //pCoexDm->nArpCnt = 0;\r
+       }\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
        numOfWifiLink = wifiLinkStatus>>16;\r
        if(numOfWifiLink >= 2)\r
@@ -3196,12 +3559,12 @@ EXhalbtc8723b1ant_ConnectNotify(
 \r
        if(BTC_ASSOCIATE_START == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));                \r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));              \r
                halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\r
        }\r
        else if(BTC_ASSOCIATE_FINISH == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
                \r
                pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
                if(!bWifiConnected) // non-connected scan\r
@@ -3224,6 +3587,7 @@ EXhalbtc8723b1ant_MediaStatusNotify(
        u1Byte                  H2C_Parameter[3] ={0};\r
        u4Byte                  wifiBw;\r
        u1Byte                  wifiCentralChnl;\r
+       BOOLEAN                 bWifiUnderBMode = FALSE;\r
 \r
        if(pBtCoexist->bManualControl ||\r
                pBtCoexist->bStopCoexDm ||\r
@@ -3233,10 +3597,33 @@ EXhalbtc8723b1ant_MediaStatusNotify(
        if(BTC_MEDIA_CONNECT == type)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));\r
+\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\r
+\r
+               //Set CCK Tx/Rx high Pri except 11b mode\r
+               if (bWifiUnderBMode)\r
+               {\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx\r
+               }\r
+               else\r
+               {\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\r
+               }\r
+               \r
+               pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
+               pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\r
+               pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\r
+               pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\r
        }\r
        else\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));\r
+               pCoexDm->nArpCnt = 0;\r
+\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\r
        }\r
 \r
        // only 2.4G we need to inform bt the chnl mask\r
@@ -3281,6 +3668,38 @@ EXhalbtc8723b1ant_SpecialPacketNotify(
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
+       if( BTC_PACKET_DHCP == type || \r
+               BTC_PACKET_EAPOL == type ||\r
+               BTC_PACKET_ARP == type )\r
+       {\r
+               if (BTC_PACKET_ARP == type)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n"));            \r
+\r
+                       pCoexDm->nArpCnt++;\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt));\r
+                       \r
+                       if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \r
+                       {\r
+                               pCoexSta->bWiFiIsHighPriTask = FALSE;                                   \r
+                       }                       \r
+                       else\r
+                       {\r
+                               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n"));          \r
+               }\r
+       } \r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet [Type = %d] notify\n", type));\r
+       }\r
+\r
        pCoexSta->specialPktPeriodCnt = 0;\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
@@ -3306,9 +3725,9 @@ EXhalbtc8723b1ant_SpecialPacketNotify(
        }\r
 \r
        if( BTC_PACKET_DHCP == type ||\r
-               BTC_PACKET_EAPOL == type )\r
-       {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));\r
+               BTC_PACKET_EAPOL == type || \r
+               ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )\r
+               {\r
                halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\r
        }\r
 }\r
@@ -3354,17 +3773,28 @@ EXhalbtc8723b1ant_BtInfoNotify(
                pCoexSta->btRetryCnt =  // [3:0]\r
                        pCoexSta->btInfoC2h[rspSource][2]&0xf;\r
 \r
+               if (pCoexSta->btRetryCnt >= 1)\r
+                       pCoexSta->popEventCnt++;\r
+\r
+               if (pCoexSta->btInfoC2h[rspSource][2]&0x20)\r
+                       pCoexSta->bC2hBtPage = TRUE;\r
+               else\r
+                       pCoexSta->bC2hBtPage = FALSE;                   \r
+\r
                pCoexSta->btRssi =\r
-                       pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
+                       pCoexSta->btInfoC2h[rspSource][3]*2-90;\r
+                       //pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
 \r
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
                \r
-               if (!(pCoexSta->btInfoC2h[rspSource][2] & 0x40))\r
+               pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\r
+               if(!pCoexSta->bBtTxRxMask)\r
                {\r
-                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch GNT_BT */                         \r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch GNT_BT since BT RF REG 0x3C != 0x15\n"));\r
-                       pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15);\r
+                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */                            \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"));\r
+                       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\r
                }\r
                \r
                // Here we need to resend some wifi info to BT\r
@@ -3445,6 +3875,8 @@ EXhalbtc8723b1ant_BtInfoNotify(
 \r
        halbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist);\r
        \r
+       btInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\r
+       \r
        if(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION))\r
        {\r
                pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\r
@@ -3485,6 +3917,33 @@ EXhalbtc8723b1ant_BtInfoNotify(
        halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\r
 }\r
 \r
+VOID\r
+EXhalbtc8723b1ant_RfStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                                  type\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF Status notify\n"));\r
+\r
+       if(BTC_RF_ON == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned ON!!\n"));\r
+               pBtCoexist->bStopCoexDm = FALSE;\r
+       }\r
+       else if(BTC_RF_OFF == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned OFF!!\n"));\r
+               \r
+               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+               \r
+               halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+               pBtCoexist->bStopCoexDm = TRUE;\r
+       }\r
+}\r
+\r
 VOID\r
 EXhalbtc8723b1ant_HaltNotify(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
@@ -3494,16 +3953,16 @@ EXhalbtc8723b1ant_HaltNotify(
        \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
-       pBtCoexist->bStopCoexDm = TRUE;\r
-\r
-       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
-       halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);\r
-       halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
-\r
        halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
        halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\r
+       halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+       //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+       halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
 \r
        EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+\r
+       pBtCoexist->bStopCoexDm = TRUE; \r
 }\r
 \r
 VOID\r
@@ -3517,24 +3976,20 @@ EXhalbtc8723b1ant_PnpNotify(
        if(BTC_WIFI_PNP_SLEEP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
-               pBtCoexist->bStopCoexDm = TRUE;\r
-               /*\r
-               halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
-               halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
-               */\r
 \r
-               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
                halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
                halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
-               halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);\r
+               halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+               //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+               pBtCoexist->bStopCoexDm = TRUE;\r
        }\r
        else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
                pBtCoexist->bStopCoexDm = FALSE;\r
-               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
                halbtc8723b1ant_InitCoexDm(pBtCoexist);\r
                halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3547,9 +4002,9 @@ EXhalbtc8723b1ant_CoexDmReset(
 {\r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], *****************Coex DM Reset*****************\n"));\r
 \r
-       halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);\r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\r
+       halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
+       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
+       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\r
        halbtc8723b1ant_InitCoexDm(pBtCoexist);\r
 }\r
 \r
@@ -3582,16 +4037,16 @@ EXhalbtc8723b1ant_Periodical(
 \r
 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)\r
        halbtc8723b1ant_QueryBtInfo(pBtCoexist);\r
-       halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
        halbtc8723b1ant_MonitorBtEnableDisable(pBtCoexist);\r
 #else\r
+       halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\r
+       halbtc8723b1ant_MonitorWiFiCtr(pBtCoexist);\r
+\r
        if( halbtc8723b1ant_IsWifiStatusChanged(pBtCoexist) ||\r
                pCoexDm->bAutoTdmaAdjust )\r
        {\r
-               //if(pCoexSta->specialPktPeriodCnt > 2)\r
-               //{\r
-                       halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);        \r
-               //}\r
+\r
+               halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);        \r
        }\r
 \r
        pCoexSta->specialPktPeriodCnt++;\r
index cb4b89b2aa0701273c162cbf50ed1b2a1304bf02..9ebec684988e187af3aca5ce0e3083b67ce85894 100755 (executable)
@@ -17,6 +17,8 @@
 \r
 #define        BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT             2\r
 \r
+#define  BT_8723B_1ANT_WIFI_NOISY_THRESH                                                               30   //max: 255\r
+\r
 typedef enum _BT_INFO_SRC_8723B_1ANT{\r
        BT_INFO_SRC_8723B_1ANT_WIFI_FW                  = 0x0,\r
        BT_INFO_SRC_8723B_1ANT_BT_RSP                           = 0x1,\r
@@ -109,6 +111,7 @@ typedef struct _COEX_DM_8723B_1ANT{
        u1Byte          curRetryLimitType;\r
        u1Byte          preAmpduTimeType;\r
        u1Byte          curAmpduTimeType;\r
+       u4Byte          nArpCnt;\r
 \r
        u1Byte          errorCondition;\r
 } COEX_DM_8723B_1ANT, *PCOEX_DM_8723B_1ANT;\r
@@ -127,25 +130,51 @@ typedef struct _COEX_STA_8723B_1ANT{
        u4Byte                                  highPriorityRx;\r
        u4Byte                                  lowPriorityTx;\r
        u4Byte                                  lowPriorityRx;\r
-       u1Byte                                  btRssi;\r
+       s1Byte                                  btRssi;\r
+       BOOLEAN                                 bBtTxRxMask;\r
        u1Byte                                  preBtRssiState;\r
        u1Byte                                  preWifiRssiState[4];\r
        BOOLEAN                                 bC2hBtInfoReqSent;\r
        u1Byte                                  btInfoC2h[BT_INFO_SRC_8723B_1ANT_MAX][10];\r
        u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8723B_1ANT_MAX];\r
        BOOLEAN                                 bC2hBtInquiryPage;\r
+       BOOLEAN                                 bC2hBtPage;                             //Add for win8.1 page out issue\r
+       BOOLEAN                                 bWiFiIsHighPriTask;             //Add for win8.1 page out issue\r
        u1Byte                                  btRetryCnt;\r
        u1Byte                                  btInfoExt;\r
+       u4Byte                                  popEventCnt;\r
+       u1Byte                                  nScanAPNum;\r
+\r
+       u4Byte                                  nCRCOK_CCK;\r
+       u4Byte                                  nCRCOK_11g;\r
+       u4Byte                                  nCRCOK_11n;\r
+       u4Byte                                  nCRCOK_11nAgg;\r
+       \r
+       u4Byte                                  nCRCErr_CCK;\r
+       u4Byte                                  nCRCErr_11g;\r
+       u4Byte                                  nCRCErr_11n;\r
+       u4Byte                                  nCRCErr_11nAgg; \r
+\r
+       BOOLEAN                                 bCCKLock;\r
+       BOOLEAN                                 bPreCCKLock;\r
+       u1Byte                                  nCoexTableType;\r
+\r
+       BOOLEAN                                 bForceLpsOn;\r
 }COEX_STA_8723B_1ANT, *PCOEX_STA_8723B_1ANT;\r
 \r
 //===========================================\r
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8723b1ant_InitHwConfig(\r
+EXhalbtc8723b1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723b1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8723b1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -186,6 +215,11 @@ EXhalbtc8723b1ant_BtInfoNotify(
        IN      u1Byte                  length\r
        );\r
 VOID\r
+EXhalbtc8723b1ant_RfStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                                  type\r
+       );\r
+VOID\r
 EXhalbtc8723b1ant_HaltNotify(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
index 358f20839a21cee782b65560401f9d3573015304..34795bd91d4ffc957474d592bc26b7f41e928325 100755 (executable)
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b2Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8723b2Ant=20131113;\r
-u4Byte GLCoexVer8723b2Ant=0x3f;\r
+u4Byte GLCoexVerDate8723b2Ant=20131211;\r
+u4Byte GLCoexVer8723b2Ant=0x40;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -303,6 +303,31 @@ halbtc8723b2ant_MonitorBtEnableDisable(
        }\r
 }\r
 \r
+VOID\r
+halbtc8723b2ant_LimitedRx(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bForceExec,\r
+       IN      BOOLEAN                         bRejApAggPkt,\r
+       IN      BOOLEAN                         bBtCtrlAggBufSize,\r
+       IN      u1Byte                          aggBufSize\r
+       )\r
+{\r
+       BOOLEAN bRejectRxAgg=bRejApAggPkt;\r
+       BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize;\r
+       u1Byte  rxAggSize=aggBufSize;\r
+\r
+       //============================================\r
+       //      Rx Aggregation related setting\r
+       //============================================\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\r
+       // decide BT control aggregation buf size or not\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\r
+       // aggregation buf size, only work when BT control Rx aggregation size.\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\r
+       // real update aggregation setting\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\r
+}\r
+\r
 VOID\r
 halbtc8723b2ant_MonitorBtCtr(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -685,50 +710,6 @@ halbtc8723b2ant_ActionAlgorithm(
        return algorithm;\r
 }\r
 \r
-BOOLEAN\r
-halbtc8723b2ant_NeedToDecBtPwr(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       )\r
-{\r
-       BOOLEAN         bRet=FALSE;\r
-       BOOLEAN         bBtHsOn=FALSE, bWifiConnected=FALSE;\r
-       s4Byte          btHsRssi=0;\r
-       u1Byte          btRssiState;\r
-\r
-       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\r
-               return FALSE;\r
-       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))\r
-               return FALSE;\r
-       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\r
-               return FALSE;\r
-\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
-\r
-       if(bWifiConnected)\r
-       {\r
-               if(bBtHsOn)\r
-               {\r
-                       if(btHsRssi > 37)\r
-                       {\r
-                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));\r
-                               bRet = TRUE;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
-                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-                       {\r
-               \r
-                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));\r
-                               bRet = TRUE;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       return bRet;\r
-}\r
-\r
 VOID\r
 halbtc8723b2ant_SetFwDacSwingLevel(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -750,20 +731,15 @@ halbtc8723b2ant_SetFwDacSwingLevel(
 VOID\r
 halbtc8723b2ant_SetFwDecBtPwr(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bDecBtPwr\r
+       IN      u1Byte                          decBtPwrLvl\r
        )\r
 {\r
        u1Byte                  H2C_Parameter[1] ={0};\r
        \r
-       H2C_Parameter[0] = 0;\r
+       H2C_Parameter[0] = decBtPwrLvl;\r
 \r
-       if(bDecBtPwr)\r
-       {\r
-               H2C_Parameter[0] |= BIT1;\r
-       }\r
-\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", \r
-               (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n", \r
+               decBtPwrLvl, H2C_Parameter[0]));\r
 \r
        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);    \r
 }\r
@@ -772,24 +748,24 @@ VOID
 halbtc8723b2ant_DecBtPwr(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      BOOLEAN                 bForceExec,\r
-       IN      BOOLEAN                 bDecBtPwr\r
+       IN      u1Byte                          decBtPwrLvl\r
        )\r
 {\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",  \r
-               (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF")));\r
-       pCoexDm->bCurDecBtPwr = bDecBtPwr;\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n",  \r
+               (bForceExec? "force to":""), decBtPwrLvl));\r
+       pCoexDm->curBtDecPwrLvl = decBtPwrLvl;\r
 \r
        if(!bForceExec)\r
        {\r
-               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", \r
-                       pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", \r
+                       pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl));\r
 \r
-               if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr\r
+               if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl\r
                        return;\r
        }\r
-       halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);\r
+       halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\r
 \r
-       pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\r
+       pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\r
 }\r
 \r
 VOID\r
@@ -1249,7 +1225,7 @@ halbtc8723b2ant_CoexTableWithType(
                        halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
                        break;\r
                case 7:\r
-                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+                       halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0xfafafafa, 0xffff, 0x3);\r
                        break;\r
                case 8:\r
                        halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);\r
@@ -1401,46 +1377,70 @@ halbtc8723b2ant_SetAntPath(
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);        // [31:16]=fw ver, [15:0]=fw sub ver\r
 \r
-       if((fwVer<0xc0000) || bPgExtSwitch)\r
+       if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\r
                bUseExtSwitch = TRUE;\r
 \r
        if(bInitHwCfg)\r
        {\r
-               // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
-               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
-               u4Tmp &=~BIT23;\r
-               u4Tmp |= BIT24;\r
-               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
-\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\r
                pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);\r
 \r
-               //Force GNT_BT to low\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0);\r
-               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x0);\r
+               if(fwVer >= 0x180000)\r
+               {\r
+               /* Use H2C to set GNT_BT to LOW */\r
+               H2C_Parameter[0] = 0;\r
+               pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\r
+               }\r
+               \r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi TRx Mask off\r
+               pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); //BT TRx Mask off\r
 \r
                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                {\r
                        //tell firmware "no antenna inverse"\r
                        H2C_Parameter[0] = 0;\r
-                       H2C_Parameter[1] = 1;  //ext switch type\r
-                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);    \r
                }\r
                else\r
                {\r
                        //tell firmware "antenna inverse"\r
                        H2C_Parameter[0] = 1;\r
-                       H2C_Parameter[1] = 1;  //ext switch type\r
-                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);    \r
                }\r
+\r
+               if (bUseExtSwitch)\r
+               {\r
+                       //ext switch type\r
+                       H2C_Parameter[1] = 1;\r
+               }\r
+               else\r
+               {\r
+                       //int switch type\r
+                       H2C_Parameter[1] = 0;\r
+               }\r
+               pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
        }\r
 \r
        // ext switch setting\r
        if(bUseExtSwitch)\r
        {\r
-               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
+               if (bInitHwCfg)\r
+               {\r
+                       // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
+                       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+                       u4Tmp &=~BIT23;\r
+                       u4Tmp |= BIT24;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+               }\r
+               \r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
                switch(antPosType)\r
                {\r
                        case BTC_ANT_WIFI_AT_MAIN:\r
@@ -1453,15 +1453,23 @@ halbtc8723b2ant_SetAntPath(
        }\r
        else    // internal switch\r
        {\r
-               // fixed ext switch\r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\r
+               if (bInitHwCfg)\r
+               {\r
+                       // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
+                       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+                       u4Tmp |= BIT23;\r
+                       u4Tmp &=~BIT24;\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+               }\r
+               \r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //fixed external switch S1->Main, S0->Aux\r
                switch(antPosType)\r
                {\r
                        case BTC_ANT_WIFI_AT_MAIN:\r
-                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
+                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\r
                                break;\r
                        case BTC_ANT_WIFI_AT_AUX:\r
-                               pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT\r
+                               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT\r
                                break;\r
                }\r
        }\r
@@ -1597,7 +1605,7 @@ halbtc8723b2ant_CoexAllOff(
        // fw all off\r
        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
-       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        // sw all off\r
        halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
@@ -1617,7 +1625,7 @@ halbtc8723b2ant_InitCoexDm(
        \r
        halbtc8723b2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
-       halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\r
 \r
        halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
@@ -1645,13 +1653,13 @@ halbtc8723b2ant_ActionBtInquiry(
                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
        }       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
-       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
 \r
        pCoexDm->bNeedRecover0x948 = TRUE;\r
-       pCoexDm->backup0x948 = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x948);\r
+       pCoexDm->backup0x948 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\r
 \r
        halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_AUX, FALSE, FALSE);\r
 }\r
@@ -1660,6 +1668,7 @@ halbtc8723b2ant_IsCommonAction(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
+       u1Byte                  btRssiState=BTC_RSSI_STATE_HIGH;\r
        BOOLEAN                 bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\r
        BOOLEAN                 bBtHsOn=FALSE, bLowPwrDisable=FALSE;\r
 \r
@@ -1671,6 +1680,7 @@ halbtc8723b2ant_IsCommonAction(
        {\r
                bLowPwrDisable = FALSE;\r
                pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+               halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n"));\r
 \r
@@ -1678,7 +1688,7 @@ halbtc8723b2ant_IsCommonAction(
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
                \r
                halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
                halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
@@ -1691,6 +1701,7 @@ halbtc8723b2ant_IsCommonAction(
                {\r
                        bLowPwrDisable = FALSE;\r
                        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+                       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
                        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));\r
 \r
@@ -1698,7 +1709,7 @@ halbtc8723b2ant_IsCommonAction(
                        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
                        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);              \r
                        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
-                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
                halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
                        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
@@ -1713,12 +1724,13 @@ halbtc8723b2ant_IsCommonAction(
                        if(bBtHsOn)\r
                                return FALSE;\r
                        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));\r
+                       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
                        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
                        halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
                        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
-                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
                        halbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
                        halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
@@ -1741,15 +1753,17 @@ halbtc8723b2ant_IsCommonAction(
                                        return FALSE;\r
                                \r
                                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n"));\r
+                               btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+                               halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
                                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
                                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
                                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\r
                                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\r
-                               if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+                               if(BTC_RSSI_HIGH(btRssiState))\r
+                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
                                else    \r
-                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+                                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
                                halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
                                halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
                                bCommon = TRUE;\r
@@ -2676,19 +2690,22 @@ halbtc8723b2ant_ActionSco(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte  wifiRssiState;\r
+       u1Byte  wifiRssiState, btRssiState;\r
        u4Byte  wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
        \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
@@ -2748,12 +2765,14 @@ halbtc8723b2ant_ActionHid(
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
@@ -2828,8 +2847,9 @@ halbtc8723b2ant_ActionA2dp(
        {\r
                //DbgPrint(" AP#>10(%d)\n", apNum);\r
                pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);      \r
+               halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
                halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);      \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
                halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
                halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
 \r
@@ -2849,13 +2869,14 @@ halbtc8723b2ant_ActionA2dp(
        }\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
 \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
 \r
@@ -2906,19 +2927,22 @@ halbtc8723b2ant_ActionA2dpPanHs(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState;\r
+       u1Byte          wifiRssiState, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+       \r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
 \r
@@ -2969,12 +2993,14 @@ halbtc8723b2ant_ActionPanEdr(
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);\r
 \r
@@ -3027,24 +3053,22 @@ halbtc8723b2ant_ActionPanHs(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       u1Byte          wifiRssiState;\r
+       u1Byte          wifiRssiState, btRssiState;\r
        u4Byte          wifiBw;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
-               (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
-       {\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
-       }\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else\r
-       {\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
-       }\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
        \r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
        \r
@@ -3095,12 +3119,14 @@ halbtc8723b2ant_ActionPanEdrA2dp(
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
@@ -3162,10 +3188,12 @@ halbtc8723b2ant_ActionPanEdrHid(
        btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
@@ -3237,12 +3265,14 @@ halbtc8723b2ant_ActionHidA2dpPanEdr(
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\r
+\r
        halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       if(BTC_RSSI_HIGH(btRssiState))\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
        else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
 \r
@@ -3299,20 +3329,44 @@ halbtc8723b2ant_ActionHidA2dp(
 {\r
        u1Byte          wifiRssiState, btRssiState;\r
        u4Byte          wifiBw;\r
+       u1Byte          apNum=0;\r
 \r
        wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
-       btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       //btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\r
+       btRssiState = halbtc8723b2ant_BtRssiState(3, 29, 37);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\r
 \r
-       halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\r
 \r
-       if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))\r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
-       else    \r
-               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+       halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+       if(BTC_WIFI_BW_LEGACY == wifiBw)\r
+       {\r
+               if(BTC_RSSI_HIGH(btRssiState))\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+               else if(BTC_RSSI_MEDIUM(btRssiState))\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+       else    \r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+       }\r
+       else    \r
+       {       // only 802.11N mode we have to dec bt power to 4 degree\r
+               if(BTC_RSSI_HIGH(btRssiState))\r
+               {\r
+                       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
+                       // need to check ap Number of Not\r
+                       if(apNum < 10)\r
+                               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\r
+                       else\r
+                               halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+               }\r
+               else if(BTC_RSSI_MEDIUM(btRssiState))\r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\r
+               else    \r
+                       halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\r
+       }\r
 \r
        halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
 \r
@@ -3392,7 +3446,7 @@ halbtc8723b2ant_RunCoexistMechanism(
                if(pCoexDm->bNeedRecover0x948)\r
                {\r
                        pCoexDm->bNeedRecover0x948 = FALSE;\r
-                       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);\r
                }\r
        }\r
 \r
@@ -3468,29 +3522,37 @@ halbtc8723b2ant_WifiOffHwCfg(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       PADAPTER padapter=pBtCoexist->Adapter;\r
+       BOOLEAN bIsInMpMode = FALSE;\r
+       u1Byte H2C_Parameter[2] ={0};\r
+       u4Byte fwVer=0;\r
+\r
        // set wlan_act to low\r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\r
 \r
        pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\r
-        \r
-       //Force GNT_BT to High\r
-       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);\r
-       if(padapter->registrypriv.mp_mode ==0)  \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\r
+       if(fwVer >= 0x180000)\r
+       {\r
+       /* Use H2C to set GNT_BT to HIGH */\r
+       H2C_Parameter[0] = 1;\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\r
+       }\r
+       else\r
+       {\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\r
+       }\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\r
+       if(!bIsInMpMode)\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\r
        else\r
                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\r
 }\r
 \r
-//============================================================\r
-// work around function start with wa_halbtc8723b2ant_\r
-//============================================================\r
-//============================================================\r
-// extern function start with EXhalbtc8723b2ant_\r
-//============================================================\r
 VOID\r
-EXhalbtc8723b2ant_InitHwConfig(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
+halbtc8723b2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bBackUp\r
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
@@ -3502,9 +3564,6 @@ EXhalbtc8723b2ant_InitHwConfig(
 \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));\r
 \r
-       //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi goto standby while GNT_BT 0-->1\r
-       //pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x1); //BT goto standby while GNT_BT 1-->0\r
-\r
        // backup rf 0x1e value\r
        pCoexDm->btRf0x1eBackup = \r
                pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);  \r
@@ -3525,8 +3584,86 @@ EXhalbtc8723b2ant_InitHwConfig(
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
        pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\r
        pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\r
+}\r
+\r
+//============================================================\r
+// work around function start with wa_halbtc8723b2ant_\r
+//============================================================\r
+//============================================================\r
+// extern function start with EXhalbtc8723b2ant_\r
+//============================================================\r
+VOID\r
+EXhalbtc8723b2ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */\r
+       u2Byte u2Tmp=0x0;\r
+\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\r
+\r
+       // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\r
+       u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\r
+       pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\r
+\r
+       // set GRAN_BT = 1\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\r
+       // set WLAN_ACT = 0\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);     \r
+\r
+       // \r
+       // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\r
+       // Local setting bit define\r
+       //      BIT0: "0" for no antenna inverse; "1" for antenna inverse \r
+       //      BIT1: "0" for internal switch; "1" for external switch\r
+       //      BIT2: "0" for one antenna; "1" for two antenna\r
+       // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\r
+       if(pBtCoexist->chipInterface == BTC_INTF_USB)\r
+       {\r
+               // fixed at S0 for USB interface\r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+\r
+               u1Tmp |= 0x1;   // antenna inverse\r
+               pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\r
 \r
-       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi goto standby while GNT_BT 0-->1\r
+               pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
+       }\r
+       else\r
+       {\r
+               // for PCIE and SDIO interface, we check efuse 0xc3[6]\r
+               if(pBoardInfo->singleAntPath == 0)\r
+               {\r
+                       // set to S1\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\r
+                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\r
+               }\r
+               else if(pBoardInfo->singleAntPath == 1)\r
+               {\r
+                       // set to S0\r
+                       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\r
+                       u1Tmp |= 0x1;   // antenna inverse\r
+                       pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\r
+               }\r
+\r
+               if(pBtCoexist->chipInterface == BTC_INTF_PCI)\r
+               {       \r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\r
+               }\r
+               else if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\r
+               {\r
+                       pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\r
+               }                       \r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8723b2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       halbtc8723b2ant_InitHwConfig(pBtCoexist, TRUE);\r
 }\r
 \r
 VOID\r
@@ -3569,13 +3706,6 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);\r
@@ -3683,7 +3813,7 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \\r
-               pCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);\r
+               pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\r
        CL_PRINTF(cliBuf);\r
 \r
        // Hw setting           \r
@@ -3791,7 +3921,7 @@ EXhalbtc8723b2ant_IpsNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
                pCoexSta->bUnderIps = FALSE;\r
-               EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);\r
+               halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\r
                halbtc8723b2ant_InitCoexDm(pBtCoexist);\r
                halbtc8723b2ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3856,6 +3986,7 @@ EXhalbtc8723b2ant_MediaStatusNotify(
        u1Byte                  H2C_Parameter[3] ={0};\r
        u4Byte                  wifiBw;\r
        u1Byte                  wifiCentralChnl;\r
+       u1Byte                  apNum=0;\r
 \r
        if(BTC_MEDIA_CONNECT == type)\r
        {\r
@@ -3877,7 +4008,13 @@ EXhalbtc8723b2ant_MediaStatusNotify(
                if(BTC_WIFI_BW_HT40 == wifiBw)\r
                        H2C_Parameter[2] = 0x30;\r
                else\r
-                       H2C_Parameter[2] = 0x20;\r
+               {\r
+                       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\r
+                       if(apNum < 10)\r
+                               H2C_Parameter[2] = 0x30;\r
+                       else\r
+                               H2C_Parameter[2] = 0x20;\r
+       }\r
        }\r
        \r
        pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\r
@@ -3957,11 +4094,13 @@ EXhalbtc8723b2ant_BtInfoNotify(
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
 \r
-               if (pCoexSta->btInfoC2h[rspSource][2] & 0x40)\r
+               pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\r
+               if (pCoexSta->bBtTxRxMask)\r
                {\r
-                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch GNT_BT */                         \r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch GNT_BT since BT RF REG 0x3C != 0x01\n"));\r
-                       pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x01);\r
+                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */                            \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n"));\r
+                       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);\r
                }\r
 \r
                // Here we need to resend some wifi info to BT\r
@@ -4095,11 +4234,33 @@ EXhalbtc8723b2ant_HaltNotify(
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
        halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);\r
+       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\r
        halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
        \r
        EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
 }\r
 \r
+VOID\r
+EXhalbtc8723b2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));\r
+\r
+       if(BTC_WIFI_PNP_SLEEP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
+       }\r
+       else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
+               halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8723b2ant_InitCoexDm(pBtCoexist);\r
+               halbtc8723b2ant_QueryBtInfo(pBtCoexist);\r
+       }\r
+}\r
+\r
 VOID\r
 EXhalbtc8723b2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
index bf879d6048a6140da77def2da91260008f9de904..d16466d18f79298786e2d797205278246480a3d1 100755 (executable)
@@ -49,8 +49,8 @@ typedef enum _BT_8723B_2ANT_COEX_ALGO{
 \r
 typedef struct _COEX_DM_8723B_2ANT{\r
        // fw mechanism\r
-       BOOLEAN         bPreDecBtPwr;\r
-       BOOLEAN         bCurDecBtPwr;\r
+       u1Byte          preBtDecPwrLvl;\r
+       u1Byte          curBtDecPwrLvl;\r
        u1Byte          preFwDacSwingLvl;\r
        u1Byte          curFwDacSwingLvl;\r
        BOOLEAN         bCurIgnoreWlanAct;\r
@@ -97,7 +97,7 @@ typedef struct _COEX_DM_8723B_2ANT{
        u1Byte          wifiChnlInfo[3];\r
 \r
        BOOLEAN         bNeedRecover0x948;\r
-       u2Byte          backup0x948;\r
+       u4Byte          backup0x948;\r
 } COEX_DM_8723B_2ANT, *PCOEX_DM_8723B_2ANT;\r
 \r
 typedef struct _COEX_STA_8723B_2ANT{   \r
@@ -114,6 +114,7 @@ typedef struct _COEX_STA_8723B_2ANT{
        u4Byte                                  lowPriorityTx;\r
        u4Byte                                  lowPriorityRx;\r
        u1Byte                                  btRssi;\r
+       BOOLEAN                         bBtTxRxMask;\r
        u1Byte                                  preBtRssiState;\r
        u1Byte                                  preWifiRssiState[4];\r
        BOOLEAN                                 bC2hBtInfoReqSent;\r
@@ -128,10 +129,15 @@ typedef struct _COEX_STA_8723B_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8723b2ant_InitHwConfig(\r
+EXhalbtc8723b2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723b2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8723b2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -176,6 +182,11 @@ EXhalbtc8723b2ant_HaltNotify(
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8723b2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       );\r
+VOID\r
 EXhalbtc8723b2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
index 9f4e49ad6f8b962aad3353cd461ee335cce03fc9..d705431b51b3654c9eb9a5a80c3ba84a31bffc29 100755 (executable)
@@ -2092,9 +2092,17 @@ halbtc8812a1ant_InitCoexDm(
 // extern function start with EXhalbtc8812a1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8812a1ant_InitHwConfig(\r
+EXhalbtc8812a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8812a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        u4Byte  u4Tmp=0;\r
        u2Byte  u2Tmp=0;\r
@@ -2185,13 +2193,6 @@ EXhalbtc8812a1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index 652e723ebea1ea8fbddbbaac3eafa33c240e9c34..4f2df7a6033d662217ec23e934c384f777aa1d5b 100755 (executable)
@@ -132,10 +132,15 @@ typedef struct _COEX_STA_8812A_1ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8812a1ant_InitHwConfig(\r
+EXhalbtc8812a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8812a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8812a1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index c7add94066cc3fb238fcd090c74ca26c70725c13..e0737098f83d24bc42f06afd5ab5702a563afdff 100755 (executable)
@@ -4126,9 +4126,17 @@ halbtc8812a2ant_InitHwConfig(
 // extern function start with EXhalbtc8812a2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8812a2ant_InitHwConfig(\r
+EXhalbtc8812a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}      \r
+\r
+VOID\r
+EXhalbtc8812a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        halbtc8812a2ant_InitHwConfig(pBtCoexist, TRUE);\r
 }\r
@@ -4173,13 +4181,6 @@ EXhalbtc8812a2ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
index 31c78d324e6302fe543a9264bf62d6890adf234f..4f6f5d1210c7ed3d1f876ab0388415eda1a04ecd 100755 (executable)
@@ -148,10 +148,15 @@ typedef struct _COEX_STA_8812A_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8812a2ant_InitHwConfig(\r
+EXhalbtc8812a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8812a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8812a2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index 8728a47db5c9660df67c976b4d06c11cd67e7a90..130566a2f6d462ecf38edfb47b37a782486a9ba3 100755 (executable)
@@ -1,7 +1,7 @@
 //============================================================\r
 // Description:\r
 //\r
-// This file is for RTL8821A Co-exist mechanism\r
+// This file is for 8821A_1ANT Co-exist mechanism\r
 //\r
 // History\r
 // 2012/11/15 Cosa first check in.\r
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8821a1Ant[]={
        "BT Info[bt auto report]",\r
 };\r
 \r
-u4Byte GLCoexVerDate8821a1Ant=20130816;\r
-u4Byte GLCoexVer8821a1Ant=0x41;\r
+u4Byte GLCoexVerDate8821a1Ant=20140306;\r
+u4Byte GLCoexVer8821a1Ant=0x4b;\r
 \r
 //============================================================\r
 // local function proto type if needed\r
@@ -420,7 +420,17 @@ halbtc8821a1ant_MonitorBtCtr(
        u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
        u1Byte                  u1Tmp, u1Tmp1;\r
        s4Byte                  wifiRssi;\r
-       \r
+#if 0\r
+       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\r
+       if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \r
+       {\r
+               pCoexSta->highPriorityTx = 65535;\r
+               pCoexSta->highPriorityRx = 65535;\r
+               pCoexSta->lowPriorityTx = 65535;\r
+               pCoexSta->lowPriorityRx = 65535;\r
+               return;\r
+       }\r
+#endif \r
        regHPTxRx = 0x770;\r
        regLPTxRx = 0x774;\r
 \r
@@ -915,6 +925,8 @@ halbtc8821a1ant_CoexTableWithType(
        IN      u1Byte                          type\r
        )\r
 {\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type));\r
+       \r
        switch(type)\r
        {\r
                case 0:\r
@@ -927,19 +939,19 @@ halbtc8821a1ant_CoexTableWithType(
                        halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 3:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 4:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                case 5:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 6:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\r
                        break;\r
                case 7:\r
-                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5afa5afa, 0x5afa5afa, 0xffffff, 0x3);\r
+                       halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\r
                        break;\r
                default:\r
                        break;\r
@@ -1000,18 +1012,35 @@ halbtc8821a1ant_SetFwPstdma(
        )\r
 {\r
        u1Byte                  H2C_Parameter[5] ={0};\r
+       u1Byte                  realByte1=byte1, realByte5=byte5;\r
+       BOOLEAN                 bApEnable=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
+\r
+       if(bApEnable)\r
+       {\r
+               if(byte1&BIT4 && !(byte1&BIT5))\r
+               {                       \r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));\r
+                       realByte1 &= ~BIT4;\r
+                       realByte1 |= BIT5;\r
 \r
-       H2C_Parameter[0] = byte1;       \r
+                       realByte5 |= BIT5;\r
+                       realByte5 &= ~BIT6;\r
+               }\r
+       }\r
+\r
+       H2C_Parameter[0] = realByte1;   \r
        H2C_Parameter[1] = byte2;       \r
        H2C_Parameter[2] = byte3;\r
        H2C_Parameter[3] = byte4;\r
-       H2C_Parameter[4] = byte5;\r
+       H2C_Parameter[4] = realByte5;\r
 \r
-       pCoexDm->psTdmaPara[0] = byte1;\r
+       pCoexDm->psTdmaPara[0] = realByte1;\r
        pCoexDm->psTdmaPara[1] = byte2;\r
        pCoexDm->psTdmaPara[2] = byte3;\r
        pCoexDm->psTdmaPara[3] = byte4;\r
-       pCoexDm->psTdmaPara[4] = byte5;\r
+       pCoexDm->psTdmaPara[4] = realByte5;\r
        \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n", \r
                H2C_Parameter[0], \r
@@ -1075,7 +1104,8 @@ halbtc8821a1ant_SwMechanism(
        IN      BOOLEAN         bLowPenaltyRA\r
        ) \r
 {\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d \n", bLowPenaltyRA));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d\n", \r
+               bLowPenaltyRA));\r
        \r
        halbtc8821a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\r
 }\r
@@ -1100,8 +1130,8 @@ halbtc8821a1ant_SetAntPath(
                u4Tmp |= BIT24;\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
 \r
-               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x975, 0x3, 0x3);\r
-               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
+               //0x765 = 0x18\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);        \r
 \r
                if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \r
                {\r
@@ -1110,7 +1140,7 @@ halbtc8821a1ant_SetAntPath(
                        H2C_Parameter[1] = 1;\r
                        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
 \r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\r
+                       //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\r
                }\r
                else\r
                {\r
@@ -1119,7 +1149,7 @@ halbtc8821a1ant_SetAntPath(
                        H2C_Parameter[1] = 1;\r
                        pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
 \r
-                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
+                       //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\r
                }\r
        }\r
        else if(bWifiOff)\r
@@ -1129,18 +1159,28 @@ halbtc8821a1ant_SetAntPath(
                u4Tmp &= ~BIT23;\r
                u4Tmp &= ~BIT24;\r
                pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+\r
+               //0x765 = 0x18\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3); \r
+       }\r
+       else\r
+       {\r
+               //0x765 = 0x0\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0); \r
        }\r
        \r
        // ext switch setting\r
        switch(antPosType)\r
        {\r
                case BTC_ANT_PATH_WIFI:\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\r
                        else\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\r
                        break;\r
                case BTC_ANT_PATH_BT:\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\r
                        else\r
@@ -1148,6 +1188,7 @@ halbtc8821a1ant_SetAntPath(
                        break;\r
                default:\r
                case BTC_ANT_PATH_PTA:\r
+                       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x66);\r
                        if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\r
                                pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\r
                        else\r
@@ -1167,25 +1208,24 @@ halbtc8821a1ant_PsTdma(
        PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\r
        BOOLEAN                 bTurnOnByCnt=FALSE;\r
        u1Byte                  psTdmaTypeByCnt=0, rssiAdjustVal=0;\r
-       u4Byte                  fwVer=0;\r
+       //u4Byte                        fwVer=0;\r
 \r
        pCoexDm->bCurPsTdmaOn = bTurnOn;\r
        pCoexDm->curPsTdma = type;\r
 \r
-       if(!bForceExec)\r
+       if (pCoexDm->bCurPsTdmaOn)\r
        {\r
-               if (pCoexDm->bCurPsTdmaOn)\r
-               {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
-                               pCoexDm->curPsTdma));\r
-               }\r
-               else\r
-               {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
-                               pCoexDm->curPsTdma));\r
-               }\r
-                       \r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n", \r
+                       pCoexDm->curPsTdma));\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n", \r
+                       pCoexDm->curPsTdma));\r
+       }\r
 \r
+       if(!bForceExec)\r
+       {\r
                if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\r
                        (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\r
                        return;\r
@@ -1206,7 +1246,7 @@ halbtc8821a1ant_PsTdma(
                                rssiAdjustVal = 14;\r
                                break;\r
                        case 3:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);\r
                                break;\r
                        case 4:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\r
@@ -1216,7 +1256,7 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);\r
                                break;\r
                        case 6:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x0, 0x0);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);\r
                                break;\r
                        case 7:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\r
@@ -1232,17 +1272,17 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\r
                                break;\r
                        case 11:        \r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x03, 0x10, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\r
                                rssiAdjustVal = 20;\r
                                break;\r
                        case 12:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\r
                                break;\r
                        case 13:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x18, 0x18, 0x0, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x50);\r
                                break;\r
                        case 14:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);\r
                                break;\r
                        case 15:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\r
@@ -1259,7 +1299,7 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);\r
                                break;\r
                        case 21:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x03, 0x11, 0x10);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\r
                                break;\r
                        case 22:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10);\r
@@ -1291,13 +1331,13 @@ halbtc8821a1ant_PsTdma(
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\r
                                break;\r
                        case 30:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x3, 0x10, 0x50);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\r
                                break;\r
                        case 31:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\r
                                break;\r
                        case 32:\r
-                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0xa, 0x3, 0x10, 0x0);\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\r
                                break;\r
                        case 33:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);\r
@@ -1311,6 +1351,10 @@ halbtc8821a1ant_PsTdma(
                        case 36:\r
                                halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\r
                                break;\r
+                       case 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\r
+                               /* here softap mode screen off will cost 70-80mA for phone */\r
+                               halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\r
+                               break;  \r
                }\r
        }\r
        else\r
@@ -1702,29 +1746,6 @@ halbtc8821a1ant_CoexUnder5G(
        halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 5);\r
 }\r
 \r
-#define WIFI_ONLY_CHECK_UNDER_5G\r
-#ifdef WIFI_ONLY_CHECK_UNDER_5G\r
-VOID\r
-halbtc8821a1ant_ActionWifiOnly(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       )\r
-{\r
-       BOOLEAN  bWifiUnder5G=FALSE;\r
-\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
-\r
-       if (bWifiUnder5G)\r
-       {\r
-               halbtc8821a1ant_CoexUnder5G(pBtCoexist);\r
-               return;\r
-       }\r
-       else\r
-       {\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\r
-       }\r
-}\r
-#else\r
 VOID\r
 halbtc8821a1ant_ActionWifiOnly(\r
        IN      PBTC_COEXIST            pBtCoexist\r
@@ -1733,7 +1754,6 @@ halbtc8821a1ant_ActionWifiOnly(
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
 }\r
-#endif\r
 \r
 VOID\r
 halbtc8821a1ant_MonitorBtEnableDisable(\r
@@ -1893,6 +1913,16 @@ halbtc8821a1ant_ActionHidA2dp(
 //     Non-Software Coex Mechanism start\r
 //\r
 //=============================================\r
+VOID\r
+halbtc8821a1ant_ActionWifiMultiPort(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+       \r
+       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+}\r
 \r
 VOID\r
 halbtc8821a1ant_ActionHs(\r
@@ -1900,38 +1930,50 @@ halbtc8821a1ant_ActionHs(
        )\r
 {\r
        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
-       halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\r
+       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
 }\r
 \r
 VOID\r
 halbtc8821a1ant_ActionBtInquiry(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
-{\r
+{      \r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
-       BOOLEAN                 bWifiConnected=FALSE;\r
-       \r
+       BOOLEAN                 bWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\r
 \r
-       if(!bWifiConnected)\r
+       if((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask))\r
        {\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);          \r
        }\r
-       else if( (pBtLinkInfo->bScoExist) ||\r
-                       (pBtLinkInfo->bHidOnly) )\r
+       else if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\r
        {\r
-               // SCO/HID-only busy\r
+               // SCO/HID/A2DP  busy\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
                halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else if ((pBtLinkInfo->bPanExist) || (bWifiBusy))\r
+       {\r
+               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);              \r
+               \r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
        }\r
        else\r
        {\r
-               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 30);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\r
        }\r
 }\r
 \r
@@ -1941,13 +1983,24 @@ halbtc8821a1ant_ActionBtScoHidOnlyBusy(
        IN      u1Byte                          wifiStatus\r
        )\r
 {\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       BOOLEAN bWifiConnected=FALSE;\r
+       u1Byte  wifiRssiState=BTC_RSSI_STATE_HIGH;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+\r
        // tdma and coex table\r
-       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
 \r
-       if(BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus)\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);          \r
-       else\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+       if(pBtLinkInfo->bScoExist)\r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+       }\r
+       else //HID\r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\r
+       }\r
 }\r
 \r
 VOID\r
@@ -1969,18 +2022,26 @@ halbtc8821a1ant_ActionWifiConnectedBtAclBusy(
        }\r
        else if(pBtLinkInfo->bA2dpOnly)  //A2DP         \r
        {\r
-               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+               if(BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\r
+               {\r
+                       //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+                       //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       pCoexDm->bAutoTdmaAdjust = FALSE;\r
+               }\r
+               else if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
                        (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )     \r
                {\r
-                        halbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\r
+                       halbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
                }\r
                else //for low BT RSSI\r
                {\r
                        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
                        pCoexDm->bAutoTdmaAdjust = FALSE;\r
-               }                       \r
-\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               }\r
        }\r
        else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\r
        {\r
@@ -1992,16 +2053,16 @@ halbtc8821a1ant_ActionWifiConnectedBtAclBusy(
                }\r
                else //for low BT RSSI\r
                {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
                        pCoexDm->bAutoTdmaAdjust = FALSE;\r
                }                       \r
 \r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
        }\r
        else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)                 \r
        {\r
                halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\r
                pCoexDm->bAutoTdmaAdjust = FALSE;\r
        }\r
        else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\r
@@ -2028,20 +2089,80 @@ halbtc8821a1ant_ActionWifiNotConnected(
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table  \r
-       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+       halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
 }\r
 \r
 VOID\r
-halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(\r
+halbtc8821a1ant_ActionWifiNotConnectedScan(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       \r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+       \r
+       // tdma and coex table\r
+       if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
+       {\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+        {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+       }\r
+       else if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
+                       (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\r
+       {\r
+               halbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\r
+                       BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);\r
+       }\r
+       else\r
+       {\r
+               //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+               //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
 \r
+               //Bryant Add\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+       }\r
+}\r
 \r
-       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+VOID\r
+halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
+       \r
+       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+\r
+       // tdma and coex table\r
+       if( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) )\r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else if( (pBtLinkInfo->bA2dpExist)  || (pBtLinkInfo->bPanExist) )                       \r
+       {\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else    \r
+       {               \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+       }\r
 }\r
 \r
 VOID\r
@@ -2051,22 +2172,26 @@ halbtc8821a1ant_ActionWifiConnectedScan(
 {\r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
        \r
-       // power save state\r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
        if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
+               if (pBtLinkInfo->bA2dpExist)\r
+               {\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
+               else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
                {\r
                        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
                }\r
                else\r
                {\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-       }\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\r
+               }\r
        }\r
        else if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\r
                        (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\r
@@ -2076,8 +2201,12 @@ halbtc8821a1ant_ActionWifiConnectedScan(
        }\r
        else\r
        {\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
+               //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+\r
+               //Bryant Add\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
 \r
@@ -2086,31 +2215,25 @@ halbtc8821a1ant_ActionWifiConnectedSpecialPacket(
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       BOOLEAN                 bHsConnecting=FALSE;\r
        PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\r
 \r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_CONNECTING, &bHsConnecting);\r
-\r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
+       if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\r
        {\r
-               if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\r
-               {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\r
-                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
-               else\r
-               {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-                       halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
-               }\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
        }\r
-       else\r
+       else if(pBtLinkInfo->bPanExist) \r
        {\r
                halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\r
-               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);          \r
+       }\r
+       else    \r
+       {               \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
        }\r
 }\r
 \r
@@ -2121,7 +2244,7 @@ halbtc8821a1ant_ActionWifiConnected(
 {\r
        BOOLEAN         bWifiBusy=FALSE;\r
        BOOLEAN         bScan=FALSE, bLink=FALSE, bRoam=FALSE;\r
-       BOOLEAN         bUnder4way=FALSE;\r
+       BOOLEAN         bUnder4way=FALSE, bApEnable=FALSE;\r
        u4Byte          wifiBw;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n"));\r
@@ -2139,19 +2262,28 @@ halbtc8821a1ant_ActionWifiConnected(
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
        if(bScan || bLink || bRoam)\r
        {\r
-               halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);\r
+               if(bScan)       \r
+                       halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);\r
+               else\r
+                       halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\r
                BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"));\r
                return;\r
        }\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
        // power save state\r
-       if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\r
-               halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
+       if(!bApEnable && BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\r
+       {\r
+               if(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly)      //A2DP\r
+                       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
+               else\r
+                       halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\r
+       }\r
        else\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
 \r
        // tdma and coex table\r
-       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);      \r
        if(!bWifiBusy)\r
        {\r
                if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\r
@@ -2167,7 +2299,7 @@ halbtc8821a1ant_ActionWifiConnected(
                }\r
                else\r
                {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                }\r
        }\r
@@ -2186,7 +2318,7 @@ halbtc8821a1ant_ActionWifiConnected(
                }\r
                else \r
                {\r
-                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                       halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
                        halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
                }\r
        }\r
@@ -2270,6 +2402,8 @@ halbtc8821a1ant_RunCoexistMechanism(
        BOOLEAN bBtCtrlAggBufSize=FALSE;\r
        u1Byte  aggBufSize=5;\r
        u1Byte  wifiRssiState=BTC_RSSI_STATE_HIGH;\r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
        BOOLEAN bWifiUnder5G=FALSE;\r
 \r
        BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n"));\r
@@ -2308,9 +2442,18 @@ halbtc8821a1ant_RunCoexistMechanism(
        }\r
 \r
        pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\r
-\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        if(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)\r
        {\r
                halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
@@ -2380,7 +2523,12 @@ halbtc8821a1ant_RunCoexistMechanism(
                pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
 \r
                if(bScan || bLink || bRoam)\r
-                       halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);\r
+               {\r
+                        if (bScan)     \r
+                               halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist); \r
+                        else\r
+                               halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);     \r
+               }\r
                else\r
                        halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\r
        }\r
@@ -2399,14 +2547,15 @@ halbtc8821a1ant_InitCoexDm(
        // sw all off\r
        halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\r
 \r
-       halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
+       //halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\r
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
 }\r
 \r
 VOID\r
 halbtc8821a1ant_InitHwConfig(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                         bBackUp\r
+       IN      BOOLEAN                         bBackUp,\r
+       IN      BOOLEAN                         bWifiOnly\r
        )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
@@ -2416,9 +2565,12 @@ halbtc8821a1ant_InitHwConfig(
        u1Byte                          H2C_Parameter[2] ={0};\r
        BOOLEAN                 bWifiUnder5G=FALSE;\r
                \r
-\r
+       \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));\r
 \r
+       if(bWifiOnly)\r
+               return;\r
+       \r
        if(bBackUp)\r
        {\r
                pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\r
@@ -2440,6 +2592,7 @@ halbtc8821a1ant_InitHwConfig(
                halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\r
        else\r
                halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\r
+\r
        // PTA parameter\r
        halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\r
 \r
@@ -2456,11 +2609,19 @@ halbtc8821a1ant_InitHwConfig(
 // extern function start with EXhalbtc8821a1ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8821a1ant_InitHwConfig(\r
+EXhalbtc8821a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
 {\r
-       halbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       halbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\r
 }\r
 \r
 VOID\r
@@ -2492,7 +2653,7 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
        BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
        BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
        s4Byte                          wifiRssi=0, btHsRssi=0;\r
-       u4Byte                          wifiBw, wifiTrafficDir;\r
+       u4Byte                          wifiBw, wifiTrafficDir, faOfdm, faCck, wifiLinkStatus;\r
        u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
        u4Byte                          fwVer=0, btPatchVer=0;\r
 \r
@@ -2514,13 +2675,6 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                CL_PRINTF(cliBuf);\r
        }\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\r
        CL_PRINTF(cliBuf);      \r
@@ -2569,6 +2723,14 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
                ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
        CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "sta/vwifi/hs/p2pGo/p2pGc", \\r
+               ((wifiLinkStatus&WIFI_STA_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_AP_CONNECTED)? 1:0), \r
+               ((wifiLinkStatus&WIFI_HS_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_P2P_GO_CONNECTED)? 1:0), \r
+               ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );\r
+       CL_PRINTF(cliBuf);\r
+       \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
                ((pBtCoexist->btInfo.bBtDisabled)? ("disabled"):        ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":\r
                (  (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),\r
@@ -2634,13 +2796,13 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
                        pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\r
                CL_PRINTF(cliBuf);\r
        \r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \\r
-                       pCoexDm->errorCondition);\r
-               CL_PRINTF(cliBuf);\r
-               \r
                CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "IgnWlanAct", \\r
                        pCoexDm->bCurIgnoreWlanAct);\r
                CL_PRINTF(cliBuf);\r
+       \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \\r
+                       pCoexDm->errorCondition);\r
+               CL_PRINTF(cliBuf);\r
        }\r
 \r
        // Hw setting           \r
@@ -2705,9 +2867,8 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
        u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\r
        u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\r
        u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\r
-       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \\r
-               u4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8(coexTable)", \\r
+               u4Tmp[0], u4Tmp[1], u4Tmp[2]);\r
        CL_PRINTF(cliBuf);\r
 \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)", \\r
@@ -2738,17 +2899,20 @@ EXhalbtc8821a1ant_IpsNotify(
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));\r
                pCoexSta->bUnderIps = TRUE;\r
-               halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
-               //set PTA control\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\r
+               \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
                halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\r
+               halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);   \r
+               //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
        }\r
        else if(BTC_IPS_LEAVE == type)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
                pCoexSta->bUnderIps = FALSE;\r
 \r
-               halbtc8821a1ant_RunCoexistMechanism(pBtCoexist);\r
+               halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
+               halbtc8821a1ant_InitCoexDm(pBtCoexist);\r
+               halbtc8821a1ant_QueryBtInfo(pBtCoexist);\r
        }\r
 }\r
 \r
@@ -2780,10 +2944,29 @@ EXhalbtc8821a1ant_ScanNotify(
        )\r
 {\r
        BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;    \r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
+       BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       u1Byte  aggBufSize=5;\r
 \r
        if(pBtCoexist->bManualControl ||\r
-               pBtCoexist->bStopCoexDm ||\r
-               pBtCoexist->btInfo.bBtDisabled )\r
+               pBtCoexist->bStopCoexDm )\r
+               return;\r
+\r
+       if(BTC_SCAN_START == type)\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+\r
+               halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+       }       \r
+\r
+       if(pBtCoexist->btInfo.bBtDisabled)\r
                return;\r
 \r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
@@ -2791,6 +2974,16 @@ EXhalbtc8821a1ant_ScanNotify(
 \r
        halbtc8821a1ant_QueryBtInfo(pBtCoexist);\r
        \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if(numOfWifiLink >= 2)\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+       \r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
                halbtc8821a1ant_ActionBtInquiry(pBtCoexist);\r
@@ -2804,10 +2997,10 @@ EXhalbtc8821a1ant_ScanNotify(
 \r
        if(BTC_SCAN_START == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
                if(!bWifiConnected)     // non-connected scan\r
                {\r
-                       halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);\r
+                       halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist);\r
                }\r
                else    // wifi is connected\r
                {\r
@@ -2816,7 +3009,7 @@ EXhalbtc8821a1ant_ScanNotify(
        }\r
        else if(BTC_SCAN_FINISH == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
                if(!bWifiConnected)     // non-connected scan\r
                {\r
                        halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\r
@@ -2835,12 +3028,39 @@ EXhalbtc8821a1ant_ConnectNotify(
        )\r
 {\r
        BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;    \r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
+       BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       u1Byte  aggBufSize=5;\r
 \r
        if(pBtCoexist->bManualControl ||\r
                pBtCoexist->bStopCoexDm ||\r
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
+       if(BTC_ASSOCIATE_START == type)\r
+       {\r
+        pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));        \r
+               pCoexDm->nArpCnt = 0;\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));       \r
+               pCoexDm->nArpCnt = 0;\r
+       }\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if(numOfWifiLink >= 2)\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
@@ -2855,12 +3075,12 @@ EXhalbtc8821a1ant_ConnectNotify(
 \r
        if(BTC_ASSOCIATE_START == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));\r
-               halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));              \r
+               halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\r
        }\r
        else if(BTC_ASSOCIATE_FINISH == type)\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
                \r
                pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
                if(!bWifiConnected) // non-connected scan\r
@@ -2896,6 +3116,7 @@ EXhalbtc8821a1ant_MediaStatusNotify(
        else\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));\r
+               pCoexDm->nArpCnt = 0;\r
        }\r
 \r
        // only 2.4G we need to inform bt the chnl mask\r
@@ -2930,14 +3151,49 @@ EXhalbtc8821a1ant_SpecialPacketNotify(
        )\r
 {\r
        BOOLEAN bBtHsOn=FALSE;\r
+       u4Byte  wifiLinkStatus=0;\r
+       u4Byte  numOfWifiLink=0;\r
+       BOOLEAN bBtCtrlAggBufSize=FALSE;\r
+       u1Byte  aggBufSize=5;\r
        \r
        if(pBtCoexist->bManualControl ||\r
                pBtCoexist->bStopCoexDm ||\r
                pBtCoexist->btInfo.bBtDisabled )\r
                return;\r
 \r
+       if( BTC_PACKET_DHCP == type || \r
+               BTC_PACKET_EAPOL == type ||\r
+               BTC_PACKET_ARP == type )\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = TRUE;\r
+\r
+               if(BTC_PACKET_ARP == type)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n"));            \r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n"));          \r
+               }\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bWiFiIsHighPriTask = FALSE;   \r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet [Type = %d] notify\n", type));\r
+       }\r
+\r
        pCoexSta->specialPktPeriodCnt = 0;\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\r
+       numOfWifiLink = wifiLinkStatus>>16;\r
+       if(numOfWifiLink >= 2)\r
+       {\r
+               halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\r
+               halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\r
+               halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\r
+               return;\r
+       }\r
+\r
        pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
        if(pCoexSta->bC2hBtInquiryPage)\r
        {\r
@@ -2951,9 +3207,18 @@ EXhalbtc8821a1ant_SpecialPacketNotify(
        }\r
 \r
        if( BTC_PACKET_DHCP == type ||\r
-               BTC_PACKET_EAPOL == type )\r
+               BTC_PACKET_EAPOL == type || \r
+               BTC_PACKET_ARP == type )\r
        {\r
-               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));\r
+               //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));\r
+               if(BTC_PACKET_ARP == type)\r
+               {\r
+                       pCoexDm->nArpCnt++;\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt));\r
+                       if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \r
+                               return; \r
+               }\r
+               \r
                halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\r
        }\r
 }\r
@@ -3002,12 +3267,26 @@ EXhalbtc8821a1ant_BtInfoNotify(
                pCoexSta->btRetryCnt =  // [3:0]\r
                        pCoexSta->btInfoC2h[rspSource][2]&0xf;\r
 \r
+               if (pCoexSta->btInfoC2h[rspSource][2]&0x20)\r
+                       pCoexSta->bC2hBtPage = TRUE;\r
+               else\r
+                       pCoexSta->bC2hBtPage = FALSE;                   \r
+\r
                pCoexSta->btRssi =\r
                        pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
 \r
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
 \r
+               pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\r
+               if(!pCoexSta->bBtTxRxMask)\r
+               {\r
+                       /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */                            \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"));\r
+                       pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\r
+               }\r
+               \r
                // Here we need to resend some wifi info to BT\r
                // because bt is reset and loss of the info.\r
                if(pCoexSta->btInfoExt & BIT1)\r
@@ -3043,7 +3322,6 @@ EXhalbtc8821a1ant_BtInfoNotify(
                }\r
                else\r
                {\r
-                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n"));\r
                        halbtc8821a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\r
                }\r
 #endif\r
@@ -3087,6 +3365,8 @@ EXhalbtc8821a1ant_BtInfoNotify(
 \r
        halbtc8821a1ant_UpdateBtLinkInfo(pBtCoexist);\r
                \r
+       btInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\r
+       \r
        if(!(btInfo&BT_INFO_8821A_1ANT_B_CONNECTION))\r
        {\r
                pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\r
@@ -3136,15 +3416,16 @@ EXhalbtc8821a1ant_HaltNotify(
        \r
        BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
 \r
-       pBtCoexist->bStopCoexDm = TRUE;\r
-\r
-       halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
-       halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
-\r
        halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
        halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\r
+       halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+       //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+       halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
 \r
        EXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+\r
+       pBtCoexist->bStopCoexDm = TRUE; \r
 }\r
 \r
 VOID\r
@@ -3158,16 +3439,20 @@ EXhalbtc8821a1ant_PnpNotify(
        if(BTC_WIFI_PNP_SLEEP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
-               pBtCoexist->bStopCoexDm = TRUE;\r
-               halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+\r
                halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\r
-               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);      \r
+               halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\r
+               halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\r
+               halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\r
+               //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\r
+\r
+               pBtCoexist->bStopCoexDm = TRUE;\r
        }\r
        else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
        {\r
                BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
                pBtCoexist->bStopCoexDm = FALSE;\r
-               halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE);\r
+               halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\r
                halbtc8821a1ant_InitCoexDm(pBtCoexist);\r
                halbtc8821a1ant_QueryBtInfo(pBtCoexist);\r
        }\r
@@ -3208,10 +3493,10 @@ EXhalbtc8821a1ant_Periodical(
        if( halbtc8821a1ant_IsWifiStatusChanged(pBtCoexist) ||\r
                pCoexDm->bAutoTdmaAdjust )\r
        {\r
-               if(pCoexSta->specialPktPeriodCnt > 2)\r
-               {\r
+               //if(pCoexSta->specialPktPeriodCnt > 2)\r
+               //{\r
                        halbtc8821a1ant_RunCoexistMechanism(pBtCoexist);        \r
-               }\r
+               //}\r
        }\r
 \r
        pCoexSta->specialPktPeriodCnt++;\r
index a9656abc2e298399e58de9ac0885e6a16a30e033..4c7469ef67c82159d4c36e51c489d2af54517d95 100755 (executable)
@@ -1,7 +1,7 @@
 //===========================================\r
 // The following is for 8821A 1ANT BT Co-exist definition\r
 //===========================================\r
-#define        BT_AUTO_REPORT_ONLY_8821A_1ANT                          0\r
+#define        BT_AUTO_REPORT_ONLY_8821A_1ANT                          1\r
 \r
 #define        BT_INFO_8821A_1ANT_B_FTP                                                BIT7\r
 #define        BT_INFO_8821A_1ANT_B_A2DP                                       BIT6\r
@@ -108,6 +108,7 @@ typedef struct _COEX_DM_8821A_1ANT{
        u1Byte          curRetryLimitType;\r
        u1Byte          preAmpduTimeType;\r
        u1Byte          curAmpduTimeType;\r
+       u4Byte          nArpCnt;\r
 \r
        u1Byte          errorCondition;\r
 } COEX_DM_8821A_1ANT, *PCOEX_DM_8821A_1ANT;\r
@@ -127,12 +128,15 @@ typedef struct _COEX_STA_8821A_1ANT{
        u4Byte                                  lowPriorityTx;\r
        u4Byte                                  lowPriorityRx;\r
        u1Byte                                  btRssi;\r
+       BOOLEAN                                 bBtTxRxMask;\r
        u1Byte                                  preBtRssiState;\r
        u1Byte                                  preWifiRssiState[4];\r
        BOOLEAN                                 bC2hBtInfoReqSent;\r
        u1Byte                                  btInfoC2h[BT_INFO_SRC_8821A_1ANT_MAX][10];\r
        u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8821A_1ANT_MAX];\r
        BOOLEAN                                 bC2hBtInquiryPage;\r
+       BOOLEAN                                 bC2hBtPage;                             //Add for win8.1 page out issue\r
+       BOOLEAN                                 bWiFiIsHighPriTask;             //Add for win8.1 page out issue\r
        u1Byte                                  btRetryCnt;\r
        u1Byte                                  btInfoExt;\r
 }COEX_STA_8821A_1ANT, *PCOEX_STA_8821A_1ANT;\r
@@ -141,10 +145,15 @@ typedef struct _COEX_STA_8821A_1ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8821a1ant_InitHwConfig(\r
+EXhalbtc8821a1ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8821a1ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8821a1ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -201,10 +210,4 @@ VOID
 EXhalbtc8821a1ant_DisplayCoexInfo(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
-VOID\r
-EXhalbtc8821a1ant_DbgControl(\r
-       IN      PBTC_COEXIST                    pBtCoexist,\r
-       IN      u1Byte                          opCode,\r
-       IN      u1Byte                          opLen,\r
-       IN      pu1Byte                         pData\r
-       );\r
+\r
index 0d513790a4053add38acbc0a5b75106223e2019d..520c769602924bc00e6390e1ec8f27d36dde3060 100755 (executable)
@@ -686,97 +686,6 @@ halbtc8821a2ant_DecBtPwr(
        pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\r
 }\r
 \r
-VOID\r
-halbtc8821a2ant_SetFwBtLnaConstrain(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bBtLnaConsOn\r
-       )\r
-{\r
-       u1Byte                  H2C_Parameter[2] ={0};\r
-       \r
-       H2C_Parameter[0] = 0x3; // opCode, 0x3=BT_SET_LNA_CONSTRAIN\r
-\r
-       if(bBtLnaConsOn)\r
-       {\r
-               H2C_Parameter[1] |= BIT0;\r
-       }\r
-\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT LNA Constrain: %s, FW write 0x69=0x%x\n", \r
-               (bBtLnaConsOn? "ON!!":"OFF!!"), \r
-               H2C_Parameter[0]<<8|H2C_Parameter[1]));\r
-\r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 2, H2C_Parameter);    \r
-}\r
-\r
-VOID\r
-halbtc8821a2ant_SetBtLnaConstrain(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bForceExec,\r
-       IN      BOOLEAN                 bBtLnaConsOn\r
-       )\r
-{\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Constrain = %s\n",  \r
-               (bForceExec? "force":""), ((bBtLnaConsOn)? "ON":"OFF")));\r
-       pCoexDm->bCurBtLnaConstrain = bBtLnaConsOn;\r
-\r
-       if(!bForceExec)\r
-       {\r
-               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtLnaConstrain=%d, bCurBtLnaConstrain=%d\n", \r
-                       pCoexDm->bPreBtLnaConstrain, pCoexDm->bCurBtLnaConstrain));\r
-\r
-               if(pCoexDm->bPreBtLnaConstrain == pCoexDm->bCurBtLnaConstrain) \r
-                       return;\r
-       }\r
-       halbtc8821a2ant_SetFwBtLnaConstrain(pBtCoexist, pCoexDm->bCurBtLnaConstrain);\r
-\r
-       pCoexDm->bPreBtLnaConstrain = pCoexDm->bCurBtLnaConstrain;\r
-}\r
-\r
-VOID\r
-halbtc8821a2ant_SetFwBtPsdMode(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      u1Byte                  btPsdMode\r
-       )\r
-{\r
-       u1Byte                  H2C_Parameter[2] ={0};\r
-       \r
-       H2C_Parameter[0] = 0x2; // opCode, 0x2=BT_SET_PSD_MODE\r
-\r
-       H2C_Parameter[1] = btPsdMode;\r
-\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT PSD mode=0x%x, FW write 0x69=0x%x\n", \r
-               H2C_Parameter[1], \r
-               H2C_Parameter[0]<<8|H2C_Parameter[1]));\r
-\r
-       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 2, H2C_Parameter);    \r
-}\r
-\r
-\r
-VOID\r
-halbtc8821a2ant_SetBtPsdMode(\r
-       IN      PBTC_COEXIST            pBtCoexist,\r
-       IN      BOOLEAN                 bForceExec,\r
-       IN      u1Byte                  btPsdMode\r
-       )\r
-{\r
-       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT PSD mode = 0x%x\n",  \r
-               (bForceExec? "force":""), btPsdMode));\r
-       pCoexDm->bCurBtPsdMode = btPsdMode;\r
-\r
-       if(!bForceExec)\r
-       {\r
-               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtPsdMode=0x%x, bCurBtPsdMode=0x%x\n", \r
-                       pCoexDm->bPreBtPsdMode, pCoexDm->bCurBtPsdMode));\r
-\r
-               if(pCoexDm->bPreBtPsdMode == pCoexDm->bCurBtPsdMode) \r
-                       return;\r
-       }\r
-       halbtc8821a2ant_SetFwBtPsdMode(pBtCoexist, pCoexDm->bCurBtPsdMode);\r
-\r
-       pCoexDm->bPreBtPsdMode = pCoexDm->bCurBtPsdMode;\r
-}\r
-\r
-\r
 VOID\r
 halbtc8821a2ant_SetBtAutoReport(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
@@ -1470,6 +1379,8 @@ halbtc8821a2ant_CoexUnder5G(
        )\r
 {\r
        halbtc8821a2ant_CoexAllOff(pBtCoexist);\r
+\r
+       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\r
 }\r
 \r
 VOID\r
@@ -3598,9 +3509,17 @@ halbtc8821a2ant_RunCoexistMechanism(
 // extern function start with EXhalbtc8821a2ant_\r
 //============================================================\r
 VOID\r
-EXhalbtc8821a2ant_InitHwConfig(\r
+EXhalbtc8821a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8821a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
 {\r
        PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
        u4Byte  u4Tmp=0;\r
@@ -3663,13 +3582,6 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
        CL_PRINTF(cliBuf);\r
 \r
-       if(!pBoardInfo->bBtExist)\r
-       {\r
-               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");\r
-               CL_PRINTF(cliBuf);\r
-               return;\r
-       }\r
-\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
                pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
        CL_PRINTF(cliBuf);      \r
@@ -3766,8 +3678,8 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
        // Sw mechanism \r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
        CL_PRINTF(cliBuf);\r
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig/ btLna]", \\r
-               pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig, pCoexDm->bCurBtLnaConstrain);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \\r
+               pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\r
        CL_PRINTF(cliBuf);\r
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \\r
                pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\r
@@ -4000,11 +3912,11 @@ EXhalbtc8821a2ant_BtInfoNotify(
 {\r
        u1Byte                  btInfo=0;\r
        u1Byte                  i, rspSource=0;\r
-       static u4Byte           setBtLnaCnt=0, setBtPsdMode=0;\r
        BOOLEAN                 bBtBusy=FALSE, bLimitedDig=FALSE;\r
-       BOOLEAN                 bWifiConnected=FALSE, bBtHsOn=FALSE;\r
+       BOOLEAN                 bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;\r
 \r
        pCoexSta->bC2hBtInfoReqSent = FALSE;\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
 \r
        rspSource = tmpBuf[0]&0xf;\r
        if(rspSource >= BT_INFO_SRC_8821A_2ANT_MAX)\r
@@ -4027,6 +3939,7 @@ EXhalbtc8821a2ant_BtInfoNotify(
                }\r
        }\r
 \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
        if(BT_INFO_SRC_8821A_2ANT_WIFI_FW != rspSource)\r
        {\r
                pCoexSta->btRetryCnt =  // [3:0]\r
@@ -4037,12 +3950,12 @@ EXhalbtc8821a2ant_BtInfoNotify(
 \r
                pCoexSta->btInfoExt = \r
                        pCoexSta->btInfoC2h[rspSource][4];\r
-\r
+               \r
                // Here we need to resend some wifi info to BT\r
                // because bt is reset and loss of the info.\r
                if( (pCoexSta->btInfoExt & BIT1) )\r
                {                       \r
-                       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+                       \r
                        if(bWifiConnected)\r
                        {\r
                                EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\r
@@ -4051,42 +3964,28 @@ EXhalbtc8821a2ant_BtInfoNotify(
                        {\r
                                EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
                        }\r
-\r
-                       setBtPsdMode = 0;\r
-               }\r
-               if(setBtPsdMode <= 3)\r
-               {\r\r
-                       halbtc8821a2ant_SetBtPsdMode(pBtCoexist, FORCE_EXEC, 0x0); //fix CH-BW mode \r
-                       setBtPsdMode++;\r
                }\r
-               \r
-               if(pCoexDm->bCurBtLnaConstrain)\r
+\r
+               if(!pBtCoexist->bManualControl && !bWifiUnder5G)\r
                {\r
-                       if( (pCoexSta->btInfoExt & BIT2) )\r
+                       if( (pCoexSta->btInfoExt&BIT3) )\r
                        {\r
+                               if(bWifiConnected)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));\r
+                                       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\r
+                               }\r
                        }\r
                        else\r
                        {\r
-                               if(setBtLnaCnt <= 3)\r
+                               // BT already NOT ignore Wlan active, do nothing here.\r
+                               if(!bWifiConnected)\r
                                {\r
-                                       halbtc8821a2ant_SetBtLnaConstrain(pBtCoexist, FORCE_EXEC, TRUE);\r
-                                       setBtLnaCnt++;\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n"));\r
+                                       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
                                }\r
                        }\r
                }\r
-               else\r
-               {\r
-                       setBtLnaCnt = 0;\r
-               }\r
-\r
-               if( (pCoexSta->btInfoExt & BIT3) )\r
-               {\r
-                       halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\r
-               }\r
-               else\r
-               {\r
-                       // BT already NOT ignore Wlan active, do nothing here.\r
-               }\r
 \r
                if( (pCoexSta->btInfoExt & BIT4) )\r
                {\r
@@ -4185,6 +4084,25 @@ EXhalbtc8821a2ant_HaltNotify(
        EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
 }\r
 \r
+VOID\r
+EXhalbtc8821a2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));\r
+\r
+       if(BTC_WIFI_PNP_SLEEP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
+               halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+       }\r
+       else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
+       }\r
+}\r
+\r
 VOID\r
 EXhalbtc8821a2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
index 95266a122e8d3d4e52f65f709ff9426ce7b9ac6f..3da55176f5bac976d9226766a51e2581467094f3 100755 (executable)
@@ -45,10 +45,6 @@ typedef struct _COEX_DM_8821A_2ANT{
        // fw mechanism\r
        BOOLEAN         bPreDecBtPwr;\r
        BOOLEAN         bCurDecBtPwr;\r
-       BOOLEAN         bPreBtLnaConstrain;\r
-       BOOLEAN         bCurBtLnaConstrain;\r
-       u1Byte          bPreBtPsdMode;\r
-       u1Byte          bCurBtPsdMode;\r
        u1Byte          preFwDacSwingLvl;\r
        u1Byte          curFwDacSwingLvl;\r
        BOOLEAN         bCurIgnoreWlanAct;\r
@@ -122,10 +118,15 @@ typedef struct _COEX_STA_8821A_2ANT{
 // The following is interface which will notify coex module.\r
 //===========================================\r
 VOID\r
-EXhalbtc8821a2ant_InitHwConfig(\r
+EXhalbtc8821a2ant_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8821a2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtc8821a2ant_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -170,6 +171,11 @@ EXhalbtc8821a2ant_HaltNotify(
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
 VOID\r
+EXhalbtc8821a2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       );\r
+VOID\r
 EXhalbtc8821a2ant_Periodical(\r
        IN      PBTC_COEXIST                    pBtCoexist\r
        );\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c
new file mode 100755 (executable)
index 0000000..5fc7bb4
--- /dev/null
@@ -0,0 +1,4140 @@
+//============================================================\r
+// Description:\r
+//\r
+// This file is for RTL8821A_CSR_CSR Co-exist mechanism\r
+//\r
+// History\r
+// 2012/08/22 Cosa first check in.\r
+// 2012/11/14 Cosa Revise for 8821A_CSR 2Ant out sourcing.\r
+//\r
+//============================================================\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "Mp_Precomp.h"\r
+#if(BT_30_SUPPORT == 1)\r
+//============================================================\r
+// Global variables, these are static variables\r
+//============================================================\r
+static COEX_DM_8821A_CSR_2ANT  GLCoexDm8821aCsr2Ant;\r
+static PCOEX_DM_8821A_CSR_2ANT         pCoexDm=&GLCoexDm8821aCsr2Ant;\r
+static COEX_STA_8821A_CSR_2ANT GLCoexSta8821aCsr2Ant;\r
+static PCOEX_STA_8821A_CSR_2ANT        pCoexSta=&GLCoexSta8821aCsr2Ant;\r
+\r
+const char *const GLBtInfoSrc8821aCsr2Ant[]={\r
+       "BT Info[wifi fw]",\r
+       "BT Info[bt rsp]",\r
+       "BT Info[bt auto report]",\r
+};\r
+\r
+u4Byte GLCoexVerDate8821aCsr2Ant=20130618;\r
+u4Byte GLCoexVer8821aCsr2Ant=0x5050;\r
+\r
+//============================================================\r
+// local function proto type if needed\r
+//============================================================\r
+//============================================================\r
+// local function start with halbtc8821aCsr2ant_\r
+//============================================================\r
+u1Byte\r
+halbtc8821aCsr2ant_BtRssiState(\r
+       u1Byte                  levelNum,\r
+       u1Byte                  rssiThresh,\r
+       u1Byte                  rssiThresh1\r
+       )\r
+{\r
+       s4Byte                  btRssi=0;\r
+       u1Byte                  btRssiState=pCoexSta->preBtRssiState;\r
+\r
+       btRssi = pCoexSta->btRssi;\r
+\r
+       if(levelNum == 2)\r
+       {                       \r
+               if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btRssi < rssiThresh)\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+       else if(levelNum == 3)\r
+       {\r
+               if(rssiThresh > rssiThresh1)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n"));\r
+                       return pCoexSta->preBtRssiState;\r
+               }\r
+               \r
+               if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));\r
+                       }\r
+               }\r
+               else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\r
+                       (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\r
+               {\r
+                       if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));\r
+                       }\r
+                       else if(btRssi < rssiThresh)\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btRssi < rssiThresh1)\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               btRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+               \r
+       pCoexSta->preBtRssiState = btRssiState;\r
+\r
+       return btRssiState;\r
+}\r
+\r
+u1Byte\r
+halbtc8821aCsr2ant_WifiRssiState(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  index,\r
+       IN      u1Byte                  levelNum,\r
+       IN      u1Byte                  rssiThresh,\r
+       IN      u1Byte                  rssiThresh1\r
+       )\r
+{\r
+       s4Byte                  wifiRssi=0;\r
+       u1Byte                  wifiRssiState=pCoexSta->preWifiRssiState[index];\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
+       \r
+       if(levelNum == 2)\r
+       {\r
+               if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(wifiRssi < rssiThresh)\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+       else if(levelNum == 3)\r
+       {\r
+               if(rssiThresh > rssiThresh1)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n"));\r
+                       return pCoexSta->preWifiRssiState[index];\r
+               }\r
+               \r
+               if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\r
+                       (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\r
+               {\r
+                       if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));\r
+                       }\r
+               }\r
+               else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\r
+                       (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\r
+               {\r
+                       if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));\r
+                       }\r
+                       else if(wifiRssi < rssiThresh)\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_LOW;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(wifiRssi < rssiThresh1)\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_MEDIUM;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));\r
+                       }\r
+                       else\r
+                       {\r
+                               wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));\r
+                       }\r
+               }\r
+       }\r
+               \r
+       pCoexSta->preWifiRssiState[index] = wifiRssiState;\r
+\r
+       return wifiRssiState;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_MonitorBtEnableDisable(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       static BOOLEAN  bPreBtDisabled=FALSE;\r
+       static u4Byte   btDisableCnt=0;\r
+       BOOLEAN                 bBtActive=TRUE, bBtDisabled=FALSE;\r
+\r
+       // This function check if bt is disabled\r
+\r
+       if(     pCoexSta->highPriorityTx == 0 &&\r
+               pCoexSta->highPriorityRx == 0 &&\r
+               pCoexSta->lowPriorityTx == 0 &&\r
+               pCoexSta->lowPriorityRx == 0)\r
+       {\r
+               bBtActive = FALSE;\r
+       }\r
+       if(     pCoexSta->highPriorityTx == 0xffff &&\r
+               pCoexSta->highPriorityRx == 0xffff &&\r
+               pCoexSta->lowPriorityTx == 0xffff &&\r
+               pCoexSta->lowPriorityRx == 0xffff)\r
+       {\r
+               bBtActive = FALSE;\r
+       }\r
+       if(bBtActive)\r
+       {\r
+               btDisableCnt = 0;\r
+               bBtDisabled = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n"));\r
+       }\r
+       else\r
+       {\r
+               btDisableCnt++;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n", \r
+                               btDisableCnt));\r
+               if(btDisableCnt >= 2)\r
+               {\r
+                       bBtDisabled = TRUE;\r
+                       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n"));\r
+               }\r
+       }\r
+       if(bPreBtDisabled != bBtDisabled)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n", \r
+                       (bPreBtDisabled ? "disabled":"enabled"), \r
+                       (bBtDisabled ? "disabled":"enabled")));\r
+               bPreBtDisabled = bBtDisabled;\r
+               if(!bBtDisabled)\r
+               {\r
+               }\r
+               else\r
+               {\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_MonitorBtCtr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u4Byte                  regHPTxRx, regLPTxRx, u4Tmp;\r
+       u4Byte                  regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\r
+       u1Byte                  u1Tmp;\r
+       \r
+       regHPTxRx = 0x770;\r
+       regLPTxRx = 0x774;\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\r
+       regHPTx = u4Tmp & bMaskLWord;\r
+       regHPRx = (u4Tmp & bMaskHWord)>>16;\r
+\r
+       u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\r
+       regLPTx = u4Tmp & bMaskLWord;\r
+       regLPRx = (u4Tmp & bMaskHWord)>>16;\r
+               \r
+       pCoexSta->highPriorityTx = regHPTx;\r
+       pCoexSta->highPriorityRx = regHPRx;\r
+       pCoexSta->lowPriorityTx = regLPTx;\r
+       pCoexSta->lowPriorityRx = regLPRx;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", \r
+               regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n", \r
+               regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\r
+\r
+       // reset counter\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_QueryBtInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+\r
+       pCoexSta->bC2hBtInfoReqSent = TRUE;\r
+\r
+       H2C_Parameter[0] |= BIT0;       // trigger\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n", \r
+               H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\r
+}\r
+u1Byte\r
+halbtc8821aCsr2ant_ActionAlgorithm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+       BOOLEAN                         bBtHsOn=FALSE;\r
+       u1Byte                          algorithm=BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED;\r
+       u1Byte                          numOfDiffProfile=0;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
+       \r
+       //for win-8 stack HID report error\r
+       if(!pStackInfo->bHidExist)\r
+               pStackInfo->bHidExist = pCoexSta->bHidExist;  //sync  BTInfo with BT firmware and stack\r
+       // when stack HID report error, here we use the info from bt fw.\r
+       if(!pStackInfo->bBtLinkExist)\r
+               pStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\r
+       \r
+       if(!pStackInfo->bBtLinkExist)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n"));\r
+               return algorithm;\r
+       }\r
+\r
+       if(pStackInfo->bScoExist)\r
+               numOfDiffProfile++;\r
+       if(pStackInfo->bHidExist)\r
+               numOfDiffProfile++;\r
+       if(pStackInfo->bPanExist)\r
+               numOfDiffProfile++;\r
+       if(pStackInfo->bA2dpExist)\r
+               numOfDiffProfile++;\r
+       \r
+       if(numOfDiffProfile == 1)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n"));\r
+                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;\r
+               }\r
+               else\r
+               {\r
+                       if(pStackInfo->bHidExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID;\r
+                       }\r
+                       else if(pStackInfo->bA2dpExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP;\r
+                       }\r
+                       else if(pStackInfo->bPanExist)\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANHS;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else if(numOfDiffProfile == 2)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       if(pStackInfo->bHidExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                       }\r
+                       else if(pStackInfo->bA2dpExist)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                       }\r
+                       else if(pStackInfo->bPanExist)\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(pStackInfo->numOfHid >= 2)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\r
+                               }\r
+                               else\r
+                               {                       \r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;\r
+                               }\r
+                       }\r
+                       else if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n"));\r
+                                       algorithm =  BT_8821A_CSR_2ANT_COEX_ALGO_HID;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+                       else if( pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else if(numOfDiffProfile == 3)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n"));\r
+                               algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                       }\r
+                       else if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+                       else if( pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       else if(numOfDiffProfile >= 3)\r
+       {\r
+               if(pStackInfo->bScoExist)\r
+               {\r
+                       if( pStackInfo->bHidExist &&\r
+                               pStackInfo->bPanExist &&\r
+                               pStackInfo->bA2dpExist )\r
+                       {\r
+                               if(bBtHsOn)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));\r
+\r
+                               }\r
+                               else\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"));\r
+                                       algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return algorithm;\r
+}\r
+\r
+BOOLEAN\r
+halbtc8821aCsr2ant_NeedToDecBtPwr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN         bRet=FALSE;\r
+       BOOLEAN         bBtHsOn=FALSE, bWifiConnected=FALSE;\r
+       s4Byte          btHsRssi=0;\r
+       u1Byte          btRssiState;\r
+\r
+       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\r
+               return FALSE;\r
+       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))\r
+               return FALSE;\r
+       if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\r
+               return FALSE;\r
+\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       if(bWifiConnected)\r
+       {\r
+               if(bBtHsOn)\r
+               {\r
+                       if(btHsRssi > 37)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+                       {\r
+               \r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       return bRet;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwDacSwingLevel(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  dacSwingLvl\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+\r
+       // There are several type of dacswing\r
+       // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\r
+       H2C_Parameter[0] = dacSwingLvl;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl));\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwDecBtPwr(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bDecBtPwr\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+       \r
+       H2C_Parameter[0] = 0;\r
+\r
+       if(bDecBtPwr)\r
+       {\r
+               H2C_Parameter[0] |= BIT1;\r
+       }\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n", \r
+               (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);    \r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_DecBtPwr(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bDecBtPwr\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",  \r
+               (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF")));\r
+       pCoexDm->bCurDecBtPwr = bDecBtPwr;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n", \r
+                       pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr));\r
+\r
+               if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);\r
+\r
+       pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetBtAutoReport(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bEnableAutoReport\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+       \r
+       H2C_Parameter[0] = 0;\r
+\r
+       if(bEnableAutoReport)\r
+       {\r
+               H2C_Parameter[0] |= BIT0;\r
+       }\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n", \r
+               (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);    \r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_BtAutoReport(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bEnableAutoReport\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n",  \r
+               (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled")));\r
+       pCoexDm->bCurBtAutoReport = bEnableAutoReport;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", \r
+                       pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport));\r
+\r
+               if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\r
+\r
+       pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_FwDacSwingLvl(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      u1Byte                  fwDacSwingLvl\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n",  \r
+               (bForceExec? "force to":""), fwDacSwingLvl));\r
+       pCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", \r
+                       pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl));\r
+\r
+               if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \r
+                       return;\r
+       }\r
+\r
+       halbtc8821aCsr2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\r
+\r
+       pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetSwRfRxLpfCorner(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bRxRfShrinkOn\r
+       )\r
+{\r
+       if(bRxRfShrinkOn)\r
+       {\r
+               //Shrink RF Rx LPF corner\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n"));\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\r
+       }\r
+       else\r
+       {\r
+               //Resume RF Rx LPF corner\r
+               // After initialized, we can use pCoexDm->btRf0x1eBackup\r
+               if(pBtCoexist->bInitilized)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n"));\r
+                       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_RfShrink(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bRxRfShrinkOn\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n",  \r
+               (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF")));\r
+       pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n", \r
+                       pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink));\r
+\r
+               if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\r
+\r
+       pCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bLowPenaltyRa\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[6] ={0};\r
+       \r
+       H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty\r
+\r
+       if(bLowPenaltyRa)\r
+       {\r
+               H2C_Parameter[1] |= BIT0;\r
+               H2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\r
+               H2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\r
+               H2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\r
+               H2C_Parameter[5] = 0xf9;        //MCS5 or OFDM36        \r
+       }\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s", \r
+               (bLowPenaltyRa? "ON!!":"OFF!!") ));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_LowPenaltyRa(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bLowPenaltyRa\r
+       )\r
+{\r
+       //return;\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n",  \r
+               (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF")));\r
+       pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n", \r
+                       pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa));\r
+\r
+               if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\r
+\r
+       pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetDacSwingReg(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u4Byte                  level\r
+       )\r
+{\r
+       u1Byte  val=(u1Byte)level;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level));\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetSwFullTimeDacSwing(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bSwDacSwingOn,\r
+       IN      u4Byte                  swDacSwingLvl\r
+       )\r
+{\r
+       if(bSwDacSwingOn)\r
+       {\r
+               halbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\r
+       }\r
+       else\r
+       {\r
+               halbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, 0x18);\r
+       }\r
+}\r
+\r
+\r
+VOID\r
+halbtc8821aCsr2ant_DacSwing(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bDacSwingOn,\r
+       IN      u4Byte                  dacSwingLvl\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n",  \r
+               (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl));\r
+       pCoexDm->bCurDacSwingOn = bDacSwingOn;\r
+       pCoexDm->curDacSwingLvl = dacSwingLvl;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n", \r
+                       pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl,\r
+                       pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl));\r
+\r
+               if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\r
+                       (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\r
+                       return;\r
+       }\r
+       delay_ms(30);\r
+       halbtc8821aCsr2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\r
+\r
+       pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\r
+       pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetAdcBackOff(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bAdcBackOff\r
+       )\r
+{\r
+       if(bAdcBackOff)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n"));\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3);\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n"));\r
+               pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1);\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_AdcBackOff(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bAdcBackOff\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n",  \r
+               (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF")));\r
+       pCoexDm->bCurAdcBackOff = bAdcBackOff;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n", \r
+                       pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff));\r
+\r
+               if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\r
+\r
+       pCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetAgcTable(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bAgcTableEn\r
+       )\r
+{\r
+       u1Byte          rssiAdjustVal=0;\r
+\r
+       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\r
+       if(bAgcTableEn)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x28F4B);\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x10AB2);\r
+               rssiAdjustVal = 8;\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B);\r
+               pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2);\r
+       }\r
+       pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\r
+\r
+       // set rssiAdjustVal for wifi module.\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_AgcTable(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bAgcTableEn\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n",  \r
+               (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable")));\r
+       pCoexDm->bCurAgcTableEn = bAgcTableEn;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", \r
+                       pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn));\r
+\r
+               if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\r
+\r
+       pCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetCoexTable(\r
+       IN      PBTC_COEXIST    pBtCoexist,\r
+       IN      u4Byte          val0x6c0,\r
+       IN      u4Byte          val0x6c4,\r
+       IN      u4Byte          val0x6c8,\r
+       IN      u1Byte          val0x6cc\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0));\r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4));\r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8));\r
+       pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc));\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_CoexTable(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      u4Byte                  val0x6c0,\r
+       IN      u4Byte                  val0x6c4,\r
+       IN      u4Byte                  val0x6c8,\r
+       IN      u1Byte                  val0x6cc\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", \r
+               (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\r
+       pCoexDm->curVal0x6c0 = val0x6c0;\r
+       pCoexDm->curVal0x6c4 = val0x6c4;\r
+       pCoexDm->curVal0x6c8 = val0x6c8;\r
+       pCoexDm->curVal0x6cc = val0x6cc;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n", \r
+                       pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n", \r
+                       pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc));\r
+       \r
+               if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\r
+                       (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\r
+                       (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\r
+                       (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\r
+\r
+       pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\r
+       pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\r
+       pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\r
+       pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwIgnoreWlanAct(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bEnable\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[1] ={0};\r
+               \r
+       if(bEnable)\r
+       {\r
+               H2C_Parameter[0] |= BIT0;               // function enable\r
+       }\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n", \r
+               H2C_Parameter[0]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_IgnoreWlanAct(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bEnable\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n", \r
+               (bForceExec? "force to":""), (bEnable? "ON":"OFF")));\r
+       pCoexDm->bCurIgnoreWlanAct = bEnable;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n", \r
+                       pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct));\r
+\r
+               if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\r
+                       return;\r
+       }\r
+       halbtc8821aCsr2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\r
+\r
+       pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetFwPstdma(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  byte1,\r
+       IN      u1Byte                  byte2,\r
+       IN      u1Byte                  byte3,\r
+       IN      u1Byte                  byte4,\r
+       IN      u1Byte                  byte5\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[5] ={0};\r
+\r
+       H2C_Parameter[0] = byte1;       \r
+       H2C_Parameter[1] = byte2;       \r
+       H2C_Parameter[2] = byte3;\r
+       H2C_Parameter[3] = byte4;\r
+       H2C_Parameter[4] = byte5;\r
+\r
+       pCoexDm->psTdmaPara[0] = byte1;\r
+       pCoexDm->psTdmaPara[1] = byte2;\r
+       pCoexDm->psTdmaPara[2] = byte3;\r
+       pCoexDm->psTdmaPara[3] = byte4;\r
+       pCoexDm->psTdmaPara[4] = byte5;\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n", \r
+               H2C_Parameter[0], \r
+               H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SwMechanism1(\r
+       IN      PBTC_COEXIST    pBtCoexist,     \r
+       IN      BOOLEAN         bShrinkRxLPF,\r
+       IN      BOOLEAN         bLowPenaltyRA,\r
+       IN      BOOLEAN         bLimitedDIG, \r
+       IN      BOOLEAN         bBTLNAConstrain\r
+       ) \r
+{\r
+       u4Byte  wifiBw;\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+       \r
+       if(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\r
+       {\r
+               if (bShrinkRxLPF)\r
+                       bShrinkRxLPF = FALSE;\r
+       }\r
+               \r
+        halbtc8821aCsr2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\r
+       halbtc8821aCsr2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\r
+\r
+       //no limited DIG\r
+       //halbtc8821aCsr2ant_SetBtLnaConstrain(pBtCoexist, NORMAL_EXEC, bBTLNAConstrain);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SwMechanism2(\r
+       IN      PBTC_COEXIST    pBtCoexist,     \r
+       IN      BOOLEAN         bAGCTableShift,\r
+       IN      BOOLEAN         bADCBackOff,\r
+       IN      BOOLEAN         bSWDACSwing,\r
+       IN      u4Byte          dacSwingLvl\r
+       ) \r
+{\r
+       //halbtc8821aCsr2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\r
+       halbtc8821aCsr2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\r
+       halbtc8821aCsr2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_SetAntPath(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                          antPosType,\r
+       IN      BOOLEAN                         bInitHwCfg,\r
+       IN      BOOLEAN                         bWifiOff\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u4Byte                          u4Tmp=0;\r
+       u1Byte                          H2C_Parameter[2] ={0};\r
+       \r
+       if(bInitHwCfg)\r
+       {\r
+               // 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\r
+               u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+               u4Tmp &=~BIT23;\r
+               u4Tmp |= BIT24;\r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\r
+\r
+               pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x974, 0x3ff);\r
+               pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\r
+\r
+               if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \r
+               {\r
+                       //tell firmware "antenna inverse"  ==> WRONG firmware antenna control code.==>need fw to fix\r
+                       H2C_Parameter[0] = 1;\r
+                       H2C_Parameter[1] = 1;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
+               }\r
+               else\r
+               {\r
+                       //tell firmware "no antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix\r
+                       H2C_Parameter[0] = 0;\r
+                       H2C_Parameter[1] = 1;\r
+                       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\r
+               }\r
+       }\r
+       \r
+       // ext switch setting\r
+       switch(antPosType)\r
+       {\r
+               case BTC_ANT_WIFI_AT_MAIN:\r
+                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\r
+                       break;\r
+               case BTC_ANT_WIFI_AT_AUX:\r
+                       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\r
+                       break;\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_PsTdma(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bForceExec,\r
+       IN      BOOLEAN                 bTurnOn,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       BOOLEAN                 bTurnOnByCnt=FALSE;\r
+       u1Byte                  psTdmaTypeByCnt=0;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n", \r
+               (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type));\r
+       pCoexDm->bCurPsTdmaOn = bTurnOn;\r
+       pCoexDm->curPsTdma = type;\r
+\r
+       if(!bForceExec)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", \r
+                       pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", \r
+                       pCoexDm->prePsTdma, pCoexDm->curPsTdma));\r
+\r
+               if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\r
+                       (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\r
+                       return;\r
+       }       \r
+       if(bTurnOn)\r
+       {\r
+               switch(type)\r
+               {\r
+                       case 1:\r
+                       default:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               break;\r
+                       case 2:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               break;\r
+                       case 3:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\r
+                               break;\r
+                       case 4:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);\r
+                               break;\r
+                       case 5:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               break;\r
+                       case 6:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               break;\r
+                       case 7:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\r
+                               break;\r
+                       case 8: \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);\r
+                               break;\r
+                       case 9: \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               break;\r
+                       case 10:        \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\r
+                               break;\r
+                       case 11:        \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\r
+                               break;\r
+                       case 12:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\r
+                               break;\r
+                       case 13:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\r
+                               break;\r
+                       case 14:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\r
+                               break;\r
+                       case 15:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\r
+                               break;\r
+                       case 16:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\r
+                               break;\r
+                       case 17:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\r
+                               break;\r
+                       case 18:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\r
+                               break;                  \r
+                       case 19:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\r
+                               break;\r
+                       case 20:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\r
+                               break;\r
+                       case 21:        \r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\r
+                               break;\r
+                       case 71:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\r
+                               break;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // disable PS tdma\r
+               switch(type)\r
+               {\r
+                       case 0:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\r
+                               break;\r
+                       case 1:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\r
+                               break;\r
+                       default:\r
+                               halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\r
+                               break;\r
+               }\r
+       }\r
+\r
+       // update pre state\r
+       pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\r
+       pCoexDm->prePsTdma = pCoexDm->curPsTdma;\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_CoexAllOff(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       // fw all off\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       // sw all off\r
+       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+       // hw all off\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_CoexUnder5G(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\r
+\r
+       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_InitCoexDm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{      \r
+       // force to reset coex mechanism\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\r
+       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);\r
+\r
+       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_BtInquiryPage(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN bLowPwrDisable=TRUE;\r
+       \r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+}\r
+BOOLEAN\r
+halbtc8821aCsr2ant_IsCommonAction(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BOOLEAN                 bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\r
+       BOOLEAN                 bLowPwrDisable=FALSE;\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+\r
+       if(!bWifiConnected && \r
+               BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)\r
+       {\r
+               bLowPwrDisable = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT IPS!!\n"));  \r
+\r
+               \r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               \r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(bWifiConnected && \r
+                       (BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) )\r
+       {               \r
+               bLowPwrDisable = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               if(bWifiBusy)\r
+               {       \r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT IPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT IPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               \r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(!bWifiConnected && \r
+               (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               bLowPwrDisable = TRUE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT LPS!!\n"));          \r
+\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(bWifiConnected && \r
+               (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               bLowPwrDisable = TRUE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+               \r
+               if(bWifiBusy)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT LPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT LPS!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               \r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+\r
+               bCommon = TRUE;\r
+       }\r
+       else if(!bWifiConnected && \r
+                       (BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\r
+       {\r
+               bLowPwrDisable = FALSE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT Busy!!\n")); \r
+\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+               halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               \r
+               bCommon = TRUE;\r
+       }\r
+       else\r
+       {\r
+               bLowPwrDisable = TRUE;\r
+               pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\r
+\r
+               if(bWifiBusy)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT Busy!!\n"));\r
+                       bCommon = FALSE;\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT Busy!!\n"));\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\r
+\r
+                       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+                               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+                       else    \r
+                               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+                       \r
+                       bCommon = TRUE;\r
+               }\r
+\r
+               halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);\r
+       }\r
+       \r
+       return bCommon;\r
+}\r
+VOID\r
+halbtc8821aCsr2ant_TdmaDurationAdjust(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                 bScoHid,\r
+       IN      BOOLEAN                 bTxPause,\r
+       IN      u1Byte                  maxInterval\r
+       )\r
+{\r
+       static s4Byte           up,dn,m,n,WaitCount;\r
+       s4Byte                  result;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\r
+       u1Byte                  retryCount=0;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n"));\r
+\r
+       if(pCoexDm->bResetTdmaAdjust)\r
+       {\r
+               pCoexDm->bResetTdmaAdjust = FALSE;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));\r
+               {\r
+                       if(bScoHid)\r
+                       {\r
+                               if(bTxPause)\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+                                               pCoexDm->psTdmaDuAdjType = 13;  \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;  \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;  \r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+                                               pCoexDm->psTdmaDuAdjType = 9;   \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;  \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(bTxPause)\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                               pCoexDm->psTdmaDuAdjType = 5;   \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;   \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(maxInterval == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+                                               pCoexDm->psTdmaDuAdjType = 1;   \r
+                                       }\r
+                                       else if(maxInterval == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;   \r
+                                       }\r
+                                       else if(maxInterval == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               //============\r
+               up = 0;\r
+               dn = 0;\r
+               m = 1;\r
+               n= 3;\r
+               result = 0;\r
+               WaitCount = 0;\r
+       }\r
+       else\r
+       {\r
+               //accquire the BT TRx retry count from BT_Info byte2\r
+               retryCount = pCoexSta->btRetryCnt;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n", \r
+                       up, dn, m, n, WaitCount));\r
+               result = 0;\r
+               WaitCount++; \r
+                 \r
+               if(retryCount == 0)  // no retry in the last 2-second duration\r
+               {\r
+                       up++;\r
+                       dn--;\r
+\r
+                       if (dn <= 0)\r
+                               dn = 0;                          \r
+\r
+                       if(up >= n)     // if ³sÄò n ­Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration\r
+                       {\r
+                               WaitCount = 0; \r
+                               n = 3;\r
+                               up = 0;\r
+                               dn = 0;\r
+                               result = 1; \r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n"));\r
+                       }\r
+               }\r
+               else if (retryCount <= 3)       // <=3 retry in the last 2-second duration\r
+               {\r
+                       up--; \r
+                       dn++;\r
+\r
+                       if (up <= 0)\r
+                               up = 0;\r
+\r
+                       if (dn == 2)    // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration\r
+                       {\r
+                               if (WaitCount <= 2)\r
+                                       m++; // Á×§K¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^\r
+                               else\r
+                                       m = 1;\r
+\r
+                               if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.\r
+                                       m = 20;\r
+\r
+                               n = 3*m;\r
+                               up = 0;\r
+                               dn = 0;\r
+                               WaitCount = 0;\r
+                               result = -1; \r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));\r
+                       }\r
+               }\r
+               else  //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration\r
+               {\r
+                       if (WaitCount == 1)\r
+                               m++; // Á×§K¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^\r
+                       else\r
+                               m = 1;\r
+\r
+                       if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.\r
+                               m = 20;\r
+\r
+                       n = 3*m;\r
+                       up = 0;\r
+                       dn = 0;\r
+                       WaitCount = 0; \r
+                       result = -1;\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));\r
+               }\r
+\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval));\r
+               if(maxInterval == 1)\r
+               {\r
+                       if(bTxPause)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));\r
+\r
+                               if(pCoexDm->curPsTdma == 71)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                       pCoexDm->psTdmaDuAdjType = 5;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 1)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                       pCoexDm->psTdmaDuAdjType = 5;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 2)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                       pCoexDm->psTdmaDuAdjType = 6;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 3)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 4)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                       pCoexDm->psTdmaDuAdjType = 8;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 9)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+                                       pCoexDm->psTdmaDuAdjType = 13;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 10)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                       pCoexDm->psTdmaDuAdjType = 14;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 11)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 12)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                       pCoexDm->psTdmaDuAdjType = 16;\r
+                               }\r
+                               \r
+                               if(result == -1)\r
+                               {                                       \r
+                                       if(pCoexDm->curPsTdma == 5)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                               pCoexDm->psTdmaDuAdjType = 8;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 13)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                               pCoexDm->psTdmaDuAdjType = 16;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 8)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+                                               pCoexDm->psTdmaDuAdjType = 5;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 16)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+                                               pCoexDm->psTdmaDuAdjType = 13;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));\r
+                               if(pCoexDm->curPsTdma == 5)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\r
+                                       pCoexDm->psTdmaDuAdjType = 71;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 6)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                       pCoexDm->psTdmaDuAdjType = 2;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 7)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 8)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                       pCoexDm->psTdmaDuAdjType = 4;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 13)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+                                       pCoexDm->psTdmaDuAdjType = 9;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 14)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                       pCoexDm->psTdmaDuAdjType = 10;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 15)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 16)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                       pCoexDm->psTdmaDuAdjType = 12;\r
+                               }\r
+                               \r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 71)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+                                               pCoexDm->psTdmaDuAdjType = 1;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                               pCoexDm->psTdmaDuAdjType = 4;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 9)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                               pCoexDm->psTdmaDuAdjType = 12;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 4)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+                                               pCoexDm->psTdmaDuAdjType = 1;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\r
+                                               pCoexDm->psTdmaDuAdjType = 71;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 12)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+                                               pCoexDm->psTdmaDuAdjType = 9;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else if(maxInterval == 2)\r
+               {\r
+                       if(bTxPause)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));\r
+                               if(pCoexDm->curPsTdma == 1)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                       pCoexDm->psTdmaDuAdjType = 6;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 2)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                       pCoexDm->psTdmaDuAdjType = 6;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 3)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 4)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                       pCoexDm->psTdmaDuAdjType = 8;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 9)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                       pCoexDm->psTdmaDuAdjType = 14;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 10)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                       pCoexDm->psTdmaDuAdjType = 14;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 11)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 12)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                       pCoexDm->psTdmaDuAdjType = 16;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 5) \r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                               pCoexDm->psTdmaDuAdjType = 8;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 13)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                               pCoexDm->psTdmaDuAdjType = 16;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 8)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\r
+                                               pCoexDm->psTdmaDuAdjType = 6;\r
+                                       }                                       \r
+                                       else if(pCoexDm->curPsTdma == 16)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+                                               pCoexDm->psTdmaDuAdjType = 14;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));\r
+                               if(pCoexDm->curPsTdma == 5)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                       pCoexDm->psTdmaDuAdjType = 2;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 6)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                       pCoexDm->psTdmaDuAdjType = 2;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 7)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 8)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                       pCoexDm->psTdmaDuAdjType = 4;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 13)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                       pCoexDm->psTdmaDuAdjType = 10;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 14)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                       pCoexDm->psTdmaDuAdjType = 10;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 15)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 16)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                       pCoexDm->psTdmaDuAdjType = 12;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                               pCoexDm->psTdmaDuAdjType = 4;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 9)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                               pCoexDm->psTdmaDuAdjType = 12;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 4)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\r
+                                               pCoexDm->psTdmaDuAdjType = 2;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 12)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+                                               pCoexDm->psTdmaDuAdjType = 10;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else if(maxInterval == 3)\r
+               {\r
+                       if(bTxPause)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));\r
+                               if(pCoexDm->curPsTdma == 1)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 2)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 3)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                       pCoexDm->psTdmaDuAdjType = 7;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 4)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                       pCoexDm->psTdmaDuAdjType = 8;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 9)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 10)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 11)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                       pCoexDm->psTdmaDuAdjType = 15;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 12)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                       pCoexDm->psTdmaDuAdjType = 16;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 5) \r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\r
+                                               pCoexDm->psTdmaDuAdjType = 8;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 13)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\r
+                                               pCoexDm->psTdmaDuAdjType = 16;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 8)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 7)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 6)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\r
+                                               pCoexDm->psTdmaDuAdjType = 7;\r
+                                       }                                       \r
+                                       else if(pCoexDm->curPsTdma == 16)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 15)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 14)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\r
+                                               pCoexDm->psTdmaDuAdjType = 15;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));\r
+                               if(pCoexDm->curPsTdma == 5)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 6)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 7)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                       pCoexDm->psTdmaDuAdjType = 3;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 8)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                       pCoexDm->psTdmaDuAdjType = 4;\r
+                               }\r
+                               if(pCoexDm->curPsTdma == 13)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 14)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 15)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                       pCoexDm->psTdmaDuAdjType = 11;\r
+                               }\r
+                               else if(pCoexDm->curPsTdma == 16)\r
+                               {\r
+                                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                       pCoexDm->psTdmaDuAdjType = 12;\r
+                               }\r
+                               if(result == -1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 1)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\r
+                                               pCoexDm->psTdmaDuAdjType = 4;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 9)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\r
+                                               pCoexDm->psTdmaDuAdjType = 12;\r
+                                       }\r
+                               } \r
+                               else if (result == 1)\r
+                               {\r
+                                       if(pCoexDm->curPsTdma == 4)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 3)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 2)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\r
+                                               pCoexDm->psTdmaDuAdjType = 3;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 12)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 11)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                                       else if(pCoexDm->curPsTdma == 10)\r
+                                       {\r
+                                               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\r
+                                               pCoexDm->psTdmaDuAdjType = 11;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // if current PsTdma not match with the recorded one (when scan, dhcp...), \r
+       // then we have to adjust it back to the previous record one.\r
+       if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\r
+       {\r
+               BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", \r
+                       pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\r
+\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
+               \r
+               if( !bScan && !bLink && !bRoam)\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));\r
+               }\r
+       }\r
+\r
+       // when halbtc8821aCsr2ant_TdmaDurationAdjust() is called, fw dac swing is included in the function.\r
+       //if(pCoexDm->psTdmaDuAdjType == 71)\r
+       //      halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xc); //Skip because A2DP get worse at HT40\r
+       //else\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x6);\r
+}\r
+\r
+// SCO only or SCO+PAN(HS)\r
+VOID\r
+halbtc8821aCsr2ant_ActionSco(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte  wifiRssiState,btRssiState;\r
+       u4Byte  wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+       else  //for SCO quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+       \r
+               // fw mechanism\r
+               //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);                      \r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                       halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);     \r
+               }               \r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+}\r
+\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionHid(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte  wifiRssiState, btRssiState;     \r
+       u4Byte  wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }       \r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+}\r
+\r
+//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\r
+VOID\r
+halbtc8821aCsr2ant_ActionA2dp(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       //fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()\r
+       //halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+       \r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionA2dpPanHs(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2,35, 0);\r
+\r
+       //fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()\r
+       //halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if(btInfoExt&BIT0)      //a2dp basic rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\r
+               }\r
+               else                            //a2dp edr rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if(btInfoExt&BIT0)      //a2dp basic rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\r
+               }\r
+               else                            //a2dp edr rate\r
+               {\r
+                       halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }               \r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanEdr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+\r
+//PAN(HS) only\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanHs(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               }\r
+               halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+               }\r
+\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+//PAN(EDR)+A2DP\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanEdrA2dp(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               };\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionPanEdrHid(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState;\r
+       u4Byte          wifiBw;\r
+\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       { \r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); \r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); \r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+// HID+A2DP+PAN(EDR)\r
+VOID\r
+halbtc8821aCsr2ant_ActionHidA2dpPanEdr(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_ActionHidA2dp(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       u1Byte          wifiRssiState, btRssiState, btInfoExt;\r
+       u4Byte          wifiBw;\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\r
+       btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\r
+\r
+       if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\r
+       else    \r
+               halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+\r
+       if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\r
+       {\r
+//Allen                halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+               halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);\r
+       }\r
+       else  //for HID quality & wifi performance balance at 11n mode\r
+       {\r
+//Allen                halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\r
+                       halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);\r
+\r
+       }\r
+\r
+       if(BTC_WIFI_BW_HT40 == wifiBw)\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+               \r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               // fw mechanism\r
+               if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+//                             halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+//Allen                                halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(btInfoExt&BIT0)      //a2dp basic rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+                       else                            //a2dp edr rate\r
+                       {\r
+                               halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\r
+                       }\r
+               }\r
+\r
+               // sw mechanism\r
+               if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\r
+                       (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\r
+               }\r
+               else\r
+               {\r
+                        halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\r
+                        halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\r
+               }\r
+       }\r
+}\r
+\r
+VOID\r
+halbtc8821aCsr2ant_RunCoexistMechanism(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+       BOOLEAN                         bWifiUnder5G=FALSE;\r
+       u1Byte                          btInfoOriginal=0, btRetryCnt=0;\r
+       u1Byte                          algorithm=0;\r
+\r
+       if(pBtCoexist->bManualControl)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Manual control!!!\n"));\r
+               return;\r
+       }\r
+       \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
+\r
+       if(bWifiUnder5G)\r
+       {\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n"));\r
+               halbtc8821aCsr2ant_CoexUnder5G(pBtCoexist);\r
+               return;\r
+       }\r
+\r
+       if(pStackInfo->bProfileNotified)\r
+       {\r
+               algorithm = halbtc8821aCsr2ant_ActionAlgorithm(pBtCoexist);\r
+               if(pCoexSta->bC2hBtInquiryPage && (BT_8821A_CSR_2ANT_COEX_ALGO_PANHS!=algorithm))\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n"));\r
+                       halbtc8821aCsr2ant_BtInquiryPage(pBtCoexist);\r
+                       return;\r
+               }\r
+\r
+               pCoexDm->curAlgorithm = algorithm;\r
+               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm));\r
+\r
+               if(halbtc8821aCsr2ant_IsCommonAction(pBtCoexist))\r
+               {\r
+                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n"));\r
+                       pCoexDm->bResetTdmaAdjust = TRUE;\r
+               }\r
+               else\r
+               {\r
+                       if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\r
+                       {\r
+                               BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n", \r
+                                       pCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\r
+                               pCoexDm->bResetTdmaAdjust = TRUE;\r
+                       }\r
+                       switch(pCoexDm->curAlgorithm)\r
+                       {\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_SCO:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n"));\r
+                                       halbtc8821aCsr2ant_ActionSco(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_HID:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n"));\r
+                                       halbtc8821aCsr2ant_ActionHid(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n"));\r
+                                       halbtc8821aCsr2ant_ActionA2dp(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n"));\r
+                                       halbtc8821aCsr2ant_ActionA2dpPanHs(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanEdr(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANHS:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanHs(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanEdrA2dp(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));\r
+                                       halbtc8821aCsr2ant_ActionPanEdrHid(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));\r
+                                       halbtc8821aCsr2ant_ActionHidA2dpPanEdr(pBtCoexist);\r
+                                       break;\r
+                               case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n"));\r
+                                       halbtc8821aCsr2ant_ActionHidA2dp(pBtCoexist);\r
+                                       break;\r
+                               default:\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n"));\r
+                                       halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\r
+                                       break;\r
+                       }\r
+                       pCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\r
+               }\r
+       }\r
+       else\r
+       {       // stack doesn't notify profile info.\r
+               // use the following profile info from bt fw.\r
+               //pCoexSta->bBtLinkExist\r
+               //pCoexSta->bScoExist\r
+               //pCoexSta->bA2dpExist\r
+               //pCoexSta->bHidExist\r
+               //pCoexSta->bPanExist\r
+}\r
+}\r
+\r
+\r
+\r
+//============================================================\r
+// work around function start with wa_halbtc8821aCsr2ant_\r
+//============================================================\r
+//============================================================\r
+// extern function start with EXhalbtc8821aCsr2ant_\r
+//============================================================\r
+VOID\r
+EXhalbtc8821aCsr2ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       u4Byte  u4Tmp=0;\r
+       u2Byte                          u2Tmp=0;\r
+       u1Byte  u1Tmp=0;\r
+       u1Byte                          H2C_Parameter[2] ={0};\r
+               \r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));\r
+\r
+       // backup rf 0x1e value\r
+       pCoexDm->btRf0x1eBackup = \r
+               pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\r
+\r
+       // 0x790[5:0]=0x5\r
+       u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\r
+       u1Tmp &= 0xc0;\r
+       u1Tmp |= 0x5;\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\r
+       \r
+       //Antenna config\r
+       halbtc8821aCsr2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\r
+\r
+       // PTA parameter\r
+       halbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\r
+       \r
+       // Enable counter statistics\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\r
+       pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\r
+       pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitCoexDm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n"));\r
+       \r
+       halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_DisplayCoexInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       )\r
+{\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+       pu1Byte                         cliBuf=pBtCoexist->cliBuf;\r
+       u1Byte                          u1Tmp[4], i, btInfoExt, psTdmaCase=0;\r
+       u4Byte                          u4Tmp[4];\r
+       BOOLEAN                         bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;\r
+       BOOLEAN                         bBtHsOn=FALSE, bWifiBusy=FALSE;\r
+       s4Byte                          wifiRssi=0, btHsRssi=0;\r
+       u4Byte                          wifiBw, wifiTrafficDir;\r
+       u1Byte                          wifiDot11Chnl, wifiHsChnl;\r
+       u4Byte                          fwVer=0, btPatchVer=0;\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \\r
+               pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\r
+       CL_PRINTF(cliBuf);      \r
+       \r
+       if(pBtCoexist->bManualControl)\r
+       {\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!");\r
+               CL_PRINTF(cliBuf);\r
+       }\r
+       \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \\r
+               ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \\r
+               GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsMode(HsChnl)", \\r
+               wifiDot11Chnl, bBtHsOn, wifiHsChnl);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \\r
+               pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\r
+               pCoexDm->wifiChnlInfo[2]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \\r
+               wifiRssi, btHsRssi);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \\r
+               bLink, bRoam, bScan);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \\r
+               (bWifiUnder5G? "5G":"2.4G"),\r
+               ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),\r
+               ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \\r
+               ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? "idle":(  (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy"))),\r
+               pCoexSta->btRssi, pCoexSta->btRetryCnt);\r
+       CL_PRINTF(cliBuf);\r
+       \r
+       if(pStackInfo->bProfileNotified)\r
+       {                       \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \\r
+                       pStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\r
+               CL_PRINTF(cliBuf);      \r
+\r
+               pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\r
+       }\r
+\r
+       btInfoExt = pCoexSta->btInfoExt;\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \\r
+               (btInfoExt&BIT0)? "Basic rate":"EDR rate");\r
+       CL_PRINTF(cliBuf);      \r
+\r
+       for(i=0; i<BT_INFO_SRC_8821A_CSR_2ANT_MAX; i++)\r
+       {\r
+               if(pCoexSta->btInfoC2hCnt[i])\r
+               {                               \r
+                       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8821aCsr2Ant[i], \\r
+                               pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\r
+                               pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\r
+                               pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\r
+                               pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\r
+                       CL_PRINTF(cliBuf);\r
+               }\r
+       }\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \\r
+               ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),\r
+               ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")));\r
+       CL_PRINTF(cliBuf);\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);\r
+\r
+       // Sw mechanism \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");\r
+       CL_PRINTF(cliBuf);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \\r
+               pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\r
+       CL_PRINTF(cliBuf);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \\r
+               pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       // Fw mechanism         \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============");\r
+       CL_PRINTF(cliBuf);      \r
+       \r
+       if(!pBtCoexist->bManualControl)\r
+       {\r
+               psTdmaCase = pCoexDm->curPsTdma;\r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA", \\r
+                       pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\r
+                       pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\r
+                       pCoexDm->psTdmaPara[4], psTdmaCase);\r
+               CL_PRINTF(cliBuf);\r
+       \r
+               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \\r
+                       pCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);\r
+               CL_PRINTF(cliBuf);\r
+       }\r
+\r
+       // Hw setting           \r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============");\r
+       CL_PRINTF(cliBuf);      \r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \\r
+               pCoexDm->btRf0x1eBackup);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x ", "0x778 (W_Act)/ 0x6cc (CoTab Sel)", \\r
+               u1Tmp[0], u1Tmp[1]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x8db(ADC)/0xc5b[29:25](DAC)", \\r
+               ((u1Tmp[0]&0x60)>>5), ((u1Tmp[1]&0x3e)>>1));\r
+       CL_PRINTF(cliBuf); \r
+       \r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)", \\r
+               u4Tmp[0]&0xff, ((u4Tmp[0]&0x30000000)>>28));\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\r
+       u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x974);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x40/ 0x4c[24:23]/ 0x974", \\r
+               u1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u4Tmp[1]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \\r
+               u4Tmp[0], u1Tmp[0]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa0a);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xc50(DIG)/0xa0a(CCK-TH)", \\r
+               u4Tmp[0], u1Tmp[0]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48);\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\r
+       u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA", \\r
+               u4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1]  );\r
+       CL_PRINTF(cliBuf);\r
+\r
+       u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\r
+       u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\r
+       u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8", \\r
+               u4Tmp[0], u4Tmp[1], u4Tmp[2]);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770 (hi-pri Rx/Tx)", \\r
+               pCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\r
+       CL_PRINTF(cliBuf);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(low-pri Rx/Tx)", \\r
+               pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\r
+       CL_PRINTF(cliBuf);\r
+\r
+       // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang\r
+       u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x41b);\r
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (mgntQ hang chk == 0xf)", \\r
+               u1Tmp[0]);\r
+       CL_PRINTF(cliBuf);      \r
+\r
+       pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\r
+}\r
+\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_IpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_IPS_ENTER == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));\r
+               pCoexSta->bUnderIps = TRUE;\r
+               halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\r
+       }\r
+       else if(BTC_IPS_LEAVE == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));\r
+               pCoexSta->bUnderIps = FALSE;\r
+               //halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_LpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_LPS_ENABLE == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n"));\r
+               pCoexSta->bUnderLps = TRUE;\r
+       }\r
+       else if(BTC_LPS_DISABLE == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n"));\r
+               pCoexSta->bUnderLps = FALSE;\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_ScanNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_SCAN_START == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));\r
+       }\r
+       else if(BTC_SCAN_FINISH == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_ConnectNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       )\r
+{\r
+       if(BTC_ASSOCIATE_START == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));\r
+       }\r
+       else if(BTC_ASSOCIATE_FINISH == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_MediaStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       u1Byte                  H2C_Parameter[3] ={0};\r
+       u4Byte                  wifiBw;\r
+       u1Byte                  wifiCentralChnl;\r
+\r
+       if(BTC_MEDIA_CONNECT == type)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));\r
+       }\r
+       else\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));\r
+       }\r
+\r
+       // only 2.4G we need to inform bt the chnl mask\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\r
+       if( (BTC_MEDIA_CONNECT == type) &&\r
+               (wifiCentralChnl <= 14) )\r
+       {\r
+               H2C_Parameter[0] = 0x1;\r
+               H2C_Parameter[1] = wifiCentralChnl;\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\r
+               if(BTC_WIFI_BW_HT40 == wifiBw)\r
+                       H2C_Parameter[2] = 0x30;\r
+               else\r
+                       H2C_Parameter[2] = 0x20;\r
+       }\r
+                       \r
+       pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\r
+       pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\r
+       pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\r
+       \r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n", \r
+               H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\r
+\r
+       pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_SpecialPacketNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       )\r
+{\r
+       if(type == BTC_PACKET_DHCP)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_BtInfoNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      pu1Byte                 tmpBuf,\r
+       IN      u1Byte                  length\r
+       )\r
+{\r
+       u1Byte                  btInfo=0;\r
+       u1Byte                  i, rspSource=0;\r
+       BOOLEAN                 bBtBusy=FALSE, bLimitedDig=FALSE;\r
+       BOOLEAN                 bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;\r
+\r
+       pCoexSta->bC2hBtInfoReqSent = FALSE;\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\r
+\r
+       rspSource = tmpBuf[0]&0xf;\r
+       if(rspSource >= BT_INFO_SRC_8821A_CSR_2ANT_MAX)\r
+               rspSource = BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW;\r
+       pCoexSta->btInfoC2hCnt[rspSource]++;\r
+\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length));\r
+       for(i=0; i<length; i++)\r
+       {\r
+               pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\r
+               if(i == 1)\r
+                       btInfo = tmpBuf[i];\r
+               if(i == length-1)\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));\r
+               }\r
+               else\r
+               {\r
+                       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));\r
+               }\r
+       }\r
+\r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\r
+       if(BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW != rspSource)\r
+       {\r
+               pCoexSta->btRetryCnt =  // [3:0]\r
+                       pCoexSta->btInfoC2h[rspSource][2]&0xf;\r
+\r
+               pCoexSta->btRssi =\r
+                       pCoexSta->btInfoC2h[rspSource][3]*2+10;\r
+\r
+               pCoexSta->btInfoExt = \r
+                       pCoexSta->btInfoC2h[rspSource][4];\r
+               \r
+               // Here we need to resend some wifi info to BT\r
+               // because bt is reset and loss of the info.\r
+               if( (pCoexSta->btInfoExt & BIT1) )\r
+               {                       \r
+                       \r
+                       if(bWifiConnected)\r
+                       {\r
+                               EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\r
+                       }\r
+                       else\r
+                       {\r
+                               EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+                       }\r
+               }\r
+\r
+               if(!pBtCoexist->bManualControl && !bWifiUnder5G)\r
+               {\r
+                       if( (pCoexSta->btInfoExt&BIT3) )\r
+                       {\r
+                               if(bWifiConnected)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));\r
+                                       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               // BT already NOT ignore Wlan active, do nothing here.\r
+                               if(!bWifiConnected)\r
+                               {\r
+                                       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n"));\r
+                                       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if( (pCoexSta->btInfoExt & BIT4) )\r
+               {\r
+                       // BT auto report already enabled, do nothing\r
+               }\r
+               else\r
+               {\r
+                       halbtc8821aCsr2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\r
+               }\r
+       }\r
+               \r
+       pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\r
+       // check BIT2 first ==> check if bt is under inquiry or page scan\r
+       if(btInfo & BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE)\r
+       {\r
+               pCoexSta->bC2hBtInquiryPage = TRUE;\r
+               pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\r
+       }\r
+       else\r
+       {\r
+               pCoexSta->bC2hBtInquiryPage = FALSE;\r
+               if(btInfo == 0x1)       // connection exists but no busy\r
+               {\r
+                       pCoexSta->bBtLinkExist = TRUE;\r
+                       pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE;\r
+               }\r
+               else if(btInfo & BT_INFO_8821A_CSR_2ANT_B_CONNECTION)   // connection exists and some link is busy\r
+               {\r
+                       pCoexSta->bBtLinkExist = TRUE;\r
+                       if(btInfo & BT_INFO_8821A_CSR_2ANT_B_FTP)\r
+                               pCoexSta->bPanExist = TRUE;\r
+                       else\r
+                               pCoexSta->bPanExist = FALSE;\r
+                       if(btInfo & BT_INFO_8821A_CSR_2ANT_B_A2DP)\r
+                               pCoexSta->bA2dpExist = TRUE;\r
+                       else\r
+                               pCoexSta->bA2dpExist = FALSE;\r
+                       if(btInfo & BT_INFO_8821A_CSR_2ANT_B_HID)\r
+                               pCoexSta->bHidExist = TRUE;\r
+                       else\r
+                               pCoexSta->bHidExist = FALSE;\r
+                       if(btInfo & BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO)\r
+                               pCoexSta->bScoExist = TRUE;\r
+                       else\r
+                               pCoexSta->bScoExist = FALSE;\r
+                       pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\r
+               }\r
+               else\r
+               {\r
+                       pCoexSta->bBtLinkExist = FALSE;\r
+                       pCoexSta->bPanExist = FALSE;\r
+                       pCoexSta->bA2dpExist = FALSE;\r
+                       pCoexSta->bHidExist = FALSE;\r
+                       pCoexSta->bScoExist = FALSE;\r
+                       pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_IDLE;\r
+               }\r
+\r
+               if(bBtHsOn)\r
+               {\r
+                       pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\r
+               }\r
+       }\r
+\r
+       if(BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus)\r
+       {\r
+               bBtBusy = TRUE;\r
+       }\r
+       else\r
+       {\r
+               bBtBusy = FALSE;\r
+       }\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\r
+\r
+       if(BT_8821A_CSR_2ANT_BT_STATUS_IDLE != pCoexDm->btStatus)\r
+       {\r
+               bLimitedDig = TRUE;\r
+       }\r
+       else\r
+       {\r
+               bLimitedDig = FALSE;\r
+       }\r
+       pCoexDm->bLimitedDig = bLimitedDig;\r
+       pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\r
+\r
+       halbtc8821aCsr2ant_RunCoexistMechanism(pBtCoexist);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_HaltNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));\r
+\r
+       halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+       EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       )\r
+{\r
+       BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));\r
+\r
+       if(BTC_WIFI_PNP_SLEEP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));\r
+               halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\r
+       }\r
+       else if(BTC_WIFI_PNP_WAKE_UP == pnpState)\r
+       {\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));\r
+       }\r
+}\r
+\r
+VOID\r
+EXhalbtc8821aCsr2ant_Periodical(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       )\r
+{\r
+       static u1Byte           disVerInfoCnt=0;\r
+       u4Byte                          fwVer=0, btPatchVer=0;\r
+       PBTC_BOARD_INFO         pBoardInfo=&pBtCoexist->boardInfo;\r
+       PBTC_STACK_INFO         pStackInfo=&pBtCoexist->stackInfo;\r
+\r
+       BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n"));\r
+\r
+       if(disVerInfoCnt <= 5)\r
+       {\r
+               disVerInfoCnt += 1;\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \\r
+                       pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \\r
+                       ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion));\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\r
+               pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \\r
+                       GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer));\r
+               BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));\r
+       }\r
+\r
+       halbtc8821aCsr2ant_QueryBtInfo(pBtCoexist);\r
+       halbtc8821aCsr2ant_MonitorBtCtr(pBtCoexist);\r
+       halbtc8821aCsr2ant_MonitorBtEnableDisable(pBtCoexist);\r
+}\r
+\r
+\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h
new file mode 100755 (executable)
index 0000000..6e429bb
--- /dev/null
@@ -0,0 +1,186 @@
+//===========================================\r
+// The following is for 8821A_CSR 2Ant BT Co-exist definition\r
+//===========================================\r
+#define        BT_INFO_8821A_CSR_2ANT_B_FTP                                            BIT7\r
+#define        BT_INFO_8821A_CSR_2ANT_B_A2DP                                   BIT6\r
+#define        BT_INFO_8821A_CSR_2ANT_B_HID                                            BIT5\r
+#define        BT_INFO_8821A_CSR_2ANT_B_SCO_BUSY                               BIT4\r
+#define        BT_INFO_8821A_CSR_2ANT_B_ACL_BUSY                               BIT3\r
+#define        BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE                               BIT2\r
+#define        BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO                               BIT1\r
+#define        BT_INFO_8821A_CSR_2ANT_B_CONNECTION                             BIT0\r
+\r
+#define                BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT         2\r
+\r
+typedef enum _BT_INFO_SRC_8821A_CSR_2ANT{\r
+       BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW                      = 0x0,\r
+       BT_INFO_SRC_8821A_CSR_2ANT_BT_RSP                               = 0x1,\r
+       BT_INFO_SRC_8821A_CSR_2ANT_BT_ACTIVE_SEND               = 0x2,\r
+       BT_INFO_SRC_8821A_CSR_2ANT_MAX\r
+}BT_INFO_SRC_8821A_CSR_2ANT,*PBT_INFO_SRC_8821A_CSR_2ANT;\r
+\r
+typedef enum _BT_8821A_CSR_2ANT_BT_STATUS{\r
+       BT_8821A_CSR_2ANT_BT_STATUS_IDLE                                = 0x0,\r
+       BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE      = 0x1,\r
+       BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE                    = 0x2,\r
+       BT_8821A_CSR_2ANT_BT_STATUS_MAX\r
+}BT_8821A_CSR_2ANT_BT_STATUS,*PBT_8821A_CSR_2ANT_BT_STATUS;\r
+\r
+typedef enum _BT_8821A_CSR_2ANT_COEX_ALGO{\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED                   = 0x0,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_SCO                         = 0x1,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_HID                         = 0x2,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_A2DP                                = 0x3,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS          = 0x4,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR                      = 0x5,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANHS                       = 0x6,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP         = 0x7,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID          = 0x8,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR     = 0x9,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP                    = 0xa,\r
+       BT_8821A_CSR_2ANT_COEX_ALGO_MAX                         = 0xb,\r
+}BT_8821A_CSR_2ANT_COEX_ALGO,*PBT_8821A_CSR_2ANT_COEX_ALGO;\r
+\r
+typedef struct _COEX_DM_8821A_CSR_2ANT{\r
+       // fw mechanism\r
+       BOOLEAN         bPreDecBtPwr;\r
+       BOOLEAN         bCurDecBtPwr;\r
+       u1Byte          preFwDacSwingLvl;\r
+       u1Byte          curFwDacSwingLvl;\r
+       BOOLEAN         bCurIgnoreWlanAct;\r
+       BOOLEAN         bPreIgnoreWlanAct;\r
+       u1Byte          prePsTdma;\r
+       u1Byte          curPsTdma;\r
+       u1Byte          psTdmaPara[5];\r
+       u1Byte          psTdmaDuAdjType;\r
+       BOOLEAN         bResetTdmaAdjust;\r
+       BOOLEAN         bPrePsTdmaOn;\r
+       BOOLEAN         bCurPsTdmaOn;\r
+       BOOLEAN         bPreBtAutoReport;\r
+       BOOLEAN         bCurBtAutoReport;\r
+\r
+       // sw mechanism\r
+       BOOLEAN         bPreRfRxLpfShrink;\r
+       BOOLEAN         bCurRfRxLpfShrink;\r
+       u4Byte          btRf0x1eBackup;\r
+       BOOLEAN         bPreLowPenaltyRa;\r
+       BOOLEAN         bCurLowPenaltyRa;\r
+       BOOLEAN         bPreDacSwingOn;\r
+       u4Byte          preDacSwingLvl;\r
+       BOOLEAN         bCurDacSwingOn;\r
+       u4Byte          curDacSwingLvl;\r
+       BOOLEAN         bPreAdcBackOff;\r
+       BOOLEAN         bCurAdcBackOff;\r
+       BOOLEAN         bPreAgcTableEn;\r
+       BOOLEAN         bCurAgcTableEn;\r
+       u4Byte          preVal0x6c0;\r
+       u4Byte          curVal0x6c0;\r
+       u4Byte          preVal0x6c4;\r
+       u4Byte          curVal0x6c4;\r
+       u4Byte          preVal0x6c8;\r
+       u4Byte          curVal0x6c8;\r
+       u1Byte          preVal0x6cc;\r
+       u1Byte          curVal0x6cc;\r
+       BOOLEAN         bLimitedDig;\r
+\r
+       // algorithm related\r
+       u1Byte          preAlgorithm;\r
+       u1Byte          curAlgorithm;\r
+       u1Byte          btStatus;\r
+       u1Byte          wifiChnlInfo[3];\r
+} COEX_DM_8821A_CSR_2ANT, *PCOEX_DM_8821A_CSR_2ANT;\r
+\r
+typedef struct _COEX_STA_8821A_CSR_2ANT{\r
+       BOOLEAN                                 bBtLinkExist;\r
+       BOOLEAN                                 bScoExist;\r
+       BOOLEAN                                 bA2dpExist;\r
+       BOOLEAN                                 bHidExist;\r
+       BOOLEAN                                 bPanExist;\r
+\r
+       BOOLEAN                                 bUnderLps;\r
+       BOOLEAN                                 bUnderIps;\r
+       u4Byte                                  highPriorityTx;\r
+       u4Byte                                  highPriorityRx;\r
+       u4Byte                                  lowPriorityTx;\r
+       u4Byte                                  lowPriorityRx;\r
+       u1Byte                                  btRssi;\r
+       u1Byte                                  preBtRssiState;\r
+       u1Byte                                  preWifiRssiState[4];\r
+       BOOLEAN                                 bC2hBtInfoReqSent;\r
+       u1Byte                                  btInfoC2h[BT_INFO_SRC_8821A_CSR_2ANT_MAX][10];\r
+       u4Byte                                  btInfoC2hCnt[BT_INFO_SRC_8821A_CSR_2ANT_MAX];\r
+       BOOLEAN                                 bC2hBtInquiryPage;\r
+       u1Byte                                  btRetryCnt;\r
+       u1Byte                                  btInfoExt;\r
+}COEX_STA_8821A_CSR_2ANT, *PCOEX_STA_8821A_CSR_2ANT;\r
+\r
+//===========================================\r
+// The following is interface which will notify coex module.\r
+//===========================================\r
+VOID\r
+EXhalbtc8821aCsr2ant_PowerOnSetting(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_InitCoexDm(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_IpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_LpsNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_ScanNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_ConnectNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                  type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_MediaStatusNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_SpecialPacketNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          type\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_BtInfoNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      pu1Byte                 tmpBuf,\r
+       IN      u1Byte                  length\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_HaltNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_PnpNotify(\r
+       IN      PBTC_COEXIST                    pBtCoexist,\r
+       IN      u1Byte                          pnpState\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_Periodical(\r
+       IN      PBTC_COEXIST                    pBtCoexist\r
+       );\r
+VOID\r
+EXhalbtc8821aCsr2ant_DisplayCoexInfo(\r
+       IN      PBTC_COEXIST            pBtCoexist\r
+       );\r
+\r
index 73b0baf746db78b54607cbab8aa05fe1d686d56a..83903794d0810b2d2d10ac90e15aabe5cd8d18dc 100755 (executable)
@@ -4,6 +4,9 @@
 #define                NORMAL_EXEC                                     FALSE\r
 #define                FORCE_EXEC                                              TRUE\r
 \r
+#define                BTC_RF_OFF                                      0x0\r
+#define                BTC_RF_ON                                       0x1\r
+\r
 #define                BTC_RF_A                                        0x0\r
 #define                BTC_RF_B                                        0x1\r
 #define                BTC_RF_C                                        0x2\r
@@ -42,6 +45,15 @@ typedef enum _BTC_POWERSAVE_TYPE{
        BTC_PS_MAX\r
 } BTC_POWERSAVE_TYPE, *PBTC_POWERSAVE_TYPE;\r
 \r
+typedef enum _BTC_BT_REG_TYPE{\r
+       BTC_BT_REG_RF                                           = 0,\r
+       BTC_BT_REG_MODEM                                        = 1,\r
+       BTC_BT_REG_BLUEWIZE                                     = 2,\r
+       BTC_BT_REG_VENDOR                                       = 3,\r
+       BTC_BT_REG_LE                                           = 4,\r
+       BTC_BT_REG_MAX\r
+} BTC_BT_REG_TYPE, *PBTC_BT_REG_TYPE;\r
+\r
 typedef enum _BTC_CHIP_INTERFACE{\r
        BTC_INTF_UNKNOWN        = 0,\r
        BTC_INTF_PCI                    = 1,\r
@@ -156,7 +168,8 @@ typedef struct _BTC_BOARD_INFO{
        u1Byte                          pgAntNum;       // pg ant number\r
        u1Byte                          btdmAntNum;     // ant number for btdm\r
        u1Byte                          btdmAntPos;             //Bryant Add to indicate Antenna Position for (pgAntNum = 2) && (btdmAntNum =1)  (DPDT+1Ant case)\r
-       BOOLEAN                         bBtExist;\r
+       u1Byte                          singleAntPath;  // current used for 8723b only, 1=>s0,  0=>s1\r
+       //BOOLEAN                               bBtExist;\r
 } BTC_BOARD_INFO, *PBTC_BOARD_INFO;\r
 \r
 typedef enum _BTC_DBG_OPCODE{\r
@@ -209,6 +222,17 @@ typedef enum _BTC_WIFI_PNP{
        BTC_WIFI_PNP_MAX\r
 }BTC_WIFI_PNP,*PBTC_WIFI_PNP;\r
 \r
+//for 8723b-d cut large current issue\r
+typedef enum _BT_WIFI_COEX_STATE{\r
+       BTC_WIFI_STAT_INIT,\r
+       BTC_WIFI_STAT_IQK,\r
+       BTC_WIFI_STAT_NORMAL_OFF,\r
+       BTC_WIFI_STAT_MP_OFF,\r
+       BTC_WIFI_STAT_NORMAL,\r
+       BTC_WIFI_STAT_ANT_DIV,\r
+       BTC_WIFI_STAT_MAX\r
+}BT_WIFI_COEX_STATE,*PBT_WIFI_COEX_STATE;\r
+\r
 // defined for BFP_BTC_GET\r
 typedef enum _BTC_GET_TYPE{\r
        // type BOOLEAN\r
@@ -225,6 +249,7 @@ typedef enum _BTC_GET_TYPE{
        BTC_GET_BL_WIFI_ENABLE_ENCRYPTION,\r
        BTC_GET_BL_WIFI_UNDER_B_MODE,\r
        BTC_GET_BL_EXT_SWITCH,\r
+       BTC_GET_BL_WIFI_IS_IN_MP_MODE,\r
 \r
        // type s4Byte\r
        BTC_GET_S4_WIFI_RSSI,\r
@@ -260,6 +285,7 @@ typedef enum _BTC_SET_TYPE{
        BTC_SET_BL_TO_REJ_AP_AGG_PKT,\r
        BTC_SET_BL_BT_CTRL_AGG_SIZE,\r
        BTC_SET_BL_INC_SCAN_DEV_NUM,\r
+       BTC_SET_BL_BT_TX_RX_MASK,\r
 \r
        // type u1Byte\r
        BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,\r
@@ -285,6 +311,7 @@ typedef enum _BTC_SET_TYPE{
        // BT Coex related\r
        BTC_SET_ACT_CTRL_BT_INFO,\r
        BTC_SET_ACT_CTRL_BT_COEX,\r
+       BTC_SET_ACT_CTRL_8723B_ANT,\r
        //=================\r
        BTC_SET_MAX\r
 }BTC_SET_TYPE,*PBTC_SET_TYPE;\r
@@ -382,6 +409,12 @@ typedef VOID
        IN      u4Byte                  Data\r
        );\r
 typedef VOID\r
+(*BFP_BTC_LOCAL_REG_W1)(\r
+       IN      PVOID                   pBtcContext,\r
+       IN      u4Byte                  RegAddr,\r
+       IN      u1Byte                  Data\r
+       );\r
+typedef VOID\r
 (*BFP_BTC_SET_BB_REG)(\r
        IN      PVOID                   pBtcContext,\r
        IN      u4Byte                  RegAddr,\r
@@ -410,13 +443,6 @@ typedef u4Byte
        IN      u4Byte                  BitMask\r
        );\r
 typedef VOID\r
-(*BFP_BTC_SET_BT_REG)( \r
-       IN      PVOID                   pBtcContext,\r
-       IN      u1Byte                  RegType,\r
-       IN      u4Byte                  RegAddr,\r
-       IN      u4Byte                  Data\r
-       );\r
-typedef VOID\r
 (*BFP_BTC_FILL_H2C)(\r
        IN      PVOID                   pBtcContext,\r
        IN      u1Byte                  elementId,\r
@@ -438,6 +464,19 @@ typedef    BOOLEAN
        OUT     PVOID                   pInBuf\r
        );\r
 typedef VOID\r
+(*BFP_BTC_SET_BT_REG)(\r
+       IN      PVOID                   pBtcContext,\r
+       IN      u1Byte                  regType,\r
+       IN      u4Byte                  offset,\r
+       IN      u4Byte                  value\r
+       );\r
+typedef u4Byte \r
+(*BFP_BTC_GET_BT_REG)(\r
+       IN      PVOID                   pBtcContext,\r
+       IN      u1Byte                  regType,\r
+       IN      u4Byte                  offset\r
+       );\r
+typedef VOID\r
 (*BFP_BTC_DISP_DBG_MSG)(\r
        IN      PVOID                   pBtCoexist,\r
        IN      u1Byte                  dispType\r
@@ -451,6 +490,7 @@ typedef struct _BTC_BT_INFO{
        BOOLEAN                                 bBtCtrlAggBufSize;\r
        BOOLEAN                                 bRejectAggPkt;\r
        BOOLEAN                                 bIncreaseScanDevNum;\r
+       BOOLEAN                                 bBtTxRxMask;\r
        u1Byte                                  preAggBufSize;\r
        u1Byte                                  aggBufSize;\r
        BOOLEAN                                 bBtBusy;\r
@@ -458,6 +498,7 @@ typedef struct _BTC_BT_INFO{
        u2Byte                                  btHciVer;\r
        u2Byte                                  btRealFwVer;\r
        u1Byte                                  btFwVer;\r
+       u4Byte                                  getBtFwVerCnt;\r
 \r
        BOOLEAN                                 bBtDisableLowPwr;\r
 \r
@@ -494,10 +535,12 @@ typedef struct _BTC_BT_LINK_INFO{
        BOOLEAN                                 bHidOnly;\r
        BOOLEAN                                 bPanExist;\r
        BOOLEAN                                 bPanOnly;\r
+       BOOLEAN                                 bSlaveRole;\r
 } BTC_BT_LINK_INFO, *PBTC_BT_LINK_INFO;\r
 \r
 typedef struct _BTC_STATISTICS{\r
        u4Byte                                  cntBind;\r
+       u4Byte                                  cntPowerOn;\r
        u4Byte                                  cntInitHwConfig;\r
        u4Byte                                  cntInitCoexDm;\r
        u4Byte                                  cntIpsNotify;\r
@@ -507,6 +550,7 @@ typedef struct _BTC_STATISTICS{
        u4Byte                                  cntMediaStatusNotify;\r
        u4Byte                                  cntSpecialPacketNotify;\r
        u4Byte                                  cntBtInfoNotify;\r
+       u4Byte                                  cntRfStatusNotify;\r
        u4Byte                                  cntPeriodical;\r
        u4Byte                                  cntCoexDmSwitch;\r
        u4Byte                                  cntStackOperationNotify;\r
@@ -538,6 +582,7 @@ typedef struct _BTC_COEXIST{
        BFP_BTC_W2                      fBtcWrite2Byte;\r
        BFP_BTC_R4                      fBtcRead4Byte;\r
        BFP_BTC_W4                      fBtcWrite4Byte;\r
+       BFP_BTC_LOCAL_REG_W1    fBtcWriteLocalReg1Byte;\r
        // read/write bb related\r
        BFP_BTC_SET_BB_REG      fBtcSetBbReg;\r
        BFP_BTC_GET_BB_REG      fBtcGetBbReg;\r
@@ -546,9 +591,6 @@ typedef struct _BTC_COEXIST{
        BFP_BTC_SET_RF_REG      fBtcSetRfReg;\r
        BFP_BTC_GET_RF_REG      fBtcGetRfReg;\r
        \r
-       //write bt reg related\r
-       BFP_BTC_SET_BT_REG      fBtcSetBtReg;\r
-       \r
        // fill h2c related\r
        BFP_BTC_FILL_H2C                fBtcFillH2c;\r
        // other\r
@@ -556,19 +598,27 @@ typedef struct _BTC_COEXIST{
        // normal get/set related\r
        BFP_BTC_GET                     fBtcGet;\r
        BFP_BTC_SET                     fBtcSet;\r
+\r
+       BFP_BTC_GET_BT_REG      fBtcGetBtReg;\r
+       BFP_BTC_SET_BT_REG      fBtcSetBtReg;\r
 } BTC_COEXIST, *PBTC_COEXIST;\r
 \r
 extern BTC_COEXIST                             GLBtCoexist;\r
 \r
 BOOLEAN\r
 EXhalbtcoutsrc_InitlizeVariables(\r
-       IN      PVOID           Adapter\r
+       IN      PVOID           Adapter \r
        );\r
 VOID\r
-EXhalbtcoutsrc_InitHwConfig(\r
+EXhalbtcoutsrc_PowerOnSetting(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
+EXhalbtcoutsrc_InitHwConfig(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      BOOLEAN                         bWifiOnly\r
+       );\r
+VOID\r
 EXhalbtcoutsrc_InitCoexDm(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
@@ -609,6 +659,11 @@ EXhalbtcoutsrc_BtInfoNotify(
        IN      u1Byte                  length\r
        );\r
 VOID\r
+EXhalbtcoutsrc_RfStatusNotify(\r
+       IN      PBTC_COEXIST            pBtCoexist,\r
+       IN      u1Byte                          type\r
+       );\r
+VOID\r
 EXhalbtcoutsrc_StackOperationNotify(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      u1Byte                  type\r
@@ -618,10 +673,6 @@ EXhalbtcoutsrc_HaltNotify(
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
 VOID\r
-EXhalbtcoutsrc_SwitchGntBt(\r
-       IN      PBTC_COEXIST            pBtCoexist\r
-       );\r
-VOID\r
 EXhalbtcoutsrc_PnpNotify(\r
        IN      PBTC_COEXIST            pBtCoexist,\r
        IN      u1Byte                  pnpState\r
@@ -658,10 +709,12 @@ VOID
 EXhalbtcoutsrc_UpdateMinBtRssi(\r
        IN      s1Byte  btRssi\r
        );\r
+#if 0\r
 VOID\r
 EXhalbtcoutsrc_SetBtExist(\r
        IN      BOOLEAN         bBtExist\r
        );\r
+#endif\r
 VOID\r
 EXhalbtcoutsrc_SetChipType(\r
        IN      u1Byte          chipType\r
@@ -672,6 +725,10 @@ EXhalbtcoutsrc_SetAntNum(
        IN      u1Byte          antNum\r
        );\r
 VOID\r
+EXhalbtcoutsrc_SetSingleAntPath(\r
+       IN      u1Byte          singleAntPath\r
+       );\r
+VOID\r
 EXhalbtcoutsrc_DisplayBtCoexInfo(\r
        IN      PBTC_COEXIST            pBtCoexist\r
        );\r
index 2e804a792d96d2880d03b730459d6c0533f1d7a4..d74846cb30479ef308546442fff9f187797aabcf 100755 (executable)
@@ -450,11 +450,13 @@ ODM_TXPowerTrackingCallback_ThermalMeter(
 
        }
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
+#if (RTL8723B_SUPPORT == 0)
        // Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).
        if ((delta_IQK >= c.Threshold_IQK)) {           
                if ( ! pDM_Odm->RFCalibrateInfo.bIQKInProgress) 
                        (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);
        }
+#endif         
 #endif         
                        
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));
index 4128c608af37e9632e7d68f49f0e090e4e3795ea..1388d3674580d23b9e10d61fa5587dd3d2928c76 100755 (executable)
@@ -36,50 +36,6 @@ const u2Byte dB_Invert_Table[8][12] = {
        {       17783,  19953,  22387,  25119,  28184,  31623,  35481,  39811,  44668,  50119,  56234,  65535}};
 
 
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] = 
-// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU        MARVELL     92U_AP          SELF_AP(DownLink/Tx)
-{ 0x5e4322,            0xa44f,                 0x5e4322,               0x5ea32b,               0x5ea422,       0x5ea322,       0x3ea430,       0x5ea42b, 0x5ea44f,     0x5e4322,       0x5e4322};
-
-
-static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] = 
-// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP(UpLink/Rx)
-{ 0xa44f,              0x5ea44f,       0x5e4322,               0x5ea42b,               0xa44f,                 0xa630,                 0x5ea630,       0x5ea42b, 0xa44f,               0xa42b,         0xa42b};
-
-static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] = 
-// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP
-{ 0x4322,              0xa44f,                 0x5e4322,               0xa42b,                         0x5e4322,       0x4322,                 0xa42b,         0x5ea42b, 0xa44f,               0x5e4322,       0x5ea42b};
-
-
-//============================================================
-// EDCA Paramter for AP/ADSL   by Mingzhi 2011-11-22
-//============================================================
-#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)
-enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };
-
-static const struct ParaRecord rtl_ap_EDCA[] =
-{
-//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
-     {0,     7,      4,      10,     0},            //BK
-     {0,     3,      4,      6,      0},             //BE
-     {0,     1,      3,      4,      188},         //VI
-     {0,     1,      2,      3,      102},         //VO
-     {0,     1,      3,      4,      94},          //VI_AG
-     {0,     1,      2,      3,      47},          //VO_AG
-};
-
-static const struct ParaRecord rtl_sta_EDCA[] =
-{
-//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
-     {0,     7,      4,      10,     0},
-     {0,     3,      4,      10,     0},
-     {0,     2,      3,      4,      188},
-     {0,     2,      2,      3,      102},
-     {0,     2,      3,      4,      94},
-     {0,     2,      2,      3,      47},
-};
-#endif
-
 //============================================================
 // Global var
 //============================================================
@@ -440,58 +396,13 @@ odm_BasicDbgMessage
 //END------------COMMON INFO RELATED---------------//
 
 //START---------------DIG---------------------------//
-VOID 
-odm_FalseAlarmCounterStatistics(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_DIGInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID   
-odm_DIG(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-BOOLEAN 
-odm_DigAbort(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID 
-odm_CCKPacketDetectionThresh(
-       IN              PDM_ODM_T               pDM_Odm
-       );
 
-VOID
-odm_AdaptivityInit(
-       IN              PDM_ODM_T               pDM_Odm
-);
+//Remove by Yuchen
 
-VOID
-odm_Adaptivity(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  IGI
-);
 //END---------------DIG---------------------------//
 
 //START-------BB POWER SAVE-----------------------//
-VOID 
-odm_DynamicBBPowerSavingInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID 
-odm_DynamicBBPowerSaving(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_1R_CCA(
-       IN              PDM_ODM_T               pDM_Odm
-       );
+//Remove BB power Saving by YuChen
 //END---------BB POWER SAVE-----------------------//
 
 //START-----------------PSD-----------------------//
@@ -499,36 +410,8 @@ odm_1R_CCA(
 //============================================================
 // Function predefine.
 //============================================================
-VOID   odm_PathDiversityInit_92C(      IN      PADAPTER        Adapter);
-VOID   odm_2TPathDiversityInit_92C(    IN      PADAPTER        Adapter);
-VOID   odm_1TPathDiversityInit_92C(    IN      PADAPTER        Adapter);
-BOOLEAN        odm_IsConnected_92C(IN  PADAPTER        Adapter);
-VOID   odm_PathDiversityAfterLink_92C( IN      PADAPTER        Adapter);
-
-VOID
-odm_CCKTXPathDiversityCallback(
-       PRT_TIMER               pTimer
-       );
-
-VOID
-odm_CCKTXPathDiversityWorkItemCallback(
-    IN PVOID            pContext
-    );
-
-VOID
-odm_PathDivChkAntSwitchCallback(
-       PRT_TIMER               pTimer
-       );
-
-VOID
-odm_PathDivChkAntSwitchWorkitemCallback(
-    IN PVOID            pContext
-    );
 
-VOID   odm_SetRespPath_92C(            IN      PADAPTER        Adapter,        IN      u1Byte  DefaultRespPath);
-VOID   odm_OFDMTXPathDiversity_92C(    IN      PADAPTER        Adapter);
-VOID   odm_CCKTXPathDiversity_92C(     IN      PADAPTER        Adapter);
-VOID   odm_ResetPathDiversity_92C(             IN      PADAPTER        Adapter);
+//Remove PathDiversity related funtion predefine to odm_PathDiv.h
 
 //Start-------------------- RX High Power------------------------//
 VOID   odm_RXHPInit(   IN              PDM_ODM_T               pDM_Odm);
@@ -566,69 +449,7 @@ odm_RefreshRateAdaptiveMaskAPADSL(
        IN              PDM_ODM_T               pDM_Odm
        );
 
-VOID
-ODM_DynamicATCSwitch_init(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-ODM_DynamicATCSwitch(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_Write_CrystalCap(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  CrystalCap
-);
-
-VOID 
-odm_DynamicTxPowerInit(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_DynamicTxPowerRestorePowerIndex(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID 
-odm_DynamicTxPowerNIC(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-VOID
-odm_DynamicTxPowerSavePowerIndex(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID
-odm_DynamicTxPowerWritePowerIndex(
-       IN      PDM_ODM_T       pDM_Odm, 
-       IN      u1Byte          Value);
-
-VOID 
-odm_DynamicTxPower_92C(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID 
-odm_DynamicTxPower_92D(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_MPT_DIGCallback(
-       PRT_TIMER               pTimer
-);
-
-VOID
-odm_MPT_DIGWorkItemCallback(
-    IN PVOID            pContext
-    );
-#endif
-
+//Remove by YuChen
 
 VOID
 odm_RSSIMonitorInit(
@@ -655,16 +476,6 @@ VOID
 odm_RSSIMonitorCheck(
        IN              PDM_ODM_T               pDM_Odm
        );
-VOID 
-odm_DynamicTxPower(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-VOID 
-odm_DynamicTxPowerAP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
 
 VOID
 odm_SwAntDivInit(
@@ -740,12 +551,6 @@ odm_TXPowerTrackingCheckAP(
        IN              PDM_ODM_T               pDM_Odm
        );
 
-
-
-
-
-
-
 VOID
 odm_RateAdaptiveMaskInit(
        IN      PDM_ODM_T       pDM_Odm
@@ -813,60 +618,7 @@ odm_TXPowerTrackingThermalMeterCheck(
 
 #endif
 
-VOID
-odm_EdcaTurboCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-VOID
-ODM_EdcaTurboInit(
-       IN      PDM_ODM_T               pDM_Odm
-);
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-odm_EdcaTurboCheckMP(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-
-//check if edca turbo is disabled
-BOOLEAN
-odm_IsEdcaTurboDisable(
-       IN      PDM_ODM_T       pDM_Odm
-);
-//choose edca paramter for special IOT case
-VOID 
-ODM_EdcaParaSelByIot(
-       IN      PDM_ODM_T       pDM_Odm,
-       OUT     u4Byte          *EDCA_BE_UL,
-       OUT u4Byte              *EDCA_BE_DL
-       );
-//check if it is UL or DL
-VOID
-odm_EdcaChooseTrafficIdx( 
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u8Byte                          cur_tx_bytes,  
-       IN      u8Byte                          cur_rx_bytes, 
-       IN      BOOLEAN                 bBiasOnRx,
-       OUT BOOLEAN             *pbIsCurRDLState
-       );
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID
-odm_EdcaTurboCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
-       );
-#else
-VOID 
-odm_IotEngine(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-
-VOID
-odm_EdcaParaInit(
-       IN      PDM_ODM_T       pDM_Odm
-       );
-#endif
-
+//Remove Edca by Yu Chen
 
 
 #define        RxDefaultAnt1           0x65a9
@@ -901,10 +653,6 @@ odm_HwAntDiv(
        IN      PDM_ODM_T       pDM_Odm
 );
 
-VOID   odm_PathDiversityInit(IN        PDM_ODM_T       pDM_Odm);
-VOID   odm_PathDiversity(      IN      PDM_ODM_T       pDM_Odm);
-
-
 
 //============================================================
 //3 Export Interface
@@ -919,88 +667,85 @@ ODM_DMInit(
        )
 {
 
-       //2012.05.03 Luke: For all IC series
        odm_CommonInfoSelfInit(pDM_Odm);
        odm_CmnInfoInit_Debug(pDM_Odm);
-       odm_DIGInit(pDM_Odm);   
+       odm_DIGInit(pDM_Odm);
+       odm_NHMCounterStatisticsInit(pDM_Odm);
        odm_AdaptivityInit(pDM_Odm);
        odm_RateAdaptiveMaskInit(pDM_Odm);
+       ODM_CfoTrackingInit(pDM_Odm);
+       ODM_EdcaTurboInit(pDM_Odm);
        odm_RSSIMonitorInit(pDM_Odm);
-       
-#if (RTL8192E_SUPPORT == 1)
-       if(pDM_Odm->SupportICType==ODM_RTL8192E)
-       {
-               odm_PrimaryCCA_Check_Init(pDM_Odm);
-       }
-#endif
+       odm_TXPowerTrackingInit(pDM_Odm);
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       ODM_ClearTxPowerTrackingState(pDM_Odm);
 
-//#if (MP_DRIVER != 1)
        if ( *(pDM_Odm->mp_mode) != 1)
-           odm_PathDiversityInit(pDM_Odm);
-//#endif
-       ODM_EdcaTurboInit(pDM_Odm);
+       odm_PathDiversityInit(pDM_Odm);
 
-       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+#endif
+
+#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))     
+       if ( *(pDM_Odm->mp_mode) != 1){
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+               odm_SwAntDivInit(pDM_Odm);      
+       else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
        {
-               odm_TXPowerTrackingInit(pDM_Odm);
-//#if (MP_DRIVER != 1)
-               if ( *(pDM_Odm->mp_mode) != 1)
-                       ODM_AntDivInit(pDM_Odm);
-//#endif
+               if(pDM_Odm->AntDivType == HW_ANTDIV)
+                       odm_InitHybridAntDiv(pDM_Odm);
+               else
+                       odm_SwAntDivInit(pDM_Odm);
        }
-       else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       else
+               ODM_AntDivInit(pDM_Odm);
+       }
+#endif
+
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
        {
                odm_DynamicBBPowerSavingInit(pDM_Odm);
                odm_DynamicTxPowerInit(pDM_Odm);
-               odm_TXPowerTrackingInit(pDM_Odm);
-               //ODM_EdcaTurboInit(pDM_Odm);
-//#if (MP_DRIVER != 1)
-               if ( *(pDM_Odm->mp_mode) != 1) {
-               if(pDM_Odm->SupportICType==ODM_RTL8723A)
-                       odm_SwAntDivInit(pDM_Odm);      
-               else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
+
+#if (RTL8188E_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8188E)
                {
-                       if(pDM_Odm->AntDivType == HW_ANTDIV)
-                       odm_InitHybridAntDiv(pDM_Odm);
-                       else
-                       odm_SwAntDivInit(pDM_Odm);
+                       odm_PrimaryCCA_Init(pDM_Odm);
+                       ODM_RAInfo_Init_all(pDM_Odm);
                }
-               else
-                       ODM_AntDivInit(pDM_Odm);
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
        
+       #if (RTL8723B_SUPPORT == 1)
                if(pDM_Odm->SupportICType == ODM_RTL8723B)
                        odm_SwAntDetectInit(pDM_Odm);
-               }
-//#endif
+       #endif
 
-//2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
-// so compile flags must be left here to prevent from compile errors
-#if (RTL8188E_SUPPORT == 1)
-               if(pDM_Odm->SupportICType==ODM_RTL8188E)
-               {
-                       odm_PrimaryCCA_Init(pDM_Odm);    // Gary
-                       ODM_RAInfo_Init_all(pDM_Odm);
-               }       
-#endif         
+       #if (RTL8192E_SUPPORT == 1)
+               if(pDM_Odm->SupportICType==ODM_RTL8192E)
+                       odm_PrimaryCCA_Check_Init(pDM_Odm);
+       #endif
 
-//2010.05.30 LukeLee: Following are not incorporated into ODM structure yet.
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-               if(pDM_Odm->SupportICType&ODM_RTL8723A)
+       #if (RTL8723A_SUPPORT == 1)
+               if(pDM_Odm->SupportICType == ODM_RTL8723A)
                        odm_PSDMonitorInit(pDM_Odm);
-               
-               if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
-               {
-                       odm_RXHPInit(pDM_Odm);  
-               }
+       #endif
+
+       #if (RTL8192D_SUPPORT == 1)
                if(pDM_Odm->SupportICType==ODM_RTL8192D)
-               {
-                       odm_PathDivInit_92D(pDM_Odm); //92D Path Div Init   //Neil Chen
-               }       
+                       odm_PathDivInit_92D(pDM_Odm);
+       #endif
+
+       #if ((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1))
+               if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
+                       odm_RXHPInit(pDM_Odm);
+       #endif
+#endif
 #endif
-       }
 
-       ODM_DynamicATCSwitch_init(pDM_Odm);
-       ODM_ClearTxPowerTrackingState(pDM_Odm);
+       }
 
 }
 
@@ -1026,6 +771,7 @@ ODM_DMWatchdog(
        odm_CommonInfoSelfUpdate(pDM_Odm);
        odm_BasicDbgMessage(pDM_Odm);
        odm_FalseAlarmCounterStatistics(pDM_Odm);
+       odm_NHMCounterStatistics(pDM_Odm);
        ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min));
 
        odm_RSSIMonitorCheck(pDM_Odm);
@@ -1069,7 +815,7 @@ ODM_DMWatchdog(
        odm_DynamicBBPowerSaving(pDM_Odm);      
        odm_EdcaTurboCheck(pDM_Odm);
        odm_PathDiversity(pDM_Odm);
-       ODM_DynamicATCSwitch(pDM_Odm);
+       ODM_CfoTracking(pDM_Odm);
        odm_DynamicTxPower(pDM_Odm);    
 
 #if (RTL8192E_SUPPORT == 1)
@@ -1483,8 +1229,8 @@ ODM_CmnInfoUpdate(
                        pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;
                        break;
                // The following is for BT HS mode and BT coexist mechanism.
-               case ODM_CMNINFO_BT_DISABLED:
-                       pDM_Odm->bBtDisabled = (BOOLEAN)Value;
+               case ODM_CMNINFO_BT_ENABLED:
+                       pDM_Odm->bBtEnabled = (BOOLEAN)Value;
                        break;
                        
                case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
@@ -1806,6 +1552,7 @@ odm_BasicDbgMessage
                FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n", 
                pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B));
+       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_C = %d, RSSI_D = %d\n", pDM_Odm->RSSI_C, pDM_Odm->RSSI_D));
 
 }
 
@@ -1966,9772 +1713,4313 @@ odm_IsLinked(
  *     When            Who             Remark
  *
  *---------------------------------------------------------------------------*/
-VOID
-ODM_ChangeDynamicInitGainThresh(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u4Byte          DM_Type,
-       IN      u4Byte          DM_Value
-       )
-{
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
 
-       if (DM_Type == DIG_TYPE_THRESH_HIGH)
-       {
-               pDM_DigTable->RssiHighThresh = DM_Value;                
-       }
-       else if (DM_Type == DIG_TYPE_THRESH_LOW)
-       {
-               pDM_DigTable->RssiLowThresh = DM_Value;
-       }
-       else if (DM_Type == DIG_TYPE_ENABLE)
-       {
-               pDM_DigTable->Dig_Enable_Flag   = TRUE;
-       }       
-       else if (DM_Type == DIG_TYPE_DISABLE)
-       {
-               pDM_DigTable->Dig_Enable_Flag = FALSE;
-       }       
-       else if (DM_Type == DIG_TYPE_BACKOFF)
-       {
-               if(DM_Value > 30)
-                       DM_Value = 30;
-               pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
-       }
-       else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
-       {
-               if(DM_Value == 0)
-                       DM_Value = 0x1;
-               pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
-       }
-       else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
-       {
-               if(DM_Value > 0x50)
-                       DM_Value = 0x50;
-               pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
-       }
-}      /* DM_ChangeDynamicInitGainThresh */
+//Remove DIG by yuchen
 
-int getIGIForDiff(int value_IGI)
-{
-       #define ONERCCA_LOW_TH          0x30
-       #define ONERCCA_LOW_DIFF        8
+//Remove DIG and FA check by Yu Chen
 
-       if (value_IGI < ONERCCA_LOW_TH) {
-               if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
-                       return ONERCCA_LOW_TH;
-               else
-                       return value_IGI + ONERCCA_LOW_DIFF;
-       } else {
-               return value_IGI;
-       }
-}
 
+//3============================================================
+//3 BB Power Save
+//3============================================================
 
-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;
+//Remove BB power saving by Yuchen
 
-       //Reg524[11]=0 is easily to transmit packets during adaptivity test
+//3============================================================
+//3 RATR MASK
+//3============================================================
+//3============================================================
+//3 Rate Adaptive
+//3============================================================
 
-       //ODM_SetBBReg(pDM_Odm, 0x524, BIT11, 1);// stop counting if EDCCA is asserted
-}
+VOID
+odm_RateAdaptiveMaskInit(
+       IN      PDM_ODM_T       pDM_Odm
+       )
+{
+       PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;
 
-// Add by Neil Chen to enable edcca to MP Platform 
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
 
-VOID
-odm_EnableEDCCA(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
+       pMgntInfo->Ratr_State = DM_RATR_STA_INIT;
 
-       // This should be moved out of OUTSRC
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       // Enable EDCCA. The value is suggested by SD3 Wilson.
+       if (pMgntInfo->DM_Type == DM_Type_ByDriver)
+               pHalData->bUseRAMask = TRUE;
+       else
+               pHalData->bUseRAMask = FALSE;   
 
-       //
-       // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
-       //
-       if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
-       {
-               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
-               
-       }       
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       pOdmRA->Type = DM_Type_ByDriver;
+       if (pOdmRA->Type == DM_Type_ByDriver)
+               pDM_Odm->bUseRAMask = _TRUE;
        else
-       {
-               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
-               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
-       }       
-       
-       //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
-}
+               pDM_Odm->bUseRAMask = _FALSE;   
+#endif
 
-VOID
-odm_DisableEDCCA(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{      
-       // Disable EDCCA..
-       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
-       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
+       pOdmRA->RATRState = DM_RATR_STA_INIT;
+       pOdmRA->LdpcThres = 35;
+       pOdmRA->bUseLdpc = FALSE;
+       pOdmRA->HighRSSIThresh = 50;
+       pOdmRA->LowRSSIThresh = 20;
 }
 
-//
-// Description: According to initial gain value to determine to enable or disable EDCCA.
-//
-// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
-//
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) 
 VOID
-odm_DynamicEDCCA(
-       IN              PDM_ODM_T               pDM_Odm
-)
+ODM_RateAdaptiveStateApInit(   
+       IN      PADAPTER                Adapter ,
+       IN      PRT_WLAN_STA    pEntry
+       )
 {
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       u1Byte  RegC50, RegC58;
-       BOOLEAN         bFwCurrentInPSMode=FALSE;       
+       pEntry->Ratr_State = DM_RATR_STA_INIT;
+}
+#endif
 
-       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));   
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+u4Byte ODM_Get_Rate_Bitmap(
+       IN      PDM_ODM_T       pDM_Odm,        
+       IN      u4Byte          macid,
+       IN      u4Byte          ra_mask,        
+       IN      u1Byte          rssi_level)
+{
+       PSTA_INFO_T     pEntry;
+       u4Byte  rate_bitmap = 0;
+       u1Byte  WirelessMode;
+       //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);
+       
+       
+       pEntry = pDM_Odm->pODM_StaInfo[macid];
+       if(!IS_STA_VALID(pEntry))
+               return ra_mask;
 
-       // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
-       if(bFwCurrentInPSMode)
-               return;
+       WirelessMode = pEntry->wireless_mode;
        
-       RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
-       RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
+       switch(WirelessMode)
+       {
+               case ODM_WM_B:
+                       if(ra_mask & 0x0000000c)                //11M or 5.5M enable                            
+                               rate_bitmap = 0x0000000d;
+                       else
+                               rate_bitmap = 0x0000000f;
+                       break;
+                       
+               case (ODM_WM_G):
+               case (ODM_WM_A):
+                       if(rssi_level == DM_RATR_STA_HIGH)
+                               rate_bitmap = 0x00000f00;
+                       else
+                               rate_bitmap = 0x00000ff0;
+                       break;
+                       
+               case (ODM_WM_B|ODM_WM_G):
+                       if(rssi_level == DM_RATR_STA_HIGH)
+                               rate_bitmap = 0x00000f00;
+                       else if(rssi_level == DM_RATR_STA_MIDDLE)
+                               rate_bitmap = 0x00000ff0;
+                       else
+                               rate_bitmap = 0x00000ff5;
+                       break;          
+
+               case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :
+               case (ODM_WM_B|ODM_WM_N24G)     :
+               case (ODM_WM_G|ODM_WM_N24G)     :
+               case (ODM_WM_A|ODM_WM_N5G)      :
+                       {                                       
+                               if (    pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)
+                               {
+                                       if(rssi_level == DM_RATR_STA_HIGH)
+                                       {
+                                               rate_bitmap = 0x000f0000;
+                                       }
+                                       else if(rssi_level == DM_RATR_STA_MIDDLE)
+                                       {
+                                               rate_bitmap = 0x000ff000;
+                                       }
+                                       else{
+                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
+                                                       rate_bitmap = 0x000ff015;
+                                               else
+                                                       rate_bitmap = 0x000ff005;
+                                       }                               
+                               }
+                               else
+                               {
+                                       if(rssi_level == DM_RATR_STA_HIGH)
+                                       {               
+                                               rate_bitmap = 0x0f8f0000;
+                                       }
+                                       else if(rssi_level == DM_RATR_STA_MIDDLE)
+                                       {
+                                               rate_bitmap = 0x0f8ff000;
+                                       }
+                                       else
+                                       {
+                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
+                                                       rate_bitmap = 0x0f8ff015;
+                                               else
+                                                       rate_bitmap = 0x0f8ff005;
+                                       }                                       
+                               }
+                       }
+                       break;
+
+               case (ODM_WM_AC|ODM_WM_G):
+                       if(rssi_level == 1)
+                               rate_bitmap = 0xfc3f0000;
+                       else if(rssi_level == 2)
+                               rate_bitmap = 0xfffff000;
+                       else
+                               rate_bitmap = 0xffffffff;
+                       break;
 
+               case (ODM_WM_AC|ODM_WM_A):
+
+                       if (pDM_Odm->RFType == RF_1T1R)
+                       {
+                               if(rssi_level == 1)                             // add by Gary for ac-series
+                                       rate_bitmap = 0x003f8000;
+                               else if (rssi_level == 2)
+                                       rate_bitmap = 0x003ff000;
+                               else
+                                       rate_bitmap = 0x003ff010;
+                       }
+                       else
+                       {
+                               if(rssi_level == 1)                             // add by Gary for ac-series
+                                       rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9
+                               else if (rssi_level == 2)
+                                       rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9
+                               else
+                                       rate_bitmap = 0xfffff010;       // All
+                       }
+                       break;
+                       
+               default:
+                       if(pDM_Odm->RFType == RF_1T2R)
+                               rate_bitmap = 0x000fffff;
+                       else
+                               rate_bitmap = 0x0fffffff;
+                       break;  
 
-       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;
-               }
        }
-}
 
+       //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",rssi_level,WirelessMode,rate_bitmap));
+
+       return (ra_mask&rate_bitmap);
+       
+}      
+#endif
 
-#endif    // end MP platform support
 
 VOID
-odm_Adaptivity(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  IGI
-)
+odm_RefreshBasicRateMask(
+       IN              PDM_ODM_T               pDM_Odm 
+       )
 {
-       s1Byte TH_L2H_dmc, TH_H2L_dmc;
-       s1Byte Diff, IGI_target;
-       BOOLEAN EDCCA_State = 0;
-
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       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
+       PADAPTER                Adapter  =  pDM_Odm->Adapter;
+       static u1Byte           Stage = 0;
+       u1Byte                  CurStage = 0;
+       OCTET_STRING    osRateSet;
+       PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);
+       u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};
 
-       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_WIN)
-               // Adjust EDCCA.
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-                       odm_DynamicEDCCA(pDM_Odm);
-#endif
+       if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 )
                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->bLinked == FALSE)   // unlink Default port information
+               CurStage = 0;   
+       else if(pDM_Odm->RSSI_Min < 40) // link RSSI  < 40%
+               CurStage = 1;
+       else if(pDM_Odm->RSSI_Min > 45) // link RSSI > 45%
+               CurStage = 3;   
+       else
+               CurStage = 2;                                   // link  25% <= RSSI <= 30%
 
-       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(CurStage != Stage)
        {
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+               if(CurStage == 1)
+               {
+                       FillOctetString(osRateSet, RateSet, 5);
+                       FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);
+                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);
+               }
+               else if(CurStage == 3 && (Stage == 1 || Stage == 2))
                {
-                       ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
-                       ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
+                       Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
                }
-               else
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
-               return;
        }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)     
-               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);
+       
+       Stage = CurStage;
 #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));
+/*-----------------------------------------------------------------------------
+ * Function:   odm_RefreshRateAdaptiveMask()
+ *
+ * Overview:   Update rate table mask according to rssi
+ *
+ * Input:              NONE
+ *
+ * Output:             NONE
+ *
+ * Return:             NONE
+ *
+ * Revised History:
+ *     When            Who             Remark
+ *     05/27/2009      hpfan   Create Version 0.  
+ *
+ *---------------------------------------------------------------------------*/
+VOID
+odm_RefreshRateAdaptiveMask(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
 
-       if(EDCCA_State == 1)
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n")); 
+       if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
        {
-               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;
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));
+               return; 
        }
-       else
+       //
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
+       //
+       switch  (pDM_Odm->SupportPlatform)
        {
-               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));
+               case    ODM_WIN:
+                       odm_RefreshRateAdaptiveMaskMP(pDM_Odm);
+                       break;
 
-       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);
-}
+               case    ODM_CE:
+                       odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
+                       break;
 
-VOID
-ODM_DynamicATCSwitch_init(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+               case    ODM_AP:
+               case    ODM_ADSL:
+                       odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);
+                       break;
+       }
        
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
-
-       pDM_Odm->CrystalCap = pHalData->CrystalCap;
-       pDM_Odm->bATCStatus = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11);
-       pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
-
-#endif
 }
 
 VOID
-ODM_DynamicATCSwitch(
-       IN              PDM_ODM_T               pDM_Odm
-)
+odm_RefreshRateAdaptiveMaskMP(
+       IN              PDM_ODM_T               pDM_Odm 
+       )
 {
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       u1Byte                  CrystalCap,ATC_status_temp = 0;
-       u4Byte                  packet_count;
-       int                             CFO_kHz_A,CFO_kHz_B,CFO_ave = 0, Adjust_Xtal = 0;
-       int                             CFO_ave_diff;
-
-#if (MP_DRIVER == 1)
-       if ( *(pDM_Odm->mp_mode) == 1)
-               pDM_Odm->bLinked = TRUE;
-#endif 
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER                                pAdapter         =  pDM_Odm->Adapter;
+       PADAPTER                                pTargetAdapter = NULL;
+       HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);
+       PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);
+       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;
 
-       if(!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC))
+       if(pAdapter->bDriverStopped)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
                return;
+       }
 
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("=========> ODM_DynamicATCSwitch()\n"));
+       if(!pHalData->bUseRAMask)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
+               return;
+       }
 
-       //2 No link!
-       //
-       if(!pDM_Odm->bLinked)
-       {       
-               //3 
-               //3 1.Enable ATC
-               if(pDM_Odm->bATCStatus == ATC_Status_Off)
+       // if default port is connected, update RA table for default port (infrastructure mode only)
+       if(pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter)))
+       {
+       
+               if(pHalData->UndecoratedSmoothedPWDB < pRA->LdpcThres)
                {
-                       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-                               ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
-                       
-                       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-                               ODM_SetBBReg(pDM_Odm, rFc_area_Jaguar, BIT14, ATC_Status_On);
-                       
-                       pDM_Odm->bATCStatus = ATC_Status_On;
+                       pRA->bUseLdpc = TRUE;
+                       pRA->bLowerRtsRate = TRUE;
+                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
+                               MgntSet_TX_LDPC(pAdapter,0,TRUE);
+                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
                }
-
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): No link!!\n"));
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): ATCStatus = %d\n", pDM_Odm->bATCStatus));
-
-               //3 2.Disable CFO tracking for BT
-               if(!pDM_Odm->bBtDisabled)
+               else if(pHalData->UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
                {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!!\n"));
-                       return;
+                       pRA->bUseLdpc = FALSE;
+                       pRA->bLowerRtsRate = FALSE;
+                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
+                               MgntSet_TX_LDPC(pAdapter,0,FALSE);
+                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
                }
-
-               //3 3.Reset Crystal Cap.
-               if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
+       
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));
+               if( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State) )
                {
-                       pDM_Odm->CrystalCap = pHalData->CrystalCap;
-                       CrystalCap = pDM_Odm->CrystalCap & 0x3f;
-                       odm_Write_CrystalCap(pDM_Odm,CrystalCap);
+                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));
+                       pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);
                }
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CrystalCap = 0x%x\n", pDM_Odm->CrystalCap));
-               
        }
-       else
-       {
 
-       //2 Initialization
        //
-               //3 1. Calculate CFO for path-A & path-B
-               CFO_kHz_A =  (int)(pDM_Odm->CFO_tail[0] * 3125)  / 1280;
-               CFO_kHz_B =  (int)(pDM_Odm->CFO_tail[1] * 3125)  / 1280;
-               packet_count = pDM_Odm->packetCount;
-               
-               //3 2.No new packet
-               if(packet_count == pDM_Odm->packetCount_pre)
-               {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter doesn't change\n"));
-                       return;
-               }
-               pDM_Odm->packetCount_pre = packet_count;
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter = %d\n", pDM_Odm->packetCount));
-               
-               //3 3.Average CFO
-               if(pDM_Odm->RFType == ODM_1T1R)
-                       CFO_ave = CFO_kHz_A;
-               else
-                       CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
+       // The following part configure AP/VWifi/IBSS rate adaptive mask.
+       //
 
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n", 
-                                               CFO_kHz_A, CFO_kHz_B, CFO_ave));
+       if(pMgntInfo->mIbss)    // Target: AP/IBSS peer.
+               pTargetAdapter = GetDefaultAdapter(pAdapter);
+       else
+               pTargetAdapter = GetFirstAPAdapter(pAdapter);
 
-               //3 4.Avoid abnormal large CFO
-               CFO_ave_diff = (pDM_Odm->CFO_ave_pre >= CFO_ave)?(pDM_Odm->CFO_ave_pre - CFO_ave):(CFO_ave - pDM_Odm->CFO_ave_pre);
-               if(CFO_ave_diff > 20 && pDM_Odm->largeCFOHit == 0)
-               {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): first large CFO hit\n"));
-                       pDM_Odm->largeCFOHit = 1;
-                       return;
-               }
-               else
-                       pDM_Odm->largeCFOHit = 0;
-               pDM_Odm->CFO_ave_pre = CFO_ave;
+       // if extension port (softap) is started, updaet RA table for more than one clients associate
+       if(pTargetAdapter != NULL)
+       {
+               int     i;
+               PRT_WLAN_STA    pEntry;
 
-       //2 CFO tracking by adjusting Xtal cap.
-       //
-               if (pDM_Odm->bBtDisabled)
+               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
                {
-                       //3 1.Dynamic Xtal threshold
-                       if(CFO_ave >= -pDM_Odm->CFOThreshold && CFO_ave <= pDM_Odm->CFOThreshold && pDM_Odm->bIsfreeze == 0)
-                       {
-                               if (pDM_Odm->CFOThreshold == CFO_Threshold_Xtal)
-                               {
-                                       pDM_Odm->CFOThreshold = CFO_Threshold_Xtal + 10;
-                                       pDM_Odm->bIsfreeze = 1;
-                               }
-                               else
-                                       pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
-                       }
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Dynamic threshold = %d\n", pDM_Odm->CFOThreshold));
-                       
-               //3      2.Calculate Xtal offset
-                       if(CFO_ave > pDM_Odm->CFOThreshold && pDM_Odm->CrystalCap < 0x3f)
-                               Adjust_Xtal =  ((CFO_ave - CFO_Threshold_Xtal) >> 2) + 1;
-                       else if(CFO_ave < (-pDM_Odm->CFOThreshold) && pDM_Odm->CrystalCap > 0)
-                               Adjust_Xtal =  ((CFO_ave + CFO_Threshold_Xtal) >> 2) - 1;
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Crystal cap = 0x%x, Crystal cap offset = %d\n", pDM_Odm->CrystalCap, Adjust_Xtal));
-
-                       //3 3.Adjudt Crystal Cap.
-                       if(Adjust_Xtal != 0)
+                       pEntry = AsocEntry_EnumStation(pTargetAdapter, i);
+                       if(NULL != pEntry)
                        {
-                               pDM_Odm->bIsfreeze = 0;
-                               pDM_Odm->CrystalCap = pDM_Odm->CrystalCap + Adjust_Xtal;
-
-                               if(pDM_Odm->CrystalCap > 0x3f)
-                                       pDM_Odm->CrystalCap = 0x3f;
-                               else if (pDM_Odm->CrystalCap < 0)
-                                       pDM_Odm->CrystalCap = 0;
-
-                               CrystalCap = pDM_Odm->CrystalCap & 0x3f;
-                               odm_Write_CrystalCap(pDM_Odm,CrystalCap);
-       
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): New crystal cap = 0x%x \n", pDM_Odm->CrystalCap));
-                       }
-               }
-               else if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
-               {
-                       //3 Reset Xtal Cap when BT is enable
-                       pDM_Odm->CrystalCap = pHalData->CrystalCap;
-                       CrystalCap = pDM_Odm->CrystalCap & 0x3f;
-                       odm_Write_CrystalCap(pDM_Odm,CrystalCap);
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is reset)\n"));
-               }
-               else
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is unchanged)\n"));
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES){
-                       //2 Dynamic ATC switch
-                       //
-                               //3 1.Enable ATC when CFO is larger then 80kHz
-                               if(CFO_ave < CFO_Threshold_ATC && CFO_ave > -CFO_Threshold_ATC)
-                               {
-                                       if(pDM_Odm->bATCStatus == ATC_Status_On)
-                                       {
-                                       ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_Off);
-                                       pDM_Odm->bATCStatus = ATC_Status_Off;
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable ATC!!\n"));
-                               }
-                               else
+                               if(pEntry->bAssociated)
                                {
-                                       if(pDM_Odm->bATCStatus == ATC_Status_Off)
+                                       if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) )
                                        {
-                                               ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
-                                               pDM_Odm->bATCStatus = ATC_Status_On;
+                                               ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);
+                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State));
+                                               pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);
                                        }
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Enable ATC!!\n"));
                                }
+                       }
                }
        }
-#endif
+
+       if(pMgntInfo->bSetTXPowerTrainingByOid)
+               pMgntInfo->bSetTXPowerTrainingByOid = FALSE;    
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 }
 
+
 VOID
-odm_Write_CrystalCap(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  CrystalCap
-)
+odm_RefreshRateAdaptiveMaskCE(
+       IN              PDM_ODM_T               pDM_Odm 
+       )
 {
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       u1Byte  i;
+       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
+       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;
 
-       if(IS_HARDWARE_TYPE_8192D(Adapter))
+       if(pAdapter->bDriverStopped)
        {
-               PHY_SetBBReg(Adapter, 0x24, 0xF0, CrystalCap & 0x0F);
-               PHY_SetBBReg(Adapter, 0x28, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
+               return;
        }
 
-       if(IS_HARDWARE_TYPE_8188E(Adapter))
-       {
-               // write 0x24[16:11] = 0x24[22:17] = CrystalCap
-               PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, 0x7ff800, (CrystalCap | (CrystalCap << 6)));
-       }
-       
-       if(IS_HARDWARE_TYPE_8812(Adapter))
-       {
-               // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
-               CrystalCap = CrystalCap & 0x3F;
-               PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
-       }       
-       
-       //only for B-cut
-       if ((IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) ||
-               IS_HARDWARE_TYPE_8723B(Adapter) ||IS_HARDWARE_TYPE_8192E(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))
+       if(!pDM_Odm->bUseRAMask)
        {
-               // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
-               CrystalCap = CrystalCap & 0x3F;
-               PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));    
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
+               return;
        }
-       
-       if(IS_HARDWARE_TYPE_8723AE(Adapter))
-               PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505);                         
 
-}
+       //printk("==> %s \n",__FUNCTION__);
+
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
+               PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
+               if(IS_STA_VALID(pstat) ) {
+                       if(IS_MCAST( pstat->hwaddr))  //if(psta->mac_id ==1)
+                                continue;
+                       if(IS_MCAST( pstat->hwaddr))
+                               continue;
+
+                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
+                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
+                       {
+                               if(pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres)
+                               {
+                                       pRA->bUseLdpc = TRUE;
+                                       pRA->bLowerRtsRate = TRUE;
+                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
+                                               Set_RA_LDPC_8812(pstat, TRUE);
+                                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
+                               }
+                               else if(pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
+                               {
+                                       pRA->bUseLdpc = FALSE;
+                                       pRA->bLowerRtsRate = FALSE;
+                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
+                                               Set_RA_LDPC_8812(pstat, FALSE);
+                                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
+                               }
+                       }
+                       #endif
 
+                       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));
+                               //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);
+                               rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
+                       }
+               
+               }
+       }                       
+       
+#endif
+}
 
 VOID
-ODM_Write_DIG(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u1Byte                  CurrentIGI
+odm_RefreshRateAdaptiveMaskAPADSL(
+       IN              PDM_ODM_T               pDM_Odm
        )
 {
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       struct rtl8192cd_priv *priv = pDM_Odm->priv;
+       struct stat_info        *pstat;
 
-       if(pDM_Odm->StopDIG)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
+       if (!priv->pmib->dot11StationConfigEntry.autoRate) 
                return;
-       }
 
-       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 (list_empty(&priv->asoc_list))
+               return;
 
-       if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI)
-       {
-               if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_WIN))
-               { 
-                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
-                       if(pDM_Odm->RFType != ODM_1T1R)
-                               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))
+       list_for_each_entry(pstat, &priv->asoc_list, asoc_list) {
+               if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) {
+                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));
+
+#ifdef CONFIG_RTL_88E_SUPPORT
+                       if (GET_CHIP_VER(priv)==VERSION_8188E) {
+#ifdef TXREPORT
+                               add_RATid(priv, pstat);
+#endif
+                       } else
+#endif
                        {
-                       case ODM_CCA_2R:
-                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
-                                       if(pDM_Odm->RFType != ODM_1T1R)
-                                       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->RFType != ODM_1T1R)
-                                       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->RFType != ODM_1T1R)
-                                       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));
-       
+#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)                 
+                       add_update_RATid(priv, pstat);
+#endif
+                       }
+               }
+       }
+#endif
 }
 
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 VOID
-odm_DIGbyRSSI_LPS(
-       IN              PDM_ODM_T               pDM_Odm
-       )
+ODM_DynamicARFBSelect(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  rate,
+       IN              BOOLEAN                 Collision_State 
+)
 {
-       //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 
+       if(pDM_Odm->SupportICType != ODM_RTL8192E)
+               return;
+
+       if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12){
+               if (Collision_State == 1){
+                       if(rate == DESC_RATEMCS12){
+
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);        
+                       }
+                       else if(rate == DESC_RATEMCS11){
 
-       u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C
-       u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);        
+                       }
+                       else if(rate == DESC_RATEMCS10){
 
-       CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);        
+                       }
+                       else if(rate == DESC_RATEMCS9){
 
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);        
+                       }
+                       else{
 
-       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG_LPS, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);        
+                       }
+               }
+               else{   // Collision_State == 0
+                       if(rate == DESC_RATEMCS12){
 
-       // Using FW PS mode to make IGI
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        
+                       }
+                       else if(rate == DESC_RATEMCS11){
 
-       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;      
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);        
+                       }
+                       else if(rate == DESC_RATEMCS10){
 
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);        
+                       }
+                       else if(rate == DESC_RATEMCS9){
 
-       //Lower bound checking
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);        
+                       }
+                       else{
 
-       //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;
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);        
+                       }
+               }
+       }
+       else{  // MCS13~MCS15,  1SS, G-mode
+               if (Collision_State == 1){
+                       if(rate == DESC_RATEMCS15){
 
-       //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_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);        
+                       }
+                       else if(rate == DESC_RATEMCS14){
 
-       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);        
+                       }
+                       else if(rate == DESC_RATEMCS13){
 
-}
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);        
+                       }
+                       else{
 
-VOID
-odm_DIGInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);        
+                       }
+               }
+               else{   // Collision_State == 0
+                       if(rate == DESC_RATEMCS15){
 
-       //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;
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);        
+                       }
+                       else if(rate == DESC_RATEMCS14){
+
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        
+                       }
+                       else if(rate == DESC_RATEMCS13){
+
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        
+                       }
+                       else{
+
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);
+                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        
+                       }
 
-       //To Initi BT30 IGI
-       pDM_DigTable->BT30_CurIGI=0x32;
+
+               }
+
+       }       
 
 }
 
-VOID
-odm_DigForBtHsMode(
-       IN              PDM_ODM_T               pDM_Odm
+#endif
+
+// Return Value: BOOLEAN
+// - TRUE: RATRState is changed.
+BOOLEAN 
+ODM_RAStateCheck(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              s4Byte                  RSSI,
+       IN              BOOLEAN                 bForceUpdate,
+       OUT             pu1Byte                 pRATRState
        )
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       pDIG_T                                  pDM_DigTable=&pDM_Odm->DM_DigTable;
-       u1Byte                                  digForBtHs=0;
-       u1Byte                                  digUpBound=0x5a;
-       
-       if(pDM_Odm->bBtConnectProcess)
+       PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
+       const u1Byte GoUpGap = 5;
+       u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;
+       u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;
+       u1Byte RATRState;
+
+       // Threshold Adjustment: 
+       // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.
+       // Here GoUpGap is added to solve the boundary's level alternation issue.
+       switch (*pRATRState)
        {
-               if(pDM_Odm->SupportICType&(ODM_RTL8723A))
-                       digForBtHs = 0x28;
-               else
-                       digForBtHs = 0x22;
+               case DM_RATR_STA_INIT:
+               case DM_RATR_STA_HIGH:
+                       break;
+
+               case DM_RATR_STA_MIDDLE:
+                       HighRSSIThreshForRA += GoUpGap;
+                       break;
+
+               case DM_RATR_STA_LOW:
+                       HighRSSIThreshForRA += GoUpGap;
+                       LowRSSIThreshForRA += GoUpGap;
+                       break;
+
+               default: 
+                       ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );
+                       break;
        }
+
+       // Decide RATRState by RSSI.
+       if(RSSI > HighRSSIThreshForRA)
+               RATRState = DM_RATR_STA_HIGH;
+       else if(RSSI > LowRSSIThreshForRA)
+               RATRState = DM_RATR_STA_MIDDLE;
        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;
+               RATRState = DM_RATR_STA_LOW;
+       //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);
 
-               // update Current IGI
-               pDM_DigTable->BT30_CurIGI = digForBtHs;
+       if( *pRATRState!=RATRState || bForceUpdate)
+       {
+               ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );
+               *pRATRState = RATRState;
+               return TRUE;
        }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
-#endif
+
+       return FALSE;
 }
 
-VOID 
-odm_DIG(
-       IN              PDM_ODM_T               pDM_Odm
+
+//============================================================
+
+//3============================================================
+//3 Dynamic Tx Power
+//3============================================================
+
+//Remove BY YuChen
+
+//3============================================================
+//3 RSSI Monitor
+//3============================================================
+
+VOID
+odm_RSSIDumpToRegister(
+       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_WIN)
-// 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;
-*/
+       PADAPTER                Adapter = pDM_Odm->Adapter;
 
-       if(pDM_Odm->bBtHsOperation)
-       {
-               odm_DigForBtHsMode(pDM_Odm);
-       }
-       
-       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)) )
+       if(pDM_Odm->SupportICType == ODM_RTL8812)
        {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period \n"));
-               return;
-       }
-#endif
+               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);
+               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);
+
+               // Rx EVM
+               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);
+               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);
+
+               // Rx SNR
+               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
+               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
+
+               // Rx Cfo_Short
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);
 
-       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)))
+               // Rx Cfo_Tail
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)
        {
-#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"));
+               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);
+               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);
+               // Rx EVM
+               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);
+               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);
+               // Rx SNR
+               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
+               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
+               // Rx Cfo_Short
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);
+               // Rx Cfo_Tail
+               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);
+               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);
+        }
+#endif
+}
+
+
+VOID
+odm_RSSIMonitorInit(
+       IN      PDM_ODM_T       pDM_Odm
+       )
+{
+       pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;
+
+       pRA_Table->firstconnect = FALSE;
+
+}
+
+VOID
+odm_RSSIMonitorCheck(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+       // 
+       // For AP/ADSL use prtl8192cd_priv
+       // For CE/NIC use PADAPTER
+       //
+
+       if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
                return;
-       }
-               
-       if(*(pDM_Odm->pbScanInProcess))
+       
+       //
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
+       //
+       switch  (pDM_Odm->SupportPlatform)
        {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n"));
-               return;
+               case    ODM_WIN:
+                       odm_RSSIMonitorCheckMP(pDM_Odm);
+                       break;
+
+               case    ODM_CE:
+                       odm_RSSIMonitorCheckCE(pDM_Odm);
+                       break;
+
+               case    ODM_AP:
+                       odm_RSSIMonitorCheckAP(pDM_Odm);
+                       break;          
+
+               case    ODM_ADSL:
+                       //odm_DIGAP(pDM_Odm);
+                       break;  
        }
+       
+}      // odm_RSSIMonitorCheck
 
-       //add by Neil Chen to avoid PSD is processing
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+
+VOID
+odm_RSSIMonitorCheckMP(
+       IN      PDM_ODM_T       pDM_Odm
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PRT_WLAN_STA    pEntry;
+       u1Byte                  i;
+       s4Byte                  tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
+       u1Byte                  H2C_Parameter[4] ={0};
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
+       u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0; 
+       u1Byte                  STBC_TX = 0;
+       BOOLEAN                 FirstConnect;                                                    
+       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;      
+#if (BEAMFORMING_SUPPORT == 1) 
+       BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;
+       u1Byte                  TxBF_EN = 0;
+#endif
+
+       RT_DISP(FDM, DM_PWDB, ("pHalData->UndecoratedSmoothedPWDB = 0x%x( %d)\n", 
+               pHalData->UndecoratedSmoothedPWDB,
+               pHalData->UndecoratedSmoothedPWDB));
+
+       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
+       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
+       pMgntInfo->lastTxOkCnt = curTxOkCnt;
+       pMgntInfo->lastRxOkCnt = curRxOkCnt;
+
+       RT_DISP(FDM, DM_PWDB, ("Tx = %d Rx = %d\n", curTxOkCnt, curRxOkCnt));
+
+       FirstConnect = (pHalData->bLinked) && (pRA_Table->firstconnect == FALSE);    
+       pRA_Table->firstconnect = pHalData->bLinked;                                               
+       H2C_Parameter[3] |= FirstConnect << 5;
+
+       if(pDM_Odm->SupportICType == ODM_RTL8188E && (pMgntInfo->CustomerID==RT_CID_819x_HP))
        {
-               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(curRxOkCnt >(curTxOkCnt*6))
+                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);
+               else
+                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);
+       }       
+
+       if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
        {
-               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);
-                       }
-               }
+               if(curRxOkCnt >(curTxOkCnt*6))
+                       H2C_Parameter[3]=0x01;
                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);
+                       H2C_Parameter[3]=0x00;
        }
-       
-       //1 Boundary Decision
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
+
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
        {
-               if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
                {
-
-                       dm_dig_max = DM_DIG_MAX_AP_HP;
-                       dm_dig_min = DM_DIG_MIN_AP_HP;
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
                }
                else
                {
-                       dm_dig_max = DM_DIG_MAX_NIC_HP;
-                       dm_dig_min = DM_DIG_MIN_NIC_HP;
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
                }
-               DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
-       }
-       else
-       {
-               if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+
+               if(pEntry != NULL)
                {
-#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
+                       if(pEntry->bAssociated)
+                       {
+                       
+                               RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);
+                               RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n", 
+                                       pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));
+
+                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
+                               {
+
+#if (BEAMFORMING_SUPPORT == 1)
+                                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pEntry->AssociatedMacId);
+                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
+                                               TxBF_EN = 1;
+                                       else
+                                               TxBF_EN = 0;
+       
+                                       H2C_Parameter[3] |= TxBF_EN << 6; 
+                                       
+                                       if(TxBF_EN)
+                                               STBC_TX = 0;
+                                       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;
+                                       {
+                                               if(IS_WIRELESS_MODE_AC(Adapter))
+                                                       STBC_TX = TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX);
+                                               else
+                                                       STBC_TX = TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX);
+                                       }
+
+                                       H2C_Parameter[3] |= STBC_TX << 1;
+                               }
+
+                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
+                                       tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
+                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
+                                       tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
+
+                               H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);
+                               H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
+                               H2C_Parameter[0] = (pEntry->AssociatedMacId);
+                               if(pDM_Odm->SupportICType == ODM_RTL8812)
+                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
+                               else if(pDM_Odm->SupportICType == ODM_RTL8192E)
+                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
+                               else    
+                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
                        }
-                       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_WIN|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;
+                       break;
                }
        }
 
-       if(0 < *pDM_Odm->pu1ForcedIgiLb)
+       if(tmpEntryMaxPWDB != 0)        // If associated entry is found
        {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): force IGI lb to: %u\n", *pDM_Odm->pu1ForcedIgiLb));
-               dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
-               dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
+               pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
+               RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));
        }
-               
-       if(pDM_Odm->bLinked)
+       else
        {
-               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;
+               pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;
+       }
+       
+       if(tmpEntryMinPWDB != 0xff) // If associated entry is found
+       {
+               pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
+               RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));
 
-                       //BT is Concurrent
+       }
+       else
+       {
+               pHalData->EntryMinUndecoratedSmoothedPWDB = 0;
+       }
 
-                       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
+       // Indicate Rx signal strength to FW.
+       if(pHalData->bUseRAMask)
+       {
+               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
                {
-                       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 && pDM_Odm->SupportICType != ODM_RTL8192E)
-                               offset = 20;
-                       else
-                               offset = 10;
+                       PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pMgntInfo);
+                       PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pMgntInfo);
+
+#if (BEAMFORMING_SUPPORT == 1)
                        
-                       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;
+                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pMgntInfo->mMacId);
+
+                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
+                               TxBF_EN = 1;
                        else
-                               pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
-                       
-                       }
+                               TxBF_EN = 0;
 
-                       //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--;
-               */
-                       if(pDM_Odm->bOneEntryOnly)
-                       {       
-                               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;
+                       H2C_Parameter[3] |= TxBF_EN << 6; 
 
-                               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",pDM_Odm->RSSI_Min));
-                       }
-                       //1 Lower Bound for 88E AntDiv
-#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
-                       else if( (pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) &&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) )
-                       //else 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) ||pDM_Odm->AntDivType == S0S1_SW_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));
-                               }
-                       }
-#endif
+                       if(TxBF_EN)
+                               STBC_TX = 0;
                        else
+#endif
                        {
-                               DIG_Dynamic_MIN=dm_dig_min;
+                               if(IS_WIRELESS_MODE_AC(Adapter))
+                                       STBC_TX = TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX);
+                               else
+                                       STBC_TX = TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX);
                        }
+
+                       H2C_Parameter[3] |= STBC_TX << 1;
                }
+               
+               H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);
+               H2C_Parameter[1] = 0x20;        // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
+               H2C_Parameter[0] = 0;           // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
+               if(pDM_Odm->SupportICType == ODM_RTL8812)
+                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
+               else  if(pDM_Odm->SupportICType == ODM_RTL8192E)
+                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); 
+               else    
+                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
        }
        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"));
+               PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);
        }
-       
-       //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
-               }
+       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E))
+               odm_RSSIDumpToRegister(pDM_Odm);
 
-       }
-       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));
+       odm_FindMinimumRSSI(Adapter);
+       ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)pHalData->bLinked);
+       ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)pHalData->MinUndecoratedPWDBForDM);
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+}
 
-       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
-               pDM_Odm->bsta_state = _TRUE;
-       #endif  
-       
-       if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2) && (pDM_Odm->bsta_state) )
-       {               
-                       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;
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+//
+//sherry move from DUSC to here 20110517
+//
+static VOID
+FindMinimumRSSI_Dmsp(
+       IN      PADAPTER        pAdapter
+)
+{
+#if 0
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       s32     Rssi_val_min_back_for_mac0;
+       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(pAdapter);
+       BOOLEAN         bRestoreRssi = _FALSE;
+       PADAPTER        BuddyAdapter = pAdapter->BuddyAdapter;
 
-       //1 Adjust initial gain by false alarm
-       if(pDM_Odm->bLinked)
+       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
        {
-               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(BuddyAdapter!= NULL)
                {
-                       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+                       if(pHalData->bSlaveOfDMSP)
                        {
-                               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;     
+                               //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("bSlavecase of dmsp\n"));
+                               BuddyAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP = pdmpriv->MinUndecoratedPWDBForDM;
                        }
                        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(bGetValueFromBuddyAdapter)
                                {
-                                       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 (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-                                       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
-                                               pDM_Odm->bsta_state = _TRUE;
-                                       #endif
-
-                                       if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2)
-                                               &&(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
-                                       {                                               
-                                               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"));
-                                       }
-                                       /*{
-                                               u2Byte value16;
-                                               value16 = (u2Byte) ODM_GetBBReg(pDM_Odm, 0x664, bMaskLWord);
-                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): NumQryBeaconPkt = %d, OFDM_OK_Cnt = %d\n", 
-                                                       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, value16));
-                                       }*/
+                                       //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("get new RSSI\n"));
+                                       bRestoreRssi = _TRUE;
+                                       Rssi_val_min_back_for_mac0 = pdmpriv->MinUndecoratedPWDBForDM;
+                                       pdmpriv->MinUndecoratedPWDBForDM = pAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP;
                                }
                        }
                }
-       }       
-       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(bRestoreRssi)
        {
-               if(CurrentIGI > Adap_IGI_Upper)
-                       CurrentIGI = Adap_IGI_Upper;
-
-               if(pDM_Odm->IGI_LowerBound != 0)
-               {
-                       if(CurrentIGI < pDM_Odm->IGI_LowerBound)
-                               CurrentIGI = pDM_Odm->IGI_LowerBound;
-               }
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_Odm->IGI_LowerBound = %d\n", pDM_Odm->IGI_LowerBound));
+               bRestoreRssi = _FALSE;
+               pdmpriv->MinUndecoratedPWDBForDM = Rssi_val_min_back_for_mac0;
        }
-       
-       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));
+#endif
+}
 
-       //2 High power RSSI threshold
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
-{
-       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;
+static void
+FindMinimumRSSI(
+IN     PADAPTER        pAdapter
+       )
+{      
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;   
+       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);
 
-       //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))
-       {
-               // 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_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;
-               }
-       }
-       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))
-       {
-               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)
-               {
-                       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
-               
-#if (RTL8192D_SUPPORT==1) 
-       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       //1 1.Determine the minimum RSSI 
+
+       if((pDM_Odm->bLinked != _TRUE) &&
+               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
        {
-               //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
-               {
-                       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
-                       if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
-                       {
-                               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;
-                       }
-               }
+               pdmpriv->MinUndecoratedPWDBForDM = 0;
+               //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
        }
        else
-#endif
        {
-               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
-               {
-                       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;
-               }
+               pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
        }
-}
 
+       //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);
+       //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));
+}
+#endif
 
-BOOLEAN 
-odm_DigAbort(
+VOID
+odm_RSSIMonitorCheckCE(
        IN              PDM_ODM_T               pDM_Odm
        )
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-// This should be moved out of OUTSRC
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
-       
-#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
-
-       if(pRX_HP_Table->RXHP_flag == 1)
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);
+       int     i;
+       int     tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
+       u8      sta_cnt=0;
+       u32     UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;
+       u32     PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
+       BOOLEAN                 FirstConnect = FALSE;
+       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;
+
+       if(pDM_Odm->bLinked != _TRUE)
+               return;
+
+       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
+       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
        {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n"));
-               return  TRUE;   
-       }
+               u64     curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;
+               u64     curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;
 
-       return  FALSE;
-#else  // For Other team any special case for DIG?
-       return  FALSE;
-#endif
-       
+               if(curRxOkCnt >(curTxOkCnt*6))
+                       UL_DL_STATE = 1;
+               else
+                       UL_DL_STATE = 0;
+       }
+       #endif
 
-}
+       FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);    
+       pRA_Table->firstconnect = pDM_Odm->bLinked;
 
-//3============================================================
-//3 FASLE ALARM CHECK
-//3============================================================
+       //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
+       {
+               #if 1
+               struct sta_info *psta;
+               
+               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
+                       if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))
+                       {
+                                       if(IS_MCAST( psta->hwaddr))  //if(psta->mac_id ==1)
+                                                continue;
+                                                               
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))
+                                                continue;
+                                                               
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
+                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
 
-VOID 
-odm_FalseAlarmCounterStatistics(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       u4Byte ret_value;
-       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
+                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-       if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
-               return;
-#endif
+                                       #if 0
+                                       DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,
+                                               psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);
+                                       #endif
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
-               (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&&    ////modify by Guo.Mingzhi 2011-12-29
-               (!(*(pDM_Odm->pbMasterOfDMSP))))
-       {
-               odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
-               return;
-       }
-#endif         
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
 
-       if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
-               return;
+#ifdef CONFIG_80211N_HT
+                                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
+                                               {
+#ifdef CONFIG_BEAMFORMING
+                                                       BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id);
 
-       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-       {
+                                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
+                                                               TxBF_EN = 1;
+                                                       else
+                                                               TxBF_EN = 0;
 
-       //hold ofdm counter
-               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
-               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
-       
-               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
-               FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
-               FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);         
-               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
-               FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); 
-               FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);    
-               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
-               FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
-               FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
-               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
-               FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
-
-               FalseAlmCnt->Cnt_Ofdm_fail =    FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
-                                                                       FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
-                                                                       FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
-
-#if (RTL8188E_SUPPORT==1)
-               if((pDM_Odm->SupportICType == ODM_RTL8188E)||(pDM_Odm->SupportICType == ODM_RTL8192E))
-               {
-                               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
-                       FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
-                       FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
-               }
+                                                       if (TxBF_EN) {
+                                                               STBC_TX = 0;
+                                                       }
+                                                       else
 #endif
-
-#if (RTL8192D_SUPPORT==1) 
-               if(pDM_Odm->SupportICType == ODM_RTL8192D)
-               {
-                       odm_GetCCKFalseAlarm_92D(pDM_Odm);
-               }
-               else
+                                                       {
+#ifdef CONFIG_80211AC_VHT
+                                                               if(IsSupportedVHT(psta->wireless_mode))
+                                                                       STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);
+                                                               else    
+#endif
+                                                                       STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);
+                                                       }
+                                               }
 #endif
-               {
-                       //hold cck counter
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); 
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); 
-               
-                               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
-                       FalseAlmCnt->Cnt_Cck_fail = ret_value;
-                               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
-                       FalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;
 
-                               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
-                       FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
+                                               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
+                                               else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
+                                                       PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) |(STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30));
+                                               else
+                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
+                                       }
+                       }
                }
-               
-               FalseAlmCnt->Cnt_all = (        FalseAlmCnt->Cnt_Fast_Fsync + 
-                                                       FalseAlmCnt->Cnt_SB_Search_fail +
-                                                       FalseAlmCnt->Cnt_Parity_Fail +
-                                                       FalseAlmCnt->Cnt_Rate_Illegal +
-                                                       FalseAlmCnt->Cnt_Crc8_fail +
-                                                       FalseAlmCnt->Cnt_Mcs_fail +
-                                                       FalseAlmCnt->Cnt_Cck_fail);     
-
-               FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
-
-#if (RTL8192C_SUPPORT==1)
-               if(pDM_Odm->SupportICType == ODM_RTL8192C)
-                       odm_ResetFACounter_92C(pDM_Odm);
-#endif
+               #else
+               _irqL irqL;
+               _list   *plist, *phead;
+               struct sta_info *psta;
+               struct sta_priv *pstapriv = &Adapter->stapriv;
+               u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
 
-#if (RTL8192D_SUPPORT==1)
-               if(pDM_Odm->SupportICType == ODM_RTL8192D)
-                       odm_ResetFACounter_92D(pDM_Odm);
-#endif
+               _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
 
-               if(pDM_Odm->SupportICType >=ODM_RTL8723A)
+               for(i=0; i< NUM_STA; i++)
                {
-                       //reset false alarm counter registers
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
-                       //update ofdm counter
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
-
-                       //reset CCK CCA counter
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); 
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); 
-                       //reset CCK FA counter
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); 
-                               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); 
-               }
-                       
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
-                       FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
-                       FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
-                       FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
-       }
-       else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-       {
-               u4Byte CCKenable;
-               //read OFDM FA counter
-               FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
-               FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
+                       phead = &(pstapriv->sta_hash[i]);
+                       plist = get_next(phead);
                
-               CCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
-               if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
-                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
-               else
-                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
-
-               // reset OFDM FA coutner
-               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
-               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
-               // reset CCK FA counter
-               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
-               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n",       FalseAlmCnt->Cnt_Cck_fail));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n",  FalseAlmCnt->Cnt_all));
-}
+                       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
+                       {
+                               psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
 
-//3============================================================
-//3 CCK Packet Detect Threshold
-//3============================================================
+                               plist = get_next(plist);
 
-VOID 
-odm_CCKPacketDetectionThresh(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
+                               if(_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) || 
+                                       _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
+                                       continue;
 
-       u1Byte  CurCCK_CCAThres;
-       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+                               if(psta->state & WIFI_ASOC_STATE)
+                               {
+                                       
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
+                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-//modify by Guo.Mingzhi 2011-12-29
-       if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
-//     if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
-               return;
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
+                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
 
-       if(pDM_Odm->bBtHsOperation)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
-               ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
-               return;
-       }
+                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){
+                                               //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);
+                                               #if(RTL8192D_SUPPORT==1)
+                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
+                                               #else
+                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
+                                               #endif
+                                       }
+                               }
+                       
+                       }
 
-#endif
+               }
+       
+               _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
+               #endif
 
-       if(!(pDM_Odm->SupportAbility & (ODM_BB_CCK_PD|ODM_BB_FA_CNT)))
-               return;
+               //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);
 
-       if(pDM_Odm->ExtLNA)
-               return;
+               for(i=0; i< sta_cnt; i++)
+               {
+                       if(PWDB_rssi[i] != (0)){
+                               if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW
+                               {
+                                       #if(RTL8192D_SUPPORT==1)
+                                       if(pDM_Odm->SupportICType == ODM_RTL8192D){
+                                               FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));              
+                                       }
+                                       #endif
+                                       
+                                       #if((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
+                                       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8723A)){
+                                               rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
+                                       }
+                                       #endif
+                                       
+                                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
+                                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)){   
+                                               PWDB_rssi[i] |= (UL_DL_STATE << 24);
+                                               rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
+                                       }
+                                       #endif
+                                       #if(RTL8192E_SUPPORT==1)
+                                       if(pDM_Odm->SupportICType == ODM_RTL8192E){
+                                               rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
+                                       }
+                                       #endif
+                                       #if(RTL8723B_SUPPORT==1)
+                                       if(pDM_Odm->SupportICType == ODM_RTL8723B){
+                                               rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
+                                       }
+                                       #endif
+                               }
+                               else{
+                                       #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))
+                                       if(pDM_Odm->SupportICType == ODM_RTL8188E){
+                                               ODM_RA_SetRSSI_8188E(
+                                               &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));
+                                       }
+                                       #endif
+                               }
+                       }
+               }               
+       }
 
-       if(pDM_Odm->bLinked)
+
+
+       if(tmpEntryMaxPWDB != 0)        // If associated entry is found
        {
-               if(pDM_Odm->RSSI_Min > 25)
-                       CurCCK_CCAThres = 0xcd;
-               else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
-                       CurCCK_CCAThres = 0x83;
-               else
-               {
-                       if(FalseAlmCnt->Cnt_Cck_fail > 1000)
-                               CurCCK_CCAThres = 0x83;
-                       else
-                               CurCCK_CCAThres = 0x40;
-               }
+               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;             
        }
        else
        {
-               if(FalseAlmCnt->Cnt_Cck_fail > 1000)
-                       CurCCK_CCAThres = 0x83;
-               else
-                       CurCCK_CCAThres = 0x40;
+               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
+       }
+
+       if(tmpEntryMinPWDB != 0xff) // If associated entry is found
+       {
+               pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;             
        }
-       
-#if (RTL8192D_SUPPORT==1) 
-       if((pDM_Odm->SupportICType == ODM_RTL8192D)&&(*pDM_Odm->pBandType == ODM_BAND_2_4G))
-               ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
        else
-#endif
-               ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
-}
+       {
+               pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
+       }
+
+       FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM
 
+       #if(RTL8192D_SUPPORT==1)
+       FindMinimumRSSI_Dmsp(Adapter);
+       #endif
+       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
-ODM_Write_CCK_CCA_Thres(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u1Byte                  CurCCK_CCAThres
+odm_RSSIMonitorCheckAP(
+       IN              PDM_ODM_T               pDM_Odm
        )
 {
-       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+#ifdef CONFIG_RTL_92C_SUPPORT || defined(CONFIG_RTL_92D_SUPPORT)
+
+       u4Byte i;
+       PSTA_INFO_T pstat;
 
-       if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)              //modify by Guo.Mingzhi 2012-01-03
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
        {
-               ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
+               pstat = pDM_Odm->pODM_StaInfo[i];
+               if(IS_STA_VALID(pstat) )
+               {                       
+#ifdef STA_EXT
+                       if (REMAP_AID(pstat) < (FW_NUM_STAT - 1))
+#endif
+                               add_update_rssi(pDM_Odm->priv, pstat);
+
+               }               
        }
-       pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
-       pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
-       
+#endif
+#endif
+
 }
 
-//3============================================================
-//3 BB Power Save
-//3============================================================
-VOID 
-odm_DynamicBBPowerSavingInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
-
-       pDM_PSTable->PreCCAState = CCA_MAX;
-       pDM_PSTable->CurCCAState = CCA_MAX;
-       pDM_PSTable->PreRFState = RF_MAX;
-       pDM_PSTable->CurRFState = RF_MAX;
-       pDM_PSTable->Rssi_val_min = 0;
-       pDM_PSTable->initialize = 0;
-}
 
 
 VOID
-odm_DynamicBBPowerSaving(
-       IN              PDM_ODM_T               pDM_Odm
+ODM_InitAllTimers(
+       IN PDM_ODM_T    pDM_Odm 
        )
-{      
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+{
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
+       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,
+       (RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, "SwAntennaSwitchTimer_8723B");
+#endif
+#endif
 
-       if (pDM_Odm->SupportICType != ODM_RTL8723A)
-               return;
-       if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
-               return;
-       if(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
-               return;
-       
-       //1 2.Power Saving for 92C
-       if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
-       {
-               odm_1R_CCA(pDM_Odm);
-       }
-       
-       // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
-       // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
-       //1 3.Power Saving for 88C
-       else
-       {
-               ODM_RF_Saving(pDM_Odm, FALSE);
-       }
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
+               (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
+#endif
        
+#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+#if (RTL8188E_SUPPORT == 1)
+       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,
+               (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");
+#endif
+#endif
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer, 
+               (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");
+       //
+       //Path Diversity
+       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
+       //
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 
+               (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");
+
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, 
+               (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");
+
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 
+               (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer");
+
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,
+               (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer");  
+#endif 
 }
 
 VOID
-odm_1R_CCA(
-       IN      PDM_ODM_T       pDM_Odm
+ODM_CancelAllTimers(
+       IN PDM_ODM_T    pDM_Odm 
        )
 {
-       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       //
+       // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in 
+       // win7 platform.
+       //
+       HAL_ADAPTER_STS_CHK(pDM_Odm)
+#endif 
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
+       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
+#endif
+#endif
 
-       if(pDM_Odm->RSSI_Min!= 0xFF)
-       {
-                
-               if(pDM_PSTable->PreCCAState == CCA_2R)
-               {
-                       if(pDM_Odm->RSSI_Min >= 35)
-                               pDM_PSTable->CurCCAState = CCA_1R;
-                       else
-                               pDM_PSTable->CurCCAState = CCA_2R;
-                       
-               }
-               else{
-                       if(pDM_Odm->RSSI_Min <= 30)
-                               pDM_PSTable->CurCCAState = CCA_2R;
-                       else
-                               pDM_PSTable->CurCCAState = CCA_1R;
-               }
-       }
-       else{
-               pDM_PSTable->CurCCAState=CCA_MAX;
-       }
-       
-       if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
-       {
-               if(pDM_PSTable->CurCCAState == CCA_1R)
-               {
-                       if(  pDM_Odm->RFType ==ODM_2T2R )
-                       {
-                               ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x13);
-                               //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
-                       }
-                       else
-                       {
-                               ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x23);
-                               //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
-                       }
-               }
-               else
-               {
-                       ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x33);
-                       //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
-               }
-               pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
-       }
-       //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("CCAStage = %s\n",(pDM_PSTable->CurCCAState==0)?"1RCCA":"2RCCA"));
+#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+#if (RTL8188E_SUPPORT == 1)
+       ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
+#endif
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);   
+       //
+       //Path Diversity
+       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
+       //
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
+
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
+
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
+
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
+#endif 
 }
 
-void
-ODM_RF_Saving(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte          bForceInNormal 
+
+VOID
+ODM_ReleaseAllTimers(
+       IN PDM_ODM_T    pDM_Odm 
        )
 {
-#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
-       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
-       u1Byte  Rssi_Up_bound = 30 ;
-       u1Byte  Rssi_Low_bound = 25;
-       #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
-       {
-               Rssi_Up_bound = 50 ;
-               Rssi_Low_bound = 45;
-       }
-       #endif
-       if(pDM_PSTable->initialize == 0){
-               
-               pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
-               pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
-               pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
-               pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
-               //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
-               pDM_PSTable->initialize = 1;
-       }
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
+#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
+       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
+#endif
+#endif
 
-       if(!bForceInNormal)
-       {
-               if(pDM_Odm->RSSI_Min != 0xFF)
-               {                        
-                       if(pDM_PSTable->PreRFState == RF_Normal)
-                       {
-                               if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
-                                       pDM_PSTable->CurRFState = RF_Save;
-                               else
-                                       pDM_PSTable->CurRFState = RF_Normal;
-                       }
-                       else{
-                               if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
-                                       pDM_PSTable->CurRFState = RF_Normal;
-                               else
-                                       pDM_PSTable->CurRFState = RF_Save;
-                       }
-               }
-               else
-                       pDM_PSTable->CurRFState=RF_MAX;
-       }
-       else
-       {
-               pDM_PSTable->CurRFState = RF_Normal;
-       }
-       
-       if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
-       {
-               if(pDM_PSTable->CurRFState == RF_Save)
-               {
-                       // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
-                       // Suggested by SD3 Yu-Nan. 2011.01.20.
-                       if(pDM_Odm->SupportICType == ODM_RTL8723A)
-                       {
-                               ODM_SetBBReg(pDM_Odm, 0x874  , BIT5, 0x1); //Reg874[5]=1b'1
-                       }
-                       ODM_SetBBReg(pDM_Odm, 0x874  , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
-                       ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
-                       ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
-                       ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
-                       ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
-                       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
-                       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
-                       //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Save"));
-               }
-               else
-               {
-                       ODM_SetBBReg(pDM_Odm, 0x874  , 0x1CC000, pDM_PSTable->Reg874); 
-                       ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70); 
-                       ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
-                       ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74); 
-                       ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);  
+#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
+#endif
 
-                       if(pDM_Odm->SupportICType == ODM_RTL8723A)
-                       {
-                               ODM_SetBBReg(pDM_Odm,0x874  , BIT5, 0x0); //Reg874[5]=1b'0
-                       }
-                       //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Normal"));
-               }
-               pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
-       }
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+#if (RTL8188E_SUPPORT == 1)
+       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
+#endif
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);
+       //
+       //Path Diversity
+       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
+       //
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
+
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer); 
 #endif 
 }
 
 
 //3============================================================
-//3 RATR MASK
-//3============================================================
-//3============================================================
-//3 Rate Adaptive
+//3 Tx Power Tracking
 //3============================================================
 
 VOID
-odm_RateAdaptiveMaskInit(
-       IN      PDM_ODM_T       pDM_Odm
-       )
+odm_IQCalibrate(
+               IN      PDM_ODM_T       pDM_Odm 
+               )
 {
-       PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
-
-       pMgntInfo->Ratr_State = DM_RATR_STA_INIT;
-
-       if (pMgntInfo->DM_Type == DM_Type_ByDriver)
-               pHalData->bUseRAMask = TRUE;
-       else
-               pHalData->bUseRAMask = FALSE;   
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       
+       if(!IS_HARDWARE_TYPE_JAGUAR(Adapter))
+               return;
+       else if(IS_HARDWARE_TYPE_8812AU(Adapter))
+               return;
+#if (RTL8821A_SUPPORT == 1)
+       if(pDM_Odm->bLinked)
+       {
+               if((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess))
+               {
+                       pDM_Odm->preChannel = *pDM_Odm->pChannel;
+                       pDM_Odm->LinkedInterval = 0;
+               }
 
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       pOdmRA->Type = DM_Type_ByDriver;
-       if (pOdmRA->Type == DM_Type_ByDriver)
-               pDM_Odm->bUseRAMask = _TRUE;
+               if(pDM_Odm->LinkedInterval < 3)
+                       pDM_Odm->LinkedInterval++;
+               
+               if(pDM_Odm->LinkedInterval == 2)
+               {
+                       // Mark out IQK flow to prevent tx stuck. by Maddest 20130306
+                       // Open it verified by James 20130715
+                       PHY_IQCalibrate_8821A(Adapter, FALSE);
+               }
+       }
        else
-               pDM_Odm->bUseRAMask = _FALSE;   
+               pDM_Odm->LinkedInterval = 0;
 #endif
-
-       pOdmRA->RATRState = DM_RATR_STA_INIT;
-       pOdmRA->LdpcThres = 35;
-       pOdmRA->bUseLdpc = FALSE;
-       pOdmRA->HighRSSIThresh = 50;
-       pOdmRA->LowRSSIThresh = 20;
 }
 
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) 
+
 VOID
-ODM_RateAdaptiveStateApInit(   
-       IN      PADAPTER                Adapter ,
-       IN      PRT_WLAN_STA    pEntry
+odm_TXPowerTrackingInit(
+       IN      PDM_ODM_T       pDM_Odm 
        )
 {
-       pEntry->Ratr_State = DM_RATR_STA_INIT;
-}
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))
+               return;
 #endif
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-u4Byte ODM_Get_Rate_Bitmap(
-       IN      PDM_ODM_T       pDM_Odm,        
-       IN      u4Byte          macid,
-       IN      u4Byte          ra_mask,        
-       IN      u1Byte          rssi_level)
-{
-       PSTA_INFO_T     pEntry;
-       u4Byte  rate_bitmap = 0;
-       u1Byte  WirelessMode;
-       //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);
-       
-       
-       pEntry = pDM_Odm->pODM_StaInfo[macid];
-       if(!IS_STA_VALID(pEntry))
-               return ra_mask;
-
-       WirelessMode = pEntry->wireless_mode;
-       
-       switch(WirelessMode)
-       {
-               case ODM_WM_B:
-                       if(ra_mask & 0x0000000c)                //11M or 5.5M enable                            
-                               rate_bitmap = 0x0000000d;
-                       else
-                               rate_bitmap = 0x0000000f;
-                       break;
-                       
-               case (ODM_WM_G):
-               case (ODM_WM_A):
-                       if(rssi_level == DM_RATR_STA_HIGH)
-                               rate_bitmap = 0x00000f00;
-                       else
-                               rate_bitmap = 0x00000ff0;
-                       break;
-                       
-               case (ODM_WM_B|ODM_WM_G):
-                       if(rssi_level == DM_RATR_STA_HIGH)
-                               rate_bitmap = 0x00000f00;
-                       else if(rssi_level == DM_RATR_STA_MIDDLE)
-                               rate_bitmap = 0x00000ff0;
-                       else
-                               rate_bitmap = 0x00000ff5;
-                       break;          
-
-               case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :
-               case (ODM_WM_B|ODM_WM_N24G)     :
-               case (ODM_WM_G|ODM_WM_N24G)     :
-               case (ODM_WM_A|ODM_WM_N5G)      :
-                       {                                       
-                               if (    pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)
-                               {
-                                       if(rssi_level == DM_RATR_STA_HIGH)
-                                       {
-                                               rate_bitmap = 0x000f0000;
-                                       }
-                                       else if(rssi_level == DM_RATR_STA_MIDDLE)
-                                       {
-                                               rate_bitmap = 0x000ff000;
-                                       }
-                                       else{
-                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
-                                                       rate_bitmap = 0x000ff015;
-                                               else
-                                                       rate_bitmap = 0x000ff005;
-                                       }                               
-                               }
-                               else
-                               {
-                                       if(rssi_level == DM_RATR_STA_HIGH)
-                                       {               
-                                               rate_bitmap = 0x0f8f0000;
-                                       }
-                                       else if(rssi_level == DM_RATR_STA_MIDDLE)
-                                       {
-                                               rate_bitmap = 0x0f8ff000;
-                                       }
-                                       else
-                                       {
-                                               if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
-                                                       rate_bitmap = 0x0f8ff015;
-                                               else
-                                                       rate_bitmap = 0x0f8ff005;
-                                       }                                       
-                               }
-                       }
-                       break;
-
-               case (ODM_WM_AC|ODM_WM_G):
-                       if(rssi_level == 1)
-                               rate_bitmap = 0xfc3f0000;
-                       else if(rssi_level == 2)
-                               rate_bitmap = 0xfffff000;
-                       else
-                               rate_bitmap = 0xffffffff;
-                       break;
-
-               case (ODM_WM_AC|ODM_WM_A):
-
-                       if (pDM_Odm->RFType == RF_1T1R)
-                       {
-                               if(rssi_level == 1)                             // add by Gary for ac-series
-                                       rate_bitmap = 0x003f8000;
-                               else if (rssi_level == 2)
-                                       rate_bitmap = 0x003ff000;
-                               else
-                                       rate_bitmap = 0x003ff010;
-                       }
-                       else
-                       {
-                               if(rssi_level == 1)                             // add by Gary for ac-series
-                                       rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9
-                               else if (rssi_level == 2)
-                                       rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9
-                               else
-                                       rate_bitmap = 0xfffff010;       // All
-                       }
-                       break;
-                       
-               default:
-                       if(pDM_Odm->RFType == RF_1T2R)
-                               rate_bitmap = 0x000fffff;
-                       else
-                               rate_bitmap = 0x0fffffff;
-                       break;  
-
-       }
-
-       //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",rssi_level,WirelessMode,rate_bitmap));
-
-       return (ra_mask&rate_bitmap);
-       
+       odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
 }      
-#endif
-
 
-VOID
-odm_RefreshBasicRateMask(
-       IN              PDM_ODM_T               pDM_Odm 
+u1Byte 
+getSwingIndex(
+       IN      PDM_ODM_T       pDM_Odm 
        )
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter  =  pDM_Odm->Adapter;
-       static u1Byte           Stage = 0;
-       u1Byte                  CurStage = 0;
-       OCTET_STRING    osRateSet;
-       PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);
-       u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};
-
-       if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 )
-               return;
-
-       if(pDM_Odm->bLinked == FALSE)   // unlink Default port information
-               CurStage = 0;   
-       else if(pDM_Odm->RSSI_Min < 40) // link RSSI  < 40%
-               CurStage = 1;
-       else if(pDM_Odm->RSSI_Min > 45) // link RSSI > 45%
-               CurStage = 3;   
-       else
-               CurStage = 2;                                   // link  25% <= RSSI <= 30%
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u1Byte                  i = 0;
+       u4Byte                  bbSwing;
+       u4Byte                  swingTableSize;
+       pu4Byte                         pSwingTable;
 
-       if(CurStage != Stage)
+       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
+               pDM_Odm->SupportICType == ODM_RTL8192E) 
        {
-               if(CurStage == 1)
+               bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
+
+               pSwingTable = OFDMSwingTable_New;
+               swingTableSize = OFDM_TABLE_SIZE;
+       } else {
+#if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
+               if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
                {
-                       FillOctetString(osRateSet, RateSet, 5);
-                       FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);
-                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);
+                       bbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);
+                       pSwingTable = TxScalingTable_Jaguar;
+                       swingTableSize = TXSCALE_TABLE_SIZE;
                }
-               else if(CurStage == 3 && (Stage == 1 || Stage == 2))
+               else
+#endif
                {
-                       Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
+                       bbSwing = 0;
+                       pSwingTable = OFDMSwingTable;
+                       swingTableSize = OFDM_TABLE_SIZE;
                }
        }
-       
-       Stage = CurStage;
-#endif
-}
-
-/*-----------------------------------------------------------------------------
- * Function:   odm_RefreshRateAdaptiveMask()
- *
- * Overview:   Update rate table mask according to rssi
- *
- * Input:              NONE
- *
- * Output:             NONE
- *
- * Return:             NONE
- *
- * Revised History:
- *     When            Who             Remark
- *     05/27/2009      hpfan   Create Version 0.  
- *
- *---------------------------------------------------------------------------*/
-VOID
-odm_RefreshRateAdaptiveMask(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n")); 
-       if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));
-               return; 
-       }
-       //
-       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
-       // at the same time. In the stage2/3, we need to prive universal interface and merge all
-       // HW dynamic mechanism.
-       //
-       switch  (pDM_Odm->SupportPlatform)
-       {
-               case    ODM_WIN:
-                       odm_RefreshRateAdaptiveMaskMP(pDM_Odm);
-                       break;
-
-               case    ODM_CE:
-                       odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
-                       break;
 
-               case    ODM_AP:
-               case    ODM_ADSL:
-                       odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);
+       for (i = 0; i < swingTableSize; ++i) {
+               u4Byte tableValue = pSwingTable[i];
+               
+               if (tableValue >= 0x100000 )
+                       tableValue >>= 22;
+               if (bbSwing == tableValue)
                        break;
        }
-       
+       return i;
 }
 
 VOID
-odm_RefreshRateAdaptiveMaskMP(
-       IN              PDM_ODM_T               pDM_Odm 
+odm_TXPowerTrackingThermalMeterInit(
+       IN      PDM_ODM_T       pDM_Odm 
        )
 {
+       u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);
+       u1Byte                  p = 0;
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                                pAdapter         =  pDM_Odm->Adapter;
-       PADAPTER                                pTargetAdapter = NULL;
-       HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);
-       PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);
-       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
 
-       if(pAdapter->bDriverStopped)
+       #if     MP_DRIVER != 1                                  //for mp driver, turn off txpwrtracking as default
+       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl = TRUE;            
+       #endif
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       PADAPTER                        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+
+
+       if (pDM_Odm->SupportICType >= ODM_RTL8188E) 
        {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
-               return;
+               pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
+               pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
+               pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
+               
+               if ( *(pDM_Odm->mp_mode) != 1)
+                       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
+               else
+                       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
+
+               MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
        }
+       else
+       {
+               struct dm_priv  *pdmpriv = &pHalData->dmpriv;
 
-       if(!pHalData->bUseRAMask)
+               pdmpriv->bTXPowerTracking = _TRUE;
+               pdmpriv->TXPowercount = 0;
+               pdmpriv->bTXPowerTrackingInit = _FALSE;
+               //#if   (MP_DRIVER != 1)                //for mp driver, turn off txpwrtracking as default
+
+               if (*(pDM_Odm->mp_mode) != 1)
+                       pdmpriv->TxPowerTrackControl = _TRUE;
+               else
+                       pdmpriv->TxPowerTrackControl = _FALSE;
+
+
+               //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
+       }
+       
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       #ifdef RTL8188E_SUPPORT
        {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
-               return;
+               pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
+               pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
+               pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
+               pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
        }
+       #endif
+#endif
 
-       // if default port is connected, update RA table for default port (infrastructure mode only)
-       if(pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter)))
+       //pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
+       pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
+       pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
+       pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;       
+
+       // The index of "0 dB" in SwingTable.
+       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
+               pDM_Odm->SupportICType == ODM_RTL8192E) 
        {
+               pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
+               pDM_Odm->DefaultCckIndex = 20;  
+       }
+       else
+       {
+               pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;
+               pDM_Odm->DefaultCckIndex = 24;  
+       }
+
+       pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
+       pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
        
-               if(pHalData->UndecoratedSmoothedPWDB < pRA->LdpcThres)
-               {
-                       pRA->bUseLdpc = TRUE;
-                       pRA->bLowerRtsRate = TRUE;
-                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                               MgntSet_TX_LDPC(pAdapter,0,TRUE);
-                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
-               }
-               else if(pHalData->UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
-               {
-                       pRA->bUseLdpc = FALSE;
-                       pRA->bLowerRtsRate = FALSE;
-                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                               MgntSet_TX_LDPC(pAdapter,0,FALSE);
-                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
-               }
-       
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));
-               if( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State) )
-               {
-                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));
-                       pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);
-               }
+       for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
+       {
+               pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;             
+               pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;             
+               pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
+               pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
+               pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
        }
 
+}
+
+
+VOID
+ODM_TXPowerTrackingCheck(
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
        //
-       // The following part configure AP/VWifi/IBSS rate adaptive mask.
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
        //
+       switch  (pDM_Odm->SupportPlatform)
+       {
+               case    ODM_WIN:
+                       odm_TXPowerTrackingCheckMP(pDM_Odm);
+                       break;
 
-       if(pMgntInfo->mIbss)    // Target: AP/IBSS peer.
-               pTargetAdapter = GetDefaultAdapter(pAdapter);
-       else
-               pTargetAdapter = GetFirstAPAdapter(pAdapter);
+               case    ODM_CE:
+                       odm_TXPowerTrackingCheckCE(pDM_Odm);
+                       break;
 
-       // if extension port (softap) is started, updaet RA table for more than one clients associate
-       if(pTargetAdapter != NULL)
-       {
-               int     i;
-               PRT_WLAN_STA    pEntry;
+               case    ODM_AP:
+                       odm_TXPowerTrackingCheckAP(pDM_Odm);            
+                       break;          
 
-               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
-               {
-                       pEntry = AsocEntry_EnumStation(pTargetAdapter, i);
-                       if(NULL != pEntry)
-                       {
-                               if(pEntry->bAssociated)
-                               {
-                                       if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) )
-                                       {
-                                               ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);
-                                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State));
-                                               pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);
-                                       }
-                               }
-                       }
-               }
+               case    ODM_ADSL:
+                       //odm_DIGAP(pDM_Odm);
+                       break;  
        }
 
-       if(pMgntInfo->bSetTXPowerTrainingByOid)
-               pMgntInfo->bSetTXPowerTrainingByOid = FALSE;    
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 }
 
-
 VOID
-odm_RefreshRateAdaptiveMaskCE(
-       IN              PDM_ODM_T               pDM_Odm 
+odm_TXPowerTrackingCheckCE(
+       IN              PDM_ODM_T               pDM_Odm 
        )
 {
 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       u1Byte  i;
-       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
-       PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;
-
-       if(pAdapter->bDriverStopped)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       #if( (RTL8192C_SUPPORT==1) ||  (RTL8723A_SUPPORT==1) )
+       if(IS_HARDWARE_TYPE_8192C(Adapter)){
+               rtl8192c_odm_CheckTXPowerTracking(Adapter);
                return;
        }
+       #endif
 
-       if(!pDM_Odm->bUseRAMask)
+       #if (RTL8192D_SUPPORT==1) 
+       if(IS_HARDWARE_TYPE_8192D(Adapter)){    
+               #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+               if(!Adapter->bSlaveOfDMSP)
+               #endif
+                       rtl8192d_odm_CheckTXPowerTracking(Adapter);
+               return; 
+       }
+       #endif
+
+       #if(((RTL8188E_SUPPORT==1) ||  (RTL8812A_SUPPORT==1) ||  (RTL8821A_SUPPORT==1) ||  (RTL8192E_SUPPORT==1)  ||  (RTL8723B_SUPPORT==1)  ))
+       if(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
        {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
                return;
        }
 
-       //printk("==> %s \n",__FUNCTION__);
-
-       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
-               PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pstat) ) {
-                       if(IS_MCAST( pstat->hwaddr))  //if(psta->mac_id ==1)
-                                continue;
-                       if(IS_MCAST( pstat->hwaddr))
-                               continue;
-
-                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
-                       {
-                               if(pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres)
-                               {
-                                       pRA->bUseLdpc = TRUE;
-                                       pRA->bLowerRtsRate = TRUE;
-                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                                               Set_RA_LDPC_8812(pstat, TRUE);
-                                       //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
-                               }
-                               else if(pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
-                               {
-                                       pRA->bUseLdpc = FALSE;
-                                       pRA->bLowerRtsRate = FALSE;
-                                       if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
-                                               Set_RA_LDPC_8812(pstat, FALSE);
-                                       //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
-                               }
-                       }
-                       #endif
-
-                       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));
-                               //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);
-                               rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
-                       }
+       if(!pDM_Odm->RFCalibrateInfo.TM_Trigger)                //at least delay 1 sec
+       {
+               //pHalData->TxPowerCheckCnt++;  //cosa add for debug
+               if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)||IS_HARDWARE_TYPE_8723B(Adapter))
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
+               else
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);
                
-               }
-       }                       
-       
-#endif
+               //DBG_871X("Trigger Thermal Meter!!\n");
+               
+               pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
+               return;
+       }
+       else
+       {
+               //DBG_871X("Schedule TxPowerTracking direct call!!\n");
+               ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
+               pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
+       }
+       #endif
+#endif 
 }
 
 VOID
-odm_RefreshRateAdaptiveMaskAPADSL(
-       IN              PDM_ODM_T               pDM_Odm
+odm_TXPowerTrackingCheckMP(
+       IN              PDM_ODM_T               pDM_Odm 
        )
 {
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-       struct rtl8192cd_priv *priv = pDM_Odm->priv;
-       struct stat_info        *pstat;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER        Adapter = pDM_Odm->Adapter;
 
-       if (!priv->pmib->dot11StationConfigEntry.autoRate) 
+       if (ODM_CheckPowerStatus(Adapter) == FALSE) 
+       {
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>ODM_CheckPowerStatus() return FALSE\n"));
                return;
+       }
 
-       if (list_empty(&priv->asoc_list))
+       if(IS_HARDWARE_TYPE_8723A(Adapter))
                return;
 
-       list_for_each_entry(pstat, &priv->asoc_list, asoc_list) {
-               if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) {
-                       ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));
-
-#ifdef CONFIG_RTL_88E_SUPPORT
-                       if (GET_CHIP_VER(priv)==VERSION_8188E) {
-#ifdef TXREPORT
-                               add_RATid(priv, pstat);
-#endif
-                       } else
-#endif
-                       {
-#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)                 
-                       add_update_RATid(priv, pstat);
-#endif
-                       }
-               }
+       if(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)
+               odm_TXPowerTrackingThermalMeterCheck(Adapter);
+       else {
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\n"));
        }
 #endif
+       
 }
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
 VOID
-ODM_DynamicARFBSelect(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  rate,
-       IN              BOOLEAN                 Collision_State 
-)
+odm_TXPowerTrackingCheckAP(
+       IN              PDM_ODM_T               pDM_Odm
+       )
 {
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+       prtl8192cd_priv priv            = pDM_Odm->priv;
 
-       if(pDM_Odm->SupportICType != ODM_RTL8192E)
-               return;
-
-       if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12){
-               if (Collision_State == 1){
-                       if(rate == DESC_RATEMCS12){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);        
-                       }
-                       else if(rate == DESC_RATEMCS11){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);        
-                       }
-                       else if(rate == DESC_RATEMCS10){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);        
-                       }
-                       else if(rate == DESC_RATEMCS9){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);        
-                       }
-               }
-               else{   // Collision_State == 0
-                       if(rate == DESC_RATEMCS12){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        
-                       }
-                       else if(rate == DESC_RATEMCS11){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);        
-                       }
-                       else if(rate == DESC_RATEMCS10){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);        
-                       }
-                       else if(rate == DESC_RATEMCS9){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);        
-                       }
+       if ( (priv->pmib->dot11RFEntry.ther) && ((priv->up_time % priv->pshare->rf_ft_var.tpt_period) == 0)){
+#ifdef CONFIG_RTL_92D_SUPPORT
+               if (GET_CHIP_VER(priv)==VERSION_8192D){
+                       tx_power_tracking_92D(priv);
+               } else 
+#endif
+               {
+#ifdef CONFIG_RTL_92C_SUPPORT                  
+                       tx_power_tracking(priv);
+#endif
                }
        }
-       else{  // MCS13~MCS15,  1SS, G-mode
-               if (Collision_State == 1){
-                       if(rate == DESC_RATEMCS15){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);        
-                       }
-                       else if(rate == DESC_RATEMCS14){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);        
-                       }
-                       else if(rate == DESC_RATEMCS13){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);        
-                       }
-               }
-               else{   // Collision_State == 0
-                       if(rate == DESC_RATEMCS15){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);        
-                       }
-                       else if(rate == DESC_RATEMCS14){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        
-                       }
-                       else if(rate == DESC_RATEMCS13){
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        
-                       }
-                       else{
-
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);
-                               ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        
-                       }
+#endif 
 
+}
 
-               }
 
-       }       
 
-}
+//antenna mapping info
+// 1: right-side antenna
+// 2/0: left-side antenna
+//PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt:  for right-side antenna:   Ant:1    RxDefaultAnt1
+//PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt:  for left-side antenna:     Ant:0    RxDefaultAnt2
+// We select left antenna as default antenna in initial process, modify it as needed
+//
 
-#endif
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 
-// Return Value: BOOLEAN
-// - TRUE: RATRState is changed.
-BOOLEAN 
-ODM_RAStateCheck(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              s4Byte                  RSSI,
-       IN              BOOLEAN                 bForceUpdate,
-       OUT             pu1Byte                 pRATRState
+VOID
+odm_TXPowerTrackingThermalMeterCheck(
+       IN      PADAPTER                Adapter
        )
 {
-       PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
-       const u1Byte GoUpGap = 5;
-       u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;
-       u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;
-       u1Byte RATRState;
+#ifndef AP_BUILD_WORKAROUND
+       static u1Byte                   TM_Trigger = 0;
 
-       // Threshold Adjustment: 
-       // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.
-       // Here GoUpGap is added to solve the boundary's level alternation issue.
-       switch (*pRATRState)
+       if(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))
        {
-               case DM_RATR_STA_INIT:
-               case DM_RATR_STA_HIGH:
-                       break;
-
-               case DM_RATR_STA_MIDDLE:
-                       HighRSSIThreshForRA += GoUpGap;
-                       break;
-
-               case DM_RATR_STA_LOW:
-                       HighRSSIThreshForRA += GoUpGap;
-                       LowRSSIThreshForRA += GoUpGap;
-                       break;
-
-               default: 
-                       ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );
-                       break;
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
+                       ("===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\n"));
+               return;
        }
 
-       // Decide RATRState by RSSI.
-       if(RSSI > HighRSSIThreshForRA)
-               RATRState = DM_RATR_STA_HIGH;
-       else if(RSSI > LowRSSIThreshForRA)
-               RATRState = DM_RATR_STA_MIDDLE;
+       if(!TM_Trigger)         //at least delay 1 sec
+       {
+               if(IS_HARDWARE_TYPE_8192D(Adapter))
+                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_92D, BIT17 | BIT16, 0x03);
+               else if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||
+                           IS_HARDWARE_TYPE_8723B(Adapter))
+                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
+               else
+                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
+               
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger Thermal Meter!!\n"));
+               
+               TM_Trigger = 1;
+               return;
+       }
        else
-               RATRState = DM_RATR_STA_LOW;
-       //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);
-
-       if( *pRATRState!=RATRState || bForceUpdate)
        {
-               ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );
-               *pRATRState = RATRState;
-               return TRUE;
+               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));           
+               odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
+               TM_Trigger = 0;
        }
-
-       return FALSE;
+#endif
 }
 
+// Only for 8723A SW ANT DIV INIT--2012--07--17
+VOID
+odm_SwAntDivInit_NIC_8723A(
+       IN      PDM_ODM_T               pDM_Odm)
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       
+       u1Byte                  btAntNum=BT_GetPgAntNum(Adapter);
 
-//============================================================
-
-//3============================================================
-//3 Dynamic Tx Power
-//3============================================================
-
-VOID 
-odm_DynamicTxPowerInit(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-
-       #if DEV_BUS_TYPE==RT_USB_INTERFACE                                      
-       if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
+       if(IS_HARDWARE_TYPE_8723A(Adapter))
        {
-               odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
-               pMgntInfo->bDynamicTxPowerEnable = TRUE;
-       }               
-       else    
-       #else
-       //so 92c pci do not need dynamic tx power? vivi check it later
-       if(IS_HARDWARE_TYPE_8192D(Adapter))
-               pMgntInfo->bDynamicTxPowerEnable = TRUE;
-       else
-               pMgntInfo->bDynamicTxPowerEnable = FALSE;
-       #endif
+               pDM_SWAT_Table->ANTA_ON =TRUE;
+               
+               // Set default antenna B status by PG
+               if(btAntNum == 2)
+                       pDM_SWAT_Table->ANTB_ON = TRUE;
+               else if(btAntNum == 1)
+                       pDM_SWAT_Table->ANTB_ON = FALSE;
+               else
+                       pDM_SWAT_Table->ANTB_ON = TRUE;
+       }       
        
+}
 
-       pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
-       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       pdmpriv->bDynamicTxPowerEnable = _FALSE;
-
-       #if (RTL8192C_SUPPORT==1) 
-       #ifdef CONFIG_USB_HCI
+#endif //end #ifMP
 
-       #ifdef CONFIG_INTEL_PROXIM
-       if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
-       #else
-       if(pHalData->BoardType == BOARD_USB_High_PA)
-       #endif
 
-       {
-               //odm_SavePowerIndex(Adapter);
-               odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
-               pdmpriv->bDynamicTxPowerEnable = _TRUE;
-       }               
-       else    
-       #else
-               pdmpriv->bDynamicTxPowerEnable = _FALSE;
-       #endif
-       #endif
-       
-       pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
-       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; 
-       
-#endif
-       
-}
 
+//3============================================================
+//3 SW Antenna Diversity
+//3============================================================
+#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
 VOID
-odm_DynamicTxPowerSavePowerIndex(
-       IN              PDM_ODM_T               pDM_Odm 
+odm_SwAntDivInit(
+       IN              PDM_ODM_T               pDM_Odm
        )
-{      
-       u1Byte          index;
-       u4Byte          Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
-       
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
-       for(index = 0; index< 6; index++)
-               pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)  
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       for(index = 0; index< 6; index++)
-               pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       odm_SwAntDivInit_NIC(pDM_Odm);
+#elif(DM_ODM_SUPPORT_TYPE == ODM_AP)
+       dm_SW_AntennaSwitchInit(pDM_Odm->priv);
 #endif
 }
 
 VOID
-odm_DynamicTxPowerRestorePowerIndex(
+odm_SwAntDivInit_NIC(
        IN              PDM_ODM_T               pDM_Odm
        )
 {
-       u1Byte                  index;
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       for(index = 0; index< 6; index++)
-               PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
-#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)   
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       for(index = 0; index< 6; index++)
-               rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
-#endif
-#endif
-}
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
 
-VOID
-odm_DynamicTxPowerWritePowerIndex(
-       IN      PDM_ODM_T       pDM_Odm, 
-       IN      u1Byte          Value)
-{
 
-       u1Byte                  index;
-       u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+// Init SW ANT DIV mechanism for 8723AE/AU/AS
+// Neil Chen--2012--07--17---
+// CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
+//#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
+#if (RTL8723A_SUPPORT==1) 
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+       {
+               odm_SwAntDivInit_NIC_8723A(pDM_Odm);    
+       }       
+#endif
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
+       pDM_SWAT_Table->RSSI_sum_A = 0;
+       pDM_SWAT_Table->RSSI_cnt_A = 0;
+       pDM_SWAT_Table->RSSI_sum_B = 0;
+       pDM_SWAT_Table->RSSI_cnt_B = 0;
+       pDM_SWAT_Table->CurAntenna = MAIN_ANT;
+       pDM_SWAT_Table->PreAntenna = MAIN_ANT;
+       pDM_SWAT_Table->try_flag = 0xff;
+       pDM_SWAT_Table->PreRSSI = 0;
+       pDM_SWAT_Table->SWAS_NoLink_State = 0;
+       pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
+       pDM_SWAT_Table->SelectAntennaMap=0xAA;
+       pDM_SWAT_Table->lastTxOkCnt = 0;
+       pDM_SWAT_Table->lastRxOkCnt = 0;
+       pDM_SWAT_Table->TXByteCnt_A = 0;
+       pDM_SWAT_Table->TXByteCnt_B = 0;
+       pDM_SWAT_Table->RXByteCnt_A = 0;
+       pDM_SWAT_Table->RXByteCnt_B = 0;
+       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
+       pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
        
-       for(index = 0; index< 6; index++)
-               //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
-               ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
-
 }
 
-
-VOID 
-odm_DynamicTxPower(
+//
+// 20100514 Joseph: 
+// Add new function to reset the state of antenna diversity before link.
+//
+VOID
+ODM_SwAntDivResetBeforeLink(
        IN              PDM_ODM_T               pDM_Odm
        )
 {
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-       //PADAPTER              pAdapter = pDM_Odm->Adapter;
-//     prtl8192cd_priv priv            = pDM_Odm->priv;
 
-       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
-               return;
-
-       //
-       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
-       // at the same time. In the stage2/3, we need to prive universal interface and merge all
-       // HW dynamic mechanism.
-       //
-       switch  (pDM_Odm->SupportPlatform)
-       {
-               case    ODM_WIN:
-               case    ODM_CE:
-                       odm_DynamicTxPowerNIC(pDM_Odm);
-                       break;  
-               case    ODM_AP:
-                       odm_DynamicTxPowerAP(pDM_Odm);
-                       break;          
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
 
-               case    ODM_ADSL:
-                       //odm_DIGAP(pDM_Odm);
-                       break;  
-       }
+       pDM_SWAT_Table->SWAS_NoLink_State = 0;
 
-       
 }
 
-
-VOID 
-odm_DynamicTxPowerNIC(
+//
+// 20100514 Luke/Joseph:
+// Add new function to reset antenna diversity state after link.
+//
+VOID
+ODM_SwAntDivRestAfterLink(
        IN              PDM_ODM_T               pDM_Odm
        )
-{      
-       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
-               return;
-       
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;
+       u4Byte             i;
 
-       if(pDM_Odm->SupportICType == ODM_RTL8192C)      
-       {
-               odm_DynamicTxPower_92C(pDM_Odm);
-       }
-       else if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)
        {
-               odm_DynamicTxPower_92D(pDM_Odm);
+           pDM_SWAT_Table->RSSI_cnt_A = 0;
+           pDM_SWAT_Table->RSSI_cnt_B = 0;
+           pDM_Odm->RSSI_test = FALSE;
+           pDM_SWAT_Table->try_flag = 0xff;
+           pDM_SWAT_Table->RSSI_Trying = 0;
+           pDM_SWAT_Table->SelectAntennaMap=0xAA;
+       
        }
-       else if (pDM_Odm->SupportICType == ODM_RTL8821)
+       else if(pDM_Odm->SupportICType & (ODM_RTL8723B|ODM_RTL8821))
        {
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
-               PADAPTER                Adapter  =  pDM_Odm->Adapter;
-               PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);
-
-               if (pMgntInfo->RegRspPwr == 1)
+               pDM_Odm->RSSI_test = FALSE;
+               pDM_SWAT_Table->try_flag = 0xff;
+               pDM_SWAT_Table->RSSI_Trying = 0;
+               pDM_SWAT_Table->Double_chk_flag= 0;
+               
+               pDM_FatTable->RxIdleAnt=MAIN_ANT;
+               
+               for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
                {
-                       if(pDM_Odm->RSSI_Min > 60)
-                       {
-                               ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
-
-                       }
-                       else if(pDM_Odm->RSSI_Min < 55)
-                       {
-                               ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
-                       }
+                       pDM_FatTable->MainAnt_Sum[i] = 0;
+                       pDM_FatTable->AuxAnt_Sum[i] = 0;
+                       pDM_FatTable->MainAnt_Cnt[i] = 0;
+                       pDM_FatTable->AuxAnt_Cnt[i] = 0;
                }
-#endif
+
        }
-#endif 
 }
 
-VOID 
-odm_DynamicTxPowerAP(
+void
+odm_SwAntDetectInit(
        IN              PDM_ODM_T               pDM_Odm
-
        )
-{      
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-       s4Byte i;
-
-       if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
-               return;
-       
-#ifdef HIGH_POWER_EXT_PA
-       if(pDM_Odm->ExtPA)
-               tx_power_control(priv);
-#endif         
-
-       /*
-        *      Check if station is near by to use lower tx power
-        */
-
-       if ((priv->up_time % 3) == 0 )  {
-               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
-                       PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
-                       if(IS_STA_VALID(pstat) ) {
-                               if ((pstat->hp_level == 0) && (pstat->rssi > TX_POWER_NEAR_FIELD_THRESH_AP+4))
-                                       pstat->hp_level = 1;
-                               else if ((pstat->hp_level == 1) && (pstat->rssi < TX_POWER_NEAR_FIELD_THRESH_AP))
-                                       pstat->hp_level = 0;
-                       }
-               }
-       }
-
-#endif 
+{
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+#if (RTL8723B_SUPPORT == 1)
+       pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);
+#endif
+       pDM_SWAT_Table->PreAntenna = MAIN_ANT;
+       pDM_SWAT_Table->CurAntenna = MAIN_ANT;
+       pDM_SWAT_Table->SWAS_NoLink_State = 0;
 }
 
-
-VOID 
-odm_DynamicTxPower_92C(
-       IN      PDM_ODM_T       pDM_Odm
+VOID
+ODM_SwAntDivChkPerPktRssi(
+       IN PDM_ODM_T    pDM_Odm,
+       IN u1Byte               StationID,
+       IN PODM_PHY_INFO_T pPhyInfo
        )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER Adapter = pDM_Odm->Adapter;
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       s4Byte                          UndecoratedSmoothedPWDB;
-
-       // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
-       if (pDM_Odm->ExtPA == FALSE)
-               return;
-
-       // STA not connected and AP not connected
-       if((!pMgntInfo->bMediaConnect) &&       
-               (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
-       {
-               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
-               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-
-               //the LastDTPlvl should reset when disconnect, 
-               //otherwise the tx power level wouldn't change when disconnect and connect again.
-               // Maddest 20091220.
-                pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+{      
+       SWAT_T          *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       
+       if(!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
                return;
-       }
 
-#if (INTEL_PROXIMITY_SUPPORT == 1)
-       // Intel set fixed tx power 
-       if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
+// temporary Fix 8723A MP SW ANT DIV Bug --NeilChen--2012--07--11
+#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)
        {
-               switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
-                       case 1:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
-                               break;
-                       case 2:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
-                               break;
-                       case 3:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
-                               break;
-                       case 4:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
-                               break;
-                       case 5:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
-                               break;
-                       default:
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
-                               break;
-               }               
-       }
-       else
-#endif         
-       { 
-               if(     (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
-                       (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
-                       pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+               //if(StationID == pDM_SWAT_Table->RSSI_target)
+               //{
+               //1 RSSI for SW Antenna Switch
+               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
                {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
+                       pDM_SWAT_Table->RSSI_cnt_A++;
                }
                else
                {
-                       if(pMgntInfo->bMediaConnect)    // Default port
-                       {
-                               if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
-                               {
-                                       UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
-                                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-                               }
-                               else
-                               {
-                                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
-                                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-                               }
-                       }
-                       else // associated entry pwdb
-                       {       
-                               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-                       }
-                               
-                       if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
-                       {
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
-                       }
-                       else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
-                               (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
-                       {
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
-                       }
-                       else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
-                       {
-                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
-                       }
-               }
-       }
-       if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
-       {
-               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
-               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-               if(     (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
-                       (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
-                       odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
-               else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
-                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
-               else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
-                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
-       }
-       pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
-
-       
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-
-       #if (RTL8192C_SUPPORT==1) 
-       PADAPTER Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
-       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
-       int     UndecoratedSmoothedPWDB;
-
-       if(!pdmpriv->bDynamicTxPowerEnable)
-               return;
+                       pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
+                       pDM_SWAT_Table->RSSI_cnt_B++;
 
-#ifdef CONFIG_INTEL_PROXIM
-       if(Adapter->proximity.proxim_on== _TRUE){
-               struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
-               // Intel set fixed tx power 
-               printk("\n %s  Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
-               if(prox_priv!=NULL){
-                       if(prox_priv->proxim_modeinfo->power_output> 0) 
-                       {
-                               switch(prox_priv->proxim_modeinfo->power_output)
-                               {
-                                       case 1:
-                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_100;
-                                               printk("TxHighPwrLevel_100\n");
-                                               break;
-                                       case 2:
-                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_70;
-                                               printk("TxHighPwrLevel_70\n");
-                                               break;
-                                       case 3:
-                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_50;
-                                               printk("TxHighPwrLevel_50\n");
-                                               break;
-                                       case 4:
-                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_35;
-                                               printk("TxHighPwrLevel_35\n");
-                                               break;
-                                       case 5:
-                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_15;
-                                               printk("TxHighPwrLevel_15\n");
-                                               break;
-                                       default:
-                                               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
-                                               printk("TxHighPwrLevel_100\n");
-                                               break;
-                               }               
-                       }
                }
+               //}
        }
        else
-#endif 
        {
-               // STA not connected and AP not connected
-               if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&   
-                       (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
-               {
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-
-                       //the LastDTPlvl should reset when disconnect, 
-                       //otherwise the tx power level wouldn't change when disconnect and connect again.
-                       // Maddest 20091220.
-                       pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
-                       return;
-               }
-               
-               if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port
+               if(StationID == pDM_SWAT_Table->RSSI_target)
                {
-               #if 0
-                       //todo: AP Mode
-                       if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
-                              (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+                       //1 RSSI for SW Antenna Switch
+                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
                        {
-                               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-                               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                               pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
+                               pDM_SWAT_Table->RSSI_cnt_A++;
                        }
                        else
                        {
-                               UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
-                               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                               pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
+                               pDM_SWAT_Table->RSSI_cnt_B++;
+
                        }
-               #else
-               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;     
-               #endif
-               }
-               else // associated entry pwdb
-               {       
-                       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-                       
-               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
-               {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
                }
-               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
-                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+       }
+#else  
+       if(StationID == pDM_SWAT_Table->RSSI_target)
+       {
+               //1 RSSI for SW Antenna Switch
+               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
                {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+                       pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
+                       pDM_SWAT_Table->RSSI_cnt_A++;
                }
-               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               else
                {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+                       pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
+                       pDM_SWAT_Table->RSSI_cnt_B++;
+
                }
        }
-       if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+#endif
+}
+
+//
+VOID
+odm_SwAntDivChkAntSwitch(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  Step
+       )
+{
+       // 
+       // For AP/ADSL use prtl8192cd_priv
+       // For CE/NIC use PADAPTER
+       //
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+
+       //
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
+       //
+       switch  (pDM_Odm->SupportPlatform)
        {
-               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-               if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal  or HP2 -> Normal
-                       odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
-               else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
-                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
-               else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
-                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+               case    ODM_WIN:        
+                       odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
+                       break;
+               case    ODM_CE:
+                       odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
+                       break;
+
+               case    ODM_AP:
+               case    ODM_ADSL:
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP |ODM_ADSL))
+                       if (priv->pshare->rf_ft_var.antSw_enable && (priv->up_time % 4==1))
+                               dm_SW_AntennaSwitch(priv, SWAW_STEP_PEAK);
+#endif         
+                       break;                  
        }
-       pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
-       #endif
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 
 }
 
+//
+// 20100514 Luke/Joseph:
+// Add new function for antenna diversity after link.
+// This is the main function of antenna diversity after link.
+// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
+// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
+// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
+// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
+// listened on the air with the RSSI of original antenna.
+// It chooses the antenna with better RSSI.
+// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting 
+// penalty to get next try.
 
-VOID 
-odm_DynamicTxPower_92D(
-       IN      PDM_ODM_T       pDM_Odm
+
+VOID
+ODM_SetAntenna(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u1Byte          Antenna)
+{
+       ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna); 
+}
+
+VOID
+odm_SwAntDivChkAntSwitchNIC(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte          Step
        )
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER Adapter = pDM_Odm->Adapter;
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       s4Byte                          UndecoratedSmoothedPWDB;
+#if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
+       //PMGNT_INFO            pMgntInfo = &(Adapter->MgntInfo);
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
 
-       PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;
-       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
-       u1Byte          HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
+       PADAPTER                Adapter=pDM_Odm->Adapter;
+#endif
 
-       // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
-       if (pDM_Odm->ExtPA == FALSE)
-               return;
+       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       s4Byte                  curRSSI=100, RSSI_A, RSSI_B;
+       u1Byte                  nextAntenna=AUX_ANT;
+       //static u8Byte         lastTxOkCnt=0, lastRxOkCnt=0;
+       u8Byte                  curTxOkCnt=0, curRxOkCnt=0;
+       //static u8Byte         TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
+       u8Byte                  CurByteCnt=0, PreByteCnt=0;
+       //static u1Byte         TrafficLoad = TRAFFIC_LOW;
+       u1Byte                  Score_A=0, Score_B=0;       //A: Main; B: AUX
+       u1Byte                  i;
 
-       // If dynamic high power is disabled.
-       if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
-               (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
-               pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
-       {
-               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
                return;
-       }
 
-       // STA not connected and AP not connected
-       if((!pMgntInfo->bMediaConnect) &&       
-               (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
-       {
-               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
-               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+       if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
+               return;
 
-               //the LastDTPlvl should reset when disconnect, 
-               //otherwise the tx power level wouldn't change when disconnect and connect again.
-               // Maddest 20091220.
-                pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+       if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
                return;
-       }
-       
-       if(pMgntInfo->bMediaConnect)    // Default port
-       {
-               if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
-               {
-                       UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-               else
-               {
-                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-       }
-       else // associated entry pwdb
-       {       
-               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
-               ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-       }
-       
-       if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
-               if(UndecoratedSmoothedPWDB >= 0x33)
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
-               }
-               else if((UndecoratedSmoothedPWDB <0x33) &&
-                       (UndecoratedSmoothedPWDB >= 0x2b) )
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
-               }
-               else if(UndecoratedSmoothedPWDB < 0x2b)
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
-               }
 
-       }
-       else
-       
+       if(pDM_Odm->SupportPlatform & ODM_WIN)
        {
-               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
-               }
-               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
-                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
-               }
-               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
-               {
-                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
-               }
-
+               if(*(pDM_Odm->pAntennaTest))
+                       return;
        }
 
-//sherry  delete flag 20110517
-       if(bGetValueFromBuddyAdapter)
+       if((pDM_SWAT_Table->ANTA_ON == FALSE) ||(pDM_SWAT_Table->ANTB_ON == FALSE))
        {
-               ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
-               if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
-               {
-                       ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
-                       HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
-                       pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
-                       PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
-                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
-               }                                               
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
+                               ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
+               return;
        }
 
-       if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
+       // Radio off: Status reset to default and return.
+       if(*(pDM_Odm->pbPowerSaving)==TRUE) //pHalData->eRFPowerState==eRfOff
        {
-                       ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
-                       if(Adapter->DualMacSmartConcurrent == TRUE)
-                       {
-                               if(BuddyAdapter == NULL)
-                               {
-                                       ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
-                                       if(!Adapter->bSlaveOfDMSP)
-                                       {
-                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                                       }
-                               }
-                               else
-                               {
-                                       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
-                                       {
-                                               ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
-                                               if(Adapter->bSlaveOfDMSP)
-                                               {
-                                                       ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));
-                                                       BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
-                                                       BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
-                                               }
-                                               else
-                                               {
-                                                       ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                       
-                                                       if(!bGetValueFromBuddyAdapter)
-                                                       {
-                                                               ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
-                                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                                                       }
-                                               }
-                                       }
-                                       else
-                                       {
-                                               ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
-                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                                       }
-                               }
-                       }
-                       else
-                       {
-                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
-                       }
-
-               }
-       pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-#if (RTL8192D_SUPPORT==1) 
-       PADAPTER Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
+               ODM_SwAntDivRestAfterLink(pDM_Odm);
+               return;
+       }
 
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       DM_ODM_T                *podmpriv = &pHalData->odmpriv;
-       int     UndecoratedSmoothedPWDB;
-       #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
-       PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;
-       BOOLEAN         bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
-       u8              HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
-       #endif
 
-       // If dynamic high power is disabled.
-       if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
-               (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
+       // Handling step mismatch condition.
+       // Peak step is not finished at last time. Recover the variable and check again.
+       if(     Step != pDM_SWAT_Table->try_flag        )
        {
-               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-               return;
+               ODM_SwAntDivRestAfterLink(pDM_Odm);
        }
 
-       // STA not connected and AP not connected
-       if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&   
-               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+#if  (DM_ODM_SUPPORT_TYPE &( ODM_WIN| ODM_CE ))
+
+       if(pDM_SWAT_Table->try_flag == 0xff)
        {
-               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
-               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-               //the LastDTPlvl should reset when disconnect, 
-               //otherwise the tx power level wouldn't change when disconnect and connect again.
-               // Maddest 20091220.
-               pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
-               return;
-       }
+               pDM_SWAT_Table->RSSI_target = 0xff;
                
-       if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port
-       {
-       #if 0
-               //todo: AP Mode
-               if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
-              (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
-               {
-                       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-               else
+               #if(DM_ODM_SUPPORT_TYPE & ODM_CE)
                {
-                       UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-               }
-       #else
-       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-       #endif
-       }
-       else // associated entry pwdb
-       {       
-               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
-       }
-#if TX_POWER_FOR_5G_BAND == 1
-       if(pHalData->CurrentBandType92D == BAND_ON_5G){
-               if(UndecoratedSmoothedPWDB >= 0x33)
-               {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
-               }
-               else if((UndecoratedSmoothedPWDB <0x33) &&
-                       (UndecoratedSmoothedPWDB >= 0x2b) )
-               {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
-               }
-               else if(UndecoratedSmoothedPWDB < 0x2b)
+                       u1Byte                  index = 0;
+                       PSTA_INFO_T             pEntry = NULL;
+                       
+                       
+                       for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
+                       {                                       
+                               pEntry =  pDM_Odm->pODM_StaInfo[index];
+                               if(IS_STA_VALID(pEntry) ) {
+                                       break;
+                               }
+                       }
+                       if(pEntry == NULL)
+                       {
+                               ODM_SwAntDivRestAfterLink(pDM_Odm);
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
+                               return;
+                       }
+                       else
+                       {
+                               pDM_SWAT_Table->RSSI_target = index;
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
+                       }
+                }
+               #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) 
                {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+                       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
+                       PMGNT_INFO      pMgntInfo=&pAdapter->MgntInfo;
+                       
+                       // Select RSSI checking target
+                       if(pMgntInfo->mAssoc && !ACTING_AS_AP(pAdapter))
+                       {
+                               // Target: Infrastructure mode AP.
+                               //pDM_SWAT_Table->RSSI_target = NULL;
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): RSSI_target is DEF AP!\n"));
+                       }
+                       else
+                       {
+                               u1Byte                  index = 0;
+                               PSTA_INFO_T             pEntry = NULL;
+                               PADAPTER                pTargetAdapter = NULL;
+                       
+                               if(pMgntInfo->mIbss )
+                               {
+                                       // Target: AP/IBSS peer.
+                                       pTargetAdapter = pAdapter;
+                               }
+                               else
+                               {
+                                       pTargetAdapter = GetFirstAPAdapter(pAdapter);
+                               }
+
+                               if(pTargetAdapter != NULL)
+                               {                       
+                                       for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
+                                       {                                       
+                                               
+                                               pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
+                                               if(pEntry != NULL)
+                                               {
+                                                       if(pEntry->bAssociated)
+                                                               break;                  
+                                               }
+                                               
+                                       }
+                                       
+                               }
+
+                               if(pEntry == NULL)
+                               {
+                                       ODM_SwAntDivRestAfterLink(pDM_Odm);
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
+                                       return;
+                               }
+                               else
+                               {
+                                       //pDM_SWAT_Table->RSSI_target = pEntry;
+                                       pDM_SWAT_Table->RSSI_target = index;
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
+                               }
+                       }//end if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
+
                }
+               #endif
+
+               pDM_SWAT_Table->RSSI_cnt_A = 0;
+               pDM_SWAT_Table->RSSI_cnt_B = 0;
+               pDM_SWAT_Table->try_flag = 0;
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
+               return;
        }
        else
-#endif
        {
-               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
-               {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
-               }
-               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
-                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
-               {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
-               }
-               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+
+// To Fix 8723A SW ANT DIV Bug issue
+#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
+               if (pDM_Odm->SupportICType & ODM_RTL8723A)
                {
-                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+                       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt;
+                       curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt;
+                       pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
+                       pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
                }
-       }
-#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
-       if(bGetValueFromBuddyAdapter)
-       {
-               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
-               if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
-               {
-                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
-                       HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
-                       pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
-                       PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
-                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
-                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
-               }                                               
-       }
-#endif
-
-       if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
-       {
-               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
-#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
-               if(BuddyAdapter == NULL)
+#else  
+               curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
+               curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
+               pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
+               pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
+#endif 
+               if(pDM_SWAT_Table->try_flag == 1)
                {
-                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
-                       if(!Adapter->bSlaveOfDMSP)
+                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                       {
+                               pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
+                               pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
+                       }
+                       else
+                       {
+                               pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
+                               pDM_SWAT_Table->RXByteCnt_B += curRxOkCnt;
+                       }
+               
+                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                       pDM_SWAT_Table->RSSI_Trying--;
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
+                       if(pDM_SWAT_Table->RSSI_Trying == 0)
                        {
-                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                               CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A) : (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B);
+                               PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B) : (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A);
+                               
+                               if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
+                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
+                                       PreByteCnt = PreByteCnt*9;
+                               else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
+                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
+                                       PreByteCnt = PreByteCnt*2;
+
+                               if(pDM_SWAT_Table->RSSI_cnt_A > 0)
+                                       RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A; 
+                               else
+                                       RSSI_A = 0;
+                               if(pDM_SWAT_Table->RSSI_cnt_B > 0)
+                                       RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B; 
+                               else
+                                       RSSI_B = 0;
+                               curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                               pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n", 
+                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+                                       RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
                        }
+
                }
                else
                {
-                       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+               
+                       if(pDM_SWAT_Table->RSSI_cnt_A > 0)
+                               RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A; 
+                       else
+                               RSSI_A = 0;
+                       if(pDM_SWAT_Table->RSSI_cnt_B > 0)
+                               RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B; 
+                       else
+                               RSSI_B = 0;
+                       curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                       pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n", 
+                       (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+                               RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
+                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
+                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
+               }
+
+               //1 Trying State
+               if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
+               {
+
+                       if(pDM_SWAT_Table->TestMode == TP_MODE)
                        {
-                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
-                               if(Adapter->bSlaveOfDMSP)
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\n",PreByteCnt));          
+                               if(CurByteCnt < PreByteCnt)
+                               {
+                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+                                       else
+                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+                               }
+                               else
+                               {
+                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+                                       else
+                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+                               }
+                               for (i= 0; i<8; i++)
+                               {
+                                       if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
+                                               Score_A++;
+                                       else
+                                               Score_B++;
+                               }
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Score_A=%d, Score_B=%d\n", Score_A, Score_B));
+                       
+                               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
                                {
-                                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));
-                                       BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
-                                       BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+                                       nextAntenna = (Score_A > Score_B)?MAIN_ANT:AUX_ANT;
                                }
                                else
                                {
-                                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                     
-                                       if(!bGetValueFromBuddyAdapter)
-                                       {
-                                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
-                                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
-                                       }
+                                       nextAntenna = (Score_B > Score_A)?AUX_ANT:MAIN_ANT;
                                }
-                       }
-                       else
-                       {
-                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
-                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
-                       }
-               }
-#else
-               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
-#endif
-       }
-       pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
-#endif 
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-}
-
-
-//3============================================================
-//3 RSSI Monitor
-//3============================================================
+                               //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
+                               //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n", 
+                               //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
 
-VOID
-odm_RSSIDumpToRegister(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter = pDM_Odm->Adapter;
+                               if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
+                               }
+                               else
+                               {
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
+                               }       
+                       }
 
-       if(pDM_Odm->SupportICType == ODM_RTL8812)
+                       if(pDM_SWAT_Table->TestMode == RSSI_MODE)
+                       {       
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
+                               pDM_SWAT_Table->SelectAntennaMap=0xAA;
+                               if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
+                               {
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
+                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                               }
+                               else // current anntena is good
+                               {
+                                       nextAntenna =pDM_SWAT_Table->CurAntenna;
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
+                               }
+                       }
+                       pDM_SWAT_Table->try_flag = 0;
+                       pDM_Odm->RSSI_test = FALSE;
+                       pDM_SWAT_Table->RSSI_sum_A = 0;
+                       pDM_SWAT_Table->RSSI_cnt_A = 0;
+                       pDM_SWAT_Table->RSSI_sum_B = 0;
+                       pDM_SWAT_Table->RSSI_cnt_B = 0;
+                       pDM_SWAT_Table->TXByteCnt_A = 0;
+                       pDM_SWAT_Table->TXByteCnt_B = 0;
+                       pDM_SWAT_Table->RXByteCnt_A = 0;
+                       pDM_SWAT_Table->RXByteCnt_B = 0;
+                       
+               }
+
+               //1 Normal State
+               else if(pDM_SWAT_Table->try_flag == 0)
+               {
+                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
+                       {
+                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
+                               else
+                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
+                       }
+                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
+                               {
+                               if ((curTxOkCnt+curRxOkCnt) > 3750000) //if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
+                               else
+                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
+                       }
+                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
+                               pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
+                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
+
+                       //Prepare To Try Antenna                
+                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                                       pDM_SWAT_Table->try_flag = 1;
+                                       pDM_Odm->RSSI_test = TRUE;
+                       if((curRxOkCnt+curTxOkCnt) > 1000)
+                       {
+                               pDM_SWAT_Table->RSSI_Trying = 4;
+                               pDM_SWAT_Table->TestMode = TP_MODE;
+                               }
+                               else
+                               {
+                               pDM_SWAT_Table->RSSI_Trying = 2;
+                               pDM_SWAT_Table->TestMode = RSSI_MODE;
+
+                       }
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
+                       
+                       
+                       pDM_SWAT_Table->RSSI_sum_A = 0;
+                       pDM_SWAT_Table->RSSI_cnt_A = 0;
+                       pDM_SWAT_Table->RSSI_sum_B = 0;
+                       pDM_SWAT_Table->RSSI_cnt_B = 0;
+               }
+       }
+
+       //1 4.Change TRX antenna
+       if(nextAntenna != pDM_SWAT_Table->CurAntenna)
        {
-               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);
-               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
+               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);           
+               #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)                    
+               ODM_SetAntenna(pDM_Odm,nextAntenna);            
+               #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+               {
+                       BOOLEAN bEnqueue;                       
+                       bEnqueue = (pDM_Odm->SupportInterface ==  ODM_ITRF_PCIE)?FALSE :TRUE;                   
+                       rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
+               }
+               #endif
+               
+       }
 
-               // Rx EVM
-               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);
-               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);
+       //1 5.Reset Statistics
+       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+       pDM_SWAT_Table->CurAntenna = nextAntenna;
+       pDM_SWAT_Table->PreRSSI = curRSSI;
 
-               // Rx SNR
-               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
-               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
+       //1 6.Set next timer
+       {
+               //PADAPTER              pAdapter = pDM_Odm->Adapter;
+               //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+       
 
-               // Rx Cfo_Short
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);
+       if(pDM_SWAT_Table->RSSI_Trying == 0)
+               return;
 
-               // Rx Cfo_Tail
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);
+       if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
+       {
+               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               {
+                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
+                       {
+                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
+                               
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
+                       }
+                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
+                       {
+                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
+                       }
+               }
+               else
+               {
+                       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
+               }
        }
-       else if(pDM_Odm->SupportICType == ODM_RTL8192E)
+       else
        {
-               PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);
-               PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);
-               // Rx EVM
-               PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);
-               PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);
-               // Rx SNR
-               PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
-               PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
-               // Rx Cfo_Short
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);
-               // Rx Cfo_Tail
-               PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);
-               PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);
-        }
-#endif
+               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               {
+                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
+                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
+                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
+                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
+               }
+               else
+                       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms 
+       }
+       }
+#endif // #if (DM_ODM_SUPPORT_TYPE  & (ODM_WIN|ODM_CE))
+#endif // #if (RTL8192C_SUPPORT==1) 
 }
 
 
-VOID
-odm_RSSIMonitorInit(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;
-
-       pRA_Table->firstconnect = FALSE;
+// Remove odm_SwAntDivSelectScanChnl() and odm_SwAntDivConstructScanChnl() to odm_PathDiv.c
 
-}
 
+//
+// 20100514 Luke/Joseph:
+// Callback function for 500ms antenna test trying.
+//
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 VOID
-odm_RSSIMonitorCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       )
+odm_SwAntDivChkAntSwitchCallback(
+       PRT_TIMER               pTimer
+)
 {
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       pSWAT_T         pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
 
-       if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
-               return;
+       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
+       #if USE_WORKITEM
+       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
+       #else
+       odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
+       #endif
+       #else
+       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
+       #endif
        
-       //
-       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
-       // at the same time. In the stage2/3, we need to prive universal interface and merge all
-       // HW dynamic mechanism.
-       //
-       switch  (pDM_Odm->SupportPlatform)
-       {
-               case    ODM_WIN:
-                       odm_RSSIMonitorCheckMP(pDM_Odm);
-                       break;
+}
+VOID
+odm_SwAntDivChkAntSwitchWorkitemCallback(
+    IN PVOID            pContext
+    )
+{
 
-               case    ODM_CE:
-                       odm_RSSIMonitorCheckCE(pDM_Odm);
-                       break;
+       PADAPTER                pAdapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
 
-               case    ODM_AP:
-                       odm_RSSIMonitorCheckAP(pDM_Odm);
-                       break;          
+       odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
 
-               case    ODM_ADSL:
-                       //odm_DIGAP(pDM_Odm);
-                       break;  
-       }
-       
-}      // odm_RSSIMonitorCheck
+}
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
+{
+       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;
+       PADAPTER        padapter = pDM_Odm->Adapter;
+       if(padapter->net_closed == _TRUE)
+           return;
+       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE); 
+}
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
+{
+       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;
+       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
+}
+#endif
 
+#else //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
 
-VOID
-odm_RSSIMonitorCheckMP(
-       IN      PDM_ODM_T       pDM_Odm
+VOID odm_SwAntDivInit( IN              PDM_ODM_T               pDM_Odm ) {}
+VOID ODM_SwAntDivChkPerPktRssi(
+       IN PDM_ODM_T    pDM_Odm,
+       IN u1Byte               StationID,
+       IN PODM_PHY_INFO_T pPhyInfo
+       ) {}
+VOID odm_SwAntDivChkAntSwitch(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  Step
+       ) {}
+VOID ODM_SwAntDivResetBeforeLink(      IN              PDM_ODM_T               pDM_Odm ){}
+VOID ODM_SwAntDivRestAfterLink(        IN              PDM_ODM_T               pDM_Odm ){}
+VOID odm_SwAntDetectInit(      IN              PDM_ODM_T               pDM_Odm){}
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+VOID odm_SwAntDivChkAntSwitchCallback( PRT_TIMER               pTimer){}
+VOID odm_SwAntDivChkAntSwitchWorkitemCallback(    IN PVOID            pContext    ){}
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
+#endif
+
+#endif //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
+
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+BOOLEAN
+ODM_SwAntDivCheckBeforeLink(
+       IN              PDM_ODM_T               pDM_Odm
        )
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+
        PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PRT_WLAN_STA    pEntry;
-       u1Byte                  i;
-       s4Byte                  tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
-       u1Byte                  H2C_Parameter[4] ={0};
+       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(Adapter);
        PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
-       u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0; 
-       u1Byte                  STBC_TX = 0;
-       BOOLEAN                 FirstConnect;                                                    
-       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;      
-#if (BEAMFORMING_SUPPORT == 1) 
-       BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;
-       u1Byte                  TxBF_EN = 0;
-#endif
-
-       RT_DISP(FDM, DM_PWDB, ("pHalData->UndecoratedSmoothedPWDB = 0x%x( %d)\n", 
-               pHalData->UndecoratedSmoothedPWDB,
-               pHalData->UndecoratedSmoothedPWDB));
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;
+       s1Byte                  Score = 0;
+       PRT_WLAN_BSS    pTmpBssDesc, pTestBssDesc;
+       s4Byte                  power_diff = 0, power_target = 10;
+       u1Byte                  index, counter = 0;
+       static u1Byte           ScanChannel;
+       u8Byte                  tStamp_diff = 0;                
 
-       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
-       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
-       pMgntInfo->lastTxOkCnt = curTxOkCnt;
-       pMgntInfo->lastRxOkCnt = curRxOkCnt;
 
-       RT_DISP(FDM, DM_PWDB, ("Tx = %d Rx = %d\n", curTxOkCnt, curRxOkCnt));
+       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413
+       {       // The ODM structure is not initialized.
+               return FALSE;
+       }
 
-       FirstConnect = (pHalData->bLinked) && (pRA_Table->firstconnect == FALSE);    
-       pRA_Table->firstconnect = pHalData->bLinked;                                               
-       H2C_Parameter[3] |= FirstConnect << 5;
+       // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
+       if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))
+                       return FALSE;
 
-       if(pDM_Odm->SupportICType == ODM_RTL8188E && (pMgntInfo->CustomerID==RT_CID_819x_HP))
+       // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
+       PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
        {
-               if(curRxOkCnt >(curTxOkCnt*6))
-                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);
-               else
-                       PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);
-       }       
-
-       if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
+                               ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n", 
+                               pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));
+       
+               pDM_SWAT_Table->SWAS_NoLink_State = 0;
+               
+               return FALSE;
+       }
+       else
        {
-               if(curRxOkCnt >(curTxOkCnt*6))
-                       H2C_Parameter[3]=0x01;
-               else
-                       H2C_Parameter[3]=0x00;
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
        }
-
-       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("pDM_SWAT_Table->SWAS_NoLink_State = %d\n", pDM_SWAT_Table->SWAS_NoLink_State));
+       //1 Run AntDiv mechanism "Before Link" part.
+       if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
        {
-               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
-               {
-                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
-               }
-               else
-               {
-                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
-               }
+               //1 Prepare to do Scan again to check current antenna state.
 
-               if(pEntry != NULL)
+               // Set check state to next step.
+               pDM_SWAT_Table->SWAS_NoLink_State = 1;
+       
+               // Copy Current Scan list.
+               pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;
+               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
+               
+               // Go back to scan function again.
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));
+               pMgntInfo->ScanStep=0;
+               pMgntInfo->bScanAntDetect = TRUE;
+               ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);
+
+               
+               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
                {
-                       if(pEntry->bAssociated)
+                       if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
+                               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
+                       else
+                               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
+                       if(ScanChannel == 0)
                        {
-                       
-                               RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);
-                               RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n", 
-                                       pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
+                                       ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
 
-                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
+                               if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
                                {
-
-#if (BEAMFORMING_SUPPORT == 1)
-                                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pEntry->AssociatedMacId);
-                                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
-                                               TxBF_EN = 1;
-                                       else
-                                               TxBF_EN = 0;
-       
-                                       H2C_Parameter[3] |= TxBF_EN << 6; 
-                                       
-                                       if(TxBF_EN)
-                                               STBC_TX = 0;
-                                       else
-#endif
-                                       {
-                                               if(IS_WIRELESS_MODE_AC(Adapter))
-                                                       STBC_TX = TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX);
-                                               else
-                                                       STBC_TX = TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX);
-                                       }
-
-                                       H2C_Parameter[3] |= STBC_TX << 1;
+                                       pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
                                }
-
-                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
-                                       tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
-                               if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
-                                       tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
-
-                               H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);
-                               H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
-                               H2C_Parameter[0] = (pEntry->AssociatedMacId);
-                               if(pDM_Odm->SupportICType == ODM_RTL8812)
-                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
-                               else if(pDM_Odm->SupportICType == ODM_RTL8192E)
-                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
-                               else    
-                                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
+                               else
+                               {
+                                       pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
+                               }
+                               return FALSE;
                        }
+
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
+                               ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
                }
-               else
+               else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))
                {
-                       break;
+                       // Switch Antenna to another one.
+                       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+                       pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;
+                       
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
+                               ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
+                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+                       if(pDM_Odm->SupportICType == ODM_RTL8192C)
+                       {
+                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+                       }
+                       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+                       {
+                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
+                               ODM_SetBBReg(pDM_Odm,  rfe_ctrl_anta_src, 0xff, 0x77);
+                               ODM_SetBBReg(pDM_Odm,  rDPDT_control, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
+                       }
                }
-       }
-
-       if(tmpEntryMaxPWDB != 0)        // If associated entry is found
-       {
-               pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
-               RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));
-       }
-       else
-       {
-               pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;
-       }
-       
-       if(tmpEntryMinPWDB != 0xff) // If associated entry is found
-       {
-               pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
-               RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));
+               
+               odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
+               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
 
+               return TRUE;
        }
        else
        {
-               pHalData->EntryMinUndecoratedSmoothedPWDB = 0;
-       }
+               //1 ScanComple() is called after antenna swiched.
+               //1 Check scan result and determine which antenna is going
+               //1 to be used.
 
-       // Indicate Rx signal strength to FW.
-       if(pHalData->bUseRAMask)
-       {
-               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
+               for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)
                {
-                       PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pMgntInfo);
-                       PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pMgntInfo);
-
-#if (BEAMFORMING_SUPPORT == 1)
-                       
-                       Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pMgntInfo->mMacId);
+                       pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1
+                       pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2
 
-                       if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
-                               TxBF_EN = 1;
-                       else
-                               TxBF_EN = 0;
-
-                       H2C_Parameter[3] |= TxBF_EN << 6; 
-
-                       if(TxBF_EN)
-                               STBC_TX = 0;
-                       else
-#endif
+                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
                        {
-                               if(IS_WIRELESS_MODE_AC(Adapter))
-                                       STBC_TX = TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX);
-                               else
-                                       STBC_TX = TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));
+                               continue;
                        }
 
-                       H2C_Parameter[3] |= STBC_TX << 1;
+                       if(pDM_Odm->SupportICType != ODM_RTL8723B)
+                       {
+                               if(pTmpBssDesc->ChannelNumber == ScanChannel)
+                               {
+                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
+                       {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));
+                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                       
+                               Score++;
+                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
+                       }
+                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
+                       {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));
+                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                               Score--;
+                       }
+                                       else
+                                       {
+                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)
+                                               {
+                                                       RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));
+                                               }
+                                       }
+                               }
+                       }
+                       else
+                       { 
+                               if(pTmpBssDesc->ChannelNumber == ScanChannel)
+                               {
+                                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
+                                       {
+                                               counter++;
+                                               power_diff = power_diff + (pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower); 
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
+                                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
+                                       }
+                                       else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower)
+                                       {
+                                               counter++;
+                                               power_diff = power_diff + (pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
+                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
+                                       }
+                                       else if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp)
+                                       {
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
+                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)
+                                               {
+                                                       counter++;
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
+                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
+                                               }
+                                       }
+                               }
+                       }
                }
-               
-               H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);
-               H2C_Parameter[1] = 0x20;        // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
-               H2C_Parameter[0] = 0;           // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
-               if(pDM_Odm->SupportICType == ODM_RTL8812)
-                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
-               else  if(pDM_Odm->SupportICType == ODM_RTL8192E)
-                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter); 
-               else    
-                       ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
-       }
-       else
-       {
-               PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);
-       }
 
-       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E))
-               odm_RSSIDumpToRegister(pDM_Odm);
+               if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               { 
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: %d power_diff: %d\n", counter, power_diff));
 
-       odm_FindMinimumRSSI(Adapter);
-       ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)pHalData->bLinked);
-       ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)pHalData->MinUndecoratedPWDBForDM);
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-}
+                       if(counter != 0)
+                               power_diff = power_diff / counter;
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-//
-//sherry move from DUSC to here 20110517
-//
-static VOID
-FindMinimumRSSI_Dmsp(
-       IN      PADAPTER        pAdapter
-)
-{
-#if 0
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       s32     Rssi_val_min_back_for_mac0;
-       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(pAdapter);
-       BOOLEAN         bRestoreRssi = _FALSE;
-       PADAPTER        BuddyAdapter = pAdapter->BuddyAdapter;
+                       if(power_diff <= power_target && counter != 0) 
+                               Score++;
+               }
 
-       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
-       {
-               if(BuddyAdapter!= NULL)
+               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
                {
-                       if(pHalData->bSlaveOfDMSP)
+                       if(pMgntInfo->NumBssDesc!=0 && Score<0)
                        {
-                               //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("bSlavecase of dmsp\n"));
-                               BuddyAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP = pdmpriv->MinUndecoratedPWDBForDM;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
+                                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
                        }
                        else
                        {
-                               if(bGetValueFromBuddyAdapter)
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
+                                               ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
+
+                               if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
+                                       ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
+                               else
+                                       ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
+                       }
+                       
+                       if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
+                       {
+                               pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
+                       }
+                       else
+                       {
+                               pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
+                       }
+               }
+               else if(pDM_Odm->SupportICType == ODM_RTL8723B)
+               {
+                       pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
+                       pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
+                       ODM_SetBBReg(pDM_Odm,  rfe_ctrl_anta_src, 0xff, 0x77);
+                       ODM_SetBBReg(pDM_Odm,  rDPDT_control,bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
+
+                       if(counter != 0)
+                       {
+                               if(pMgntInfo->NumBssDesc != 0 && Score > 0)
                                {
-                                       //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("get new RSSI\n"));
-                                       bRestoreRssi = _TRUE;
-                                       Rssi_val_min_back_for_mac0 = pdmpriv->MinUndecoratedPWDBForDM;
-                                       pdmpriv->MinUndecoratedPWDBForDM = pAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP;
+                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
+                                       {
+                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
+                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
+                                       }
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
+                               }
+                               else
+                               {
+                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
+                                       {
+                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
+                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
+                                               BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);
+                                       }
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
                                }
                        }
+                       else
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Igone result\n"));
+               }
+               else if(pDM_Odm->SupportICType == ODM_RTL8192C)
+               {
+                       if(pMgntInfo->NumBssDesc!=0 && Score<=0)
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
+                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
+
+                               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+                       }
+                       else
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
+                                       ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));
+
+                               pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
+
+                               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+                               PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+                       }
                }
                
-       }
+               // Check state reset to default and wait for next time.
+               pDM_SWAT_Table->SWAS_NoLink_State = 0;
+               pMgntInfo->bScanAntDetect = FALSE;
 
-       if(bRestoreRssi)
-       {
-               bRestoreRssi = _FALSE;
-               pdmpriv->MinUndecoratedPWDBForDM = Rssi_val_min_back_for_mac0;
+               return FALSE;
        }
+
+#else
+               return  FALSE;
 #endif
-}
 
-static void
-FindMinimumRSSI(
-IN     PADAPTER        pAdapter
-       )
-{      
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;   
-       PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);
+return FALSE;
+}
 
-       //1 1.Determine the minimum RSSI 
+#endif //#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
 
-       if((pDM_Odm->bLinked != _TRUE) &&
-               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
-       {
-               pdmpriv->MinUndecoratedPWDBForDM = 0;
-               //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
-       }
-       else
-       {
-               pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
-       }
 
-       //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);
-       //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));
-}
-#endif
+//3============================================================
+//3 SW Antenna Diversity
+//3============================================================
 
+#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
 VOID
-odm_RSSIMonitorCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
+odm_InitHybridAntDiv_88C_92D(
+       IN PDM_ODM_T    pDM_Odm 
        )
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);
-       int     i;
-       int     tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
-       u8      sta_cnt=0;
-       u8      UL_DL_STATE = 0, STBC_TX = 0;
-       u32     PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
-       BOOLEAN                 FirstConnect = FALSE;
-       pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;
 
-       if(pDM_Odm->bLinked != _TRUE)
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
+       struct rtl8192cd_priv *priv=pDM_Odm->priv;
+#endif
+       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       u1Byte                  bTxPathSel=0;           //0:Path-A   1:Path-B
+       u1Byte                  i;
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
+
+       //whether to do antenna diversity or not
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+       if(priv==NULL)  return;
+       if(!priv->pshare->rf_ft_var.antHw_enable)
+               return; 
+       
+       #ifdef SW_ANT_SWITCH
+       priv->pshare->rf_ft_var.antSw_enable =0;
+       #endif
+#endif
+
+       if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
                return;
 
-       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
-       {
-               u64     curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;
-               u64     curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;
 
-               if(curRxOkCnt >(curTxOkCnt*6))
-                       UL_DL_STATE = 1;
-               else
-                       UL_DL_STATE = 0;
-       }
+       bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?FALSE:TRUE;
+
+       ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
+       ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
+       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
+       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
+       // check HW setting: ANTSEL pin connection
+       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+       ODM_Write2Byte(pDM_Odm,ODM_REG_RF_PIN_11N, (ODM_Read2Byte(pDM_Odm,0x804)&0xf0ff )| BIT(8) );    // b11-b8=0001,update RFPin setting
        #endif
+       
+       // only AP support different path selection temperarly
+       if(!bTxPathSel){                 //PATH-A
+               ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
+               ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1);         //select TX ANTESEL from path A
+       }
+       else    {
+               ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
+               ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0);                 //select ANTESEL from path B
+       }
 
-       FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);    
-       pRA_Table->firstconnect = pDM_Odm->bLinked;
+       //Set OFDM HW RX Antenna Diversity
+       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
+       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
+       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1);       // Decide final antenna by comparing 2 antennas' pwdb
+       
+       //Set CCK HW RX Antenna Diversity
+       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
+       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4
+       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
+       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
 
-       //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
+
+       //Enable HW Antenna Diversity
+       if(!bTxPathSel)                 //PATH-A
+               ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1);        // Enable Hardware antenna switch
+       else
+               ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1);        // Enable Hardware antenna switch
+       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
+
+       pDM_SWAT_Table->CurAntenna=0;                   //choose left antenna as default antenna
+       pDM_SWAT_Table->PreAntenna=0;
+       for(i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
        {
-               #if 1
-               struct sta_info *psta;
-               
-               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
-                       if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))
-                       {
-                                       if(IS_MCAST( psta->hwaddr))  //if(psta->mac_id ==1)
-                                                continue;
-                                                               
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))
-                                                continue;
-                                                               
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
-                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
+               pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
+               pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
+               pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
+               pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
+               pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
+               pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
+       }
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
+}
 
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
-                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
 
-                                       #if 0
-                                       DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,
-                                               psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);
-                                       #endif
+VOID
+odm_InitHybridAntDiv(
+       IN PDM_ODM_T    pDM_Odm 
+       )
+{
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
+               return;
+       }
+       
+       if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
+       {
+#if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
+               odm_InitHybridAntDiv_88C_92D(pDM_Odm);
+#endif
+       }
+}
 
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
 
-                                               #ifdef CONFIG_80211N_HT
-                                               if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
-                                               {
-                                                       #ifdef CONFIG_80211AC_VHT
-                                                       if(IsSupportedVHT(psta->wireless_mode))
-                                                               STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);
-                                                       else    
-                                                       #endif
-                                                               STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);
-                                               }
-                                               #endif
+BOOLEAN
+odm_StaDefAntSel(
+       IN PDM_ODM_T    pDM_Odm,
+       IN u4Byte               OFDM_Ant1_Cnt,
+       IN u4Byte               OFDM_Ant2_Cnt,
+       IN u4Byte               CCK_Ant1_Cnt,
+       IN u4Byte               CCK_Ant2_Cnt,
+       OUT u1Byte              *pDefAnt 
 
-                                               if(pDM_Odm->SupportICType == ODM_RTL8192D)
-                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
-                                               else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
-                                                       PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) | (STBC_TX << 25) | (FirstConnect << 29));
-                                               else
-                                                       PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
-                                       }
-                       }
-               }
-               #else
-               _irqL irqL;
-               _list   *plist, *phead;
-               struct sta_info *psta;
-               struct sta_priv *pstapriv = &Adapter->stapriv;
-               u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
+       )
+{
+#if 1
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
 
-               _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("OFDM_Ant1_Cnt:%d, OFDM_Ant2_Cnt:%d\n",OFDM_Ant1_Cnt,OFDM_Ant2_Cnt));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("CCK_Ant1_Cnt:%d, CCK_Ant2_Cnt:%d\n",CCK_Ant1_Cnt,CCK_Ant2_Cnt));
 
-               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);
+       
+       if(((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)){
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
+               return  FALSE;
+       }
 
-                               plist = get_next(plist);
+       if(OFDM_Ant1_Cnt || OFDM_Ant2_Cnt )     {
+               //if RX OFDM packet number larger than 0
+               if(OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
+                       (*pDefAnt)=1;
+               else
+                       (*pDefAnt)=0;
+       }
+       // else if RX CCK packet number larger than 10
+       else if((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
+       {
+               if(CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
+                       (*pDefAnt)=1;
+               else if(CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
+                       (*pDefAnt)=0;
+               else if(CCK_Ant1_Cnt > CCK_Ant2_Cnt)
+                       (*pDefAnt)=0;
+               else
+                       (*pDefAnt)=1;
 
-                               if(_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) || 
-                                       _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
-                                       continue;
+       }
 
-                               if(psta->state & WIFI_ASOC_STATE)
-                               {
-                                       
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
-                                               tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
+       
+#endif
+       //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
+       //(*pDefAnt)= (u1Byte) antsel;
+       
 
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
-                                               tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
 
-                                       if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){
-                                               //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);
-                                               #if(RTL8192D_SUPPORT==1)
-                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
-                                               #else
-                                               PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
-                                               #endif
-                                       }
-                               }
-                       
-                       }
+       
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
+
+       return TRUE;
 
-               }
        
-               _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
-               #endif
+}
 
-               //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);
-
-               for(i=0; i< sta_cnt; i++)
-               {
-                       if(PWDB_rssi[i] != (0)){
-                               if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW
-                               {
-                                       #if(RTL8192D_SUPPORT==1)
-                                       if(pDM_Odm->SupportICType == ODM_RTL8192D){
-                                               FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));              
-                                       }
-                                       #endif
-                                       
-                                       #if((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
-                                       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8723A)){
-                                               rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
-                                       }
-                                       #endif
-                                       
-                                       #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-                                       if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)){   
-                                               PWDB_rssi[i] |= (UL_DL_STATE << 24);
-                                               rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
-                                       }
-                                       #endif
-                                       #if(RTL8192E_SUPPORT==1)
-                                       if(pDM_Odm->SupportICType == ODM_RTL8192E){
-                                               rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
-                                       }
-                                       #endif
-                                       #if(RTL8723B_SUPPORT==1)
-                                       if(pDM_Odm->SupportICType == ODM_RTL8723B){
-                                               rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
-                                       }
-                                       #endif
-                               }
-                               else{
-                                       #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))
-                                       if(pDM_Odm->SupportICType == ODM_RTL8188E){
-                                               ODM_RA_SetRSSI_8188E(
-                                               &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));
-                                       }
-                                       #endif
-                               }
-                       }
-               }               
-       }
 
+VOID
+odm_SetRxIdleAnt(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u1Byte  Ant,
+       IN   BOOLEAN   bDualPath                     
+)
+{
+       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
 
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
 
-       if(tmpEntryMaxPWDB != 0)        // If associated entry is found
+       if(Ant != pDM_SWAT_Table->RxIdleAnt)
        {
-               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;             
-       }
+       //for path-A
+       if(Ant==1) 
+                       ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9);   //right-side antenna
        else
-       {
-               pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
-       }
+                       ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a);   //left-side antenna
 
-       if(tmpEntryMinPWDB != 0xff) // If associated entry is found
-       {
-               pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;             
-       }
-       else
-       {
-               pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
+       //for path-B
+       if(bDualPath){
+               if(Ant==0) 
+                               ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9);   //right-side antenna
+               else 
+                               ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a);  //left-side antenna
+               }
        }
+               pDM_SWAT_Table->RxIdleAnt = Ant;
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("RxIdleAnt: %s  Reg858=0x%x\n",(Ant==1)?"Ant1":"Ant2",(Ant==1)?0x65a9:0x569a));
 
-       FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
 
-       #if(RTL8192D_SUPPORT==1)
-       FindMinimumRSSI_Dmsp(Adapter);
-       #endif
-       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
-odm_RSSIMonitorCheckAP(
-       IN              PDM_ODM_T               pDM_Odm
-       )
+ODM_AntselStatistics_88C(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  MacId,
+       IN              u4Byte                  PWDBAll,
+       IN              BOOLEAN                 isCCKrate
+)
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-#ifdef CONFIG_RTL_92C_SUPPORT || defined(CONFIG_RTL_92D_SUPPORT)
-
-       u4Byte i;
-       PSTA_INFO_T pstat;
+       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
 
-       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+       if(pDM_SWAT_Table->antsel == 1)
        {
-               pstat = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pstat) )
-               {                       
-#ifdef STA_EXT
-                       if (REMAP_AID(pstat) < (FW_NUM_STAT - 1))
-#endif
-                               add_update_rssi(pDM_Odm->priv, pstat);
-
-               }               
+               if(isCCKrate)
+                       pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
+               else
+               {
+                       pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
+                       pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
+               }
+       }
+       else
+       {
+               if(isCCKrate)
+                       pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
+               else
+               {
+                       pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
+                       pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
+               }
        }
-#endif
-#endif
 
 }
 
 
 
+
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
 VOID
-ODM_InitAllTimers(
-       IN PDM_ODM_T    pDM_Odm 
-       )
+ODM_SetTxAntByTxInfo_88C_92D(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              pu1Byte                 pDesc,
+       IN              u1Byte                  macId   
+)
 {
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
-       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,
-       (RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, "SwAntennaSwitchTimer_8723B");
-#endif
-#endif
-
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
-               (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
-#endif
-       
-#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (RTL8188E_SUPPORT == 1)
-       ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,
-               (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");
-#endif
-#endif
-#endif
+       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       u1Byte                  antsel;
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer, 
-               (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");
-       //
-       //Path Diversity
-       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
-       //
-       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 
-               (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");
+       if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) 
+               return;
 
-       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, 
-               (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");
+       if(pDM_SWAT_Table->RxIdleAnt == 1)
+               antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?0:1;
+       else
+               antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?1:0;
+       
+       SET_TX_DESC_ANTSEL_A_92C(pDesc, antsel);
+       //SET_TX_DESC_ANTSEL_B_92C(pDesc, antsel);
+       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("SET_TX_DESC_ANTSEL_A_92C=%d\n", pDM_SWAT_Table->TxAnt[macId]));
+}
+#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
+VOID
+ODM_SetTxAntByTxInfo_88C_92D(
+       IN              PDM_ODM_T               pDM_Odm
+)
+{
 
-       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 
-               (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer");
+}
+#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
+VOID
+ODM_SetTxAntByTxInfo_88C_92D(
+       IN              PDM_ODM_T               pDM_Odm
+)
+{
 
-       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,
-               (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer");  
-#endif 
 }
+#endif
 
 VOID
-ODM_CancelAllTimers(
-       IN PDM_ODM_T    pDM_Odm 
-       )
+odm_HwAntDiv_92C_92D(
+       IN      PDM_ODM_T       pDM_Odm
+)
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       //
-       // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in 
-       // win7 platform.
-       //
-       HAL_ADAPTER_STS_CHK(pDM_Odm)
+       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       u4Byte                  RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
+       u1Byte                  RxIdleAnt, i;
+       BOOLEAN         bRet=FALSE;
+       PSTA_INFO_T     pEntry;
+       
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
+       struct rtl8192cd_priv *priv=pDM_Odm->priv;
+       //if test, return
+       if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
+               return; 
 #endif 
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
-       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
-#endif
-#endif
-
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-       ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
-#endif
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
+       
+       if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))                                    //if don't support antenna diveristy
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
+               return;
+       }
 
-#if (RTL8188E_SUPPORT == 1)
-       ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
+       if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
+               return;
+       }
+       
+#if (DM_ODM_SUPPORT_TYPE&(ODM_WIN|ODM_CE))
+       if(!pDM_Odm->bLinked)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is FALSE\n"));
+               return;
+       }
 #endif
-       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);   
-       //
-       //Path Diversity
-       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
-       //
-       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
-
-       ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
 
-       ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
-
-       ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
-#endif 
-}
-
-
-VOID
-ODM_ReleaseAllTimers(
-       IN PDM_ODM_T    pDM_Odm 
-       )
-{
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
-       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
-#endif
-#endif
-
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
-#endif
+       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               pEntry = pDM_Odm->pODM_StaInfo[i];
+               if(IS_STA_VALID(pEntry))
+               {
 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+                       RSSI_Ant1 = (pDM_SWAT_Table->OFDM_Ant1_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant1_Sum[i]/pDM_SWAT_Table->OFDM_Ant1_Cnt[i]);
+                       RSSI_Ant2 = (pDM_SWAT_Table->OFDM_Ant2_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant2_Sum[i]/pDM_SWAT_Table->OFDM_Ant2_Cnt[i]);
 
-#if (RTL8188E_SUPPORT == 1)
-       ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d,  RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
+               
+                       if(RSSI_Ant1 ||RSSI_Ant2) 
+                       {
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)              
+                               if(pDM_Odm->pODM_StaInfo[i]->expire_to)
 #endif
+                               {
+                                       RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
+                                       if((!RSSI) || ( RSSI < RSSI_Min) ) {
+                                               pDM_SWAT_Table->TargetSTA = i;
+                                               RSSI_Min = RSSI;
+                                       }
+                               }
+       }
+                       ///STA: found out default antenna
+                       bRet=odm_StaDefAntSel(pDM_Odm, 
+                                                pDM_SWAT_Table->OFDM_Ant1_Cnt[i], 
+                                                pDM_SWAT_Table->OFDM_Ant2_Cnt[i], 
+                                                pDM_SWAT_Table->CCK_Ant1_Cnt[i], 
+                                                pDM_SWAT_Table->CCK_Ant2_Cnt[i], 
+                                                &pDM_SWAT_Table->TxAnt[i]);
 
-       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);
-       //
-       //Path Diversity
-       //Neil Chen--2011--06--16--  / 2012/02/23 MH Revise Arch.
-       //
-       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
-
-       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
+                       //if Tx antenna selection: successful
+                       if(bRet){       
+                               pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
+                               pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
+                               pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
+                               pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0; 
+                               pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0; 
+                               pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0; 
+                       }
+               }
+       }
+       
+       //set RX Idle Ant
+       RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
+       odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, FALSE);
 
-       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
+#ifdef TX_SHORTCUT
+       if (!priv->pmib->dot11OperationEntry.disable_txsc) {
+               plist = phead->next;
+               while(plist != phead)   {
+                       pstat = list_entry(plist, struct stat_info, asoc_list);
+                       if(pstat->expire_to) {
+                               for (i=0; i<TX_SC_ENTRY_NUM; i++) {
+                                       struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);  
+                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
+                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
+                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
+                                       pdesc= &(pstat->tx_sc_ent[i].hwdesc2);  
+                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
+                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
+                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));                                     
+                               }
+                       }               
 
-       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer); 
+                       if (plist == plist->next)
+                               break;
+                       plist = plist->next;
+               };
+       }
 #endif 
+#endif
+       
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
+       
 }
 
+VOID
+odm_HwAntDiv(
+       IN      PDM_ODM_T       pDM_Odm
+)
+{      
 
-//3============================================================
-//3 Tx Power Tracking
-//3============================================================
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;
 
-VOID
-odm_IQCalibrate(
-               IN      PDM_ODM_T       pDM_Odm 
-               )
-{
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       
-       if(!IS_HARDWARE_TYPE_JAGUAR(Adapter))
-               return;
-       else if(IS_HARDWARE_TYPE_8812AU(Adapter))
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
+       if(pAdapter->MgntInfo.AntennaTest)
                return;
-#if (RTL8821A_SUPPORT == 1)
-       if(pDM_Odm->bLinked)
+#endif
+       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
        {
-               if((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess))
-               {
-                       pDM_Odm->preChannel = *pDM_Odm->pChannel;
-                       pDM_Odm->LinkedInterval = 0;
-               }
-
-               if(pDM_Odm->LinkedInterval < 3)
-                       pDM_Odm->LinkedInterval++;
-               
-               if(pDM_Odm->LinkedInterval == 2)
-               {
-                       // Mark out IQK flow to prevent tx stuck. by Maddest 20130306
-                       // Open it verified by James 20130715
-                       PHY_IQCalibrate_8821A(Adapter, FALSE);
-               }
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
+               return;
        }
-       else
-               pDM_Odm->LinkedInterval = 0;
+       
+       if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
+       {
+#if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
+               odm_HwAntDiv_92C_92D(pDM_Odm);
 #endif
+       }
 }
 
 
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+#if 0
 VOID
-odm_TXPowerTrackingInit(
-       IN      PDM_ODM_T       pDM_Odm 
-       )
-{
-       odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
-}      
-
-u1Byte 
-getSwingIndex(
-       IN      PDM_ODM_T       pDM_Odm 
-       )
+odm_HwAntDiv(
+       IN      PDM_ODM_T       pDM_Odm
+)
 {
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       u1Byte                  i = 0;
-       u4Byte                  bbSwing;
-       u4Byte                  swingTableSize;
-       pu4Byte                         pSwingTable;
-
-       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
-               pDM_Odm->SupportICType == ODM_RTL8192E) 
-       {
-               bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
+       struct rtl8192cd_priv *priv=pDM_Odm->priv;
+       struct stat_info        *pstat, *pstat_min=NULL;
+       struct list_head        *phead, *plist;
+       int rssi_min= 0xff, i;
+       u1Byte  idleAnt=priv->pshare->rf_ft_var.CurAntenna;     
+       u1Byte  nextAnt;
+       BOOLEAN         bRet=FALSE;
+       
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
 
-               pSwingTable = OFDMSwingTable_New;
-               swingTableSize = OFDM_TABLE_SIZE;
-       } else {
-#if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
-               if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
-               {
-                       bbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);
-                       pSwingTable = TxScalingTable_Jaguar;
-                       swingTableSize = TXSCALE_TABLE_SIZE;
+       if((!priv->pshare->rf_ft_var.antHw_enable) ||(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)))
+               return;
+       
+       //if test, return
+       if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
+               return;
+       
+       phead = &priv->asoc_list;
+       plist = phead->next;
+       ////=========================
+       //find mimum rssi sta
+       ////=========================
+       while(plist != phead)   {
+               pstat = list_entry(plist, struct stat_info, asoc_list);
+               if((pstat->expire_to) && (pstat->AntRSSI[0] || pstat->AntRSSI[1])) {
+                       int rssi = (pstat->AntRSSI[0] < pstat->AntRSSI[1]) ? pstat->AntRSSI[0] : pstat->AntRSSI[1];
+                       if((!pstat_min) || ( rssi < rssi_min) ) {
+                               pstat_min = pstat;
+                               rssi_min = rssi;
+                       }
                }
-               else
-#endif
-               {
-                       bbSwing = 0;
-                       pSwingTable = OFDMSwingTable;
-                       swingTableSize = OFDM_TABLE_SIZE;
+               ///STA: found out default antenna
+               bRet=odm_StaDefAntSel(pDM_Odm,
+                                               pstat->hwRxAntSel[1],
+                                               pstat->hwRxAntSel[0],
+                                               pstat->cckPktCount[1],
+                                               pstat->cckPktCount[0],
+                                               &nextAnt
+                                               );
+               
+               //if default antenna selection: successful
+               if(bRet){       
+                       pstat->CurAntenna = nextAnt;
+                       //update rssi
+                       for(i=0; i<2; i++) {
+                               if(pstat->cckPktCount[i]==0 && pstat->hwRxAntSel[i]==0)
+                                       pstat->AntRSSI[i] = 0;
+                       }
+                       if(pstat->AntRSSI[idleAnt]==0)
+                               pstat->AntRSSI[idleAnt] = pstat->AntRSSI[idleAnt^1];
+                       // reset variables
+                       pstat->hwRxAntSel[1] = pstat->hwRxAntSel[0] =0;
+                       pstat->cckPktCount[1]= pstat->cckPktCount[0] =0;
                }
-       }
 
-       for (i = 0; i < swingTableSize; ++i) {
-               u4Byte tableValue = pSwingTable[i];
-               
-               if (tableValue >= 0x100000 )
-                       tableValue >>= 22;
-               if (bbSwing == tableValue)
+               if (plist == plist->next)
                        break;
-       }
-       return i;
+               plist = plist->next;
+               
+       };
+       ////=========================
+       //Choose  RX Idle antenna according to minmum rssi
+       ////=========================
+       if(pstat_min)   {
+               if(priv->pshare->rf_ft_var.CurAntenna!=pstat_min->CurAntenna)
+                       odm_SetRxIdleAnt(pDM_Odm,pstat_min->CurAntenna,TRUE);
+               priv->pshare->rf_ft_var.CurAntenna = pstat_min->CurAntenna;
+       }
+
+
+#ifdef TX_SHORTCUT
+       if (!priv->pmib->dot11OperationEntry.disable_txsc) {
+               plist = phead->next;
+               while(plist != phead)   {
+                       pstat = list_entry(plist, struct stat_info, asoc_list);
+                       if(pstat->expire_to) {
+                               for (i=0; i<TX_SC_ENTRY_NUM; i++) {
+                                       struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);  
+                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
+                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
+                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
+                                       pdesc= &(pstat->tx_sc_ent[i].hwdesc2);  
+                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
+                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
+                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));                                     
+                               }
+                       }               
+
+                       if (plist == plist->next)
+                               break;
+                       plist = plist->next;
+               };
+       }
+#endif 
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,"<==============odm_HwAntDiv\n");
 }
+#endif
 
-VOID
-odm_TXPowerTrackingThermalMeterInit(
-       IN      PDM_ODM_T       pDM_Odm 
-       )
+u1Byte
+ODM_Diversity_AntennaSelect(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u1Byte  *data
+)
 {
-       u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);
-       u1Byte                  p = 0;
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct rtl8192cd_priv *priv=pDM_Odm->priv;
 
-       #if     MP_DRIVER != 1                                  //for mp driver, turn off txpwrtracking as default
-       pHalData->TxPowerTrackControl = TRUE;           
-       #endif
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       PADAPTER                        Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       int ant = _atoi(data, 16);
 
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ODM_Diversity_AntennaSelect==============>\n"));
 
-       if (pDM_Odm->SupportICType >= ODM_RTL8188E) 
-       {
-               pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
-               pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
-               pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
-               //#if   (MP_DRIVER != 1)                //for mp driver, turn off txpwrtracking as default
-               if ( *(pDM_Odm->mp_mode) != 1)
-                       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
-               //#endif//#if   (MP_DRIVER != 1)
-               MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
-       }
-       else
+       #ifdef PCIE_POWER_SAVING
+       PCIeWakeUp(priv, POWER_DOWN_T0);
+       #endif
+
+       if (ant==AUX_ANT || ant==MAIN_ANT) 
        {
-               struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+               if ( !priv->pshare->rf_ft_var.antSw_select) {
+                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(8)| BIT(9) );  //  ANTSEL A as SW control
+                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7)));       // rx OFDM SW control
+                       PHY_SetBBReg(priv, 0x860, 0x300, ant);
+               } else {
+                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(24)| BIT(25) ); // ANTSEL B as HW control
+                       PHY_SetBBReg(priv, 0x864, 0x300, ant);
+                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7)));               // rx OFDM SW control
+               }
 
-               pdmpriv->bTXPowerTracking = _TRUE;
-               pdmpriv->TXPowercount = 0;
-               pdmpriv->bTXPowerTrackingInit = _FALSE;
-               //#if   (MP_DRIVER != 1)                //for mp driver, turn off txpwrtracking as default
+               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7)));       // rx CCK SW control
+               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
+               ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
 
-               if (*(pDM_Odm->mp_mode) != 1)
-                       pdmpriv->TxPowerTrackControl = _TRUE;
-               //#endif//#if   (MP_DRIVER != 1)
+               priv->pshare->rf_ft_var.antHw_enable = 0;
+               priv->pshare->rf_ft_var.CurAntenna  = (ant%2);
 
-               //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
-       }
-       
-#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-       #ifdef RTL8188E_SUPPORT
-       {
-               pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
-               pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
-               pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
-               pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
+               #ifdef SW_ANT_SWITCH
+               priv->pshare->rf_ft_var.antSw_enable = 0;
+               priv->pshare->DM_SWAT_Table.CurAntenna = ant;
+               priv->pshare->RSSI_test =0;
+               #endif
        }
-       #endif
-#endif
+       else if(ant==0){
 
-       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
-       pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
-       pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
-       pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;       
+               if ( !priv->pshare->rf_ft_var.antSw_select)  {
+                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(8)| BIT(9)) );
+                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) | BIT(7));   // OFDM HW control
+               } else {
+                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(24)| BIT(25)) );
+                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) | BIT(7));   // OFDM HW control
+               }
 
-       // The index of "0 dB" in SwingTable.
-       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
-               pDM_Odm->SupportICType == ODM_RTL8192E) 
-       {
-               pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
-               pDM_Odm->DefaultCckIndex = 20;  
-       }
-       else
-       {
-               pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;
-               pDM_Odm->DefaultCckIndex = 24;  
+               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) | BIT(7));   // CCK HW control
+               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) | BIT(21) ); // by tx desc
+               priv->pshare->rf_ft_var.CurAntenna = 0;
+               ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
+               priv->pshare->rf_ft_var.antHw_enable = 1;
+#ifdef SW_ANT_SWITCH
+               priv->pshare->rf_ft_var.antSw_enable = 0;
+               priv->pshare->RSSI_test =0;
+#endif
        }
+#ifdef SW_ANT_SWITCH
+       else if(ant==3) {
+               if(!priv->pshare->rf_ft_var.antSw_enable) {
+                       
+                       dm_SW_AntennaSwitchInit(priv);
+                       ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
+                       priv->pshare->lastTxOkCnt = priv->net_stats.tx_bytes;
+                       priv->pshare->lastRxOkCnt = priv->net_stats.rx_bytes;
+               }
+               if ( !priv->pshare->rf_ft_var.antSw_select)
+                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7)));       // rx OFDM SW control
+               else
+                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7)));       // rx OFDM SW control
+
+               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7)));               // rx CCK SW control
+               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21)));      // select ant by tx desc
+               priv->pshare->rf_ft_var.antHw_enable = 0;
+               priv->pshare->rf_ft_var.antSw_enable = 1;
 
-       pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
-       pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
-       
-       for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
-       {
-               pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;             
-               pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;             
-               pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
-               pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
-               pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
        }
+#endif
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============ODM_Diversity_AntennaSelect\n"));
 
+       return 1;
 }
+#endif
 
+#else //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
 
-VOID
-ODM_TXPowerTrackingCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       //
-       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
-       // at the same time. In the stage2/3, we need to prive universal interface and merge all
-       // HW dynamic mechanism.
-       //
-       switch  (pDM_Odm->SupportPlatform)
-       {
-               case    ODM_WIN:
-                       odm_TXPowerTrackingCheckMP(pDM_Odm);
-                       break;
+VOID odm_InitHybridAntDiv(     IN PDM_ODM_T    pDM_Odm         ){}
+VOID odm_HwAntDiv(     IN      PDM_ODM_T       pDM_Odm){}
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
+VOID ODM_SetTxAntByTxInfo_88C_92D(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              pu1Byte                 pDesc,
+       IN              u1Byte                  macId   
+){}
+#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
+VOID ODM_SetTxAntByTxInfo_88C_92D(     IN              PDM_ODM_T               pDM_Odm){ }
+#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
+VOID ODM_SetTxAntByTxInfo_88C_92D(     IN              PDM_ODM_T               pDM_Odm){ }
+#endif
 
-               case    ODM_CE:
-                       odm_TXPowerTrackingCheckCE(pDM_Odm);
-                       break;
+#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
 
-               case    ODM_AP:
-                       odm_TXPowerTrackingCheckAP(pDM_Odm);            
-                       break;          
 
-               case    ODM_ADSL:
-                       //odm_DIGAP(pDM_Odm);
-                       break;  
-       }
 
-}
+//============================================================
+//EDCA Turbo
+//============================================================
 
-VOID
-odm_TXPowerTrackingCheckCE(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
+//Remove Edca by Yuchen
+
+
+#if( DM_ODM_SUPPORT_TYPE == ODM_WIN) 
+//
+// 2011/07/26 MH Add an API for testing IQK fail case.
+//
+BOOLEAN
+ODM_CheckPowerStatus(
+       IN      PADAPTER                Adapter)
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-       PADAPTER        Adapter = pDM_Odm->Adapter;
-       #if( (RTL8192C_SUPPORT==1) ||  (RTL8723A_SUPPORT==1) )
-       if(IS_HARDWARE_TYPE_8192C(Adapter)){
-               rtl8192c_odm_CheckTXPowerTracking(Adapter);
-               return;
-       }
-       #endif
 
-       #if (RTL8192D_SUPPORT==1) 
-       if(IS_HARDWARE_TYPE_8192D(Adapter)){    
-               #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
-               if(!Adapter->bSlaveOfDMSP)
-               #endif
-                       rtl8192d_odm_CheckTXPowerTracking(Adapter);
-               return; 
-       }
-       #endif
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;
+       RT_RF_POWER_STATE       rtState;
+       PMGNT_INFO                      pMgntInfo       = &(Adapter->MgntInfo);
 
-       #if(((RTL8188E_SUPPORT==1) ||  (RTL8812A_SUPPORT==1) ||  (RTL8821A_SUPPORT==1) ||  (RTL8192E_SUPPORT==1)  ||  (RTL8723B_SUPPORT==1)  ))
-       if(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
-       {
-               return;
-       }
-
-       if(!pDM_Odm->RFCalibrateInfo.TM_Trigger)                //at least delay 1 sec
+       // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.
+       if (pMgntInfo->init_adpt_in_progress == TRUE)
        {
-               //pHalData->TxPowerCheckCnt++;  //cosa add for debug
-               if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)||IS_HARDWARE_TYPE_8723B(Adapter))
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
-               else
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);
-               
-               //DBG_871X("Trigger Thermal Meter!!\n");
-               
-               pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
-               return;
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter"));
+               return  TRUE;
        }
-       else
+       
+       //
+       //      2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.
+       //
+       Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));        
+       if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)
        {
-               //DBG_871X("Schedule TxPowerTracking direct call!!\n");
-               ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
-               pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", 
+               Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));
+               return  FALSE;
        }
-       #endif
-#endif 
+       return  TRUE;
 }
+#endif
 
-VOID
-odm_TXPowerTrackingCheckMP(
-       IN              PDM_ODM_T               pDM_Odm 
-       )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER        Adapter = pDM_Odm->Adapter;
+// need to ODM CE Platform
+//move to here for ANT detection mechanism using
 
-       if (ODM_CheckPowerStatus(Adapter) == FALSE) 
-       {
-               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>ODM_CheckPowerStatus() return FALSE\n"));
-               return;
-       }
+#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
+u4Byte
+GetPSDData(
+       IN PDM_ODM_T    pDM_Odm,
+       unsigned int    point,
+       u1Byte initial_gain_psd)
+{
+       //unsigned int  val, rfval;
+       //int   psd_report;
+       u4Byte  psd_report;
+       
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
+       //Debug Message
+       //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
+       //DbgPrint("Reg908 = 0x%x\n",val);
+       //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
+       //rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
+       //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
+       //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
+               //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
 
-       if(IS_HARDWARE_TYPE_8723A(Adapter))
-               return;
+       //Set DCO frequency index, offset=(40MHz/SamplePts)*point
+       ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
 
-       if(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)
-               odm_TXPowerTrackingThermalMeterCheck(Adapter);
-       else {
-               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\n"));
-       }
+       //Start PSD calculation, Reg808[22]=0->1
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
+       //Need to wait for HW PSD report
+       ODM_StallExecution(1000);
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
+       //Read PSD report, Reg8B4[15:0]
+       psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
+       
+#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))
+       psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
+#else
+       psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);
 #endif
+
+       return psd_report;
        
 }
 
-
-VOID
-odm_TXPowerTrackingCheckAP(
-       IN              PDM_ODM_T               pDM_Odm
-       )
+u4Byte 
+ConvertTo_dB(
+       u4Byte  Value)
 {
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
-       prtl8192cd_priv priv            = pDM_Odm->priv;
+       u1Byte i;
+       u1Byte j;
+       u4Byte dB;
 
-       if ( (priv->pmib->dot11RFEntry.ther) && ((priv->up_time % priv->pshare->rf_ft_var.tpt_period) == 0)){
-#ifdef CONFIG_RTL_92D_SUPPORT
-               if (GET_CHIP_VER(priv)==VERSION_8192D){
-                       tx_power_tracking_92D(priv);
-               } else 
-#endif
+       Value = Value & 0xFFFF;
+       
+       for (i=0;i<8;i++)
+       {
+               if (Value <= dB_Invert_Table[i][11])
                {
-#ifdef CONFIG_RTL_92C_SUPPORT                  
-                       tx_power_tracking(priv);
-#endif
+                       break;
                }
        }
-#endif 
-
-}
-
-
 
-//antenna mapping info
-// 1: right-side antenna
-// 2/0: left-side antenna
-//PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt:  for right-side antenna:   Ant:1    RxDefaultAnt1
-//PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt:  for left-side antenna:     Ant:0    RxDefaultAnt2
-// We select left antenna as default antenna in initial process, modify it as needed
-//
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-VOID
-odm_TXPowerTrackingThermalMeterCheck(
-       IN      PADAPTER                Adapter
-       )
-{
-#ifndef AP_BUILD_WORKAROUND
-       static u1Byte                   TM_Trigger = 0;
-
-       if(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))
+       if (i >= 8)
        {
-               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
-                       ("===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\n"));
-               return;
+               return (96);    // maximum 96 dB
        }
 
-       if(!TM_Trigger)         //at least delay 1 sec
-       {
-               if(IS_HARDWARE_TYPE_8192D(Adapter))
-                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_92D, BIT17 | BIT16, 0x03);
-               else if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||
-                           IS_HARDWARE_TYPE_8723B(Adapter))
-                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
-               else
-                       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
-               
-               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger Thermal Meter!!\n"));
-               
-               TM_Trigger = 1;
-               return;
-       }
-       else
+       for (j=0;j<12;j++)
        {
-               RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));           
-               odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
-               TM_Trigger = 0;
+               if (Value <= dB_Invert_Table[i][j])
+               {
+                       break;
+               }
        }
-#endif
+
+       dB = i*12 + j + 1;
+
+       return (dB);
 }
 
-// Only for 8723A SW ANT DIV INIT--2012--07--17
-VOID
-odm_SwAntDivInit_NIC_8723A(
-       IN      PDM_ODM_T               pDM_Odm)
-{
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       
-       u1Byte                  btAntNum=BT_GetPgAntNum(Adapter);
+#endif
 
-       if(IS_HARDWARE_TYPE_8723A(Adapter))
-       {
-               pDM_SWAT_Table->ANTA_ON =TRUE;
-               
-               // Set default antenna B status by PG
-               if(btAntNum == 2)
-                       pDM_SWAT_Table->ANTB_ON = TRUE;
-               else if(btAntNum == 1)
-                       pDM_SWAT_Table->ANTB_ON = FALSE;
-               else
-                       pDM_SWAT_Table->ANTB_ON = TRUE;
-       }       
+//
+// LukeLee: 
+// PSD function will be moved to FW in future IC, but now is only implemented in MP platform
+// So PSD function will not be incorporated to common ODM
+//
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+#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        SCAN_INTERVAL   1500 //ms
+#define        SYN_Length              5    // for 92D
        
-}
+#define        LNA_Low_Gain_1                      0x64
+#define        LNA_Low_Gain_2                      0x5A
+#define        LNA_Low_Gain_3                      0x58
 
-#endif //end #ifMP
+#define        pw_th_10dB                                      0x0
+#define        pw_th_16dB                                      0x3
+
+#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
 
+#define        Idle_Mode                                       0
+#define        High_TP_Mode                            1
+#define        Low_TP_Mode                             2
 
 
-//3============================================================
-//3 SW Antenna Diversity
-//3============================================================
-#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
 VOID
-odm_SwAntDivInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
+odm_PSDMonitorInit(
+       IN PDM_ODM_T    pDM_Odm)
 {
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-       odm_SwAntDivInit_NIC(pDM_Odm);
-#elif(DM_ODM_SUPPORT_TYPE == ODM_AP)
-       dm_SW_AntennaSwitchInit(pDM_Odm->priv);
-#endif
-}
-
-VOID
-odm_SwAntDivInit_NIC(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
+       //PSD Monitor Setting
+       //Which path in ADC/DAC is turnned on for PSD: both I/Q
+       ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
+       //Ageraged number: 8
+       ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
+       pDM_Odm->bPSDinProcess = FALSE;
+       pDM_Odm->bUserAssignLevel = FALSE;
+       pDM_Odm->bPSDactive = FALSE;
+       //pDM_Odm->bDMInitialGainEnable=TRUE;           //change the initialization to DIGinit
+       //Set Debug Port
+       //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
+       //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
+       //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
+       //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
 
-// Init SW ANT DIV mechanism for 8723AE/AU/AS
-// Neil Chen--2012--07--17---
-// CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
-//#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-#if (RTL8723A_SUPPORT==1) 
-       if(pDM_Odm->SupportICType == ODM_RTL8723A)
-       {
-               odm_SwAntDivInit_NIC_8723A(pDM_Odm);    
-       }       
+       //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
 #endif
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
-       pDM_SWAT_Table->RSSI_sum_A = 0;
-       pDM_SWAT_Table->RSSI_cnt_A = 0;
-       pDM_SWAT_Table->RSSI_sum_B = 0;
-       pDM_SWAT_Table->RSSI_cnt_B = 0;
-       pDM_SWAT_Table->CurAntenna = MAIN_ANT;
-       pDM_SWAT_Table->PreAntenna = MAIN_ANT;
-       pDM_SWAT_Table->try_flag = 0xff;
-       pDM_SWAT_Table->PreRSSI = 0;
-       pDM_SWAT_Table->SWAS_NoLink_State = 0;
-       pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
-       pDM_SWAT_Table->SelectAntennaMap=0xAA;
-       pDM_SWAT_Table->lastTxOkCnt = 0;
-       pDM_SWAT_Table->lastRxOkCnt = 0;
-       pDM_SWAT_Table->TXByteCnt_A = 0;
-       pDM_SWAT_Table->TXByteCnt_B = 0;
-       pDM_SWAT_Table->RXByteCnt_A = 0;
-       pDM_SWAT_Table->RXByteCnt_B = 0;
-       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
-       pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
-       
-}
-
-//
-// 20100514 Joseph: 
-// Add new function to reset the state of antenna diversity before link.
-//
-VOID
-ODM_SwAntDivResetBeforeLink(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       pDM_SWAT_Table->SWAS_NoLink_State = 0;
-
 }
 
-//
-// 20100514 Luke/Joseph:
-// Add new function to reset antenna diversity state after link.
-//
 VOID
-ODM_SwAntDivRestAfterLink(
-       IN              PDM_ODM_T               pDM_Odm
-       )
+PatchDCTone(
+       IN      PDM_ODM_T       pDM_Odm,
+       pu4Byte         PSD_report,
+       u1Byte          initial_gain_psd
+)
 {
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       pFAT_T          pDM_FatTable = &pDM_Odm->DM_FatTable;
-       u4Byte             i;
-
-       if(pDM_Odm->SupportICType == ODM_RTL8723A)
-       {
-           pDM_SWAT_Table->RSSI_cnt_A = 0;
-           pDM_SWAT_Table->RSSI_cnt_B = 0;
-           pDM_Odm->RSSI_test = FALSE;
-           pDM_SWAT_Table->try_flag = 0xff;
-           pDM_SWAT_Table->RSSI_Trying = 0;
-           pDM_SWAT_Table->SelectAntennaMap=0xAA;
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
+       //PADAPTER      pAdapter;
        
-       }
-       else if(pDM_Odm->SupportICType & (ODM_RTL8723B|ODM_RTL8821))
-       {
-               pDM_Odm->RSSI_test = FALSE;
-               pDM_SWAT_Table->try_flag = 0xff;
-               pDM_SWAT_Table->RSSI_Trying = 0;
-               pDM_SWAT_Table->Double_chk_flag= 0;
-               
-               pDM_FatTable->RxIdleAnt=MAIN_ANT;
-               
-               for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
-               {
-                       pDM_FatTable->MainAnt_Sum[i] = 0;
-                       pDM_FatTable->AuxAnt_Sum[i] = 0;
-                       pDM_FatTable->MainAnt_Cnt[i] = 0;
-                       pDM_FatTable->AuxAnt_Cnt[i] = 0;
-               }
-
-       }
-}
-
-void
-odm_SwAntDetectInit(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-#if (RTL8723B_SUPPORT == 1)
-       pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);
-#endif
-       pDM_SWAT_Table->PreAntenna = MAIN_ANT;
-       pDM_SWAT_Table->CurAntenna = MAIN_ANT;
-       pDM_SWAT_Table->SWAS_NoLink_State = 0;
-}
+       u4Byte  psd_report;
 
-VOID
-ODM_SwAntDivChkPerPktRssi(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u1Byte               StationID,
-       IN PODM_PHY_INFO_T pPhyInfo
-       )
-{      
-       SWAT_T          *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       //2 Switch to CH11 to patch CH9 and CH13 DC tone
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
        
-       if(!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
-               return;
-
-// temporary Fix 8723A MP SW ANT DIV Bug --NeilChen--2012--07--11
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+       if(pDM_Odm->SupportICType== ODM_RTL8192D)
        {
-               //if(StationID == pDM_SWAT_Table->RSSI_target)
-               //{
-               //1 RSSI for SW Antenna Switch
-               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+               if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
                {
-                       pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_A++;
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);
                }
                else
                {
-                       pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_B++;
-
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);
                }
-               //}
        }
-       else
-       {
-               if(StationID == pDM_SWAT_Table->RSSI_target)
-               {
-                       //1 RSSI for SW Antenna Switch
-                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                       {
-                               pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
-                               pDM_SWAT_Table->RSSI_cnt_A++;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
-                               pDM_SWAT_Table->RSSI_cnt_B++;
+       
+       //Ch9 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
+       PSD_report[50] = psd_report;
+       //Ch13 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
+       PSD_report[70] = psd_report;
+       
+       //2 Switch to CH3 to patch CH1 and CH5 DC tone
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
 
-                       }
-               }
-       }
-#else  
-       if(StationID == pDM_SWAT_Table->RSSI_target)
+       
+       if(pDM_Odm->SupportICType==ODM_RTL8192D)
        {
-               //1 RSSI for SW Antenna Switch
-               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+               if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
                {
-                       pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_A++;
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
                }
                else
                {
-                       pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
-                       pDM_SWAT_Table->RSSI_cnt_B++;
-
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);
+                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
                }
        }
-#endif
+       
+       //Ch1 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
+       PSD_report[10] = psd_report;
+       //Ch5 DC tone patch
+       psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
+       PSD_report[30] = psd_report;
+
 }
 
-//
+
 VOID
-odm_SwAntDivChkAntSwitch(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  Step
-       )
+GoodChannelDecision(
+       PDM_ODM_T       pDM_Odm,
+       pu4Byte         PSD_report,
+       pu1Byte         PSD_bitmap,
+       u1Byte          RSSI_BT,
+       pu1Byte         PSD_bitmap_memory)
 {
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-
-       //
-       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
-       // at the same time. In the stage2/3, we need to prive universal interface and merge all
-       // HW dynamic mechanism.
-       //
-       switch  (pDM_Odm->SupportPlatform)
+       pRXHP_T                 pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
+       //s4Byte        TH1 =  SSBT-0x15;    // modify TH by Neil Chen
+       s4Byte  TH1= RSSI_BT+0x14;
+       s4Byte  TH2 = RSSI_BT+85;
+       //u2Byte    TH3;
+//     s4Byte  RegB34;
+       u1Byte  bitmap, Smooth_size[3], Smooth_TH[3];
+       //u1Byte        psd_bit;
+       u4Byte  i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
+       int             start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
+       
+//     RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
+
+       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
+       {
+            TH1 = RSSI_BT + 0x14;  
+       }
+
+       Smooth_size[0]=Smooth_Size_1;
+       Smooth_size[1]=Smooth_Size_2;
+       Smooth_size[2]=Smooth_Size_3;
+       Smooth_TH[0]=Smooth_TH_1;
+       Smooth_TH[1]=Smooth_TH_2;
+       Smooth_TH[2]=Smooth_TH_3;
+       Smooth_Interval[0]=16;
+       Smooth_Interval[1]=15;
+       Smooth_Interval[2]=13;
+       good_cnt = 0;
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
        {
-               case    ODM_WIN:        
-                       odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
-                       break;
-               case    ODM_CE:
-                       odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
-                       break;
+               //2 Threshold  
 
-               case    ODM_AP:
-               case    ODM_ADSL:
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP |ODM_ADSL))
-                       if (priv->pshare->rf_ft_var.antSw_enable && (priv->up_time % 4==1))
-                               dm_SW_AntennaSwitch(priv, SWAW_STEP_PEAK);
-#endif         
-                       break;                  
+               if(RSSI_BT >=41)
+                       TH1 = 113;      
+               else if(RSSI_BT >=38)   // >= -15dBm
+                       TH1 = 105;                              //0x69
+               else if((RSSI_BT >=33)&(RSSI_BT <38))
+                       TH1 = 99+(RSSI_BT-33);         //0x63
+               else if((RSSI_BT >=26)&(RSSI_BT<33))
+                       TH1 = 99-(33-RSSI_BT)+2;     //0x5e
+               else if((RSSI_BT >=24)&(RSSI_BT<26))
+                       TH1 = 88-((RSSI_BT-24)*3);   //0x58
+               else if((RSSI_BT >=18)&(RSSI_BT<24))
+                       TH1 = 77+((RSSI_BT-18)*2);
+               else if((RSSI_BT >=14)&(RSSI_BT<18))
+                       TH1 = 63+((RSSI_BT-14)*2);
+               else if((RSSI_BT >=8)&(RSSI_BT<14))
+                       TH1 = 58+((RSSI_BT-8)*2);
+               else if((RSSI_BT >=3)&(RSSI_BT<8))
+                       TH1 = 52+(RSSI_BT-3);
+               else
+                       TH1 = 51;
        }
 
-}
+       for (i = 0; i< 10; i++)
+               PSD_bitmap[i] = 0;
+       
 
-//
-// 20100514 Luke/Joseph:
-// Add new function for antenna diversity after link.
-// This is the main function of antenna diversity after link.
-// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
-// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
-// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
-// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
-// listened on the air with the RSSI of original antenna.
-// It chooses the antenna with better RSSI.
-// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting 
-// penalty to get next try.
+        // Add By Gary
+       for (i=0; i<80; i++)
+               pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
+       // End
 
 
-VOID
-ODM_SetAntenna(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte          Antenna)
-{
-       ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna); 
-}
 
-VOID
-odm_SwAntDivChkAntSwitchNIC(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte          Step
-       )
-{
-#if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
-       //PMGNT_INFO            pMgntInfo = &(Adapter->MgntInfo);
-       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       {
+               TH1 =TH1-SIR_STEP_SIZE;
+       }
+       while (good_cnt < PSD_CHMIN)
+       {
+               good_cnt = 0;
+               if(pDM_Odm->SupportICType==ODM_RTL8723A)
+               {
+               if(TH1 ==TH2)
+                       break;
+               if((TH1+SIR_STEP_SIZE) < TH2)
+                       TH1 += SIR_STEP_SIZE;
+               else
+                       TH1 = TH2;
+               }
+               else
+               {
+                       if(TH1==(RSSI_BT+0x1E))
+                            break;    
+                       if((TH1+2) < (RSSI_BT+0x1E))
+                               TH1+=3;
+                       else
+                               TH1 = RSSI_BT+0x1E;     
+             
+               }
+               ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
+                        
+               for (i = 0; i< 80; i++)
+               {
+                       if((s4Byte)(PSD_report[i]) < TH1)
+                       {
+                               byte_idx = i / 8;
+                               bit_idx = i -8*byte_idx;
+                               bitmap = PSD_bitmap[byte_idx];
+                               PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
+                       }
+               }
 
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PADAPTER                Adapter=pDM_Odm->Adapter;
+#if DBG
+               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
+               for(n=0;n<10;n++)
+               {
+                       //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
+                       for (i = 0; i<8; i++)
+                               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] =   %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
+               }
 #endif
+       
+               //1 Start of smoothing function
 
-       pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       s4Byte                  curRSSI=100, RSSI_A, RSSI_B;
-       u1Byte                  nextAntenna=AUX_ANT;
-       //static u8Byte         lastTxOkCnt=0, lastRxOkCnt=0;
-       u8Byte                  curTxOkCnt=0, curRxOkCnt=0;
-       //static u8Byte         TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
-       u8Byte                  CurByteCnt=0, PreByteCnt=0;
-       //static u1Byte         TrafficLoad = TRAFFIC_LOW;
-       u1Byte                  Score_A=0, Score_B=0;       //A: Main; B: AUX
-       u1Byte                  i;
+               for (j=0;j<3;j++)
+               {
+                       start_byte_idx=0;
+                       start_bit_idx=0;
+                       for(n=0; n<Smooth_Interval[j]; n++)
+                       {
+                               good_cnt_smoothing = 0;
+                               cur_bit_idx = start_bit_idx;
+                               cur_byte_idx = start_byte_idx;
+                               for ( i=0; i < Smooth_size[j]; i++)
+                               {
+                                       NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
+                                       if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
+                                               good_cnt_smoothing++;
 
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-               return;
+                               }
 
-       if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
-               return;
+                               if( good_cnt_smoothing < Smooth_TH[j] )
+                               {
+                                       cur_bit_idx = start_bit_idx;
+                                       cur_byte_idx = start_byte_idx;
+                                       for ( i=0; i< Smooth_size[j] ; i++)
+                                       {       
+                                               NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;                                
+                                               PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
+                                       }
+                               }
+                               start_bit_idx =  start_bit_idx + Smooth_Step_Size;
+                               while ( (start_bit_idx)  > 7 )
+                               {
+                                       start_byte_idx= start_byte_idx+start_bit_idx/8;
+                                       start_bit_idx = start_bit_idx%8;
+                               }
+                       }
 
-       if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
-               return;
+                       ODM_RT_TRACE(   pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
+                       for(n=0;n<10;n++)
+                       {
+                               for (i = 0; i<8; i++)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] =   %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
+                                       
+                                       if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1)  //----- Add By Gary
+                                       {
+                                          pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
+                                       }                                                  // ------end by Gary
+                               }
+                       }
 
-       if(pDM_Odm->SupportPlatform & ODM_WIN)
-       {
-               if(*(pDM_Odm->pAntennaTest))
-                       return;
-       }
+               }
 
-       if((pDM_SWAT_Table->ANTA_ON == FALSE) ||(pDM_SWAT_Table->ANTB_ON == FALSE))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
-                               ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
-               return;
+       
+               good_cnt = 0;
+               for ( i = 0; i < 10; i++)
+               {
+                       for (n = 0; n < 8; n++)
+                               if((PSD_bitmap[i]& BIT(n)) != 0)
+                                       good_cnt++;
+               }
+               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: good channel cnt = %u",good_cnt));
        }
 
-       // Radio off: Status reset to default and return.
-       if(*(pDM_Odm->pbPowerSaving)==TRUE) //pHalData->eRFPowerState==eRfOff
+       //RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
+       for (i = 0; i <10; i++)
+               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
+/*     
+       //Update bitmap memory
+       for(i = 0; i < 80; i++)
        {
-               ODM_SwAntDivRestAfterLink(pDM_Odm);
-               return;
+               byte_idx = i / 8;
+               bit_idx = i -8*byte_idx;
+               psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
+               bitmap = PSD_bitmap_memory[i]; 
+               PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
        }
+*/
+}
 
 
-       // Handling step mismatch condition.
-       // Peak step is not finished at last time. Recover the variable and check again.
-       if(     Step != pDM_SWAT_Table->try_flag        )
-       {
-               ODM_SwAntDivRestAfterLink(pDM_Odm);
-       }
-
-#if  (DM_ODM_SUPPORT_TYPE &( ODM_WIN| ODM_CE ))
-
-       if(pDM_SWAT_Table->try_flag == 0xff)
-       {
-               pDM_SWAT_Table->RSSI_target = 0xff;
-               
-               #if(DM_ODM_SUPPORT_TYPE & ODM_CE)
-               {
-                       u1Byte                  index = 0;
-                       PSTA_INFO_T             pEntry = NULL;
-                       
-                       
-                       for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
-                       {                                       
-                               pEntry =  pDM_Odm->pODM_StaInfo[index];
-                               if(IS_STA_VALID(pEntry) ) {
-                                       break;
-                               }
-                       }
-                       if(pEntry == NULL)
-                       {
-                               ODM_SwAntDivRestAfterLink(pDM_Odm);
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
-                               return;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->RSSI_target = index;
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
-                       }
-                }
-               #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) 
-               {
-                       PADAPTER        pAdapter         =  pDM_Odm->Adapter;
-                       PMGNT_INFO      pMgntInfo=&pAdapter->MgntInfo;
-                       
-                       // Select RSSI checking target
-                       if(pMgntInfo->mAssoc && !ACTING_AS_AP(pAdapter))
-                       {
-                               // Target: Infrastructure mode AP.
-                               //pDM_SWAT_Table->RSSI_target = NULL;
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): RSSI_target is DEF AP!\n"));
-                       }
-                       else
-                       {
-                               u1Byte                  index = 0;
-                               PSTA_INFO_T             pEntry = NULL;
-                               PADAPTER                pTargetAdapter = NULL;
-                       
-                               if(pMgntInfo->mIbss )
-                               {
-                                       // Target: AP/IBSS peer.
-                                       pTargetAdapter = pAdapter;
-                               }
-                               else
-                               {
-                                       pTargetAdapter = GetFirstAPAdapter(pAdapter);
-                               }
-
-                               if(pTargetAdapter != NULL)
-                               {                       
-                                       for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
-                                       {                                       
-                                               
-                                               pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
-                                               if(pEntry != NULL)
-                                               {
-                                                       if(pEntry->bAssociated)
-                                                               break;                  
-                                               }
-                                               
-                                       }
-                                       
-                               }
-
-                               if(pEntry == NULL)
-                               {
-                                       ODM_SwAntDivRestAfterLink(pDM_Odm);
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
-                                       return;
-                               }
-                               else
-                               {
-                                       //pDM_SWAT_Table->RSSI_target = pEntry;
-                                       pDM_SWAT_Table->RSSI_target = index;
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
-                               }
-                       }//end if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
-
-               }
-               #endif
-
-               pDM_SWAT_Table->RSSI_cnt_A = 0;
-               pDM_SWAT_Table->RSSI_cnt_B = 0;
-               pDM_SWAT_Table->try_flag = 0;
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
-               return;
-       }
-       else
-       {
-
-// To Fix 8723A SW ANT DIV Bug issue
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-               if (pDM_Odm->SupportICType & ODM_RTL8723A)
-               {
-                       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt;
-                       curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt;
-                       pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-                       pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-               }
-#else  
-               curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
-               curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
-               pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
-               pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
-#endif 
-               if(pDM_SWAT_Table->try_flag == 1)
-               {
-                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                       {
-                               pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
-                               pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
-                               pDM_SWAT_Table->RXByteCnt_B += curRxOkCnt;
-                       }
-               
-                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
-                       pDM_SWAT_Table->RSSI_Trying--;
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
-                       if(pDM_SWAT_Table->RSSI_Trying == 0)
-                       {
-                               CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A) : (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B);
-                               PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B) : (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A);
-                               
-                               if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
-                                       PreByteCnt = PreByteCnt*9;
-                               else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
-                                       PreByteCnt = PreByteCnt*2;
-
-                               if(pDM_SWAT_Table->RSSI_cnt_A > 0)
-                                       RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A; 
-                               else
-                                       RSSI_A = 0;
-                               if(pDM_SWAT_Table->RSSI_cnt_B > 0)
-                                       RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B; 
-                               else
-                                       RSSI_B = 0;
-                               curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
-                               pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n", 
-                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
-                                       RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
-                       }
-
-               }
-               else
-               {
-               
-                       if(pDM_SWAT_Table->RSSI_cnt_A > 0)
-                               RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A; 
-                       else
-                               RSSI_A = 0;
-                       if(pDM_SWAT_Table->RSSI_cnt_B > 0)
-                               RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B; 
-                       else
-                               RSSI_B = 0;
-                       curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
-                       pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n", 
-                       (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
-                               RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
-               }
-
-               //1 Trying State
-               if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
-               {
-
-                       if(pDM_SWAT_Table->TestMode == TP_MODE)
-                       {
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\n",PreByteCnt));          
-                               if(CurByteCnt < PreByteCnt)
-                               {
-                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
-                                       else
-                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
-                               }
-                               else
-                               {
-                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
-                                       else
-                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
-                               }
-                               for (i= 0; i<8; i++)
-                               {
-                                       if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
-                                               Score_A++;
-                                       else
-                                               Score_B++;
-                               }
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Score_A=%d, Score_B=%d\n", Score_A, Score_B));
-                       
-                               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                               {
-                                       nextAntenna = (Score_A > Score_B)?MAIN_ANT:AUX_ANT;
-                               }
-                               else
-                               {
-                                       nextAntenna = (Score_B > Score_A)?AUX_ANT:MAIN_ANT;
-                               }
-                               //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
-                               //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n", 
-                               //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
-
-                               if(nextAntenna != pDM_SWAT_Table->CurAntenna)
-                               {
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
-                               }
-                               else
-                               {
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
-                               }       
-                       }
-
-                       if(pDM_SWAT_Table->TestMode == RSSI_MODE)
-                       {       
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
-                               pDM_SWAT_Table->SelectAntennaMap=0xAA;
-                               if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
-                               {
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
-                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
-                               }
-                               else // current anntena is good
-                               {
-                                       nextAntenna =pDM_SWAT_Table->CurAntenna;
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
-                               }
-                       }
-                       pDM_SWAT_Table->try_flag = 0;
-                       pDM_Odm->RSSI_test = FALSE;
-                       pDM_SWAT_Table->RSSI_sum_A = 0;
-                       pDM_SWAT_Table->RSSI_cnt_A = 0;
-                       pDM_SWAT_Table->RSSI_sum_B = 0;
-                       pDM_SWAT_Table->RSSI_cnt_B = 0;
-                       pDM_SWAT_Table->TXByteCnt_A = 0;
-                       pDM_SWAT_Table->TXByteCnt_B = 0;
-                       pDM_SWAT_Table->RXByteCnt_A = 0;
-                       pDM_SWAT_Table->RXByteCnt_B = 0;
-                       
-               }
-
-               //1 Normal State
-               else if(pDM_SWAT_Table->try_flag == 0)
-               {
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                       {
-                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
-                               else
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
-                       }
-                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                               {
-                               if ((curTxOkCnt+curRxOkCnt) > 3750000) //if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
-                               else
-                                       pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
-                       }
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                               pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
-
-                       //Prepare To Try Antenna                
-                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
-                                       pDM_SWAT_Table->try_flag = 1;
-                                       pDM_Odm->RSSI_test = TRUE;
-                       if((curRxOkCnt+curTxOkCnt) > 1000)
-                       {
-                               pDM_SWAT_Table->RSSI_Trying = 4;
-                               pDM_SWAT_Table->TestMode = TP_MODE;
-                               }
-                               else
-                               {
-                               pDM_SWAT_Table->RSSI_Trying = 2;
-                               pDM_SWAT_Table->TestMode = RSSI_MODE;
-
-                       }
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
-                       
-                       
-                       pDM_SWAT_Table->RSSI_sum_A = 0;
-                       pDM_SWAT_Table->RSSI_cnt_A = 0;
-                       pDM_SWAT_Table->RSSI_sum_B = 0;
-                       pDM_SWAT_Table->RSSI_cnt_B = 0;
-               }
-       }
-
-       //1 4.Change TRX antenna
-       if(nextAntenna != pDM_SWAT_Table->CurAntenna)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
-               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);           
-               #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)                    
-               ODM_SetAntenna(pDM_Odm,nextAntenna);            
-               #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-               {
-                       BOOLEAN bEnqueue;                       
-                       bEnqueue = (pDM_Odm->SupportInterface ==  ODM_ITRF_PCIE)?FALSE :TRUE;                   
-                       rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
-               }
-               #endif
-               
-       }
-
-       //1 5.Reset Statistics
-       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-       pDM_SWAT_Table->CurAntenna = nextAntenna;
-       pDM_SWAT_Table->PreRSSI = curRSSI;
-
-       //1 6.Set next timer
-       {
-               //PADAPTER              pAdapter = pDM_Odm->Adapter;
-               //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
-       
-
-       if(pDM_SWAT_Table->RSSI_Trying == 0)
-               return;
-
-       if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
-       {
-               if(pDM_SWAT_Table->TestMode == TP_MODE)
-               {
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                       {
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
-                               
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
-                       }
-                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                       {
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
-                       }
-               }
-               else
-               {
-                       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
-               }
-       }
-       else
-       {
-               if(pDM_SWAT_Table->TestMode == TP_MODE)
-               {
-                       if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
-                       else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
-                               ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
-               }
-               else
-                       ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms 
-       }
-       }
-#endif // #if (DM_ODM_SUPPORT_TYPE  & (ODM_WIN|ODM_CE))
-#endif // #if (RTL8192C_SUPPORT==1) 
-}
-
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-u1Byte
-odm_SwAntDivSelectScanChnl(
-       IN      PADAPTER        Adapter
-       )
-{
-#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
-       PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(Adapter);
-       PMGNT_INFO                      pMgntInfo = &(Adapter->MgntInfo);
-       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;
-       u1Byte                          i, j, ScanChannel = 0, ChannelNum = 0;
-       PRT_CHANNEL_LIST        pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
-       u1Byte                          EachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};
-
-       if(pMgntInfo->tmpNumBssDesc == 0)
-               return 0;
-
-       for(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)
-       {               
-               ChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;
-               for(j = 0; j < pChannelList->ChannelLen; j++)
-               {
-                       if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
-                       {
-                               EachChannelSTAs[j]++;
-                               break;
-                       }
-               }
-       }
-       
-       for(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)
-               {
-               if(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])
-                       ScanChannel = i;
-               }
-
-       if(EachChannelSTAs[ScanChannel] == 0)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("odm_SwAntDivSelectScanChnl(): Scan List is empty.\n"));
-               return 0;
-       }
-       
-       ScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;
-
-       
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, 
-               ("odm_SwAntDivSelectScanChnl(): Channel %d is select as scan channel.\n", ScanChannel));
-
-       return ScanChannel;
-#else
-       return  0;
-#endif 
-}
-
-
-VOID
-odm_SwAntDivConstructScanChnl(
-       IN      PADAPTER        Adapter,
-       IN      u1Byte          ScanChnl
-       )
-{
-
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-
-       if(ScanChnl == 0)
-       {
-               u1Byte                          i;              
-               PRT_CHANNEL_LIST        pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
-       
-               // 20100519 Joseph: Original antenna scanned nothing. 
-               // Test antenna shall scan all channel with half period in this condition.
-               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
-               for(i = 0; i < pChannelList->ChannelLen; i++)
-                       pChannelList->ChnlListEntry[i].ScanPeriod /= 2;
-       }
-       else
-       {
-               // The using of this CustomizedScanRequest is a trick to rescan the two channels 
-               //      under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
-               CUSTOMIZED_SCAN_REQUEST CustomScanReq;
-
-               CustomScanReq.bEnabled = TRUE;
-               CustomScanReq.Channels[0] = ScanChnl;
-               CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
-               CustomScanReq.nChannels = 2;
-               CustomScanReq.ScanType = SCAN_ACTIVE;
-               CustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;
-
-               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
-       }
-
-}
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-//
-// 20100514 Luke/Joseph:
-// Callback function for 500ms antenna test trying.
-//
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID
-odm_SwAntDivChkAntSwitchCallback(
-       PRT_TIMER               pTimer
-)
-{
-       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       pSWAT_T         pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
-
-       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
-       #if USE_WORKITEM
-       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
-       #else
-       odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
-       #endif
-       #else
-       ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
-       #endif
-       
-}
-VOID
-odm_SwAntDivChkAntSwitchWorkitemCallback(
-    IN PVOID            pContext
-    )
-{
-
-       PADAPTER                pAdapter = (PADAPTER)pContext;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-
-       odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
-
-}
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
-{
-       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;
-       PADAPTER        padapter = pDM_Odm->Adapter;
-       if(padapter->net_closed == _TRUE)
-           return;
-       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE); 
-}
-#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
-{
-       PDM_ODM_T       pDM_Odm= (PDM_ODM_T)FunctionContext;
-       odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
-}
-#endif
-
-#else //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-
-VOID odm_SwAntDivInit( IN              PDM_ODM_T               pDM_Odm ) {}
-VOID ODM_SwAntDivChkPerPktRssi(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u1Byte               StationID,
-       IN PODM_PHY_INFO_T pPhyInfo
-       ) {}
-VOID odm_SwAntDivChkAntSwitch(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  Step
-       ) {}
-VOID ODM_SwAntDivResetBeforeLink(      IN              PDM_ODM_T               pDM_Odm ){}
-VOID ODM_SwAntDivRestAfterLink(        IN              PDM_ODM_T               pDM_Odm ){}
-VOID odm_SwAntDetectInit(      IN              PDM_ODM_T               pDM_Odm){}
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID odm_SwAntDivChkAntSwitchCallback( PRT_TIMER               pTimer){}
-VOID odm_SwAntDivChkAntSwitchWorkitemCallback(    IN PVOID            pContext    ){}
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
-#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
-#endif
-
-#endif //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
-
-
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-BOOLEAN
-ODM_SwAntDivCheckBeforeLink(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
-
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(Adapter);
-       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
-       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;
-       s1Byte                  Score = 0;
-       PRT_WLAN_BSS    pTmpBssDesc, pTestBssDesc;
-       s4Byte                  power_diff = 0, power_target = 10;
-       u1Byte                  index, counter = 0;
-       static u1Byte           ScanChannel;
-       u8Byte                  tStamp_diff = 0;                
-
-
-       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413
-       {       // The ODM structure is not initialized.
-               return FALSE;
-       }
-
-       // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
-       if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))
-                       return FALSE;
-
-       // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
-       PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
-       if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
-       {
-               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
-       
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                               ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n", 
-                               pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));
-       
-               pDM_SWAT_Table->SWAS_NoLink_State = 0;
-               
-               return FALSE;
-       }
-       else
-       {
-               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("pDM_SWAT_Table->SWAS_NoLink_State = %d\n", pDM_SWAT_Table->SWAS_NoLink_State));
-       //1 Run AntDiv mechanism "Before Link" part.
-       if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
-       {
-               //1 Prepare to do Scan again to check current antenna state.
-
-               // Set check state to next step.
-               pDM_SWAT_Table->SWAS_NoLink_State = 1;
-       
-               // Copy Current Scan list.
-               pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;
-               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
-               
-               // Go back to scan function again.
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));
-               pMgntInfo->ScanStep=0;
-               pMgntInfo->bScanAntDetect = TRUE;
-               ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);
-
-               
-               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
-               {
-                       if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
-                               ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
-                       else
-                               ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
-                       if(ScanChannel == 0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                                       ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
-
-                               if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
-                               {
-                                       pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
-                               }
-                               else
-                               {
-                                       pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
-                               }
-                               return FALSE;
-                       }
-
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                               ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
-               }
-               else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))
-               {
-                       // Switch Antenna to another one.
-                       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-                       pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;
-                       
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                               ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
-                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
-                       if(pDM_Odm->SupportICType == ODM_RTL8192C)
-                       {
-                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
-                               ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
-                       }
-                       else if(pDM_Odm->SupportICType == ODM_RTL8723B)
-                       {
-                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
-                               ODM_SetBBReg(pDM_Odm,  rfe_ctrl_anta_src, 0xff, 0x77);
-                               ODM_SetBBReg(pDM_Odm,  rDPDT_control, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
-                       }
-               }
-               
-               odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
-               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
-
-               return TRUE;
-       }
-       else
-       {
-               //1 ScanComple() is called after antenna swiched.
-               //1 Check scan result and determine which antenna is going
-               //1 to be used.
-
-               for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)
-               {
-                       pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1
-                       pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2
-
-                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));
-                               continue;
-                       }
-
-                       if(pDM_Odm->SupportICType != ODM_RTL8723B)
-                       {
-                               if(pTmpBssDesc->ChannelNumber == ScanChannel)
-                               {
-                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
-                       {
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));
-                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                       
-                               Score++;
-                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
-                       }
-                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
-                       {
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));
-                                               RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                               Score--;
-                       }
-                                       else
-                                       {
-                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)
-                                               {
-                                                       RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
-                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));
-                                               }
-                                       }
-                               }
-                       }
-                       else
-                       { 
-                               if(pTmpBssDesc->ChannelNumber == ScanChannel)
-                               {
-                                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
-                                       {
-                                               counter++;
-                                               power_diff = power_diff + (pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower); 
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
-                                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
-                                       }
-                                       else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower)
-                                       {
-                                               counter++;
-                                               power_diff = power_diff + (pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
-                                               ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
-                                       }
-                                       else if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp)
-                                       {
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
-                                               if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)
-                                               {
-                                                       counter++;
-                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
-                                                       ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               if(pDM_Odm->SupportICType == ODM_RTL8723B)
-               { 
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: %d power_diff: %d\n", counter, power_diff));
-
-                       if(counter != 0)
-                               power_diff = power_diff / counter;
-
-                       if(power_diff <= power_target && counter != 0) 
-                               Score++;
-               }
-
-               if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
-               {
-                       if(pMgntInfo->NumBssDesc!=0 && Score<0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
-                                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
-                       }
-                       else
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                                               ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
-
-                               if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
-                                       ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
-                               else
-                                       ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
-                       }
-                       
-                       if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
-                       {
-                               pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
-                       }
-               }
-               else if(pDM_Odm->SupportICType == ODM_RTL8723B)
-               {
-                       pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
-                       pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
-                       ODM_SetBBReg(pDM_Odm,  rfe_ctrl_anta_src, 0xff, 0x77);
-                       ODM_SetBBReg(pDM_Odm,  rDPDT_control,bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
-
-                       if(counter != 0)
-                       {
-                               if(pMgntInfo->NumBssDesc != 0 && Score > 0)
-                               {
-                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
-                                       {
-                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
-                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
-                               }
-                               else
-                               {
-                                       if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
-                                       {
-                                               pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
-                                               pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
-                                               BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);
-                                       }
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
-                               }
-                       }
-                       else
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Igone result\n"));
-               }
-               else if(pDM_Odm->SupportICType == ODM_RTL8192C)
-               {
-                       if(pMgntInfo->NumBssDesc!=0 && Score<=0)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
-                                       ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
-
-                               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-                       }
-                       else
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, 
-                                       ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));
-
-                               pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
-
-                               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
-                               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
-                               PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
-                       }
-               }
-               
-               // Check state reset to default and wait for next time.
-               pDM_SWAT_Table->SWAS_NoLink_State = 0;
-               pMgntInfo->bScanAntDetect = FALSE;
-
-               return FALSE;
-       }
-
-#else
-               return  FALSE;
-#endif
-
-return FALSE;
-}
-
-#endif //#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-
-
-//3============================================================
-//3 SW Antenna Diversity
-//3============================================================
-
-#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-VOID
-odm_InitHybridAntDiv_88C_92D(
-       IN PDM_ODM_T    pDM_Odm 
-       )
-{
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-#endif
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       u1Byte                  bTxPathSel=0;           //0:Path-A   1:Path-B
-       u1Byte                  i;
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
-
-       //whether to do antenna diversity or not
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if(priv==NULL)  return;
-       if(!priv->pshare->rf_ft_var.antHw_enable)
-               return; 
-       
-       #ifdef SW_ANT_SWITCH
-       priv->pshare->rf_ft_var.antSw_enable =0;
-       #endif
-#endif
-
-       if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
-               return;
-
-
-       bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?FALSE:TRUE;
-
-       ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
-       ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
-       // check HW setting: ANTSEL pin connection
-       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       ODM_Write2Byte(pDM_Odm,ODM_REG_RF_PIN_11N, (ODM_Read2Byte(pDM_Odm,0x804)&0xf0ff )| BIT(8) );    // b11-b8=0001,update RFPin setting
-       #endif
-       
-       // only AP support different path selection temperarly
-       if(!bTxPathSel){                 //PATH-A
-               ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
-               ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1);         //select TX ANTESEL from path A
-       }
-       else    {
-               ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
-               ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0);                 //select ANTESEL from path B
-       }
-
-       //Set OFDM HW RX Antenna Diversity
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
-       ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1);       // Decide final antenna by comparing 2 antennas' pwdb
-       
-       //Set CCK HW RX Antenna Diversity
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
-
-
-       //Enable HW Antenna Diversity
-       if(!bTxPathSel)                 //PATH-A
-               ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1);        // Enable Hardware antenna switch
-       else
-               ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1);        // Enable Hardware antenna switch
-       ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
-
-       pDM_SWAT_Table->CurAntenna=0;                   //choose left antenna as default antenna
-       pDM_SWAT_Table->PreAntenna=0;
-       for(i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
-       {
-               pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
-               pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
-               pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
-               pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
-               pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
-               pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
-       }
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
-}
-
-
-VOID
-odm_InitHybridAntDiv(
-       IN PDM_ODM_T    pDM_Odm 
-       )
-{
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
-               return;
-       }
-       
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
-       {
-#if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
-               odm_InitHybridAntDiv_88C_92D(pDM_Odm);
-#endif
-       }
-}
-
-
-BOOLEAN
-odm_StaDefAntSel(
-       IN PDM_ODM_T    pDM_Odm,
-       IN u4Byte               OFDM_Ant1_Cnt,
-       IN u4Byte               OFDM_Ant2_Cnt,
-       IN u4Byte               CCK_Ant1_Cnt,
-       IN u4Byte               CCK_Ant2_Cnt,
-       OUT u1Byte              *pDefAnt 
-
-       )
-{
-#if 1
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("OFDM_Ant1_Cnt:%d, OFDM_Ant2_Cnt:%d\n",OFDM_Ant1_Cnt,OFDM_Ant2_Cnt));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("CCK_Ant1_Cnt:%d, CCK_Ant2_Cnt:%d\n",CCK_Ant1_Cnt,CCK_Ant2_Cnt));
-
-       
-       if(((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)){
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
-               return  FALSE;
-       }
-
-       if(OFDM_Ant1_Cnt || OFDM_Ant2_Cnt )     {
-               //if RX OFDM packet number larger than 0
-               if(OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
-                       (*pDefAnt)=1;
-               else
-                       (*pDefAnt)=0;
-       }
-       // else if RX CCK packet number larger than 10
-       else if((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
-       {
-               if(CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
-                       (*pDefAnt)=1;
-               else if(CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
-                       (*pDefAnt)=0;
-               else if(CCK_Ant1_Cnt > CCK_Ant2_Cnt)
-                       (*pDefAnt)=0;
-               else
-                       (*pDefAnt)=1;
-
-       }
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
-       
-#endif
-       //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
-       //(*pDefAnt)= (u1Byte) antsel;
-       
-
-
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
-
-       return TRUE;
-
-       
-}
-
-
-VOID
-odm_SetRxIdleAnt(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte  Ant,
-       IN   BOOLEAN   bDualPath                     
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
-
-       if(Ant != pDM_SWAT_Table->RxIdleAnt)
-       {
-       //for path-A
-       if(Ant==1) 
-                       ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9);   //right-side antenna
-       else
-                       ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a);   //left-side antenna
-
-       //for path-B
-       if(bDualPath){
-               if(Ant==0) 
-                               ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9);   //right-side antenna
-               else 
-                               ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a);  //left-side antenna
-               }
-       }
-               pDM_SWAT_Table->RxIdleAnt = Ant;
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("RxIdleAnt: %s  Reg858=0x%x\n",(Ant==1)?"Ant1":"Ant2",(Ant==1)?0x65a9:0x569a));
-
-       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
-
-       }
-               
-VOID
-ODM_AntselStatistics_88C(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  MacId,
-       IN              u4Byte                  PWDBAll,
-       IN              BOOLEAN                 isCCKrate
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       if(pDM_SWAT_Table->antsel == 1)
-       {
-               if(isCCKrate)
-                       pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
-               else
-               {
-                       pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
-                       pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
-               }
-       }
-       else
-       {
-               if(isCCKrate)
-                       pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
-               else
-               {
-                       pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
-                       pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
-               }
-       }
-
-}
-
-
-
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              pu1Byte                 pDesc,
-       IN              u1Byte                  macId   
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       u1Byte                  antsel;
-
-       if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) 
-               return;
-
-       if(pDM_SWAT_Table->RxIdleAnt == 1)
-               antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?0:1;
-       else
-               antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?1:0;
-       
-       SET_TX_DESC_ANTSEL_A_92C(pDesc, antsel);
-       //SET_TX_DESC_ANTSEL_B_92C(pDesc, antsel);
-       //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("SET_TX_DESC_ANTSEL_A_92C=%d\n", pDM_SWAT_Table->TxAnt[macId]));
-}
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID
-ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-
-}
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-VOID
-ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm
-)
-{
-
-}
-#endif
-
-VOID
-odm_HwAntDiv_92C_92D(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       SWAT_T                  *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       u4Byte                  RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
-       u1Byte                  RxIdleAnt, i;
-       BOOLEAN         bRet=FALSE;
-       PSTA_INFO_T     pEntry;
-       
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-       //if test, return
-       if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
-               return; 
-#endif 
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
-       
-       if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))                                    //if don't support antenna diveristy
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
-               return;
-       }
-
-       if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
-               return;
-       }
-       
-#if (DM_ODM_SUPPORT_TYPE&(ODM_WIN|ODM_CE))
-       if(!pDM_Odm->bLinked)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is FALSE\n"));
-               return;
-       }
-#endif
-
-       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
-       {
-               pEntry = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pEntry))
-               {
-
-                       RSSI_Ant1 = (pDM_SWAT_Table->OFDM_Ant1_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant1_Sum[i]/pDM_SWAT_Table->OFDM_Ant1_Cnt[i]);
-                       RSSI_Ant2 = (pDM_SWAT_Table->OFDM_Ant2_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant2_Sum[i]/pDM_SWAT_Table->OFDM_Ant2_Cnt[i]);
-
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d,  RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
-               
-                       if(RSSI_Ant1 ||RSSI_Ant2) 
-                       {
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)              
-                               if(pDM_Odm->pODM_StaInfo[i]->expire_to)
-#endif
-                               {
-                                       RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
-                                       if((!RSSI) || ( RSSI < RSSI_Min) ) {
-                                               pDM_SWAT_Table->TargetSTA = i;
-                                               RSSI_Min = RSSI;
-                                       }
-                               }
-       }
-                       ///STA: found out default antenna
-                       bRet=odm_StaDefAntSel(pDM_Odm, 
-                                                pDM_SWAT_Table->OFDM_Ant1_Cnt[i], 
-                                                pDM_SWAT_Table->OFDM_Ant2_Cnt[i], 
-                                                pDM_SWAT_Table->CCK_Ant1_Cnt[i], 
-                                                pDM_SWAT_Table->CCK_Ant2_Cnt[i], 
-                                                &pDM_SWAT_Table->TxAnt[i]);
-
-                       //if Tx antenna selection: successful
-                       if(bRet){       
-                               pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
-                               pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
-                               pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
-                               pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0; 
-                               pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0; 
-                               pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0; 
-                       }
-               }
-       }
-       
-       //set RX Idle Ant
-       RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
-       odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, FALSE);
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-#ifdef TX_SHORTCUT
-       if (!priv->pmib->dot11OperationEntry.disable_txsc) {
-               plist = phead->next;
-               while(plist != phead)   {
-                       pstat = list_entry(plist, struct stat_info, asoc_list);
-                       if(pstat->expire_to) {
-                               for (i=0; i<TX_SC_ENTRY_NUM; i++) {
-                                       struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
-                                       pdesc= &(pstat->tx_sc_ent[i].hwdesc2);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));                                     
-                               }
-                       }               
-
-                       if (plist == plist->next)
-                               break;
-                       plist = plist->next;
-               };
-       }
-#endif 
-#endif
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
-       
-}
-
-VOID
-odm_HwAntDiv(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{      
-
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       if(pAdapter->MgntInfo.AntennaTest)
-               return;
-#endif
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
-               return;
-       }
-       
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
-       {
-#if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
-               odm_HwAntDiv_92C_92D(pDM_Odm);
-#endif
-       }
-}
-
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-#if 0
-VOID
-odm_HwAntDiv(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-       struct stat_info        *pstat, *pstat_min=NULL;
-       struct list_head        *phead, *plist;
-       int rssi_min= 0xff, i;
-       u1Byte  idleAnt=priv->pshare->rf_ft_var.CurAntenna;     
-       u1Byte  nextAnt;
-       BOOLEAN         bRet=FALSE;
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
-
-       if((!priv->pshare->rf_ft_var.antHw_enable) ||(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)))
-               return;
-       
-       //if test, return
-       if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
-               return;
-       
-       phead = &priv->asoc_list;
-       plist = phead->next;
-       ////=========================
-       //find mimum rssi sta
-       ////=========================
-       while(plist != phead)   {
-               pstat = list_entry(plist, struct stat_info, asoc_list);
-               if((pstat->expire_to) && (pstat->AntRSSI[0] || pstat->AntRSSI[1])) {
-                       int rssi = (pstat->AntRSSI[0] < pstat->AntRSSI[1]) ? pstat->AntRSSI[0] : pstat->AntRSSI[1];
-                       if((!pstat_min) || ( rssi < rssi_min) ) {
-                               pstat_min = pstat;
-                               rssi_min = rssi;
-                       }
-               }
-               ///STA: found out default antenna
-               bRet=odm_StaDefAntSel(pDM_Odm,
-                                               pstat->hwRxAntSel[1],
-                                               pstat->hwRxAntSel[0],
-                                               pstat->cckPktCount[1],
-                                               pstat->cckPktCount[0],
-                                               &nextAnt
-                                               );
-               
-               //if default antenna selection: successful
-               if(bRet){       
-                       pstat->CurAntenna = nextAnt;
-                       //update rssi
-                       for(i=0; i<2; i++) {
-                               if(pstat->cckPktCount[i]==0 && pstat->hwRxAntSel[i]==0)
-                                       pstat->AntRSSI[i] = 0;
-                       }
-                       if(pstat->AntRSSI[idleAnt]==0)
-                               pstat->AntRSSI[idleAnt] = pstat->AntRSSI[idleAnt^1];
-                       // reset variables
-                       pstat->hwRxAntSel[1] = pstat->hwRxAntSel[0] =0;
-                       pstat->cckPktCount[1]= pstat->cckPktCount[0] =0;
-               }
-
-               if (plist == plist->next)
-                       break;
-               plist = plist->next;
-               
-       };
-       ////=========================
-       //Choose  RX Idle antenna according to minmum rssi
-       ////=========================
-       if(pstat_min)   {
-               if(priv->pshare->rf_ft_var.CurAntenna!=pstat_min->CurAntenna)
-                       odm_SetRxIdleAnt(pDM_Odm,pstat_min->CurAntenna,TRUE);
-               priv->pshare->rf_ft_var.CurAntenna = pstat_min->CurAntenna;
-       }
-
-
-#ifdef TX_SHORTCUT
-       if (!priv->pmib->dot11OperationEntry.disable_txsc) {
-               plist = phead->next;
-               while(plist != phead)   {
-                       pstat = list_entry(plist, struct stat_info, asoc_list);
-                       if(pstat->expire_to) {
-                               for (i=0; i<TX_SC_ENTRY_NUM; i++) {
-                                       struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
-                                       pdesc= &(pstat->tx_sc_ent[i].hwdesc2);  
-                                       pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
-                                       if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
-                                               pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));                                     
-                               }
-                       }               
-
-                       if (plist == plist->next)
-                               break;
-                       plist = plist->next;
-               };
-       }
-#endif 
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,"<==============odm_HwAntDiv\n");
-}
-#endif
-
-u1Byte
-ODM_Diversity_AntennaSelect(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN      u1Byte  *data
-)
-{
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-
-       int ant = _atoi(data, 16);
-
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ODM_Diversity_AntennaSelect==============>\n"));
-
-       #ifdef PCIE_POWER_SAVING
-       PCIeWakeUp(priv, POWER_DOWN_T0);
-       #endif
-
-       if (ant==AUX_ANT || ant==MAIN_ANT) 
-       {
-               if ( !priv->pshare->rf_ft_var.antSw_select) {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(8)| BIT(9) );  //  ANTSEL A as SW control
-                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7)));       // rx OFDM SW control
-                       PHY_SetBBReg(priv, 0x860, 0x300, ant);
-               } else {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(24)| BIT(25) ); // ANTSEL B as HW control
-                       PHY_SetBBReg(priv, 0x864, 0x300, ant);
-                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7)));               // rx OFDM SW control
-               }
-
-               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7)));       // rx CCK SW control
-               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
-               ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
-
-               priv->pshare->rf_ft_var.antHw_enable = 0;
-               priv->pshare->rf_ft_var.CurAntenna  = (ant%2);
-
-               #ifdef SW_ANT_SWITCH
-               priv->pshare->rf_ft_var.antSw_enable = 0;
-               priv->pshare->DM_SWAT_Table.CurAntenna = ant;
-               priv->pshare->RSSI_test =0;
-               #endif
-       }
-       else if(ant==0){
-
-               if ( !priv->pshare->rf_ft_var.antSw_select)  {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(8)| BIT(9)) );
-                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) | BIT(7));   // OFDM HW control
-               } else {
-                       ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(24)| BIT(25)) );
-                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) | BIT(7));   // OFDM HW control
-               }
-
-               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) | BIT(7));   // CCK HW control
-               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) | BIT(21) ); // by tx desc
-               priv->pshare->rf_ft_var.CurAntenna = 0;
-               ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
-               priv->pshare->rf_ft_var.antHw_enable = 1;
-#ifdef SW_ANT_SWITCH
-               priv->pshare->rf_ft_var.antSw_enable = 0;
-               priv->pshare->RSSI_test =0;
-#endif
-       }
-#ifdef SW_ANT_SWITCH
-       else if(ant==3) {
-               if(!priv->pshare->rf_ft_var.antSw_enable) {
-                       
-                       dm_SW_AntennaSwitchInit(priv);
-                       ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
-                       priv->pshare->lastTxOkCnt = priv->net_stats.tx_bytes;
-                       priv->pshare->lastRxOkCnt = priv->net_stats.rx_bytes;
-               }
-               if ( !priv->pshare->rf_ft_var.antSw_select)
-                       ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7)));       // rx OFDM SW control
-               else
-                       ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7)));       // rx OFDM SW control
-
-               ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7)));               // rx CCK SW control
-               ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21)));      // select ant by tx desc
-               priv->pshare->rf_ft_var.antHw_enable = 0;
-               priv->pshare->rf_ft_var.antSw_enable = 1;
-
-       }
-#endif
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============ODM_Diversity_AntennaSelect\n"));
-
-       return 1;
-}
-#endif
-
-#else //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-
-VOID odm_InitHybridAntDiv(     IN PDM_ODM_T    pDM_Odm         ){}
-VOID odm_HwAntDiv(     IN      PDM_ODM_T       pDM_Odm){}
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID ODM_SetTxAntByTxInfo_88C_92D(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              pu1Byte                 pDesc,
-       IN              u1Byte                  macId   
-){}
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID ODM_SetTxAntByTxInfo_88C_92D(     IN              PDM_ODM_T               pDM_Odm){ }
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-VOID ODM_SetTxAntByTxInfo_88C_92D(     IN              PDM_ODM_T               pDM_Odm){ }
-#endif
-
-#endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
-
-
-
-//============================================================
-//EDCA Turbo
-//============================================================
-VOID
-ODM_EdcaTurboInit(
-       IN    PDM_ODM_T         pDM_Odm)
-{
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-       odm_EdcaParaInit(pDM_Odm);
-#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PADAPTER        Adapter = NULL;
-       HAL_DATA_TYPE   *pHalData = NULL;
-
-       if(pDM_Odm->Adapter==NULL)      {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
-               return;
-       }
-
-       Adapter=pDM_Odm->Adapter;
-       pHalData=GET_HAL_DATA(Adapter);
-
-       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       
-       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
-       pHalData->bIsAnyNonBEPkts = FALSE;
-       
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       PADAPTER        Adapter = pDM_Odm->Adapter;     
-       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       
-       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
-       Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
-
-#endif 
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));
-
-       
-}      // ODM_InitEdcaTurbo
-
-VOID
-odm_EdcaTurboCheck(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-       // 
-       // For AP/ADSL use prtl8192cd_priv
-       // For CE/NIC use PADAPTER
-       //
-
-       //
-       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
-       // at the same time. In the stage2/3, we need to prive universal interface and merge all
-       // HW dynamic mechanism.
-       //
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
-
-       if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
-               return;
-
-       switch  (pDM_Odm->SupportPlatform)
-       {
-               case    ODM_WIN:
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-                       odm_EdcaTurboCheckMP(pDM_Odm);
-#endif
-                       break;
-
-               case    ODM_CE:
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-                       odm_EdcaTurboCheckCE(pDM_Odm);
-#endif
-                       break;
-
-               case    ODM_AP:
-               case    ODM_ADSL:
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-               odm_IotEngine(pDM_Odm);
-#endif
-                       break;  
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
-
-}      // odm_CheckEdcaTurbo
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-
-VOID
-odm_EdcaTurboCheckCE(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-       u32     EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];
-       u32     EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];
-       u32     ICType=pDM_Odm->SupportICType;
-       u32     IOTPeer=0;
-       u8      WirelessMode=0xFF;                   //invalid value
-       u32     trafficIndex;
-       u32     edca_param;
-       u64     cur_tx_bytes = 0;
-       u64     cur_rx_bytes = 0;
-       u8      bbtchange = _FALSE;
-       u8      bBiasOnRx = _FALSE;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       struct dvobj_priv               *pdvobjpriv = adapter_to_dvobj(Adapter);
-       struct xmit_priv                *pxmitpriv = &(Adapter->xmitpriv);
-       struct recv_priv                *precvpriv = &(Adapter->recvpriv);
-       struct registry_priv    *pregpriv = &Adapter->registrypriv;
-       struct mlme_ext_priv    *pmlmeext = &(Adapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-       if(pDM_Odm->bLinked != _TRUE)
-               goto dm_CheckEdcaTurbo_EXIT;
-
-       if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
-       {
-               goto dm_CheckEdcaTurbo_EXIT;
-       }
-
-       if(pDM_Odm->pWirelessMode!=NULL)
-               WirelessMode=*(pDM_Odm->pWirelessMode);
-
-       IOTPeer = pmlmeinfo->assoc_AP_vendor;
-
-       if (IOTPeer >=  HT_IOT_PEER_MAX)
-       {
-               goto dm_CheckEdcaTurbo_EXIT;
-       }
-
-       if(     (pDM_Odm->SupportICType == ODM_RTL8192C) ||
-               (pDM_Odm->SupportICType == ODM_RTL8723A) ||
-               (pDM_Odm->SupportICType == ODM_RTL8188E))
-       {
-               if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
-                       bBiasOnRx = _TRUE;
-       }
-
-       // Check if the status needs to be changed.
-       if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
-       {
-               cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
-               cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
-
-               //traffic, TX or RX
-               if(bBiasOnRx)
-               {
-                       if (cur_tx_bytes > (cur_rx_bytes << 2))
-                       { // Uplink TP is present.
-                               trafficIndex = UP_LINK; 
-                       }
-                       else
-                       { // Balance TP is present.
-                               trafficIndex = DOWN_LINK;
-                       }
-               }
-               else
-               {
-                       if (cur_rx_bytes > (cur_tx_bytes << 2))
-                       { // Downlink TP is present.
-                               trafficIndex = DOWN_LINK;
-                       }
-                       else
-                       { // Balance TP is present.
-                               trafficIndex = UP_LINK;
-                       }
-               }
-
-               //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
-               {
-                       if(ICType==ODM_RTL8192D)
-                       {      
-                               // Single PHY
-                               if(pDM_Odm->RFType==ODM_2T2R)
-                               {
-                                       EDCA_BE_UL = 0x60a42b;    //0x5ea42b;
-                                       EDCA_BE_DL = 0x60a42b;    //0x5ea42b;
-                               }
-                               else
-                               {
-                                       EDCA_BE_UL = 0x6ea42b;
-                                       EDCA_BE_DL = 0x6ea42b;
-                               }
-                       }
-                       else
-                       {
-                               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
-                                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
-                                               EDCA_BE_UL = 0x60a42b;
-                                               EDCA_BE_DL = 0x60a42b;
-                                       }
-                                       else
-                                       {
-                                               EDCA_BE_UL = 0x6ea42b;
-                                               EDCA_BE_DL = 0x6ea42b;
-                                       }
-                               }
-                       }
-               
-                       //92D txop can't be set to 0x3e for cisco1250
-                       if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-                       {
-                               EDCA_BE_DL = edca_setting_DL[IOTPeer];
-                               EDCA_BE_UL = edca_setting_UL[IOTPeer];
-                       }
-                       //merge from 92s_92c_merge temp brunch v2445    20120215 
-                       else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
-                       {
-                               EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
-                       }
-                       else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
-                       {
-                               EDCA_BE_DL = 0xa630;
-                       }
-                       else if(IOTPeer == HT_IOT_PEER_MARVELL)
-                       {
-                               EDCA_BE_DL = edca_setting_DL[IOTPeer];
-                               EDCA_BE_UL = edca_setting_UL[IOTPeer];
-                       }
-                       else if(IOTPeer == HT_IOT_PEER_ATHEROS)
-                       {
-                               // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. 
-                               EDCA_BE_DL = edca_setting_DL[IOTPeer];
-                       }
-
-                       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE
-                       {
-                               EDCA_BE_UL = 0x5ea42b;
-                               EDCA_BE_DL = 0x5ea42b;
-
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));
-                       }
-
-                       if (trafficIndex == DOWN_LINK)
-                               edca_param = EDCA_BE_DL;
-                       else
-                               edca_param = EDCA_BE_UL;
-
-                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
-
-                       pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
-               }
-               
-               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
-       }
-       else
-       {
-               //
-               // Turn Off EDCA turbo here.
-               // Restore original EDCA according to the declaration of AP.
-               //
-                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
-               {
-                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
-                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
-               }
-       }
-
-dm_CheckEdcaTurbo_EXIT:
-       // Set variables for next time.
-       precvpriv->bIsAnyNonBEPkts = _FALSE;
-#endif 
-}
-
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-odm_EdcaTurboCheckMP(
-       IN              PDM_ODM_T               pDM_Odm
-       )
-{
-
-
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-
-       PADAPTER                        pDefaultAdapter = GetDefaultAdapter(Adapter);
-       PADAPTER                        pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       PSTA_QOS                        pStaQos = Adapter->MgntInfo.pStaQos;
-       //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
-       u8Byte                          Ext_curTxOkCnt = 0;
-       u8Byte                          Ext_curRxOkCnt = 0;     
-       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.      
-       u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
-
-       // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
-       u8Byte                          curTxOkCnt = 0;
-       u8Byte                          curRxOkCnt = 0; 
-       u4Byte                          EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];
-       u4Byte                          EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];
-       u4Byte                         EDCA_BE = 0x5ea42b;
-       u1Byte                         IOTPeer=0;
-       BOOLEAN                      *pbIsCurRDLState=NULL;
-       BOOLEAN                      bLastIsCurRDLState=FALSE;
-       BOOLEAN                          bBiasOnRx=FALSE;
-       BOOLEAN                         bEdcaTurboOn=FALSE;
-       u1Byte                          TxRate = 0xFF;
-       u8Byte                          value64;        
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
-
-////===============================
-////list paramter for different platform
-////===============================
-       bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
-       pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);       
-
-       //2012/09/14 MH Add 
-       if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
-               pHalData->bIsAnyNonBEPkts = TRUE;
-
-       pMgntInfo->NumNonBePkt = 0;
-
-       // Caculate TX/RX TP:
-       //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
-       //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
-       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;
-       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;
-       pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-       pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-
-       if(pExtAdapter == NULL) 
-               pExtAdapter = pDefaultAdapter;
-
-       Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
-       Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
-       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
-       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
-       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
-       {
-               curTxOkCnt = Ext_curTxOkCnt ;
-               curRxOkCnt = Ext_curRxOkCnt ;
-       }
-       //
-       IOTPeer=pMgntInfo->IOTPeer;
-       bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
-       bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts) && (!pMgntInfo->bDisableFrameBursting))?TRUE:FALSE;
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx  bDisableFrameBursting : 0x%lx  \n",pHalData->bIsAnyNonBEPkts,pMgntInfo->bDisableFrameBursting));
-
-
-////===============================
-////check if edca turbo is disabled
-////===============================
-       if(odm_IsEdcaTurboDisable(pDM_Odm))
-               goto dm_CheckEdcaTurbo_EXIT;
-
-
-////===============================
-////remove iot case out
-////===============================
-       ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
-
-
-////===============================
-////Check if the status needs to be changed.
-////===============================
-       if(bEdcaTurboOn)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
-               if(bBiasOnRx)
-                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);
-               else
-                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);
-
-//modify by Guo.Mingzhi 2011-12-29
-                       EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
-                       if(IS_HARDWARE_TYPE_8821U(Adapter))
-                       {
-                               if(pMgntInfo->RegTxDutyEnable)
-                               {
-                                       //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
-                                       if(!pMgntInfo->ForcedDataRate) //auto rate
-                                       {
-                                               if(pDM_Odm->TxRate != 0xFF)
-                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); 
-                                       }
-                                       else //force rate
-                                       {
-                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
-                                       }
-
-                                       value64 = (curRxOkCnt<<2);
-                                       if(curTxOkCnt < value64) //Downlink
-                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                       else //Uplink
-                                       {
-                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
-                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
-                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
-                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                               else
-                                               {
-                                                       switch (TxRate)
-                                                       {
-                                                               case MGN_VHT1SS_MCS6:
-                                                               case MGN_VHT1SS_MCS5:
-                                                               case MGN_MCS6:
-                                                               case MGN_MCS5:
-                                                               case MGN_48M:
-                                                               case MGN_54M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS4:
-                                                               case MGN_MCS4:
-                                                               case MGN_36M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS3:
-                                                               case MGN_MCS3:
-                                                               case MGN_24M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS2:
-                                                               case MGN_MCS2:
-                                                               case MGN_18M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS1:
-                                                               case MGN_MCS1:
-                                                               case MGN_9M:
-                                                               case MGN_12M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
-                                                               break;
-                                                               case MGN_VHT1SS_MCS0:
-                                                               case MGN_MCS0:
-                                                               case MGN_6M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
-                                                               break;
-                                                               default:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                                               break;
-                                                       }
-                                               }
-                                       }                               
-                               }
-                               else
-                               {
-                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                               }
-
-                       }
-                       else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
-                               if(pMgntInfo->RegTxDutyEnable)
-                               {
-                                       //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
-                                       // it;s the same issue as 8811AU
-                                       if(!pMgntInfo->ForcedDataRate) //auto rate
-                                       {
-                                               if(pDM_Odm->TxRate != 0xFF)
-                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); 
-                                       }
-                                       else //force rate
-                                       {
-                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
-                                       }
-
-                                       value64 = (curRxOkCnt<<2);
-                                       if(curTxOkCnt < value64) //Downlink
-                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                       else //Uplink
-                                       {
-                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
-                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
-                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
-                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                               else
-                                               {
-                                                       switch (TxRate)
-                                                       {
-                                                               case MGN_VHT2SS_MCS9:
-                                                               case MGN_VHT1SS_MCS9:                                                                   
-                                                               case MGN_VHT1SS_MCS8:
-                                                               case MGN_MCS15:
-                                                               case MGN_MCS7:                                                                  
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     
-                                                               case MGN_VHT2SS_MCS8:
-                                                               case MGN_VHT1SS_MCS7:
-                                                               case MGN_MCS14:
-                                                               case MGN_MCS6:
-                                                               case MGN_54M:                                                                   
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
-                                                               case MGN_VHT2SS_MCS7:
-                                                               case MGN_VHT2SS_MCS6:
-                                                               case MGN_VHT1SS_MCS6:
-                                                               case MGN_VHT1SS_MCS5:
-                                                               case MGN_MCS13:
-                                                               case MGN_MCS5:
-                                                               case MGN_48M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
-                                                               break;
-                                                               case MGN_VHT2SS_MCS5:
-                                                               case MGN_VHT2SS_MCS4:
-                                                               case MGN_VHT1SS_MCS4:
-                                                               case MGN_VHT1SS_MCS3:   
-                                                               case MGN_MCS12:
-                                                               case MGN_MCS4:  
-                                                               case MGN_MCS3:  
-                                                               case MGN_36M:
-                                                               case MGN_24M:   
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
-                                                               break;
-                                                               case MGN_VHT2SS_MCS3:
-                                                               case MGN_VHT2SS_MCS2:
-                                                               case MGN_VHT2SS_MCS1:
-                                                               case MGN_VHT1SS_MCS2:
-                                                               case MGN_VHT1SS_MCS1:   
-                                                               case MGN_MCS11: 
-                                                               case MGN_MCS10: 
-                                                               case MGN_MCS9:          
-                                                               case MGN_MCS2:  
-                                                               case MGN_MCS1:
-                                                               case MGN_18M:   
-                                                               case MGN_12M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
-                                                               break;
-                                                               case MGN_VHT2SS_MCS0:
-                                                               case MGN_VHT1SS_MCS0:
-                                                               case MGN_MCS0:  
-                                                               case MGN_MCS8:
-                                                               case MGN_9M:    
-                                                               case MGN_6M:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
-                                                               break;
-                                                               default:
-                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                                                               break;
-                                                       }
-                                               }
-                                       }                               
-                               }
-                               else
-                               {
-                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-                               }
-                       }
-                       else
-                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
-
-               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
-               
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx  EDCA_BE_UL : 0x%lx  EDCA_BE : 0x%lx  \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));
-
-       }
-       else
-       {
-               // Turn Off EDCA turbo here.
-               // Restore original EDCA according to the declaration of AP.
-                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
-               {
-                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
-
-                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx  \n",pDM_Odm->WMMEDCA_BE));
-
-               }
-       }
-
-////===============================
-////Set variables for next time.
-////===============================
-dm_CheckEdcaTurbo_EXIT:
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       pHalData->bIsAnyNonBEPkts = FALSE;
-       pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-       pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-       pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
-       pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-       precvpriv->bIsAnyNonBEPkts = FALSE;
-       pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
-       precvpriv->last_rx_bytes = precvpriv->rx_bytes;
-#endif
-
-}
-
-
-//check if edca turbo is disabled
-BOOLEAN
-odm_IsEdcaTurboDisable(
-       IN      PDM_ODM_T       pDM_Odm
-)
-{
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       u4Byte                          IOTPeer=pMgntInfo->IOTPeer;
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-       struct registry_priv    *pregpriv = &Adapter->registrypriv;
-       struct mlme_ext_priv    *pmlmeext = &(Adapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       u4Byte                         IOTPeer=pmlmeinfo->assoc_AP_vendor;
-       u1Byte                         WirelessMode=0xFF;                   //invalid value
-
-       if(pDM_Odm->pWirelessMode!=NULL)
-               WirelessMode=*(pDM_Odm->pWirelessMode);
-
-#endif
-
-       if(pDM_Odm->bBtDisableEdcaTurbo)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
-               return TRUE;
-       }
-
-       if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
-               (pDM_Odm->bWIFITest)||
-               (IOTPeer>= HT_IOT_PEER_MAX))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
-               return TRUE;
-       }
-
-
-#if (DM_ODM_SUPPORT_TYPE ==ODM_WIN)
-       // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
-       // 2. User may disable EDCA Turbo mode with OID settings.
-       if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
-               return  TRUE;
-               }
-               
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       //suggested by Jr.Luke: open TXOP for B/G/BG/A mode 2012-0215
-       if((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)||(WirelessMode==ODM_WM_G)||(WirelessMode=ODM_WM_A))
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, ODM_Read4Byte(pDM_Odm, ODM_EDCA_BE_PARAM)|0x5E0000); 
-       
-       if(pDM_Odm->SupportICType==ODM_RTL8192D)                {
-               if ((pregpriv->wifi_spec == 1)  || (pmlmeext->cur_wireless_mode == WIRELESS_11B)) {
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("92D:EdcaTurboDisable\n"));
-                       return TRUE;
-               }
-       }       
-       else
-       {
-               if((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)){
-                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("Others:EdcaTurboDisable\n"));
-                       return TRUE;
-               }
-       }
-
-#endif
-
-       return  FALSE;
-       
-
-}
-
-//add iot case here: for MP/CE
-VOID 
-ODM_EdcaParaSelByIot(
-       IN      PDM_ODM_T       pDM_Odm,
-       OUT     u4Byte          *EDCA_BE_UL,
-       OUT u4Byte              *EDCA_BE_DL
-       )
-{
-
-       PADAPTER                       Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       u4Byte                         IOTPeer=0;
-       u4Byte                         ICType=pDM_Odm->SupportICType;
-       u1Byte                         WirelessMode=0xFF;                   //invalid value
-       u4Byte                          RFType=pDM_Odm->RFType;
-         u4Byte                         IOTPeerSubType=0;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
-       u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       #ifdef CONFIG_BT_COEXIST
-       struct btcoexist_priv   *pbtpriv = &(pHalData->bt_coexist);     
-       #endif
-       u1Byte bbtchange =FALSE;
-#endif
-
-       if(pDM_Odm->pWirelessMode!=NULL)
-               WirelessMode=*(pDM_Odm->pWirelessMode);
-               
-///////////////////////////////////////////////////////////
-////list paramter for different platform
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)     
-       IOTPeer=pMgntInfo->IOTPeer;
-       IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
-       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
-       IOTPeer=pmlmeinfo->assoc_AP_vendor;
-       #ifdef CONFIG_BT_COEXIST
-       if(pbtpriv->BT_Coexist)
-       {
-               if( (pbtpriv->BT_EDCA[UP_LINK]!=0) ||  (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
-                       bbtchange = TRUE;               
-       }
-       #endif
-
-#endif
-
-       if(ICType==ODM_RTL8192D)
-       {      
-               // Single PHY
-               if(pDM_Odm->RFType==ODM_2T2R)
-               {
-                       (*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;
-                       (*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;
-
-               }
-               else
-               {
-                       (*EDCA_BE_UL) = 0x6ea42b;
-                       (*EDCA_BE_DL) = 0x6ea42b;
-               }
-
-       }
-////============================
-/// IOT case for MP
-////============================       
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
-       else
-       {
-
-               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
-                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))                 {
-                               (*EDCA_BE_UL) = 0x60a42b;
-                               (*EDCA_BE_DL) = 0x60a42b;
-                       }
-                       else
-                       {
-                               (*EDCA_BE_UL) = 0x6ea42b;
-                               (*EDCA_BE_DL) = 0x6ea42b;
-                       }
-               }
-       }
-       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
-       {
-               (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
-               (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
-       }
-     
-       #if (INTEL_PROXIMITY_SUPPORT == 1)
-       if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
-       {
-               (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
-       }
-       else
-       #endif          
-       {
-               if((!pMgntInfo->bDisableFrameBursting) && 
-                       (pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
-               {// To check whether we shall force turn on TXOP configuration.
-                       if(!((*EDCA_BE_UL) & 0xffff0000))
-                               (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
-                       if(!((*EDCA_BE_DL) & 0xffff0000))
-                               (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
-               }
-               
-               //92D txop can't be set to 0x3e for cisco1250
-               if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-               {
-                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
-               }
-               //merge from 92s_92c_merge temp brunch v2445    20120215 
-               else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
-               {
-                       (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
-               }
-               else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
-               {
-                       (*EDCA_BE_DL) = 0xa630;
-               }
-
-               else if(IOTPeer == HT_IOT_PEER_MARVELL)
-               {
-                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
-               }
-               else if(IOTPeer == HT_IOT_PEER_ATHEROS)
-               {
-                       // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. 
-                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-                       
-                       if(ICType == ODM_RTL8821)
-                                (*EDCA_BE_DL) = 0x5ea630;
-                       
-               }
-       }
-
-       if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
-       {
-               (*EDCA_BE_DL) = 0x432b;
-               (*EDCA_BE_UL) = 0x432b;
-       }               
-
-
-
-       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE
-       {
-               (*EDCA_BE_UL) = 0x5ea42b;
-               (*EDCA_BE_DL) = 0x5ea42b;
-
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
-       }
-
-       // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.
-       if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) && 
-               (pMgntInfo->dot11CurrentChannelNumber == 6))
-       {
-               (*EDCA_BE_DL) = 0xa92b;
-       }
-
-////============================
-/// IOT case for CE 
-////============================
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-       if(RFType==ODM_RTL8192D)
-       {
-               if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-               {
-                       (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
-                       (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
-               }
-               else if((IOTPeer == HT_IOT_PEER_AIRGO) &&
-                       ((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)))) 
-                       (*EDCA_BE_DL)=0x00a630;
-               
-               else if((IOTPeer== HT_IOT_PEER_ATHEROS) && 
-                                       (WirelessMode&ODM_WM_N5G) &&
-                                       (Adapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
-                       (*EDCA_BE_DL)=0xa42b;
-                       
-       }
-       //92C IOT case:
-       else
-       {
-               #ifdef CONFIG_BT_COEXIST
-               if(bbtchange)
-               {
-                       (*EDCA_BE_UL) = pbtpriv->BT_EDCA[UP_LINK];
-                       (*EDCA_BE_DL) = pbtpriv->BT_EDCA[DOWN_LINK];            
-               }
-               else
-               #endif
-               {
-                       if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
-                       {
-                               (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
-                               (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
-                       }
-                       else
-                       {
-                               (*EDCA_BE_UL)=EDCAParam[HT_IOT_PEER_UNKNOWN][UP_LINK];
-                               (*EDCA_BE_DL)=EDCAParam[HT_IOT_PEER_UNKNOWN][DOWN_LINK];
-                       }
-               }
-               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
-                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))
-                       {
-                               (*EDCA_BE_UL) = 0x60a42b;
-                               (*EDCA_BE_DL) = 0x60a42b;
-                       }
-                       else
-                       {
-                               (*EDCA_BE_UL) = 0x6ea42b;
-                               (*EDCA_BE_DL) = 0x6ea42b;
-                       }
-               }
-
-       }
-#endif
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
-
-}
-
-
-VOID
-odm_EdcaChooseTrafficIdx( 
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      u8Byte                          cur_tx_bytes,  
-       IN      u8Byte                          cur_rx_bytes, 
-       IN      BOOLEAN                 bBiasOnRx,
-       OUT BOOLEAN             *pbIsCurRDLState
-       )
-{      
-       
-       
-       if(bBiasOnRx)
-       {
-         
-               if(cur_tx_bytes>(cur_rx_bytes*4))
-               {
-                       *pbIsCurRDLState=FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
-
-               }
-               else
-               {
-                       *pbIsCurRDLState=TRUE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
-
-               }
-       }
-       else
-       {
-               if(cur_rx_bytes>(cur_tx_bytes*4))
-               {
-                       *pbIsCurRDLState=TRUE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));
-
-               }
-               else
-               {
-                       *pbIsCurRDLState=FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
-               }
-       }
-
-       return ;
-}
-
-#endif
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-
-void odm_EdcaParaInit(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       prtl8192cd_priv priv            = pDM_Odm->priv;
-       int   mode=priv->pmib->dot11BssType.net_work_type;
-       
-       static unsigned int slot_time, VO_TXOP, VI_TXOP, sifs_time;
-       struct ParaRecord EDCA[4];
-
-        memset(EDCA, 0, 4*sizeof(struct ParaRecord));
-
-       sifs_time = 10;
-       slot_time = 20;
-
-       if (mode & (ODM_WM_N24G|ODM_WM_N5G))
-               sifs_time = 16;
-
-       if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))
-               slot_time = 9;
-
-
-#if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))
-        if( priv->pmib->dot11QosEntry.ManualEDCA ) {
-                if( OPMODE & WIFI_AP_STATE )
-                        memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));
-                else
-                        memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));
-
-               #ifdef WIFI_WMM
-               if (QOS_ENABLE)
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-               else
-               #endif
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-
-       }else
-       #endif //RTL_MANUAL_EDCA
-       {
-
-                if(OPMODE & WIFI_AP_STATE)
-                {
-                       memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));
-
-                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
-                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
-                       else
-                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));
-                }
-                else
-                {
-                       memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));
-
-                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
-                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
-                       else
-                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));
-                }
-                
-       #ifdef WIFI_WMM
-               if (QOS_ENABLE)
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-               else
-       #endif
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));
-#endif
-                       
-
-       }
-
-       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VO_PARAM, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time));
-       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time));
-       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time));
-//     ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);
-
-       priv->pshare->iot_mode_enable = 0;
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if (priv->pshare->rf_ft_var.wifi_beq_iot)
-               priv->pshare->iot_mode_VI_exist = 0;
-       
-       #ifdef WMM_VIBE_PRI
-       priv->pshare->iot_mode_BE_exist = 0;
-       #endif
-       
-       #ifdef LOW_TP_TXOP
-       priv->pshare->BE_cwmax_enhance = 0;
-       #endif
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-      priv->pshare->iot_mode_BE_exist = 0;   
-#endif
-       priv->pshare->iot_mode_VO_exist = 0;
-}
-
-BOOLEAN
-ODM_ChooseIotMainSTA(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      PSTA_INFO_T             pstat
-       )
-{
-       prtl8192cd_priv priv = pDM_Odm->priv;
-       BOOLEAN         bhighTP_found_pstat=FALSE;
-       
-       if ((GET_ROOT(priv)->up_time % 2) == 0) {
-               unsigned int tx_2s_avg = 0;
-               unsigned int rx_2s_avg = 0;
-               int i=0, aggReady=0;
-               unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);
-
-               pstat->current_tx_bytes += pstat->tx_byte_cnt;
-               pstat->current_rx_bytes += pstat->rx_byte_cnt;
-
-               if (total_sum != 0) {
-                       if (total_sum <= 100) {
-                       tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);
-                       rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);
-                       } else {
-                               tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));
-                               rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));
-                       }
-
-               }
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-               if (pstat->ht_cap_len) {
-                       if ((tx_2s_avg + rx_2s_avg) >=25 /*50*/) {
-
-                                       priv->pshare->highTP_found_pstat = pstat;
-                                       bhighTP_found_pstat=TRUE;
-                               }
-                       }
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               for(i=0; i<8; i++)
-                       aggReady += (pstat->ADDBA_ready[i]);
-               if (pstat->ht_cap_len && aggReady) 
-               {
-                       if ((tx_2s_avg + rx_2s_avg >= 25)) {
-                               priv->pshare->highTP_found_pstat = pstat;
-                       }
-                       
-               #ifdef CLIENT_MODE
-                       if (OPMODE & WIFI_STATION_STATE) {
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                               if ((pstat->IOTPeer==HT_IOT_PEER_RALINK) && ((tx_2s_avg + rx_2s_avg) >= 45))
-#else
-                               if(pstat->is_ralink_sta && ((tx_2s_avg + rx_2s_avg) >= 45))
-#endif                                 
-                                       priv->pshare->highTP_found_pstat = pstat;
-               }
-               #endif                          
-       }
-#endif
-       } else {
-               pstat->current_tx_bytes = pstat->tx_byte_cnt;
-               pstat->current_rx_bytes = pstat->rx_byte_cnt;
-       }
-
-       return bhighTP_found_pstat;
-}
-
-
-#ifdef WIFI_WMM
-VOID
-ODM_IotEdcaSwitch(
-       IN      PDM_ODM_T               pDM_Odm,
-       IN      unsigned char           enable
-       )
-{
-       prtl8192cd_priv priv    = pDM_Odm->priv;
-       int   mode=priv->pmib->dot11BssType.net_work_type;
-       unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;
-       unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||
-               ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-       #ifdef CLIENT_MODE
-               || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-       #endif
-               ))
-               return;
-#endif
-
-       if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num
-       #ifdef WDS
-               || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
-       #endif
-               ))
-               sifs_time = 16;
-
-       if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {
-               slot_time = 9;
-       } 
-       else
-       {
-               BE_TXOP = 94;
-               VI_TXOP = 188;
-       }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-       if (priv->pshare->iot_mode_VO_exist) {
-               // to separate AC_VI and AC_BE to avoid using the same EDCA settings
-               if (priv->pshare->iot_mode_BE_exist) {
-                       vi_cw_max = 5;
-                       vi_cw_min = 3;
-               } else {
-                       vi_cw_max = 6;
-                       vi_cw_min = 4;
-               }
-       }
-       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-
-       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
-
-       
-#elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {
-               if (priv->pshare->iot_mode_VO_exist) {
-       #ifdef WMM_VIBE_PRI
-                       if (priv->pshare->iot_mode_BE_exist) 
-                       {
-                               vi_cw_max = 5;
-                               vi_cw_min = 3;
-                               vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-                       }
-                       else 
-       #endif
-                       {
-                       vi_cw_max = 6;
-                       vi_cw_min = 4;
-                       vi_aifs = 0x2b;
-                       }
-               } 
-               else {
-                       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-               }
-
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)
-                       | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
-       }
-#endif
-
-
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-       if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) 
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);
-       else if(!enable)
-#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)      
-       if(!enable)                                 //if iot is disable ,maintain original BEQ PARAM
-#endif
-               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
-                       | (sifs_time + 3 * slot_time));
-       else
-       {
-               int txop_enlarge;
-               int txop;
-               unsigned int cw_max;
-               unsigned int txop_close;
-               
-       #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
-                       cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);
-                       txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);
-
-                       if(priv->pshare->txop_enlarge == 0xe)   //if intel case
-                               txop = (txop_close ? 0 : (BE_TXOP*2));
-                       else                                                        //if other case
-                               txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));
-       #else
-                       cw_max=6;
-                       if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))
-                               txop=BE_TXOP*2;
-                       else
-                               txop=BE_TXOP*priv->pshare->txop_enlarge;
-
-       #endif
-                           
-               if (priv->pshare->ht_sta_num
-       #ifdef WDS
-                       || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&
-                       priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
-       #endif
-                       ) 
-                       {
-
-                       if (priv->pshare->txop_enlarge == 0xe) {
-                               // is intel client, use a different edca value
-                               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);
-                               priv->pshare->txop_enlarge = 2;
-                       } 
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-       #ifndef LOW_TP_TXOP
-                        else if (priv->pshare->txop_enlarge == 0xd) {
-                               // is intel ralink, use a different edca value
-                               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (4 << 12) | (3 << 8) | 0x19);
-                               priv->pshare->txop_enlarge = 2;
-                       } 
-       #endif
-#endif
-                       else 
-                       {
-                               if (pDM_Odm->RFType==ODM_2T2R)
-                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
-                                               (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
-                               else
-                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)
-                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
-                                               (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
-                               #else
-                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
-                                               (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
-
-                               #endif
-                       }
-               }
-              else 
-              {
- #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
-                        ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
- #else
-               #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));
-               #else
-                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
-               #endif
-               
- #endif
-              }
-
-       }
-}
-#endif
-
-VOID 
-odm_IotEngine(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-
-       struct rtl8192cd_priv *priv=pDM_Odm->priv;
-       PSTA_INFO_T pstat = NULL;
-       u4Byte i;
-       
-#ifdef WIFI_WMM
-       unsigned int switch_turbo = 0;
-#endif 
-////////////////////////////////////////////////////////
-//  if EDCA Turbo function is not supported or Manual EDCA Setting
-//  then return
-////////////////////////////////////////////////////////
-       if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));
-               return;
-       }
-       
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))
-       if(priv->pmib->dot11QosEntry.ManualEDCA){
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));
-               return ;
-       }
-#endif 
-
-#if !(DM_ODM_SUPPORT_TYPE &ODM_AP)
- //////////////////////////////////////////////////////
- //find high TP STA every 2s
-//////////////////////////////////////////////////////
-       if ((GET_ROOT(priv)->up_time % 2) == 0) 
-               priv->pshare->highTP_found_pstat==NULL;
-
-#if 0
-       phead = &priv->asoc_list;
-       plist = phead->next;
-       while(plist != phead)   {
-               pstat = list_entry(plist, struct stat_info, asoc_list);
-
-               if(ODM_ChooseIotMainSTA(pDM_Odm, pstat));              //find the correct station
-                       break;
-               if (plist == plist->next)                                          //the last plist 
-                       break;
-               plist = plist->next;
-       };
-#endif
-
-       //find highTP STA
-       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
-               pstat = pDM_Odm->pODM_StaInfo[i];
-               if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat)))        //find the correct station
-                               break;
-       }
-
- //////////////////////////////////////////////////////
- //if highTP STA is not found, then return
- //////////////////////////////////////////////////////
-       if(priv->pshare->highTP_found_pstat==NULL)      {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));
-               return;
-       }
-#endif
-
-       pstat=priv->pshare->highTP_found_pstat;
-
-
-#ifdef WIFI_WMM
-       if (QOS_ENABLE) {
-               if (!priv->pmib->dot11OperationEntry.wifi_specific 
-               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-                       ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-                       || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
-               #endif
-                       ) {
-                       if (priv->pshare->iot_mode_enable &&
-                               ((priv->pshare->phw->VO_pkt_count > 50) ||
-                                (priv->pshare->phw->VI_pkt_count > 50) ||
-                                (priv->pshare->phw->BK_pkt_count > 50))) {
-                               priv->pshare->iot_mode_enable = 0;
-                               switch_turbo++;
-                       } else if ((!priv->pshare->iot_mode_enable) &&
-                               ((priv->pshare->phw->VO_pkt_count < 50) &&
-                                (priv->pshare->phw->VI_pkt_count < 50) &&
-                                (priv->pshare->phw->BK_pkt_count < 50))) {
-                               priv->pshare->iot_mode_enable++;
-                               switch_turbo++;
-                       }
-               }
-
-
-               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)
-               #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-               if (priv->pmib->dot11OperationEntry.wifi_specific) 
-               #endif
-               {
-                       if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {
-                               priv->pshare->iot_mode_VO_exist++;
-                               switch_turbo++;
-                       } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {
-                               priv->pshare->iot_mode_VO_exist = 0;
-                               switch_turbo++;
-                       }
-#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
-                       if (priv->pshare->iot_mode_VO_exist) {
-                               //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);
-                               if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {
-                                       priv->pshare->iot_mode_BE_exist++;
-                                       switch_turbo++;
-                               } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {
-                                       priv->pshare->iot_mode_BE_exist = 0;
-                                       switch_turbo++;
-                               }
-                       }
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
-                       if (priv->pshare->rf_ft_var.wifi_beq_iot) 
-                       {
-                               if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {
-                                       priv->pshare->iot_mode_VI_exist++;
-                                       switch_turbo++;
-                               } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {
-                                       priv->pshare->iot_mode_VI_exist = 0;
-                                       switch_turbo++;
-                               }
-                       }
-#endif
-
-               }
-               else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {
-                  if (priv->pshare->txop_enlarge) {
-                          priv->pshare->txop_enlarge = 0;
-                          if (priv->pshare->iot_mode_enable)
-                                       switch_turbo++;
-                               }
-               }
-
-#if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))
-        if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-        {
-            if (priv->pshare->iot_mode_enable &&
-                (((priv->pshare->phw->VO_pkt_count > 50) ||
-                 (priv->pshare->phw->VI_pkt_count > 50) ||
-                 (priv->pshare->phw->BK_pkt_count > 50)) ||
-                 (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))
-            {
-                priv->pshare->iot_mode_enable = 0;
-                switch_turbo++;
-            }
-            else if ((!priv->pshare->iot_mode_enable) &&
-                (((priv->pshare->phw->VO_pkt_count < 50) &&
-                 (priv->pshare->phw->VI_pkt_count < 50) &&
-                 (priv->pshare->phw->BK_pkt_count < 50)) &&
-                 (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))
-            {
-                priv->pshare->iot_mode_enable++;
-                switch_turbo++;
-            }
-        }
-#endif
-
-               priv->pshare->phw->VO_pkt_count = 0;
-               priv->pshare->phw->VI_pkt_count = 0;
-               priv->pshare->phw->BK_pkt_count = 0;
-
-       #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
-               priv->pshare->phw->BE_pkt_count = 0;
-       #endif
-               
-       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               if (priv->pshare->rf_ft_var.wifi_beq_iot)
-                       priv->pshare->phw->VI_rx_pkt_count = 0;
-               #endif
-
-       }
-#endif
-
-       if ((priv->up_time % 2) == 0) {
-               /*
-                * decide EDCA content for different chip vendor
-                */
-#ifdef WIFI_WMM
-       #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
-               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
-       
-       #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
-               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || 
-                       ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               #ifdef CLIENT_MODE
-            || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               #endif
-       #endif
-               ))
-       
-               {
-
-                       if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {
-#ifdef LOW_TP_TXOP
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                               if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-#else
-                               if (pstat->is_intel_sta)
-#endif                                 
-                               {
-                                       if (priv->pshare->txop_enlarge != 0xe)
-                                       {
-                                               priv->pshare->txop_enlarge = 0xe;
-
-                                               if (priv->pshare->iot_mode_enable)
-                                                       switch_turbo++;
-                                       }
-                               } 
-                               else if (priv->pshare->txop_enlarge != 2) 
-                               {
-                                       priv->pshare->txop_enlarge = 2;
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-#else
-                               if (priv->pshare->txop_enlarge != 2)
-                               {
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                                       if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-#else                          
-                                       if (pstat->is_intel_sta)
-#endif                                         
-                                               priv->pshare->txop_enlarge = 0xe;                                               
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
-                                       else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
-#else
-                                       else if (pstat->is_ralink_sta)
-#endif                                         
-                                               priv->pshare->txop_enlarge = 0xd;                                               
-                                       else
-                                               priv->pshare->txop_enlarge = 2;
-
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-#endif
-#if 0
-                               if (priv->pshare->txop_enlarge != 2) 
-                               {
-                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-                                       if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-                               #else
-                                       if (pstat->is_intel_sta)
-                               #endif                                  
-                                               priv->pshare->txop_enlarge = 0xe;
-                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
-                                       else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
-                                               priv->pshare->txop_enlarge = 0xd;                                               
-                               #endif
-                                       else
-                                               priv->pshare->txop_enlarge = 2;
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-#endif
-                       }
-                       else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) 
-                       {
-                               if (priv->pshare->txop_enlarge) {
-                                       priv->pshare->txop_enlarge = 0;
-                                       if (priv->pshare->iot_mode_enable)
-                                               switch_turbo++;
-                               }
-                       }
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))
-                       // for Intel IOT, need to enlarge CW MAX from 6 to 10
-                       if (pstat && pstat->is_intel_sta && (((pstat->tx_avarage+pstat->rx_avarage)>>10) < 
-                                       priv->pshare->rf_ft_var.cwmax_enhance_thd)) 
-                       {
-                               if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)
-                               {
-                                       priv->pshare->BE_cwmax_enhance = 1;
-                                       switch_turbo++;
-                               }
-                       } else {
-                               if (priv->pshare->BE_cwmax_enhance) {
-                                       priv->pshare->BE_cwmax_enhance = 0;
-                                       switch_turbo++;
-                               }
-                       }
-#endif
-               }
-#endif
-               priv->pshare->current_tx_bytes = 0;
-               priv->pshare->current_rx_bytes = 0;
-       }
-       
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))
-       if ((priv->assoc_num > 1) && (AMPDU_ENABLE))
-       {
-               if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){
-                       if ((priv->swq_en == 0)){
-                               switch_turbo++;
-                               if (priv->pshare->txop_enlarge == 0)
-                                       priv->pshare->txop_enlarge = 2;
-                               priv->swq_en = 1;
-                               }
-                       else
-                       {
-                               if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
-                               {
-                                       priv->pshare->txop_enlarge = 2;
-                                       switch_turbo--;
-                               }
-                       }
-               }
-               else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){
-                       priv->swq_en = 0;
-               }
-               else if ((priv->swq_en == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))        {
-                       priv->pshare->txop_enlarge = 2;
-                       switch_turbo--;
-               }
-    }
-#if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined CONFIG_RTL_819XD))
-    else if( (priv->assoc_num == 1) && (AMPDU_ENABLE)) {               
-        if (pstat) {
-                       int en_thd = 14417920>>(priv->up_time % 2);
-            if ((priv->swq_en == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) )  { //50Mbps
-                priv->swq_en = 1;
-                               priv->swqen_keeptime = priv->up_time;
-            }
-            else if ((priv->swq_en == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps
-                priv->swq_en = 0;
-                               priv->swqen_keeptime = 0;
-            }
-        }
-        else {
-            priv->swq_en = 0;
-                       priv->swqen_keeptime = 0;
-        }
-    }
-#endif
-#endif
-
-#ifdef WIFI_WMM
-#ifdef LOW_TP_TXOP
-       if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))
-               && QOS_ENABLE) {
-               if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {
-                       unsigned int thd_tp;
-                       unsigned char under_thd;
-                       unsigned int curr_tp;
-
-                       if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))
-                       {
-                               // Determine the upper bound throughput threshold.
-                               if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {
-                                       if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)
-                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
-                                       else
-                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;
-                               }
-                               else
-                                       thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
-
-                               // Determine to close txop.
-                               curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);
-                               if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)
-                                       under_thd = 1;
-                               else
-                                       under_thd = 0;
-                       }
-                       else
-                       {
-                               under_thd = 0;
-                       }
-
-                       if (switch_turbo) 
-                       {
-                               priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
-                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;
-                       }
-                       else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {
-                               priv->pshare->rf_ft_var.low_tp_txop_count++;
-                               if (priv->pshare->rf_ft_var.low_tp_txop_close) {
-                                       priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;
-                               }
-                               if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay) 
-
-                               {                                       
-                                       priv->pshare->rf_ft_var.low_tp_txop_count = 0;
-                                       priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
-                                       switch_turbo++;
-                               }
-                       } 
-                       else 
-                       {
-                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;
-                       }
-               }
-       }
-#endif         
-
-       if (switch_turbo)
-               ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );
-#endif
-}
-#endif
-
-
-#if( DM_ODM_SUPPORT_TYPE == ODM_WIN) 
-//
-// 2011/07/26 MH Add an API for testing IQK fail case.
-//
-BOOLEAN
-ODM_CheckPowerStatus(
-       IN      PADAPTER                Adapter)
-{
-
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;
-       RT_RF_POWER_STATE       rtState;
-       PMGNT_INFO                      pMgntInfo       = &(Adapter->MgntInfo);
-
-       // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.
-       if (pMgntInfo->init_adpt_in_progress == TRUE)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter"));
-               return  TRUE;
-       }
-       
-       //
-       //      2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.
-       //
-       Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));        
-       if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", 
-               Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));
-               return  FALSE;
-       }
-       return  TRUE;
-}
-#endif
-
-// need to ODM CE Platform
-//move to here for ANT detection mechanism using
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
-u4Byte
-GetPSDData(
-       IN PDM_ODM_T    pDM_Odm,
-       unsigned int    point,
-       u1Byte initial_gain_psd)
-{
-       //unsigned int  val, rfval;
-       //int   psd_report;
-       u4Byte  psd_report;
-       
-       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
-       //Debug Message
-       //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
-       //DbgPrint("Reg908 = 0x%x\n",val);
-       //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
-       //rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
-       //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
-       //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
-               //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
-
-       //Set DCO frequency index, offset=(40MHz/SamplePts)*point
-       ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
-
-       //Start PSD calculation, Reg808[22]=0->1
-       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
-       //Need to wait for HW PSD report
-       ODM_StallExecution(1000);
-       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
-       //Read PSD report, Reg8B4[15:0]
-       psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
-       
-#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))
-       psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
-#else
-       psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);
-#endif
-
-       return psd_report;
-       
-}
-
-u4Byte 
-ConvertTo_dB(
-       u4Byte  Value)
-{
-       u1Byte i;
-       u1Byte j;
-       u4Byte dB;
-
-       Value = Value & 0xFFFF;
-       
-       for (i=0;i<8;i++)
-       {
-               if (Value <= dB_Invert_Table[i][11])
-               {
-                       break;
-               }
-       }
-
-       if (i >= 8)
-       {
-               return (96);    // maximum 96 dB
-       }
-
-       for (j=0;j<12;j++)
-       {
-               if (Value <= dB_Invert_Table[i][j])
-               {
-                       break;
-               }
-       }
-
-       dB = i*12 + j + 1;
-
-       return (dB);
-}
-
-#endif
-
-//
-// LukeLee: 
-// PSD function will be moved to FW in future IC, but now is only implemented in MP platform
-// So PSD function will not be incorporated to common ODM
-//
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-#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        SCAN_INTERVAL   1500 //ms
-#define        SYN_Length              5    // for 92D
-       
-#define        LNA_Low_Gain_1                      0x64
-#define        LNA_Low_Gain_2                      0x5A
-#define        LNA_Low_Gain_3                      0x58
-
-#define        pw_th_10dB                                      0x0
-#define        pw_th_16dB                                      0x3
-
-#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
-
-#define        Idle_Mode                                       0
-#define        High_TP_Mode                            1
-#define        Low_TP_Mode                             2
-
-
-VOID
-odm_PSDMonitorInit(
-       IN PDM_ODM_T    pDM_Odm)
-{
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
-       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
-       //PSD Monitor Setting
-       //Which path in ADC/DAC is turnned on for PSD: both I/Q
-       ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
-       //Ageraged number: 8
-       ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
-       pDM_Odm->bPSDinProcess = FALSE;
-       pDM_Odm->bUserAssignLevel = FALSE;
-       pDM_Odm->bPSDactive = FALSE;
-       //pDM_Odm->bDMInitialGainEnable=TRUE;           //change the initialization to DIGinit
-       //Set Debug Port
-       //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
-       //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
-       //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
-       //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
-
-       //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
-#endif
-}
-
-VOID
-PatchDCTone(
-       IN      PDM_ODM_T       pDM_Odm,
-       pu4Byte         PSD_report,
-       u1Byte          initial_gain_psd
-)
-{
-       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);
-       //PADAPTER      pAdapter;
-       
-       u4Byte  psd_report;
-
-       //2 Switch to CH11 to patch CH9 and CH13 DC tone
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
-       
-       if(pDM_Odm->SupportICType== ODM_RTL8192D)
-       {
-               if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
-               {
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);
-               }
-               else
-               {
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);
-               }
-       }
-       
-       //Ch9 DC tone patch
-       psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
-       PSD_report[50] = psd_report;
-       //Ch13 DC tone patch
-       psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
-       PSD_report[70] = psd_report;
-       
-       //2 Switch to CH3 to patch CH1 and CH5 DC tone
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
-
-       
-       if(pDM_Odm->SupportICType==ODM_RTL8192D)
-       {
-               if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
-               {
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
-               }
-               else
-               {
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);
-                       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
-               }
-       }
-       
-       //Ch1 DC tone patch
-       psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
-       PSD_report[10] = psd_report;
-       //Ch5 DC tone patch
-       psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
-       PSD_report[30] = psd_report;
-
-}
-
-
-VOID
-GoodChannelDecision(
-       PDM_ODM_T       pDM_Odm,
-       pu4Byte         PSD_report,
-       pu1Byte         PSD_bitmap,
-       u1Byte          RSSI_BT,
-       pu1Byte         PSD_bitmap_memory)
-{
-       pRXHP_T                 pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
-       //s4Byte        TH1 =  SSBT-0x15;    // modify TH by Neil Chen
-       s4Byte  TH1= RSSI_BT+0x14;
-       s4Byte  TH2 = RSSI_BT+85;
-       //u2Byte    TH3;
-//     s4Byte  RegB34;
-       u1Byte  bitmap, Smooth_size[3], Smooth_TH[3];
-       //u1Byte        psd_bit;
-       u4Byte  i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
-       int             start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
-       
-//     RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
-
-       if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
-       {
-            TH1 = RSSI_BT + 0x14;  
-       }
-
-       Smooth_size[0]=Smooth_Size_1;
-       Smooth_size[1]=Smooth_Size_2;
-       Smooth_size[2]=Smooth_Size_3;
-       Smooth_TH[0]=Smooth_TH_1;
-       Smooth_TH[1]=Smooth_TH_2;
-       Smooth_TH[2]=Smooth_TH_3;
-       Smooth_Interval[0]=16;
-       Smooth_Interval[1]=15;
-       Smooth_Interval[2]=13;
-       good_cnt = 0;
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-               //2 Threshold  
-
-               if(RSSI_BT >=41)
-                       TH1 = 113;      
-               else if(RSSI_BT >=38)   // >= -15dBm
-                       TH1 = 105;                              //0x69
-               else if((RSSI_BT >=33)&(RSSI_BT <38))
-                       TH1 = 99+(RSSI_BT-33);         //0x63
-               else if((RSSI_BT >=26)&(RSSI_BT<33))
-                       TH1 = 99-(33-RSSI_BT)+2;     //0x5e
-               else if((RSSI_BT >=24)&(RSSI_BT<26))
-                       TH1 = 88-((RSSI_BT-24)*3);   //0x58
-               else if((RSSI_BT >=18)&(RSSI_BT<24))
-                       TH1 = 77+((RSSI_BT-18)*2);
-               else if((RSSI_BT >=14)&(RSSI_BT<18))
-                       TH1 = 63+((RSSI_BT-14)*2);
-               else if((RSSI_BT >=8)&(RSSI_BT<14))
-                       TH1 = 58+((RSSI_BT-8)*2);
-               else if((RSSI_BT >=3)&(RSSI_BT<8))
-                       TH1 = 52+(RSSI_BT-3);
-               else
-                       TH1 = 51;
-       }
-
-       for (i = 0; i< 10; i++)
-               PSD_bitmap[i] = 0;
-       
-
-        // Add By Gary
-       for (i=0; i<80; i++)
-               pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
-       // End
-
-
-
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-               TH1 =TH1-SIR_STEP_SIZE;
-       }
-       while (good_cnt < PSD_CHMIN)
-       {
-               good_cnt = 0;
-               if(pDM_Odm->SupportICType==ODM_RTL8723A)
-               {
-               if(TH1 ==TH2)
-                       break;
-               if((TH1+SIR_STEP_SIZE) < TH2)
-                       TH1 += SIR_STEP_SIZE;
-               else
-                       TH1 = TH2;
-               }
-               else
-               {
-                       if(TH1==(RSSI_BT+0x1E))
-                            break;    
-                       if((TH1+2) < (RSSI_BT+0x1E))
-                               TH1+=3;
-                       else
-                               TH1 = RSSI_BT+0x1E;     
-             
-               }
-               ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
-                        
-               for (i = 0; i< 80; i++)
-               {
-                       if((s4Byte)(PSD_report[i]) < TH1)
-                       {
-                               byte_idx = i / 8;
-                               bit_idx = i -8*byte_idx;
-                               bitmap = PSD_bitmap[byte_idx];
-                               PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
-                       }
-               }
-
-#if DBG
-               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
-               for(n=0;n<10;n++)
-               {
-                       //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
-                       for (i = 0; i<8; i++)
-                               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] =   %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
-               }
-#endif
-       
-               //1 Start of smoothing function
-
-               for (j=0;j<3;j++)
-               {
-                       start_byte_idx=0;
-                       start_bit_idx=0;
-                       for(n=0; n<Smooth_Interval[j]; n++)
-                       {
-                               good_cnt_smoothing = 0;
-                               cur_bit_idx = start_bit_idx;
-                               cur_byte_idx = start_byte_idx;
-                               for ( i=0; i < Smooth_size[j]; i++)
-                               {
-                                       NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
-                                       if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
-                                               good_cnt_smoothing++;
-
-                               }
-
-                               if( good_cnt_smoothing < Smooth_TH[j] )
-                               {
-                                       cur_bit_idx = start_bit_idx;
-                                       cur_byte_idx = start_byte_idx;
-                                       for ( i=0; i< Smooth_size[j] ; i++)
-                                       {       
-                                               NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;                                
-                                               PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
-                                       }
-                               }
-                               start_bit_idx =  start_bit_idx + Smooth_Step_Size;
-                               while ( (start_bit_idx)  > 7 )
-                               {
-                                       start_byte_idx= start_byte_idx+start_bit_idx/8;
-                                       start_bit_idx = start_bit_idx%8;
-                               }
-                       }
-
-                       ODM_RT_TRACE(   pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
-                       for(n=0;n<10;n++)
-                       {
-                               for (i = 0; i<8; i++)
-                               {
-                                       ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] =   %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
-                                       
-                                       if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1)  //----- Add By Gary
-                                       {
-                                          pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
-                                       }                                                  // ------end by Gary
-                               }
-                       }
-
-               }
-
-       
-               good_cnt = 0;
-               for ( i = 0; i < 10; i++)
-               {
-                       for (n = 0; n < 8; n++)
-                               if((PSD_bitmap[i]& BIT(n)) != 0)
-                                       good_cnt++;
-               }
-               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: good channel cnt = %u",good_cnt));
-       }
-
-       //RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
-       for (i = 0; i <10; i++)
-               ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
-/*     
-       //Update bitmap memory
-       for(i = 0; i < 80; i++)
-       {
-               byte_idx = i / 8;
-               bit_idx = i -8*byte_idx;
-               psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
-               bitmap = PSD_bitmap_memory[i]; 
-               PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
-       }
-*/
-}
-
-
-
-VOID
-odm_PSD_Monitor(
-       PDM_ODM_T       pDM_Odm
-)
-{
-       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-       //PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
-
-       unsigned int            pts, start_point, stop_point;
-       u1Byte                  initial_gain ;
-       static u1Byte           PSD_bitmap_memory[80], init_memory = 0;
-       static u1Byte           psd_cnt=0;
-       static u4Byte           PSD_report[80], PSD_report_tmp;
-       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
-       u1Byte                  H2C_PSD_DATA[5]={0,0,0,0,0};
-       static u1Byte           H2C_PSD_DATA_last[5] ={0,0,0,0,0};
-       u1Byte                  idx[20]={96,99,102,106,109,112,115,118,122,125,
-                                       0,3,6,10,13,16,19,22,26,29};
-       u1Byte                  n, i, channel, BBReset,tone_idx;
-       u1Byte                  PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
-       s4Byte                          PSD_skip_start, PSD_skip_stop;
-       u4Byte                  CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
-       u4Byte                  ReScan, Interval, Is40MHz;
-       u8Byte                  curTxOkCnt, curRxOkCnt;
-       int                             cur_byte_idx, cur_bit_idx;
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
-       
-       if( (*(pDM_Odm->pbScanInProcess)) ||
-               pDM_Odm->bLinkInProcess)
-       {
-               if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
-               {
-                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms  
-                       //psd_cnt=0;
-               }
-               return;
-       }
-
-       if(pDM_Odm->bBtHsOperation)
-       {
-               ReScan = 1;
-               Interval = SCAN_INTERVAL;
-       }
-       else
-       {
-       ReScan = PSD_RESCAN;
-       Interval = SCAN_INTERVAL;
-       }
-
-       //1 Initialization
-       if(init_memory == 0)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
-               for(i = 0; i < 80; i++)
-                       PSD_bitmap_memory[i] = 0xFF; // channel is always good
-               init_memory = 1;
-       }
-       if(psd_cnt == 0)
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
-               for(i = 0; i < 80; i++)
-                       PSD_report[i] = 0;
-       }
-
-       //1 Backup Current Settings
-       CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
-/*
-       if(pDM_Odm->SupportICType==ODM_RTL8192D)
-       {
-               //2 Record Current synthesizer parameters based on current channel
-               if((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))
-               {
-                       SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);
-                       SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);
-                       SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);
-                       SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);
-                       SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);
-               }
-               else     // DualMAC_DualPHY 2G
-               {
-                       SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);
-                       SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);
-                       SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);
-                       SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);
-                       SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);
-               }
-       }
-*/
-       //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
-       RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
-
-       //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
-       RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
-
-       //2???
-       if(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))
-               Is40MHz = TRUE;
-       else
-               Is40MHz = FALSE;
-
-       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
-       //1 Turn off CCK
-       //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
-       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
-       //1 Turn off TX
-       //Pause TX Queue
-       //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
-       ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
-       
-       //Force RX to stop TX immediately
-       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
-
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
-       //1 Turn off RX
-       //Rx AGC off  RegC70[0]=0, RegC7C[20]=0
-       //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
-       //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
-
-       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
-       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
-
-       
-       //Turn off CCA
-       //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
-       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
-       
-       //BB Reset
-       //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
-       BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
-       
-       //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
-       //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
-       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess 
-       ODM_Write1Byte(pDM_Odm,  0x02, BBReset&(~BIT0));
-       ODM_Write1Byte(pDM_Odm,  0x02, BBReset|BIT0);
-       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
-       
-       //1 Leave RX idle low power
-       //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
-
-       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
-       //1 Fix initial gain
-       //if (IS_HARDWARE_TYPE_8723AE(Adapter))
-       //RSSI_BT = pHalData->RSSI_BT;
-       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))      // Add by Gary
-       //    RSSI_BT = RSSI_BT_new;
-
-       if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
-       RSSI_BT=pDM_Odm->RSSI_BT;               //need to check C2H to pDM_Odm RSSI BT
-
-       if(RSSI_BT>=47)
-               RSSI_BT=47;
-          
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
-       
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-              //Neil add--2011--10--12
-               //2 Initial Gain index 
-               if(RSSI_BT >=35)   // >= -15dBm
-                       initial_gain_psd = RSSI_BT*2;
-               else if((RSSI_BT >=33)&(RSSI_BT<35))
-                       initial_gain_psd = RSSI_BT*2+6;
-               else if((RSSI_BT >=24)&(RSSI_BT<33))
-                       initial_gain_psd = 70-(33-RSSI_BT);
-               else if((RSSI_BT >=19)&(RSSI_BT<24))
-                       initial_gain_psd = 64-((24-RSSI_BT)*4);
-               else if((RSSI_BT >=14)&(RSSI_BT<19))
-                       initial_gain_psd = 44-((18-RSSI_BT)*2);
-               else if((RSSI_BT >=8)&(RSSI_BT<14))
-                       initial_gain_psd = 35-(14-RSSI_BT);
-               else
-                       initial_gain_psd = 0x1B;
-       }
-       else
-       {
-       
-               //need to do    
-               initial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI
-               //}     
-       }
-       //if(RSSI_BT<0x17)
-       //      RSSI_BT +=3;
-       //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
-
-       //initialGainUpper = 0x5E;  //Modify by neil chen
-       
-       if(pDM_Odm->bUserAssignLevel)
-       {
-               pDM_Odm->bUserAssignLevel = FALSE;
-               initialGainUpper = 0x7f;
-       }
-       else
-       {
-               initialGainUpper = 0x5E;
-       }
-       
-       /*
-       if (initial_gain_psd < 0x1a)
-               initial_gain_psd = 0x1a;
-       if (initial_gain_psd > initialGainUpper)
-               initial_gain_psd = initialGainUpper;
-       */
-
-       //if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       SSBT = RSSI_BT  * 2 +0x3E;
-       
-       
-       //if(IS_HARDWARE_TYPE_8723AE(Adapter))
-       //      SSBT = RSSI_BT  * 2 +0x3E;
-       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))   // Add by Gary
-       //{
-       //      RSSI_BT = initial_gain_psd;
-       //      SSBT = RSSI_BT;
-       //}
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
-       ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
-       //DbgPrint("PSD: SSBT= %d", SSBT);
-       //need to do
-       //pMgntInfo->bDMInitialGainEnable = FALSE;
-       pDM_Odm->bDMInitialGainEnable = FALSE;
-       initial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);
-       
-        // make sure the initial gain is under the correct range.
-       //initial_gain_psd &= 0x7f;
-       ODM_Write_DIG(pDM_Odm, initial_gain_psd);
-       //1 Turn off 3-wire
-       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
-
-       //pts value = 128, 256, 512, 1024
-       pts = 128;
-
-       if(pts == 128)
-       {
-               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
-               start_point = 64;
-               stop_point = 192;
-       }
-       else if(pts == 256)
-       {
-               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
-               start_point = 128;
-               stop_point = 384;
-       }
-       else if(pts == 512)
-       {
-               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
-               start_point = 256;
-               stop_point = 768;
-       }
-       else
-       {
-               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
-               start_point = 512;
-               stop_point = 1536;
-       }
-       
-
-//3 Skip WLAN channels if WLAN busy
-
-       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
-       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
-       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
-       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);   
-
-       PSD_skip_start=80;
-       PSD_skip_stop = 0;
-       wlan_channel = CurrentChannel & 0x0f;
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
-       if(pDM_Odm->SupportICType==ODM_RTL8723A)
-       {
-               if(pDM_Odm->bBtHsOperation)
-               {
-                       if(pDM_Odm->bLinked)
-                       {
-                               if(Is40MHz)
-                               {
-                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
-                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
-                               }
-                               else
-                               {
-                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask
-                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; 
-                               }
-                       }
-                       else
-                       {
-                               // mask for 40MHz
-                               PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
-                               PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
-                       }
-                       if(PSD_skip_start < 0)
-                               PSD_skip_start = 0;
-                       if(PSD_skip_stop >80)
-                               PSD_skip_stop = 80;
-               }
-               else
-               {
-                       if((curRxOkCnt+curTxOkCnt) > 5)
-                       {
-                               if(Is40MHz)
-                               {
-                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
-                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
-                               }
-                               else
-                               {
-                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask
-                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; 
-                               }
-                               
-                               if(PSD_skip_start < 0)
-                                       PSD_skip_start = 0;
-                               if(PSD_skip_stop >80)
-                                       PSD_skip_stop = 80;
-                       }
-               }
-       }
-#if 0  
-       else
-       {
-               if((curRxOkCnt+curTxOkCnt) > 1000)
-               {
-                       PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
-                       PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
-               }
-       }   
-#endif  //Reove RXHP Issue
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
-
-       for (n=0;n<80;n++)
-       {
-               if((n%20)==0)
-               {
-                       channel = (n/20)*4 + 1;
-                                       
-                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
-                               }
-               tone_idx = n%20;
-               if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
-               {       
-                       PSD_report[n] = SSBT;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
-               }
-               else
-               {
-                       PSD_report_tmp =  GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
-
-                       if ( PSD_report_tmp > PSD_report[n])
-                               PSD_report[n] = PSD_report_tmp;
-                               
-               }
-       }
-
-       PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
-      
-       //----end
-       //1 Turn on RX
-       //Rx AGC on
-       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
-       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
-       //CCK on
-       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
-       //1 Turn on TX
-       //Resume TX Queue
-       
-       ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
-       //Turn on 3-wire
-       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
-       //1 Restore Current Settings
-       //Resume DIG
-       pDM_Odm->bDMInitialGainEnable = TRUE;
-       
-       ODM_Write_DIG(pDM_Odm, initial_gain);
-
-       // restore originl center frequency
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
-
-       //Turn on CCA
-       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
-       //Restore RX idle low power
-       if(RxIdleLowPwr == TRUE)
-               ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
-       
-       psd_cnt++;
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
-       if (psd_cnt < ReScan)
-               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);            
-       else
-       {
-               psd_cnt = 0;
-               for(i=0;i<80;i++)
-                       //DbgPrint("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]);
-                       RT_TRACE(       COMP_PSD, DBG_LOUD,("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]));
-
-
-               GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
-
-               if(pDM_Odm->SupportICType==ODM_RTL8723A)
-               {
-                       cur_byte_idx=0;
-                       cur_bit_idx=0;
-
-                       //2 Restore H2C PSD Data to Last Data
-                       H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
-                       H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
-                       H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
-                       H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
-                       H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
-
-       
-                       //2 Translate 80bit channel map to 40bit channel        
-                       for ( i=0;i<5;i++)
-                       {
-                               for(n=0;n<8;n++)
-                               {
-                                       cur_byte_idx = i*2 + n/4;
-                                       cur_bit_idx = (n%4)*2;
-                                       if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
-                                               H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
-                               }
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
-                       }
-       
-                       //3 To Compare the difference
-                       for ( i=0;i<5;i++)
-                       {
-                               if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
-                               {
-                                       FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
-                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("Need to Update the AFH Map \n"));
-                                       break;
-                               }
-                               else
-                               {
-                                       if(i==5)
-                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Not need to Update\n"));  
-                               }
-                       }
-                       if(pDM_Odm->bBtHsOperation)
-                       {
-                               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);
-                               ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));             
-                       }
-                       else
-                       {
-                               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);
-                               ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));             
-               }
-       }
-    }
-}
-/*
-//Neil for Get BT RSSI
-// Be Triggered by BT C2H CMD
-VOID
-ODM_PSDGetRSSI(
-       IN      u1Byte  RSSI_BT)
-{
-
-
-}
-
-*/
-
-VOID
-ODM_PSDMonitor(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-       
-       //if(IS_HARDWARE_TYPE_8723AE(Adapter))
-       
-       if(pDM_Odm->SupportICType == ODM_RTL8723A)   //may need to add other IC type
-       {
-               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
-               {
-                       if(pDM_Odm->bBtDisabled) //need to check upper layer connection
-                       {
-                               pDM_Odm->bPSDactive=FALSE;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
-                               return; 
-                       }
-
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
-               //{
-                       pDM_Odm->bPSDinProcess = TRUE;
-                       pDM_Odm->bPSDactive=TRUE;
-                       odm_PSD_Monitor(pDM_Odm);
-                       pDM_Odm->bPSDinProcess = FALSE;
-               }       
-       }       
-
-}
-VOID
-odm_PSDMonitorCallback(
-       PRT_TIMER               pTimer
-)
-{
-       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-
-       PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
-}
-
-VOID
-odm_PSDMonitorWorkItemCallback(
-    IN PVOID            pContext
-    )
-{
-       PADAPTER        Adapter = (PADAPTER)pContext;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-
-       ODM_PSDMonitor(pDM_Odm);
-}
-
-// <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
-VOID
-odm_RFEControl(
-       IN      PDM_ODM_T       pDM_Odm,
-       IN  u8Byte              RSSIVal
-       )
-{
-       PADAPTER                Adapter = (PADAPTER)pDM_Odm->Adapter;
-    HAL_DATA_TYPE      *pHalData = GET_HAL_DATA(Adapter);
-       static u1Byte   TRSW_HighPwr = 0;
-        
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
-                        RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
-
-    if (pHalData->RFEType == 3) {         
-               
-        pDM_Odm->RSSI_TRSW = RSSIVal;
-
-        if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) 
-               {                                
-            TRSW_HighPwr = 1; // Switch to
-            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
-            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control
-            
-        } 
-               else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) 
-        {        
-            TRSW_HighPwr = 0; // Switched back
-            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
-            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control
-
-        }
-    }  
-
-       
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));               
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n", 
-                                RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));        
-}
-
-VOID
-ODM_MPT_DIG(
-       IN      PDM_ODM_T       pDM_Odm
-       )
-{
-       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
-       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
-       u1Byte                                          CurrentIGI = (u1Byte)pDM_DigTable->CurIGValue;
-       u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20, C50, E50;
-       u8Byte                                          RXOK_cal;
-       u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;
-
-#if ODM_FIX_2G_DIG
-       IGI_A = 0x22;
-       IGI_B = 0x24;           
-#endif
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
-
-       odm_FalseAlarmCounterStatistics( pDM_Odm);
-       pDM_Odm->LastNumQryPhyStatusAll = pDM_Odm->NumQryPhyStatusAll;
-       pDM_Odm->NumQryPhyStatusAll = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
-       RXOK_cal = pDM_Odm->NumQryPhyStatusAll - pDM_Odm->LastNumQryPhyStatusAll;
-       
-       if (RXOK_cal == 0)
-               pDM_Odm->RxPWDBAve_final= 0;
-       else
-               pDM_Odm->RxPWDBAve_final= pDM_Odm->RxPWDBAve/RXOK_cal;
-
-       pDM_Odm->RxPWDBAve = 0;
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
-       
-       // <20130315, Kordan> Except Cameo, we should always trun on 2.4G/5G DIG.
-       // (Cameo fixes the IGI of 2.4G, so only DIG on 5G. Asked by James.)
-#if ODM_FIX_2G_DIG
-       if (*pDM_Odm->pBandType == BAND_ON_5G){  // for 5G
-#else
-       if (1){ // for both 2G/5G
-#endif
-               pDM_Odm->MPDIG_2G = FALSE;
-               pDM_Odm->Times_2G = 0;
-       
-               if (RXOK_cal >= 70 && pDM_Odm->RxPWDBAve_final<= 30)
-               {
-                       if (CurrentIGI > 0x24){
-                               ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, 0x24);
-                               ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, 0x24);
-                       }
-               }
-               else
-               {
-                       if(pFalseAlmCnt->Cnt_all > 1000){
-                               CurrentIGI = CurrentIGI + 8;
-                       }
-                       else if(pFalseAlmCnt->Cnt_all > 200){
-                               CurrentIGI = CurrentIGI + 4;
-                       }
-                       else if (pFalseAlmCnt->Cnt_all > 50){
-                               CurrentIGI = CurrentIGI + 2;
-                       }
-                       else if (pFalseAlmCnt->Cnt_all < 2){
-                               CurrentIGI = CurrentIGI - 2;
-                       }
-                       
-                       if (CurrentIGI < DIG_Lower ){
-                               CurrentIGI = DIG_Lower;
-                       }
-                       else if(CurrentIGI > DIG_Upper){
-                               CurrentIGI = DIG_Upper;
-                       }
-                       
-                       pDM_DigTable->CurIGValue = CurrentIGI;
-                       
-                       ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)CurrentIGI);
-                       ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)CurrentIGI);
-
-                       C50 = ODM_Read1Byte( pDM_Odm, 0xc50);
-                       E50 = ODM_Read1Byte( pDM_Odm, 0xe50);
-                       //pDM_Odm->MPDIG_2G = FALSE;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("DIG = (%x, %x), Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", C50, E50, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
-               }
-                       
-       }
-       else
-       {       //2G
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("MPDIG_2G = %d,\n", pDM_Odm->MPDIG_2G));
-               
-               if(pDM_Odm->MPDIG_2G == FALSE){
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> Fix IGI\n"));
-                       ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)IGI_A);
-                       ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)IGI_B);
-               }
-               if (pDM_Odm->Times_2G == 2)
-                       pDM_Odm->MPDIG_2G = TRUE;
-               pDM_Odm->Times_2G++;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
-
-       if (pDM_Odm->SupportICType == ODM_RTL8812)
-               odm_RFEControl(pDM_Odm, pDM_Odm->RxPWDBAve_final);
-       
-       ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
-       
-}              
-
-VOID
-odm_MPT_DIGCallback(
-       PRT_TIMER               pTimer
-)
-{
-       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-         PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
-
-
-       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
-               #if USE_WORKITEM
-                       PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
-               #else
-                       ODM_MPT_DIG(pDM_Odm);
-               #endif
-       #else
-               PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
-       #endif
-
-}
-
-VOID
-odm_MPT_DIGWorkItemCallback(
-    IN PVOID            pContext
-    )
-{
-       PADAPTER        Adapter = (PADAPTER)pContext;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-
-       ODM_MPT_DIG(pDM_Odm);
-}
-
-
-
-
- //cosa debug tool need to modify
-
-VOID
-ODM_PSDDbgControl(
-       IN      PADAPTER        Adapter,
-       IN      u4Byte          mode,
-       IN      u4Byte          btRssi
-       )
-{
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-
-       ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
-       if(mode)
-       {
-               pDM_Odm->RSSI_BT = (u1Byte)btRssi;
-               pDM_Odm->bUserAssignLevel = TRUE;
-               ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms             
-       }
-       else
-       {
-               ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
-       }
-#endif
-}
-
-
-//#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
-
-void   odm_RXHPInit(
-       IN              PDM_ODM_T               pDM_Odm)
-{
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
-       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
-       u1Byte                  index;
-
-       pRX_HP_Table->RXHP_enable = TRUE;
-       pRX_HP_Table->RXHP_flag = 0;
-       pRX_HP_Table->PSD_func_trigger = 0;
-       pRX_HP_Table->Pre_IGI = 0x20;
-       pRX_HP_Table->Cur_IGI = 0x20;
-       pRX_HP_Table->Cur_pw_th = pw_th_10dB;
-       pRX_HP_Table->Pre_pw_th = pw_th_10dB;
-       for(index=0; index<80; index++)
-               pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
-
-#if(DEV_BUS_TYPE == RT_USB_INTERFACE)
-       pRX_HP_Table->TP_Mode = Idle_Mode;
-#endif
-#endif
-}
-
-void odm_RXHP(
-       IN              PDM_ODM_T               pDM_Odm)
-{
-#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
-#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
-       PADAPTER        Adapter =  pDM_Odm->Adapter;
-       PMGNT_INFO      pMgntInfo = &(Adapter->MgntInfo);
-       pDIG_T          pDM_DigTable = &pDM_Odm->DM_DigTable;
-       pRXHP_T         pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
-       PFALSE_ALARM_STATISTICS         FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
-       
-       u1Byte                  i, j, sum;
-       u1Byte                  Is40MHz;
-       s1Byte                  Intf_diff_idx, MIN_Intf_diff_idx = 16;   
-       s4Byte                  cur_channel;    
-       u1Byte                  ch_map_intf_5M[17] = {0};     
-       static u4Byte           FA_TH = 0;      
-       static u1Byte           psd_intf_flag = 0;
-       static s4Byte           curRssi = 0;                
-       static s4Byte           preRssi = 0;                                                                
-       static u1Byte           PSDTriggerCnt = 1;
-       
-       u1Byte                  RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31);   // for debug!!
-
-#if(DEV_BUS_TYPE == RT_USB_INTERFACE)  
-       static s8Byte           lastTxOkCnt = 0, lastRxOkCnt = 0;  
-       s8Byte                  curTxOkCnt, curRxOkCnt;
-       s8Byte                  curTPOkCnt;
-       s8Byte                  TP_Acc3, TP_Acc5;
-       static s8Byte           TP_Buff[5] = {0};
-       static u1Byte           pre_state = 0, pre_state_flag = 0;
-       static u1Byte           Intf_HighTP_flag = 0, De_counter = 16; 
-       static u1Byte           TP_Degrade_flag = 0;
-#endif    
-       static u1Byte           LatchCnt = 0;
-       
-       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))
-               return;
-       //AGC RX High Power Mode is only applied on 2G band in 92D!!!
-       if(pDM_Odm->SupportICType == ODM_RTL8192D)
-       {
-               if(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
-                       return;
-       }
-
-       if(!(pDM_Odm->SupportAbility==ODM_BB_RXHP))
-               return;
-
-
-       //RX HP ON/OFF
-       if(RX_HP_enable == 1)
-               pRX_HP_Table->RXHP_enable = FALSE;
-       else
-               pRX_HP_Table->RXHP_enable = TRUE;
-
-       if(pRX_HP_Table->RXHP_enable == FALSE)
-       {
-               if(pRX_HP_Table->RXHP_flag == 1)
-               {
-                       pRX_HP_Table->RXHP_flag = 0;
-                       psd_intf_flag = 0;
-               }
-               return;
-       }
-
-#if(DEV_BUS_TYPE == RT_USB_INTERFACE)  
-       //2 Record current TP for USB interface
-       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
-       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
-       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
-       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
-
-       curTPOkCnt = curTxOkCnt+curRxOkCnt;
-       TP_Buff[0] = curTPOkCnt;    // current TP  
-       TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
-       TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
-       
-       if(TP_Acc5 < 1000)
-               pRX_HP_Table->TP_Mode = Idle_Mode;
-       else if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
-               pRX_HP_Table->TP_Mode = Low_TP_Mode;
-       else
-               pRX_HP_Table->TP_Mode = High_TP_Mode;
-
-       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
-       // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
-       // When LatchCnt = 0, we would Get PSD result.
-       if(TP_Degrade_flag == 1)
-       {
-               LatchCnt--;
-               if(LatchCnt == 0)
-               {
-                       TP_Degrade_flag = 0;
-               }
-       }
-       // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
-       // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
-       if(Intf_HighTP_flag == 1)
-       {
-               De_counter--;
-               if(De_counter == 0)
-               {
-                       Intf_HighTP_flag = 0;
-                       psd_intf_flag = 0;
-               }
-       }
-#endif
-
-       //2 AGC RX High Power Mode by PSD only applied to STA Mode
-       //3 NOT applied 1. Ad Hoc Mode.
-       //3 NOT applied 2. AP Mode
-       if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
-       {    
-               Is40MHz = *(pDM_Odm->pBandWidth);
-               curRssi = pDM_Odm->RSSI_Min;
-               cur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
-               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
-               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
-               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
-               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
-               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
-               //2 PSD function would be triggered 
-               //3 1. Every 4 sec for PCIE
-               //3 2. Before TP Mode (Idle TP<4kbps) for USB
-               //3 3. After TP Mode (High TP) for USB 
-               if((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0))    // Only RSSI>TH and RX_HP_flag=0 will Do PSD process 
-               {
-#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
-                       //2 Before TP Mode ==> PSD would be trigger every 4 sec
-                       if(pRX_HP_Table->TP_Mode == Idle_Mode)          //2.1 less wlan traffic <4kbps
-                       {
-#endif
-                               if(PSDTriggerCnt == 1)       
-                               {       
-                                       odm_PSD_RXHP(pDM_Odm);
-                                       pRX_HP_Table->PSD_func_trigger = 1;
-                                       PSDTriggerCnt = 0;
-                               }
-                               else
-                               {
-                                       PSDTriggerCnt++;
-                               }
-#if(DEV_BUS_TYPE == RT_USB_INTERFACE)
-                       }       
-                       //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
-                       if(pRX_HP_Table->TP_Mode == High_TP_Mode)
-                       {
-                               if((pre_state_flag == 0)&&(LatchCnt == 0)) 
-                               {
-                                       // TP var < 5%
-                                       if((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
-                                       {
-                                               pre_state++;
-                                               if(pre_state == 3)      // hit pre_state condition => consecutive 3 times
-                                               {
-                                                       pre_state_flag = 1;
-                                                       pre_state = 0;
-                                               }
-
-                                       }
-                                       else
-                                       {
-                                               pre_state = 0;
-                                       }
-                               }
-                               //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
-                               if(pre_state_flag == 1)         
-                               {
-                                       if(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3))      // degrade 20%
-                                       {
-                                               odm_PSD_RXHP(pDM_Odm);
-                                               pRX_HP_Table->PSD_func_trigger = 1;
-                                               TP_Degrade_flag = 1;
-                                               LatchCnt = 2;
-                                               pre_state_flag = 0;
-                                       }
-                                       else if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
-                                       {
-                                               odm_PSD_RXHP(pDM_Odm);
-                                               pRX_HP_Table->PSD_func_trigger = 1;
-                                               TP_Degrade_flag = 1;
-                                               LatchCnt = 2;
-                                               pre_state_flag = 0;
-                                       }
-                                       else if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
-                                       {
-                                               odm_PSD_RXHP(pDM_Odm);
-                                               pRX_HP_Table->PSD_func_trigger = 1;
-                                               TP_Degrade_flag = 1;
-                                               LatchCnt = 2;
-                                               pre_state_flag = 0;
-                                       }
-                               }
-                       }
-#endif
-}
-
-#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
-               for (i=0;i<4;i++)
-               {
-                       TP_Buff[4-i] = TP_Buff[3-i];
-               }
-#endif
-               //2 Update PSD bitmap according to PSD report 
-               if((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
-               {       
-                       //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
-                       for (i = 0 ; i < 16 ; i++)
-                       {
-                               sum = 0;
-                               for(j = 0; j < 5 ; j++)
-                                       sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
-            
-                               if(sum < 5)
-                               {
-                                       ch_map_intf_5M[i] = 1;  // interference flag
-                               }
-                       }
-                       //=============just for debug=========================
-                       //for(i=0;i<16;i++)
-                               //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
-                       //===============================================
-                       //2 Mask target channel 5M index
-                       for(i = 0; i < (4+4*Is40MHz) ; i++)
-                       {
-                               ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;  
-                       }
-                               
-                       psd_intf_flag = 0;
-                       for(i = 0; i < 16; i++)
-                       {
-                               if(ch_map_intf_5M[i] == 1)
-                       {
-                               psd_intf_flag = 1;            // interference is detected!!!    
-                               break;
-                               }
-                       }
-                               
-#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
-                       if(pRX_HP_Table->TP_Mode!=Idle_Mode)
-                       {
-                               if(psd_intf_flag == 1)     // to avoid psd_intf_flag always 1
-                               {
-                                       Intf_HighTP_flag = 1;
-                                       De_counter = 32;     // 0x1E -> 0x3E needs 32 times by each IGI step =1
-                               }
-                       }
-#endif
-                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
-                       //2 Distance between target channel and interference
-                       for(i = 0; i < 16; i++)
-                       {
-                               if(ch_map_intf_5M[i] == 1)
-                               {
-                                       Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));  
-                               if(Intf_diff_idx < MIN_Intf_diff_idx)
-                                               MIN_Intf_diff_idx = Intf_diff_idx;    // the min difference index between interference and target
-                               }
-                       }
-                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx)); 
-                       //2 Choose False Alarm Threshold
-                       switch (MIN_Intf_diff_idx){
-                               case 0: 
-                               case 1:
-                               case 2:
-                               case 3:          
-                                       FA_TH = FA_RXHP_TH1;  
-                               break;
-                               case 4:                         // CH5
-                               case 5:                         // CH6
-                                       FA_TH = FA_RXHP_TH2;    
-                                       break;
-                               case 6:                         // CH7
-                               case 7:                         // CH8
-                                       FA_TH = FA_RXHP_TH3;
-                                       break; 
-                               case 8:                         // CH9
-                               case 9:                         //CH10
-                                       FA_TH = FA_RXHP_TH4;
-                                       break;  
-                               case 10:
-                               case 11:
-                               case 12:
-                               case 13:         
-                               case 14:
-                               case 15:                
-                                       FA_TH = FA_RXHP_TH5;
-                                       break;                  
-                       }       
-                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
-                       pRX_HP_Table->PSD_func_trigger = 0;
-               }
-               //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
-               if(pRX_HP_Table->RXHP_flag == 1)
-               {
-               if ((curRssi > 80)&&(preRssi < 80))
-               { 
-                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
-               }
-               else if ((curRssi < 80)&&(preRssi > 80))
-               {
-                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
-                       }
-               else if ((curRssi > 72)&&(preRssi < 72))
-                       {
-                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
-               }
-               else if ((curRssi < 72)&&( preRssi > 72))
-                       {
-                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
-               }
-               else if (curRssi < 68)           //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
-               {
-                               pRX_HP_Table->Cur_pw_th = pw_th_10dB;
-                               pRX_HP_Table->RXHP_flag = 0;    // Back to Normal DIG Mode                
-                               psd_intf_flag = 0;
-                       }
-               }
-               else    // pRX_HP_Table->RXHP_flag == 0
-               {
-                       //1 Decide whether to enter AGC RX High Power Mode
-                       if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&  
-                               (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
-                       {
-                               if (curRssi > 80)
-                               {
-                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
-                               }
-                               else if (curRssi > 72) 
-                       {
-                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
-                               }
-                               else
-                               {
-                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
-                               }
-                               pRX_HP_Table->Cur_pw_th = pw_th_16dB;           //RegC54[9:8]=2'b11: to enter AGC Flow 3
-                               pRX_HP_Table->First_time_enter = TRUE;
-                               pRX_HP_Table->RXHP_flag = 1;    //      RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
-                       }
-               }
-               preRssi = curRssi; 
-               odm_Write_RXHP(pDM_Odm);        
-       }
-#endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
-#endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
-}
-
-void odm_Write_RXHP(
-       IN      PDM_ODM_T       pDM_Odm)
-{
-       pRXHP_T         pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
-       u4Byte          currentIGI;
-
-       if(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
-       {
-               ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
-               ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);    
-       }
-       
-       if(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
-{
-               ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th);  // RegC54[9:8]=2'b11:  AGC Flow 3
-       }
-
-       if(pRX_HP_Table->RXHP_flag == 0)
-       {
-               pRX_HP_Table->Cur_IGI = 0x20;
-       }
-       else
-       {
-               currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
-               if(currentIGI<0x50)
-               {
-                       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
-                       ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);    
-               }
-       }
-       pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
-       pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
-
-}
 
 VOID
-odm_PSD_RXHP(
-       IN      PDM_ODM_T       pDM_Odm
+odm_PSD_Monitor(
+       PDM_ODM_T       pDM_Odm
 )
 {
-       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
-       PADAPTER                Adapter =  pDM_Odm->Adapter;
-       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
-       unsigned int            pts, start_point, stop_point, initial_gain ;
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       //PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
+
+       unsigned int            pts, start_point, stop_point;
+       u1Byte                  initial_gain ;
        static u1Byte           PSD_bitmap_memory[80], init_memory = 0;
        static u1Byte           psd_cnt=0;
        static u4Byte           PSD_report[80], PSD_report_tmp;
        static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       u1Byte                  H2C_PSD_DATA[5]={0,0,0,0,0};
+       static u1Byte           H2C_PSD_DATA_last[5] ={0,0,0,0,0};
        u1Byte                  idx[20]={96,99,102,106,109,112,115,118,122,125,
                                        0,3,6,10,13,16,19,22,26,29};
        u1Byte                  n, i, channel, BBReset,tone_idx;
-       u1Byte                  PSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
+       u1Byte                  PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
        s4Byte                          PSD_skip_start, PSD_skip_stop;
        u4Byte                  CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
        u4Byte                  ReScan, Interval, Is40MHz;
        u8Byte                  curTxOkCnt, curRxOkCnt;
-       //--------------2G band synthesizer for 92D switch RF channel using----------------- 
-       u1Byte                  group_idx=0;
-       u4Byte                  SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
-       u4Byte                  SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C};    // synthesizer RF register for 2G channel
-       u4Byte                  SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},     // For CH1,2,4,9,10.11.12   {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
-                                                                           {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},     // For CH3,13,14
-                                                                           {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}};   // For Ch5,6,7,8
-       //--------------------- Add by Gary for Debug setting ----------------------
-       u1Byte                 RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
-       u1Byte                 rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
-       //---------------------------------------------------------------------
+       int                             cur_byte_idx, cur_bit_idx;
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
        
-       if(pMgntInfo->bScanInProgress)
+       if( (*(pDM_Odm->pbScanInProcess)) ||
+               pDM_Odm->bLinkInProcess)
        {
+               if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
+               {
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms  
+                       //psd_cnt=0;
+               }
                return;
        }
 
+       if(pDM_Odm->bBtHsOperation)
+       {
+               ReScan = 1;
+               Interval = SCAN_INTERVAL;
+       }
+       else
+       {
        ReScan = PSD_RESCAN;
        Interval = SCAN_INTERVAL;
-
+       }
 
        //1 Initialization
        if(init_memory == 0)
        {
-               RT_TRACE(       COMP_PSD, DBG_LOUD,("Init memory\n"));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
                for(i = 0; i < 80; i++)
                        PSD_bitmap_memory[i] = 0xFF; // channel is always good
                init_memory = 1;
        }
        if(psd_cnt == 0)
        {
-               RT_TRACE(COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
                for(i = 0; i < 80; i++)
                        PSD_report[i] = 0;
        }
 
        //1 Backup Current Settings
        CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
-       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+/*
+       if(pDM_Odm->SupportICType==ODM_RTL8192D)
        {
                //2 Record Current synthesizer parameters based on current channel
-               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
+               if((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))
                {
-                       SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);
-                       SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);
-                       SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);
-                       SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);
-                       SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);
+                       SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);
                }
                else     // DualMAC_DualPHY 2G
                {
-                       SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);
-                       SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);
-                       SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);
-                       SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);
-                       SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);
+                       SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);
                }
        }
+*/
+       //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
        RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
+
+       //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
        RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
-       Is40MHz = *(pDM_Odm->pBandWidth);
-       ODM_RT_TRACE(pDM_Odm,   COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
+
+       //2???
+       if(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))
+               Is40MHz = TRUE;
+       else
+               Is40MHz = FALSE;
+
+       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
        //1 Turn off CCK
+       //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
        ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
        //1 Turn off TX
        //Pause TX Queue
-       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
+       //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
+       ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
+       
        //Force RX to stop TX immediately
+       //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
+
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
        //1 Turn off RX
        //Rx AGC off  RegC70[0]=0, RegC7C[20]=0
+       //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
+       //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
+
        ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
        ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
+
+       
        //Turn off CCA
+       //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
        ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
+       
        //BB Reset
-       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess 
+       //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
        BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
-       ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
-       ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
+       
+       //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
+       //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess 
+       ODM_Write1Byte(pDM_Odm,  0x02, BBReset&(~BIT0));
+       ODM_Write1Byte(pDM_Odm,  0x02, BBReset|BIT0);
        ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
+       
        //1 Leave RX idle low power
+       //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
+
        ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
        //1 Fix initial gain
-       RSSI_BT = RSSI_BT_new;
-       RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+       //if (IS_HARDWARE_TYPE_8723AE(Adapter))
+       //RSSI_BT = pHalData->RSSI_BT;
+       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))      // Add by Gary
+       //    RSSI_BT = RSSI_BT_new;
+
+       if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
+       RSSI_BT=pDM_Odm->RSSI_BT;               //need to check C2H to pDM_Odm RSSI BT
+
+       if(RSSI_BT>=47)
+               RSSI_BT=47;
+          
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
        
-       if(rssi_ctrl == 1)        // just for debug!!
-               initial_gain_psd = RSSI_BT_new; 
-       else
-               initial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       {
+              //Neil add--2011--10--12
+               //2 Initial Gain index 
+               if(RSSI_BT >=35)   // >= -15dBm
+                       initial_gain_psd = RSSI_BT*2;
+               else if((RSSI_BT >=33)&(RSSI_BT<35))
+                       initial_gain_psd = RSSI_BT*2+6;
+               else if((RSSI_BT >=24)&(RSSI_BT<33))
+                       initial_gain_psd = 70-(33-RSSI_BT);
+               else if((RSSI_BT >=19)&(RSSI_BT<24))
+                       initial_gain_psd = 64-((24-RSSI_BT)*4);
+               else if((RSSI_BT >=14)&(RSSI_BT<19))
+                       initial_gain_psd = 44-((18-RSSI_BT)*2);
+               else if((RSSI_BT >=8)&(RSSI_BT<14))
+                       initial_gain_psd = 35-(14-RSSI_BT);
+               else
+                       initial_gain_psd = 0x1B;
+       }
+       else
+       {
        
-       RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+               //need to do    
+               initial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI
+               //}     
+       }
+       //if(RSSI_BT<0x17)
+       //      RSSI_BT +=3;
+       //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+
+       //initialGainUpper = 0x5E;  //Modify by neil chen
        
-       initialGainUpper = 0x54;
+       if(pDM_Odm->bUserAssignLevel)
+       {
+               pDM_Odm->bUserAssignLevel = FALSE;
+               initialGainUpper = 0x7f;
+       }
+       else
+       {
+               initialGainUpper = 0x5E;
+       }
        
-       RSSI_BT = initial_gain_psd;
-       //SSBT = RSSI_BT;
+       /*
+       if (initial_gain_psd < 0x1a)
+               initial_gain_psd = 0x1a;
+       if (initial_gain_psd > initialGainUpper)
+               initial_gain_psd = initialGainUpper;
+       */
+
+       //if(pDM_Odm->SupportICType==ODM_RTL8723A)
+       SSBT = RSSI_BT  * 2 +0x3E;
        
-       //RT_TRACE(     COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
-       RT_TRACE(       COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
        
-       pDM_Odm->bDMInitialGainEnable = FALSE;          
-       initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
-       //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd); 
+       //if(IS_HARDWARE_TYPE_8723AE(Adapter))
+       //      SSBT = RSSI_BT  * 2 +0x3E;
+       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))   // Add by Gary
+       //{
+       //      RSSI_BT = initial_gain_psd;
+       //      SSBT = RSSI_BT;
+       //}
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
+       ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
+       //DbgPrint("PSD: SSBT= %d", SSBT);
+       //need to do
+       //pMgntInfo->bDMInitialGainEnable = FALSE;
+       pDM_Odm->bDMInitialGainEnable = FALSE;
+       initial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);
+       
+        // make sure the initial gain is under the correct range.
+       //initial_gain_psd &= 0x7f;
        ODM_Write_DIG(pDM_Odm, initial_gain_psd);
        //1 Turn off 3-wire
        ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
@@ -11766,69 +6054,92 @@ odm_PSD_RXHP(
        
 
 //3 Skip WLAN channels if WLAN busy
+
        curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
        curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
        lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
-       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
-       
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);   
+
        PSD_skip_start=80;
        PSD_skip_stop = 0;
        wlan_channel = CurrentChannel & 0x0f;
 
-       RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
-       
-       if((curRxOkCnt+curTxOkCnt) > 1000)
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
+       if(pDM_Odm->SupportICType==ODM_RTL8723A)
        {
-               PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
-               PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
+               if(pDM_Odm->bBtHsOperation)
+               {
+                       if(pDM_Odm->bLinked)
+                       {
+                               if(Is40MHz)
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
+                               }
+                               else
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; 
+                               }
+                       }
+                       else
+                       {
+                               // mask for 40MHz
+                               PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
+                               PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
+                       }
+                       if(PSD_skip_start < 0)
+                               PSD_skip_start = 0;
+                       if(PSD_skip_stop >80)
+                               PSD_skip_stop = 80;
+               }
+               else
+               {
+                       if((curRxOkCnt+curTxOkCnt) > 5)
+                       {
+                               if(Is40MHz)
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
+                               }
+                               else
+                               {
+                                       PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask
+                                       PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; 
+                               }
+                               
+                               if(PSD_skip_start < 0)
+                                       PSD_skip_start = 0;
+                               if(PSD_skip_stop >80)
+                                       PSD_skip_stop = 80;
+                       }
+               }
        }
-
-       RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
+#if 0  
+       else
+       {
+               if((curRxOkCnt+curTxOkCnt) > 1000)
+               {
+                       PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
+                       PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
+               }
+       }   
+#endif  //Reove RXHP Issue
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
 
        for (n=0;n<80;n++)
        {
                if((n%20)==0)
                {
                        channel = (n/20)*4 + 1;
-                       if(pDM_Odm->SupportICType == ODM_RTL8192D)
-                       {
-                               switch(channel)
-                               {
-                                       case 1: 
-                                       case 9:
-                                               group_idx = 0;
-                                               break;
-                                       case 5:
-                                               group_idx = 2;
-                                               break;
-                                       case 13:
-                                               group_idx = 1;
-                                               break;
-                               }
-                               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))   
-               {
-                                       for(i = 0; i < SYN_Length; i++)
-                                               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
-
-                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
-                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
-                               }
-                               else  // DualMAC_DualPHY 2G
-                       {
-                                       for(i = 0; i < SYN_Length; i++)
-                                               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);   
                                        
                                        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
                                }
-                       }
-                       else
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
-                       }       
                tone_idx = n%20;
                if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
                {       
-                       PSD_report[n] = initial_gain_psd;//SSBT;
-                       ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
+                       PSD_report[n] = SSBT;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
                }
                else
                {
@@ -11851,36 +6162,19 @@ odm_PSD_RXHP(
        ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
        //1 Turn on TX
        //Resume TX Queue
-       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
+       
+       ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
        //Turn on 3-wire
        ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
        //1 Restore Current Settings
        //Resume DIG
-       pDM_Odm->bDMInitialGainEnable= TRUE;
-       //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
-       ODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);
+       pDM_Odm->bDMInitialGainEnable = TRUE;
+       
+       ODM_Write_DIG(pDM_Odm, initial_gain);
+
        // restore originl center frequency
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
-       if(pDM_Odm->SupportICType == ODM_RTL8192D)
-       {
-               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
-               {
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
-               }
-               else     // DualMAC_DualPHY
-               {
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
-                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
-               }
-       }
+
        //Turn on CCA
        ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
        //Restore RX idle low power
@@ -11888,1503 +6182,914 @@ odm_PSD_RXHP(
                ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
        
        psd_cnt++;
-       //gPrint("psd cnt=%d\n", psd_cnt);
-       ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
        if (psd_cnt < ReScan)
-       {
-               ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval);  //ms
-       }
+               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);            
        else
-                       {       
+       {
                psd_cnt = 0;
                for(i=0;i<80;i++)
-                       RT_TRACE(       COMP_PSD, DBG_LOUD,("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]));
                        //DbgPrint("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]);
+                       RT_TRACE(       COMP_PSD, DBG_LOUD,("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]));
+
 
                GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
 
-                       }
-               }
+               if(pDM_Odm->SupportICType==ODM_RTL8723A)
+               {
+                       cur_byte_idx=0;
+                       cur_bit_idx=0;
+
+                       //2 Restore H2C PSD Data to Last Data
+                       H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
+                       H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
+                       H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
+                       H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
+                       H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
 
-VOID
-odm_PSD_RXHPCallback(
-       PRT_TIMER               pTimer
-)
-{
-       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
        
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-       #if USE_WORKITEM
-       ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
-       #else
-       odm_PSD_RXHP(pDM_Odm);
-       #endif
-#else
-       ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
-#endif
+                       //2 Translate 80bit channel map to 40bit channel        
+                       for ( i=0;i<5;i++)
+                       {
+                               for(n=0;n<8;n++)
+                               {
+                                       cur_byte_idx = i*2 + n/4;
+                                       cur_bit_idx = (n%4)*2;
+                                       if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
+                                               H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
+                               }
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
+                       }
        
+                       //3 To Compare the difference
+                       for ( i=0;i<5;i++)
+                       {
+                               if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
+                               {
+                                       FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("Need to Update the AFH Map \n"));
+                                       break;
+                               }
+                               else
+                               {
+                                       if(i==5)
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Not need to Update\n"));  
+                               }
+                       }
+                       if(pDM_Odm->bBtHsOperation)
+                       {
+                               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);
+                               ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));             
+                       }
+                       else
+                       {
+                               ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);
+                               ODM_RT_TRACE(   pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));             
+               }
        }
-
-VOID
-odm_PSD_RXHPWorkitemCallback(
-    IN PVOID            pContext
-    )
-{
-       PADAPTER        pAdapter = (PADAPTER)pContext;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-       
-       odm_PSD_RXHP(pDM_Odm);
+    }
 }
-
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
+/*
+//Neil for Get BT RSSI
+// Be Triggered by BT C2H CMD
 VOID
-odm_PathDiversityInit(
-       IN      PDM_ODM_T       pDM_Odm
-)
+ODM_PSDGetRSSI(
+       IN      u1Byte  RSSI_BT)
 {
-       if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
-       {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
-               return;
-       }
 
-#if RTL8812A_SUPPORT
 
-       if(pDM_Odm->SupportICType & ODM_RTL8812)
-               ODM_PathDiversityInit_8812A(pDM_Odm);
-#endif 
 }
 
+*/
 
 VOID
-odm_PathDiversity(
+ODM_PSDMonitor(
        IN      PDM_ODM_T       pDM_Odm
-)
+       )
 {
-       if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+       //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+       
+       //if(IS_HARDWARE_TYPE_8723AE(Adapter))
+       
+       if(pDM_Odm->SupportICType == ODM_RTL8723A)   //may need to add other IC type
        {
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
-               return;
-       }
+               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
+               {
+                       if(!pDM_Odm->bBtEnabled) //need to check upper layer connection
+                       {
+                               pDM_Odm->bPSDactive=FALSE;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
+                               return; 
+                       }
 
-#if RTL8812A_SUPPORT
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
+               //{
+                       pDM_Odm->bPSDinProcess = TRUE;
+                       pDM_Odm->bPSDactive=TRUE;
+                       odm_PSD_Monitor(pDM_Odm);
+                       pDM_Odm->bPSDinProcess = FALSE;
+               }       
+       }       
 
-       if(pDM_Odm->SupportICType & ODM_RTL8812)
-               ODM_PathDiversity_8812A(pDM_Odm);
-#endif 
 }
-
-
-//
-// 2011/12/02 MH Copy from MP oursrc for temporarily test.
-//
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 VOID
-odm_OFDMTXPathDiversity_92C(
-       IN      PADAPTER        Adapter)
+odm_PSDMonitorCallback(
+       PRT_TIMER               pTimer
+)
 {
-//     HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
-       PRT_WLAN_STA    pEntry;
-       u1Byte  i, DefaultRespPath = 0;
-       s4Byte  MinRSSI = 0xFF;
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
-       pDM_PDTable->OFDMTXPath = 0;
-       
-       //1 Default Port
-       if(pMgntInfo->mAssoc)
-       {
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
-                       Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
-               if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
-               {
-                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
-                       MinRSSI =  Adapter->RxStats.RxRSSIPercentage[1];
-                       DefaultRespPath = 0;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
-               }
-               else
-               {
-                       pDM_PDTable->OFDMTXPath =  pDM_PDTable->OFDMTXPath | BIT0;
-                       MinRSSI =  Adapter->RxStats.RxRSSIPercentage[0];
-                       DefaultRespPath = 1;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
-               }
-               //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));
-       }
-       //1 Extension Port
-       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
-       {
-               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
-                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
-               else
-                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+
+       PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
+}
 
-               if(pEntry!=NULL)
-               {
-                       if(pEntry->bAssociated)
-                       {
-                               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n", 
-                                       pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
-                               
-                               if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
-                               {
-                                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));
-                                       //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));
-                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId));
-                                       if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
-                                       {
-                                               MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
-                                               DefaultRespPath = 0;
-                                       }
-                               }
-                               else
-                               {
-                                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);
-                                       //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));
-                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId));
-                                       if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
-                                       {
-                                               MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
-                                               DefaultRespPath = 1;
-                                       }
-                               }
-                       }
-               }
-               else
-               {
-                       break;
-               }
-       }
+VOID
+odm_PSDMonitorWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
 
-       pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
+       ODM_PSDMonitor(pDM_Odm);
 }
 
+//Remove by Yuchen (seperate to odm_DIG.c)
 
-BOOLEAN
-odm_IsConnected_92C(
-       IN      PADAPTER        Adapter
-)
+ //cosa debug tool need to modify
+
+VOID
+ODM_PSDDbgControl(
+       IN      PADAPTER        Adapter,
+       IN      u4Byte          mode,
+       IN      u4Byte          btRssi
+       )
 {
-       PRT_WLAN_STA    pEntry;
-       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
-       u4Byte          i;
-       BOOLEAN         bConnected=FALSE;
-       
-       if(pMgntInfo->mAssoc)
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
+       if(mode)
        {
-               bConnected = TRUE;
+               pDM_Odm->RSSI_BT = (u1Byte)btRssi;
+               pDM_Odm->bUserAssignLevel = TRUE;
+               ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms             
        }
        else
        {
-               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
-               {
-                       if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
-                               pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
-                       else
-                               pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
-
-                       if(pEntry!=NULL)
-                       {
-                               if(pEntry->bAssociated)
-                               {
-                                       bConnected = TRUE;
-                                       break;
-                               }
-                       }
-                       else
-                       {
-                               break;
-                       }
-               }
+               ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
        }
-       return  bConnected;
+#endif
 }
 
 
-VOID
-odm_ResetPathDiversity_92C(
-               IN      PADAPTER        Adapter
-)
+//#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
+
+void   odm_RXHPInit(
+       IN              PDM_ODM_T               pDM_Odm)
 {
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
-       PRT_WLAN_STA    pEntry;
-       u4Byte  i,j;
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       u1Byte                  index;
+
+       pRX_HP_Table->RXHP_enable = TRUE;
+       pRX_HP_Table->RXHP_flag = 0;
+       pRX_HP_Table->PSD_func_trigger = 0;
+       pRX_HP_Table->Pre_IGI = 0x20;
+       pRX_HP_Table->Cur_IGI = 0x20;
+       pRX_HP_Table->Cur_pw_th = pw_th_10dB;
+       pRX_HP_Table->Pre_pw_th = pw_th_10dB;
+       for(index=0; index<80; index++)
+               pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
+
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)
+       pRX_HP_Table->TP_Mode = Idle_Mode;
+#endif
+#endif
+}
 
-       pHalData->RSSI_test = FALSE;
-       pDM_PDTable->CCK_Pkt_Cnt = 0;
-       pDM_PDTable->OFDM_Pkt_Cnt = 0;
-       pHalData->CCK_Pkt_Cnt =0;
-       pHalData->OFDM_Pkt_Cnt =0;
+void odm_RXHP(
+       IN              PDM_ODM_T               pDM_Odm)
+{
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
+       PADAPTER        Adapter =  pDM_Odm->Adapter;
+       PMGNT_INFO      pMgntInfo = &(Adapter->MgntInfo);
+       pDIG_T          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       pRXHP_T         pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+       
+       u1Byte                  i, j, sum;
+       u1Byte                  Is40MHz;
+       s1Byte                  Intf_diff_idx, MIN_Intf_diff_idx = 16;   
+       s4Byte                  cur_channel;    
+       u1Byte                  ch_map_intf_5M[17] = {0};     
+       static u4Byte           FA_TH = 0;      
+       static u1Byte           psd_intf_flag = 0;
+       static s4Byte           curRssi = 0;                
+       static s4Byte           preRssi = 0;                                                                
+       static u1Byte           PSDTriggerCnt = 1;
        
-       if(pDM_PDTable->CCKPathDivEnable == TRUE)       
-               PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); //RX path = PathAB
+       u1Byte                  RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31);   // for debug!!
 
-       for(i=0; i<2; i++)
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)  
+       static s8Byte           lastTxOkCnt = 0, lastRxOkCnt = 0;  
+       s8Byte                  curTxOkCnt, curRxOkCnt;
+       s8Byte                  curTPOkCnt;
+       s8Byte                  TP_Acc3, TP_Acc5;
+       static s8Byte           TP_Buff[5] = {0};
+       static u1Byte           pre_state = 0, pre_state_flag = 0;
+       static u1Byte           Intf_HighTP_flag = 0, De_counter = 16; 
+       static u1Byte           TP_Degrade_flag = 0;
+#endif    
+       static u1Byte           LatchCnt = 0;
+       
+       if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))
+               return;
+       //AGC RX High Power Mode is only applied on 2G band in 92D!!!
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
        {
-               pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
-               pDM_PDTable->RSSI_CCK_Path[i] = 0;
+               if(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
+                       return;
        }
-       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
-       {
-               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
-                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
-               else
-                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
 
-               if(pEntry!=NULL)
+       if(!(pDM_Odm->SupportAbility==ODM_BB_RXHP))
+               return;
+
+
+       //RX HP ON/OFF
+       if(RX_HP_enable == 1)
+               pRX_HP_Table->RXHP_enable = FALSE;
+       else
+               pRX_HP_Table->RXHP_enable = TRUE;
+
+       if(pRX_HP_Table->RXHP_enable == FALSE)
+       {
+               if(pRX_HP_Table->RXHP_flag == 1)
                {
-                       pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
-                       pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
-                       for(j=0; j<2; j++)
-                       {
-                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;
-                               pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
-                       }
+                       pRX_HP_Table->RXHP_flag = 0;
+                       psd_intf_flag = 0;
                }
-               else
-                       break;
+               return;
        }
-}
 
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)  
+       //2 Record current TP for USB interface
+       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
+       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
+       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
 
-VOID
-odm_CCKTXPathDiversity_92C(
-       IN      PADAPTER        Adapter
-)
-{
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
-       PRT_WLAN_STA    pEntry;
-       s4Byte  MinRSSI = 0xFF;
-       u1Byte  i, DefaultRespPath = 0;
-//     BOOLEAN bBModePathDiv = FALSE;
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       curTPOkCnt = curTxOkCnt+curRxOkCnt;
+       TP_Buff[0] = curTPOkCnt;    // current TP  
+       TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
+       TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
+       
+       if(TP_Acc5 < 1000)
+               pRX_HP_Table->TP_Mode = Idle_Mode;
+       else if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
+               pRX_HP_Table->TP_Mode = Low_TP_Mode;
+       else
+               pRX_HP_Table->TP_Mode = High_TP_Mode;
 
-       //1 Default Port
-       if(pMgntInfo->mAssoc)
+       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
+       // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
+       // When LatchCnt = 0, we would Get PSD result.
+       if(TP_Degrade_flag == 1)
        {
-               if(pHalData->OFDM_Pkt_Cnt == 0)
+               LatchCnt--;
+               if(LatchCnt == 0)
                {
-                       for(i=0; i<2; i++)
-                       {
-                               if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
-                                       pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
-                               else
-                                       pDM_PDTable->RSSI_CCK_Path[i] = 0;
-                       }
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
-                               pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n",
-                               pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
-               
-                       if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
-                       {
-                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
-                               MinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];
-                               DefaultRespPath = 0;
-                               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
-                       }
-                       else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
-                       {
-                               pDM_PDTable->CCKTXPath =  pDM_PDTable->CCKTXPath | BIT0;
-                               MinRSSI =  pDM_PDTable->RSSI_CCK_Path[0];
-                               DefaultRespPath = 1;
-                               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
-                       }
-                       else
-                       {
-                               if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
-                               {
-                                       pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
-                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
-                                       MinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];
-                                       DefaultRespPath = 0;
-                               }
-                               else
-                               {
-                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
-                               }
-                       }
+                       TP_Degrade_flag = 0;
                }
-               else //Follow OFDM decision
+       }
+       // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
+       // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
+       if(Intf_HighTP_flag == 1)
+       {
+               De_counter--;
+               if(De_counter == 0)
                {
-                       pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
-                               pDM_PDTable->CCKTXPath &BIT0));
+                       Intf_HighTP_flag = 0;
+                       psd_intf_flag = 0;
                }
        }
-       //1 Extension Port
-       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
-       {
-               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
-                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
-               else
-                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+#endif
 
-               if(pEntry!=NULL)
+       //2 AGC RX High Power Mode by PSD only applied to STA Mode
+       //3 NOT applied 1. Ad Hoc Mode.
+       //3 NOT applied 2. AP Mode
+       if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
+       {    
+               Is40MHz = *(pDM_Odm->pBandWidth);
+               curRssi = pDM_Odm->RSSI_Min;
+               cur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
+               //2 PSD function would be triggered 
+               //3 1. Every 4 sec for PCIE
+               //3 2. Before TP Mode (Idle TP<4kbps) for USB
+               //3 3. After TP Mode (High TP) for USB 
+               if((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0))    // Only RSSI>TH and RX_HP_flag=0 will Do PSD process 
                {
-                       if(pEntry->bAssociated)
+#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
+                       //2 Before TP Mode ==> PSD would be trigger every 4 sec
+                       if(pRX_HP_Table->TP_Mode == Idle_Mode)          //2.1 less wlan traffic <4kbps
+                       {
+#endif
+                               if(PSDTriggerCnt == 1)       
+                               {       
+                                       odm_PSD_RXHP(pDM_Odm);
+                                       pRX_HP_Table->PSD_func_trigger = 1;
+                                       PSDTriggerCnt = 0;
+                               }
+                               else
+                               {
+                                       PSDTriggerCnt++;
+                               }
+#if(DEV_BUS_TYPE == RT_USB_INTERFACE)
+                       }       
+                       //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
+                       if(pRX_HP_Table->TP_Mode == High_TP_Mode)
                        {
-                               if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
+                               if((pre_state_flag == 0)&&(LatchCnt == 0)) 
                                {
-                                       u1Byte j=0;
-                                       for(j=0; j<2; j++)
-                                       {
-                                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)
-                                                       pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);
-                                               else
-                                                       pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
-                                       }
-                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n", 
-                                               pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
-                                       
-                                       if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
-                                       {
-                                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
-                                               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
-                                               if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
-                                               {
-                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
-                                                       DefaultRespPath = 0;
-                                               }
-                                       }
-                                       else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
+                                       // TP var < 5%
+                                       if((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
                                        {
-                                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);
-                                               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId));
-                                               if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
+                                               pre_state++;
+                                               if(pre_state == 3)      // hit pre_state condition => consecutive 3 times
                                                {
-                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
-                                                       DefaultRespPath = 1;
+                                                       pre_state_flag = 1;
+                                                       pre_state = 0;
                                                }
+
                                        }
                                        else
                                        {
-                                               if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
-                                               {
-                                                       pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
-                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
-                                                       DefaultRespPath = 0;
-                                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
-                                               }
-                                               else
-                                               {
-                                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId));
-                                               }
+                                               pre_state = 0;
                                        }
                                }
-                               else //Follow OFDM decision
+                               //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
+                               if(pre_state_flag == 1)         
                                {
-                                       pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));
-                                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
-                                               pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));
+                                       if(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3))      // degrade 20%
+                                       {
+                                               odm_PSD_RXHP(pDM_Odm);
+                                               pRX_HP_Table->PSD_func_trigger = 1;
+                                               TP_Degrade_flag = 1;
+                                               LatchCnt = 2;
+                                               pre_state_flag = 0;
+                                       }
+                                       else if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
+                                       {
+                                               odm_PSD_RXHP(pDM_Odm);
+                                               pRX_HP_Table->PSD_func_trigger = 1;
+                                               TP_Degrade_flag = 1;
+                                               LatchCnt = 2;
+                                               pre_state_flag = 0;
+                                       }
+                                       else if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
+                                       {
+                                               odm_PSD_RXHP(pDM_Odm);
+                                               pRX_HP_Table->PSD_func_trigger = 1;
+                                               TP_Degrade_flag = 1;
+                                               LatchCnt = 2;
+                                               pre_state_flag = 0;
+                                       }
                                }
                        }
-               }
-               else
-               {
-                       break;
-               }
-       }
-
-       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
-
-       if(MinRSSI == 0xFF)
-               DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
-
-       pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
+#endif
 }
 
-
-
-VOID
-odm_PathDiversityAfterLink_92C(
-       IN      PADAPTER        Adapter
-)
-{
-       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-       pPD_T           pDM_PDTable = &Adapter->DM_PDTable;
-       u1Byte          DefaultRespPath=0;
-
-       if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
-       {
-               if(pHalData->PathDivCfg == 0)
-               {
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
-               }
-               else
-               {
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
-               }
-               return;
-       }
-       if(!odm_IsConnected_92C(Adapter))
-       {
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
-               return;
-       }
-       
-       
-       if(pDM_PDTable->TrainingState == 0)
-       {
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
-               odm_OFDMTXPathDiversity_92C(Adapter);
-
-               if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
-               {
-                       //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
-                       
-                       if(pDM_PDTable->CCK_Pkt_Cnt > 300)
-                               pDM_PDTable->Timer = 20;
-                       else if(pDM_PDTable->CCK_Pkt_Cnt > 100)
-                               pDM_PDTable->Timer = 60;
-                       else
-                               pDM_PDTable->Timer = 250;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
-
-                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // RX path = PathA
-                       pDM_PDTable->TrainingState = 1;
-                       pHalData->RSSI_test = TRUE;
-                       ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
-               }
-               else
-               {
-                       pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
-                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
-                       odm_SetRespPath_92C(Adapter, DefaultRespPath);
-                       odm_ResetPathDiversity_92C(Adapter);
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
-               }
-       }
-       else if(pDM_PDTable->TrainingState == 1)
-       {
-               //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));
-               PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // RX path = PathB
-               pDM_PDTable->TrainingState = 2;
-               ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
-       }
-       else
-       {
-               //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));
-               pDM_PDTable->TrainingState = 0; 
-               odm_CCKTXPathDiversity_92C(Adapter); 
-               if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
-               {
-                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
-               }
-               else
+#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
+               for (i=0;i<4;i++)
                {
-                       DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
-                       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
+                       TP_Buff[4-i] = TP_Buff[3-i];
                }
-               odm_SetRespPath_92C(Adapter, DefaultRespPath);
-               odm_ResetPathDiversity_92C(Adapter);
-               RT_TRACE(       COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
-       }
-
-}
-
-
-
-VOID
-odm_CCKTXPathDiversityCallback(
-       PRT_TIMER               pTimer
-)
-{
-#if USE_WORKITEM
-       PADAPTER        Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-          PDM_ODM_T            pDM_Odm = &pHalData->DM_OutSrc;
-#else
-       PADAPTER        Adapter = (PADAPTER)pTimer->Adapter;
-#endif
-
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-#if USE_WORKITEM
-       PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
-#else
-       odm_PathDiversityAfterLink_92C(Adapter);
-#endif
-#else
-       PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
-#endif
-
-}
-
-
-VOID
-odm_CCKTXPathDiversityWorkItemCallback(
-    IN PVOID            pContext
-    )
-{
-       PADAPTER        Adapter = (PADAPTER)pContext;
-
-       odm_CCKTXPathDiversity_92C(Adapter);
-}
-
-
-VOID
-ODM_CCKPathDiversityChkPerPktRssi(
-       PADAPTER                Adapter,
-       BOOLEAN                 bIsDefPort,
-       BOOLEAN                 bMatchBSSID,
-       PRT_WLAN_STA    pEntry,
-       PRT_RFD                 pRfd,
-       pu1Byte                 pDesc
-       )
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       BOOLEAN                 bCount = FALSE;
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
-       //BOOLEAN       isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
-#if DEV_BUS_TYPE != RT_SDIO_INTERFACE
-       BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
-#else  //below code would be removed if we have verified SDIO
-       BOOLEAN isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
 #endif
-
-       if((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))
-               return;
-               
-       if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
-               bCount = TRUE;
-       else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
-               bCount = TRUE;
-
-       if(bCount && isCCKrate)
-       {
-               if(pDM_PDTable->TrainingState == 1 )
-               {
-                       if(pEntry)
+               //2 Update PSD bitmap according to PSD report 
+               if((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
+               {       
+                       //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
+                       for (i = 0 ; i < 16 ; i++)
+                       {
+                               sum = 0;
+                               for(j = 0; j < 5 ; j++)
+                                       sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
+            
+                               if(sum < 5)
+                               {
+                                       ch_map_intf_5M[i] = 1;  // interference flag
+                               }
+                       }
+                       //=============just for debug=========================
+                       //for(i=0;i<16;i++)
+                               //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
+                       //===============================================
+                       //2 Mask target channel 5M index
+                       for(i = 0; i < (4+4*Is40MHz) ; i++)
+                       {
+                               ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;  
+                       }
+                               
+                       psd_intf_flag = 0;
+                       for(i = 0; i < 16; i++)
+                       {
+                               if(ch_map_intf_5M[i] == 1)
+                       {
+                               psd_intf_flag = 1;            // interference is detected!!!    
+                               break;
+                               }
+                       }
+                               
+#if (DEV_BUS_TYPE == RT_USB_INTERFACE)
+                       if(pRX_HP_Table->TP_Mode!=Idle_Mode)
                        {
-                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
-                                       pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
-                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
+                               if(psd_intf_flag == 1)     // to avoid psd_intf_flag always 1
+                               {
+                                       Intf_HighTP_flag = 1;
+                                       De_counter = 32;     // 0x1E -> 0x3E needs 32 times by each IGI step =1
+                               }
                        }
-                       else
-                       {
-                               if(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
-                                       pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
-                               pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
+#endif
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
+                       //2 Distance between target channel and interference
+                       for(i = 0; i < 16; i++)
+                       {
+                               if(ch_map_intf_5M[i] == 1)
+                               {
+                                       Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));  
+                               if(Intf_diff_idx < MIN_Intf_diff_idx)
+                                               MIN_Intf_diff_idx = Intf_diff_idx;    // the min difference index between interference and target
+                               }
+                       }
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx)); 
+                       //2 Choose False Alarm Threshold
+                       switch (MIN_Intf_diff_idx){
+                               case 0: 
+                               case 1:
+                               case 2:
+                               case 3:          
+                                       FA_TH = FA_RXHP_TH1;  
+                               break;
+                               case 4:                         // CH5
+                               case 5:                         // CH6
+                                       FA_TH = FA_RXHP_TH2;    
+                                       break;
+                               case 6:                         // CH7
+                               case 7:                         // CH8
+                                       FA_TH = FA_RXHP_TH3;
+                                       break; 
+                               case 8:                         // CH9
+                               case 9:                         //CH10
+                                       FA_TH = FA_RXHP_TH4;
+                                       break;  
+                               case 10:
+                               case 11:
+                               case 12:
+                               case 13:         
+                               case 14:
+                               case 15:                
+                                       FA_TH = FA_RXHP_TH5;
+                                       break;                  
+                       }       
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
+                       pRX_HP_Table->PSD_func_trigger = 0;
+               }
+               //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
+               if(pRX_HP_Table->RXHP_flag == 1)
+               {
+               if ((curRssi > 80)&&(preRssi < 80))
+               { 
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
+               }
+               else if ((curRssi < 80)&&(preRssi > 80))
+               {
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
+                       }
+               else if ((curRssi > 72)&&(preRssi < 72))
+                       {
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
+               }
+               else if ((curRssi < 72)&&( preRssi > 72))
+                       {
+                               pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
+               }
+               else if (curRssi < 68)           //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
+               {
+                               pRX_HP_Table->Cur_pw_th = pw_th_10dB;
+                               pRX_HP_Table->RXHP_flag = 0;    // Back to Normal DIG Mode                
+                               psd_intf_flag = 0;
                        }
                }
-               else if(pDM_PDTable->TrainingState == 2 )
+               else    // pRX_HP_Table->RXHP_flag == 0
                {
-                       if(pEntry)
-                       {
-                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
-                                       pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
-                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
-                       }
-                       else
+                       //1 Decide whether to enter AGC RX High Power Mode
+                       if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&  
+                               (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
                        {
-                               if(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
-                                       pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
-                               pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
+                               if (curRssi > 80)
+                               {
+                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
+                               }
+                               else if (curRssi > 72) 
+                       {
+                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
+                               }
+                               else
+                               {
+                                       pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
+                               }
+                               pRX_HP_Table->Cur_pw_th = pw_th_16dB;           //RegC54[9:8]=2'b11: to enter AGC Flow 3
+                               pRX_HP_Table->First_time_enter = TRUE;
+                               pRX_HP_Table->RXHP_flag = 1;    //      RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
                        }
                }
+               preRssi = curRssi; 
+               odm_Write_RXHP(pDM_Odm);        
        }
+#endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+#endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
 }
 
-
-BOOLEAN
-ODM_PathDiversityBeforeLink92C(
-       //IN    PADAPTER        Adapter
-       IN              PDM_ODM_T               pDM_Odm
-       )
+void odm_Write_RXHP(
+       IN      PDM_ODM_T       pDM_Odm)
 {
-#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE*  pHalData = NULL;
-       PMGNT_INFO              pMgntInfo = NULL;
-       //pSWAT_T               pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
-       pPD_T                   pDM_PDTable = NULL;
-
-       s1Byte                  Score = 0;
-       PRT_WLAN_BSS    pTmpBssDesc;
-       PRT_WLAN_BSS    pTestBssDesc;
-
-       u1Byte                  target_chnl = 0;
-       u1Byte                  index;
+       pRXHP_T         pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
+       u4Byte          currentIGI;
 
-       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413
-       {       // The ODM structure is not initialized.
-               return FALSE;
-       }
-       pHalData = GET_HAL_DATA(Adapter);
-       pMgntInfo = &Adapter->MgntInfo;
-       pDM_PDTable = &Adapter->DM_PDTable;
-       
-       // Condition that does not need to use path diversity.
-       if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
+       if(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
        {
-               RT_TRACE(COMP_SWAS, DBG_LOUD, 
-                               ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
-               return FALSE;
+               ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
+               ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);    
        }
-
-       // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
-       PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
-       if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
-       {
-               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
        
-               RT_TRACE(COMP_SWAS, DBG_LOUD, 
-                               ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", 
-                               pMgntInfo->RFChangeInProgress,
-                               pHalData->eRFPowerState));
-       
-               //pDM_SWAT_Table->SWAS_NoLink_State = 0;
-               pDM_PDTable->PathDiv_NoLink_State = 0;
-               
-               return FALSE;
-       }
-       else
-       {
-               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       if(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
+{
+               ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th);  // RegC54[9:8]=2'b11:  AGC Flow 3
        }
 
-       //1 Run AntDiv mechanism "Before Link" part.
-       //if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
-       if(pDM_PDTable->PathDiv_NoLink_State == 0)
+       if(pRX_HP_Table->RXHP_flag == 0)
        {
-               //1 Prepare to do Scan again to check current antenna state.
-
-               // Set check state to next step.
-               //pDM_SWAT_Table->SWAS_NoLink_State = 1;
-               pDM_PDTable->PathDiv_NoLink_State = 1;
-       
-               // Copy Current Scan list.
-               Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
-               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
-
-               // Switch Antenna to another one.
-               if(pDM_PDTable->DefaultRespPath == 0)
-               {
-                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // TRX path = PathB
-                       odm_SetRespPath_92C(Adapter, 1);
-                       pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
-                       pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
-               }
-               else
-               {
-                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // TRX path = PathA
-                       odm_SetRespPath_92C(Adapter, 0);
-                       pDM_PDTable->OFDMTXPath = 0x0;
-                       pDM_PDTable->CCKTXPath = 0x0;
-               }
-#if 0  
-
-               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-               pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
-               
-               RT_TRACE(COMP_SWAS, DBG_LOUD, 
-                       ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
-               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
-               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
-               PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
-#endif
-
-               // Go back to scan function again.
-               RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
-               pMgntInfo->ScanStep=0;
-               target_chnl = odm_SwAntDivSelectScanChnl(Adapter);
-               odm_SwAntDivConstructScanChnl(Adapter, target_chnl);
-               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
-
-               return TRUE;
+               pRX_HP_Table->Cur_IGI = 0x20;
        }
        else
        {
-               //1 ScanComple() is called after antenna swiched.
-               //1 Check scan result and determine which antenna is going
-               //1 to be used.
-
-               for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
-               {
-                       pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
-                       pTestBssDesc = &(pMgntInfo->bssDesc[index]);
-
-                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
-                       {
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
-                               continue;
-                       }
-
-                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
-                       {
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
-                               RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                       
-                               Score++;
-                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
-                       }
-                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
-                       {
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
-                               RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
-                               RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-                               Score--;
-                       }
-
-               }
-
-               if(pMgntInfo->NumBssDesc!=0 && Score<=0)
-               {
-                       RT_TRACE(COMP_SWAS, DBG_LOUD,
-                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
-
-                       //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-               }
-               else
-               {
-                       RT_TRACE(COMP_SWAS, DBG_LOUD, 
-                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
-
-                       if(pDM_PDTable->DefaultRespPath == 0)
-                       {
-                               pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
-                               pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
-                               odm_SetRespPath_92C(Adapter, 1);
-                       }
-                       else
-                       {
-                               pDM_PDTable->OFDMTXPath = 0x0;
-                               pDM_PDTable->CCKTXPath = 0x0;
-                               odm_SetRespPath_92C(Adapter, 0);
-                       }
-                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); // RX path = PathAB
-
-                       //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
-
-                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
-                       //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
-                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
-               }
-
-               // Check state reset to default and wait for next time.
-               //pDM_SWAT_Table->SWAS_NoLink_State = 0;
-               pDM_PDTable->PathDiv_NoLink_State = 0;
-
-               return FALSE;
-       }
-#else
-               return  FALSE;
-#endif
-       
-}
-
-
-//Neil Chen---2011--06--22
-//----92D Path Diversity----//
-//#ifdef PathDiv92D
-//==================================
-//3 Path Diversity 
-//==================================
-//
-// 20100514 Luke/Joseph:
-// Add new function for antenna diversity after link.
-// This is the main function of antenna diversity after link.
-// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
-// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
-// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
-// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
-// listened on the air with the RSSI of original antenna.
-// It chooses the antenna with better RSSI.
-// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting 
-// penalty to get next try.
-//
-//
-// 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.
-//
-
-
-//
-// 20100514 Luke/Joseph:
-// This function is used to gather the RSSI information for antenna testing.
-// It selects the RSSI of the peer STA that we want to know.
-//
-VOID
-ODM_PathDivChkPerPktRssi(
-       PADAPTER                Adapter,
-       BOOLEAN                 bIsDefPort,
-       BOOLEAN                 bMatchBSSID,
-       PRT_WLAN_STA    pEntry,
-       PRT_RFD                 pRfd
-       )
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
-       BOOLEAN                 bCount = FALSE;
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
-               bCount = TRUE;
-       else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
-               bCount = TRUE;
-
-       if(bCount)
-       {
-               //1 RSSI for SW Antenna Switch
-               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-               {
-                       pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
-                       pHalData->RSSI_cnt_A++;
-               }
-               else
+               currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
+               if(currentIGI<0x50)
                {
-                       pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
-                       pHalData->RSSI_cnt_B++;
-
+                       ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
+                       ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);    
                }
        }
-}
-
-
-
-//
-// 20100514 Luke/Joseph:
-// Add new function to reset antenna diversity state after link.
-//
-VOID
-ODM_PathDivRestAfterLink(
-       IN      PDM_ODM_T               pDM_Odm
-       )
-{
-       PADAPTER                Adapter=pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
-       pHalData->RSSI_cnt_A = 0;
-       pHalData->RSSI_cnt_B = 0;
-       pHalData->RSSI_test = FALSE;
-       pDM_SWAT_Table->try_flag = 0x0;       // NOT 0xff
-       pDM_SWAT_Table->RSSI_Trying = 0;
-       pDM_SWAT_Table->SelectAntennaMap=0xAA;
-       pDM_SWAT_Table->CurAntenna = MAIN_ANT;  
-}
-
-
-//
-// 20100514 Luke/Joseph:
-// Callback function for 500ms antenna test trying.
-//
-VOID
-odm_PathDivChkAntSwitchCallback(
-       PRT_TIMER               pTimer
-)
-{
-       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
-
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-
-#if USE_WORKITEM
-       PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
-#else
-       odm_PathDivChkAntSwitch(pDM_Odm);
-#endif
-#else
-       PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
-#endif
-
-//odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
-
-}
-
-
-VOID
-odm_PathDivChkAntSwitchWorkitemCallback(
-    IN PVOID            pContext
-    )
-{
-       PADAPTER        pAdapter = (PADAPTER)pContext;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
+       pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
 
-       odm_PathDivChkAntSwitch(pDM_Odm);
 }
 
-
- //MAC0_ACCESS_PHY1
-
-// 2011-06-22 Neil Chen & Gary Hsin
-// Refer to Jr.Luke's SW ANT DIV
-// 92D Path Diversity Main function
-// refer to 88C software antenna diversity
-// 
 VOID
-odm_PathDivChkAntSwitch(
-       PDM_ODM_T               pDM_Odm
-       //PADAPTER              Adapter,
-       //u1Byte                        Step
+odm_PSD_RXHP(
+       IN      PDM_ODM_T       pDM_Odm
 )
 {
-       PADAPTER                Adapter = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
-
-
-       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-       s4Byte                  curRSSI=100, RSSI_A, RSSI_B;
-       u1Byte                  nextAntenna=AUX_ANT;
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       PADAPTER                Adapter =  pDM_Odm->Adapter;
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       unsigned int            pts, start_point, stop_point, initial_gain ;
+       static u1Byte           PSD_bitmap_memory[80], init_memory = 0;
+       static u1Byte           psd_cnt=0;
+       static u4Byte           PSD_report[80], PSD_report_tmp;
        static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       u1Byte                  idx[20]={96,99,102,106,109,112,115,118,122,125,
+                                       0,3,6,10,13,16,19,22,26,29};
+       u1Byte                  n, i, channel, BBReset,tone_idx;
+       u1Byte                  PSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
+       s4Byte                          PSD_skip_start, PSD_skip_stop;
+       u4Byte                  CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
+       u4Byte                  ReScan, Interval, Is40MHz;
        u8Byte                  curTxOkCnt, curRxOkCnt;
-       static u8Byte           TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
-       u8Byte                  CurByteCnt=0, PreByteCnt=0;
-       static u1Byte           TrafficLoad = TRAFFIC_LOW;
-       u1Byte                  Score_A=0, Score_B=0;
-       u1Byte                  i=0x0;
-       // Neil Chen
-       static u1Byte        pathdiv_para=0x0;     
-       static u1Byte        switchfirsttime=0x00;
-       // u1Byte                 regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
-       u1Byte                  regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
-
-
-       //u1Byte                 reg637 =0x0;   
-       static u1Byte        fw_value=0x0;         
-       //u8Byte                        curTxOkCnt_tmp, curRxOkCnt_tmp;
-       PADAPTER            BuddyAdapter = Adapter->BuddyAdapter;     // another adapter MAC
-        // Path Diversity   //Neil Chen--2011--06--22
-
-       //u1Byte                 PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
-       u1Byte                 PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
-       u1Byte                 PathDiv_Enable = pHalData->bPathDiv_Enable;
-
-
-       //DbgPrint("Path Div PG Value:%x \n",PathDiv_Enable);   
-       if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))
-       {
-           return;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
-
-       // The first time to switch path excluding 2nd, 3rd, ....etc....
-       if(switchfirsttime==0)
+       //--------------2G band synthesizer for 92D switch RF channel using----------------- 
+       u1Byte                  group_idx=0;
+       u4Byte                  SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
+       u4Byte                  SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C};    // synthesizer RF register for 2G channel
+       u4Byte                  SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},     // For CH1,2,4,9,10.11.12   {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
+                                                                           {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},     // For CH3,13,14
+                                                                           {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}};   // For Ch5,6,7,8
+       //--------------------- Add by Gary for Debug setting ----------------------
+       u1Byte                 RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
+       u1Byte                 rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
+       //---------------------------------------------------------------------
+       
+       if(pMgntInfo->bScanInProgress)
        {
-           if(regB33==0)
-           {
-              pDM_SWAT_Table->CurAntenna = MAIN_ANT;    // Default MAC0_5G-->Path A (current antenna)     
-           }       
+               return;
        }
 
-       // Condition that does not need to use antenna diversity.
-       if(pDM_Odm->SupportICType != ODM_RTL8192D)
+       ReScan = PSD_RESCAN;
+       Interval = SCAN_INTERVAL;
+
+
+       //1 Initialization
+       if(init_memory == 0)
        {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
-               return;
+               RT_TRACE(       COMP_PSD, DBG_LOUD,("Init memory\n"));
+               for(i = 0; i < 80; i++)
+                       PSD_bitmap_memory[i] = 0xFF; // channel is always good
+               init_memory = 1;
        }
-
-       // Radio off: Status reset to default and return.
-       if(pHalData->eRFPowerState==eRfOff)
+       if(psd_cnt == 0)
        {
-               //ODM_SwAntDivRestAfterLink(Adapter);
-               return;
+               RT_TRACE(COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
+               for(i = 0; i < 80; i++)
+                       PSD_report[i] = 0;
        }
 
-       /*
-       // Handling step mismatch condition.
-       // Peak step is not finished at last time. Recover the variable and check again.
-       if(     Step != pDM_SWAT_Table->try_flag        )
-       {
-               ODM_SwAntDivRestAfterLink(Adapter);
-       } */
-       
-       if(pDM_SWAT_Table->try_flag == 0xff)
+       //1 Backup Current Settings
+       CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
        {
-               // Select RSSI checking target
-               if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
+               //2 Record Current synthesizer parameters based on current channel
+               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
                {
-                       // Target: Infrastructure mode AP.
-                       pHalData->RSSI_target = NULL;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
-               }
-               else
+                       SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);
+               }
+               else     // DualMAC_DualPHY 2G
                {
-                       u1Byte                  index = 0;
-                       PRT_WLAN_STA    pEntry = NULL;
-                       PADAPTER                pTargetAdapter = NULL;
-               
-                       if(     pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
-                       {
-                               // Target: AP/IBSS peer.
-                               pTargetAdapter = Adapter;
-                       }
-                       else if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
-                       {
-                               // Target: VWIFI peer.
-                               pTargetAdapter = GetFirstExtAdapter(Adapter);
-                       }
-
-                       if(pTargetAdapter != NULL)
-                       {
-                               for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
-                               {
-                                       pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
-                                       if(pEntry != NULL)
-                                       {
-                                               if(pEntry->bAssociated)
-                                                       break;                  
-                                       }
-                               }
-                       }
-
-                       if(pEntry == NULL)
-                       {
-                               ODM_PathDivRestAfterLink(pDM_Odm);
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
-                               return;
-                       }
-                       else
-                       {
-                               pHalData->RSSI_target = pEntry;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
-                       }
+                       SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);
+                       SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);
+                       SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);
+                       SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);
+                       SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);
                }
-                       
-               pHalData->RSSI_cnt_A = 0;
-               pHalData->RSSI_cnt_B = 0;
-               pDM_SWAT_Table->try_flag = 0;
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
-               return;
        }
-       else
-       {
-              // 1st step
-               curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
-               curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
-               lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
-               lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
+       RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
+       RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
+       Is40MHz = *(pDM_Odm->pBandWidth);
+       ODM_RT_TRACE(pDM_Odm,   COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
+       //1 Turn off CCK
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
+       //1 Turn off TX
+       //Pause TX Queue
+       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
+       //Force RX to stop TX immediately
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
+       //1 Turn off RX
+       //Rx AGC off  RegC70[0]=0, RegC7C[20]=0
+       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
+       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
+       //Turn off CCA
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
+       //BB Reset
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess 
+       BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
+       ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
+       ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
+       ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
+       //1 Leave RX idle low power
+       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
+       //1 Fix initial gain
+       RSSI_BT = RSSI_BT_new;
+       RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
        
-               if(pDM_SWAT_Table->try_flag == 1)   // Training State
-               {
-                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                       {
-                               TXByteCnt_A += curTxOkCnt;
-                               RXByteCnt_A += curRxOkCnt;
-                       }
-                       else
-                       {
-                               TXByteCnt_B += curTxOkCnt;
-                               RXByteCnt_B += curRxOkCnt;
-                       }
-               
-                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
-                       pDM_SWAT_Table->RSSI_Trying--;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
-                       if(pDM_SWAT_Table->RSSI_Trying == 0)
-                       {
-                               CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
-                               PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
-                               
-                               if(TrafficLoad == TRAFFIC_HIGH)
-                               {
-                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
-                                       PreByteCnt =PreByteCnt*9;
-                               }
-                               else if(TrafficLoad == TRAFFIC_LOW)
-                               {
-                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
-                                       PreByteCnt =PreByteCnt*2;
-                               }
-                               if(pHalData->RSSI_cnt_A > 0)
-                                       RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; 
-                               else
-                                       RSSI_A = 0;
-                               if(pHalData->RSSI_cnt_B > 0)
-                                       RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; 
-                            else
-                                       RSSI_B = 0;
-                               curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
-                               pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n", 
-                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
-                                       RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
-                       }
-
-               }
-               else   // try_flag=0
-               {
-               
-                       if(pHalData->RSSI_cnt_A > 0)
-                               RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; 
-                       else
-                               RSSI_A = 0;
-                       if(pHalData->RSSI_cnt_B > 0)
-                               RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; 
-                       else
-                               RSSI_B = 0;     
-                       curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
-                       pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
-                      ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n", 
-                       (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
-                               RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
-               }
-
-               //1 Trying State
-               if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
-               {
-
-                       if(pDM_SWAT_Table->TestMode == TP_MODE)
-                       {
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));             
-                               if(CurByteCnt < PreByteCnt)
-                               {
-                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
-                                       else
-                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
-                               }
-                               else
-                               {
-                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
-                                       else
-                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
-                               }
-                               for (i= 0; i<8; i++)
-                               {
-                                       if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
-                                               Score_A++;
-                                       else
-                                               Score_B++;
-                               }
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
-                       
-                               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
-                               {
-                                       nextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;
-                               }
-                               else
-                               {
-                                       nextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;
-                               }
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==MAIN_ANT)?"MAIN":"AUX"));
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s \n", 
-                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-
-                               if(nextAntenna != pDM_SWAT_Table->CurAntenna)
-                               {
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
-                               }
-                               else
-                               {
-                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
-                               }       
-                       }
-
-                    
-                       if(pDM_SWAT_Table->TestMode == RSSI_MODE)
-                       {       
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
-                               pDM_SWAT_Table->SelectAntennaMap=0xAA;
-                               if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
-                               {
-                                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Switch back to another antenna"));
-                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;
-                               }
-                               else // current anntena is good
-                               {
-                                       nextAntenna =pDM_SWAT_Table->CurAntenna;
-                                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: current anntena is good\n"));
-                               }
-                       }
-                       
-                       pDM_SWAT_Table->try_flag = 0;
-                       pHalData->RSSI_test = FALSE;
-                       pHalData->RSSI_sum_A = 0;
-                       pHalData->RSSI_cnt_A = 0;
-                       pHalData->RSSI_sum_B = 0;
-                       pHalData->RSSI_cnt_B = 0;
-                       TXByteCnt_A = 0;
-                       TXByteCnt_B = 0;
-                       RXByteCnt_A = 0;
-                       RXByteCnt_B = 0;
-                       
-               }
-
-               //1 Normal State
-               else if(pDM_SWAT_Table->try_flag == 0)
-               {
-                       if(TrafficLoad == TRAFFIC_HIGH)
-                       {
-                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
-                                       TrafficLoad = TRAFFIC_HIGH;
-                               else
-                                       TrafficLoad = TRAFFIC_LOW;
-                       }
-                       else if(TrafficLoad == TRAFFIC_LOW)
-                               {
-                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
-                                       TrafficLoad = TRAFFIC_HIGH;
-                               else
-                                       TrafficLoad = TRAFFIC_LOW;
-                       }
-                       if(TrafficLoad == TRAFFIC_HIGH)
-                               pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
+       if(rssi_ctrl == 1)        // just for debug!!
+               initial_gain_psd = RSSI_BT_new; 
+       else
+               initial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI
+       
+       RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
+       
+       initialGainUpper = 0x54;
+       
+       RSSI_BT = initial_gain_psd;
+       //SSBT = RSSI_BT;
+       
+       //RT_TRACE(     COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
+       RT_TRACE(       COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
+       
+       pDM_Odm->bDMInitialGainEnable = FALSE;          
+       initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
+       //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd); 
+       ODM_Write_DIG(pDM_Odm, initial_gain_psd);
+       //1 Turn off 3-wire
+       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
 
-                       //Prepare To Try Antenna                
-                               nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
-                               pDM_SWAT_Table->try_flag = 1;
-                               pHalData->RSSI_test = TRUE;
-                       if((curRxOkCnt+curTxOkCnt) > 1000)
-                       {
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-                           pDM_SWAT_Table->RSSI_Trying = 4;                           
-#else
-                           pDM_SWAT_Table->RSSI_Trying = 2;
-#endif
-                               pDM_SWAT_Table->TestMode = TP_MODE;
-                       }
-                       else
-                       {
-                               pDM_SWAT_Table->RSSI_Trying = 2;
-                               pDM_SWAT_Table->TestMode = RSSI_MODE;
+       //pts value = 128, 256, 512, 1024
+       pts = 128;
 
-                       }
-                          
-                       //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));                     
-                       pHalData->RSSI_sum_A = 0;
-                       pHalData->RSSI_cnt_A = 0;
-                       pHalData->RSSI_sum_B = 0;
-                       pHalData->RSSI_cnt_B = 0;
-               } // end of try_flag=0
+       if(pts == 128)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
+               start_point = 64;
+               stop_point = 192;
        }
-       
-       //1 4.Change TRX antenna
-       if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+       else if(pts == 256)
        {
-       
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
-               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
-               if(nextAntenna==MAIN_ANT)
-               {
-                   ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
-                   pathdiv_para = 0x02;   //02 to switchback to RF path A
-                   fw_value = 0x03;
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-                 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-#else
-                 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));      
-#endif
-               }       
-              else if(nextAntenna==AUX_ANT)
-              {
-                  ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
-                  if(switchfirsttime==0)  // First Time To Enter Path Diversity
-                  {
-                      switchfirsttime=0x01;
-                      pathdiv_para = 0x00;
-                         fw_value=0x00;    // to backup RF Path A Releated Registers             
-                                         
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-#else
-                     ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
-                     //for(u1Byte n=0; n<80,n++)
-                     //{
-                     //delay_us(500);
-                         ODM_delay_ms(500);
-                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-                                        
-                        fw_value=0x01;         // to backup RF Path A Releated Registers                
-                     ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
-#endif 
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));    
-                  }               
-                   else
-                   {
-                       pathdiv_para = 0x01;
-                        fw_value = 0x02;       
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-#else
-                     ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
-#endif 
-                   }           
-              }
-           //   odm_PathDiversity_8192D(Adapter, pathdiv_para);
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
+               start_point = 128;
+               stop_point = 384;
+       }
+       else if(pts == 512)
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
+               start_point = 256;
+               stop_point = 768;
+       }
+       else
+       {
+               ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
+               start_point = 512;
+               stop_point = 1536;
        }
+       
 
-       //1 5.Reset Statistics
-       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
-       pDM_SWAT_Table->CurAntenna = nextAntenna;
-       pDM_SWAT_Table->PreRSSI = curRSSI;
+//3 Skip WLAN channels if WLAN busy
+       curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
+       curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
+       lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
+       lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
+       
+       PSD_skip_start=80;
+       PSD_skip_stop = 0;
+       wlan_channel = CurrentChannel & 0x0f;
 
-       //1 6.Set next timer
+       RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
+       
+       if((curRxOkCnt+curTxOkCnt) > 1000)
+       {
+               PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
+               PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
+       }
 
-       if(pDM_SWAT_Table->RSSI_Trying == 0)
-               return;
+       RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
 
-       if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
-       {
-               if(pDM_SWAT_Table->TestMode == TP_MODE)
-               {
-                       if(TrafficLoad == TRAFFIC_HIGH)
+       for (n=0;n<80;n++)
+       {
+               if((n%20)==0)
+               {
+                       channel = (n/20)*4 + 1;
+                       if(pDM_Odm->SupportICType == ODM_RTL8192D)
                        {
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
-#else
-                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
-#endif                         
-                       }
-                       else if(TrafficLoad == TRAFFIC_LOW)
+                               switch(channel)
+                               {
+                                       case 1: 
+                                       case 9:
+                                               group_idx = 0;
+                                               break;
+                                       case 5:
+                                               group_idx = 2;
+                                               break;
+                                       case 13:
+                                               group_idx = 1;
+                                               break;
+                               }
+                               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))   
+               {
+                                       for(i = 0; i < SYN_Length; i++)
+                                               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
+
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
+                               }
+                               else  // DualMAC_DualPHY 2G
                        {
-                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
-                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
+                                       for(i = 0; i < SYN_Length; i++)
+                                               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);   
+                                       
+                                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                               }
                        }
+                       else
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
+                       }       
+               tone_idx = n%20;
+               if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
+               {       
+                       PSD_report[n] = initial_gain_psd;//SSBT;
+                       ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
                }
-               else   // TestMode == RSSI_MODE
-               {
-                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
-                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
-               }
-       }
-       else
-       {
-               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               else
                {
-                       if(TrafficLoad == TRAFFIC_HIGH)
+                       PSD_report_tmp =  GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
+
+                       if ( PSD_report_tmp > PSD_report[n])
+                               PSD_report[n] = PSD_report_tmp;
                                
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
-                               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
-#else          
-                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
-#endif                         
-                       else if(TrafficLoad == TRAFFIC_LOW)
-                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
                }
-               else
-                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
        }
-}
-
-//==================================================
-//3 PathDiv End
-//==================================================
-
-VOID
-odm_SetRespPath_92C(
-       IN      PADAPTER        Adapter,
-       IN      u1Byte  DefaultRespPath
-       )
-{
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
 
-       RT_TRACE(       COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
-       if(DefaultRespPath != pDM_PDTable->DefaultRespPath)
+       PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
+      
+       //----end
+       //1 Turn on RX
+       //Rx AGC on
+       ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
+       ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
+       //CCK on
+       ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
+       //1 Turn on TX
+       //Resume TX Queue
+       ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
+       //Turn on 3-wire
+       ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
+       //1 Restore Current Settings
+       //Resume DIG
+       pDM_Odm->bDMInitialGainEnable= TRUE;
+       //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
+       ODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);
+       // restore originl center frequency
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
        {
-               if(DefaultRespPath == 0)
+               if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
                {
-                       PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);      
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
                }
-               else
+               else     // DualMAC_DualPHY
                {
-                       PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
-               }       
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
+               }
        }
-       pDM_PDTable->DefaultRespPath = DefaultRespPath;
-}
+       //Turn on CCA
+       ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
+       //Restore RX idle low power
+       if(RxIdleLowPwr == TRUE)
+               ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
+       
+       psd_cnt++;
+       //gPrint("psd cnt=%d\n", psd_cnt);
+       ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
+       if (psd_cnt < ReScan)
+       {
+               ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval);  //ms
+       }
+       else
+                       {       
+               psd_cnt = 0;
+               for(i=0;i<80;i++)
+                       RT_TRACE(       COMP_PSD, DBG_LOUD,("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]));
+                       //DbgPrint("psd_report[%d]=     %d \n", 2402+i, PSD_report[i]);
+
+               GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
 
+                       }
+               }
 
 VOID
-ODM_FillTXPathInTXDESC(
-               IN      PADAPTER        Adapter,
-               IN      PRT_TCB         pTcb,
-               IN      pu1Byte         pDesc
+odm_PSD_RXHPCallback(
+       PRT_TIMER               pTimer
 )
 {
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
-       u4Byte  TXPath;
-       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
-
-       //2011.09.05  Add by Luke Lee for path diversity
-       if(pHalData->PathDivCfg == 1)
-       {       
-               TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
-               //RT_TRACE(     COMP_SWAS, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
-               //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
-               if(TXPath == 0)
-               {
-                       SET_TX_DESC_TX_ANTL_92C(pDesc,1);
-                       SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
-               }
-               else
-               {
-                       SET_TX_DESC_TX_ANTL_92C(pDesc,2);
-                       SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
-               }
-               TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
-               if(TXPath == 0)
-               {
-                       SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
-               }
-               else
-               {
-                       SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
-               }
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
+       
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+       #if USE_WORKITEM
+       ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
+       #else
+       odm_PSD_RXHP(pDM_Odm);
+       #endif
+#else
+       ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
+#endif
+       
        }
-}
 
-//Only for MP //Neil Chen--2012--0502--
 VOID
-odm_PathDivInit_92D(
-IN     PDM_ODM_T       pDM_Odm)
+odm_PSD_RXHPWorkitemCallback(
+    IN PVOID            pContext
+    )
 {
-       pPATHDIV_PARA   pathIQK = &pDM_Odm->pathIQK;
-
-       pathIQK->org_2g_RegC14=0x0;
-       pathIQK->org_2g_RegC4C=0x0;
-       pathIQK->org_2g_RegC80=0x0;
-       pathIQK->org_2g_RegC94=0x0;
-       pathIQK->org_2g_RegCA0=0x0;
-       pathIQK->org_5g_RegC14=0x0;
-       pathIQK->org_5g_RegCA0=0x0;
-       pathIQK->org_5g_RegE30=0x0;
-       pathIQK->swt_2g_RegC14=0x0;
-       pathIQK->swt_2g_RegC4C=0x0;
-       pathIQK->swt_2g_RegC80=0x0;
-       pathIQK->swt_2g_RegC94=0x0;
-       pathIQK->swt_2g_RegCA0=0x0;
-       pathIQK->swt_5g_RegC14=0x0;
-       pathIQK->swt_5g_RegCA0=0x0;
-       pathIQK->swt_5g_RegE30=0x0;
-
+       PADAPTER        pAdapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       
+       odm_PSD_RXHP(pDM_Odm);
 }
 
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+//Remove PathDiversity related function to odm_PathDiv.c
 
 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
 
@@ -13451,6 +7156,7 @@ ODM_SingleDualAntennaDefaultSetting(
                pDM_SWAT_Table->ANTB_ON=TRUE;
                //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Dual antenna\n"));
        }
+#ifdef CONFIG_BT_COEXIST
        else if(btAntNum == 1)
        {// Set antenna A as default
                pDM_SWAT_Table->ANTA_ON=TRUE;
@@ -13461,6 +7167,7 @@ ODM_SingleDualAntennaDefaultSetting(
        {
                //RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));
        }
+#endif
 }
 
 
@@ -13607,7 +7314,7 @@ ODM_SingleDualAntennaDetection(
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);    
        
        //IQK Single tone start
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
        
@@ -13661,7 +7368,7 @@ ODM_SingleDualAntennaDetection(
        }
 
        //Close IQK Single Tone function
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      
 
        //1 Return to antanna A
        if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
index 81bc89005b8428d2b56daf5baff78238b442443e..345d675304838c7214d5c03fe66867e1d64bcdf8 100755 (executable)
 #ifndef        __HALDMOUTSRC_H__\r
 #define __HALDMOUTSRC_H__\r
 \r
+\r
+#include "odm_EdcaTurboCheck.h"\r
+#include "odm_DIG.h"\r
+#include "odm_PathDiv.h"\r
+#include "odm_DynamicBBPowerSaving.h"\r
+#include "odm_DynamicTxPower.h"\r
+#include "odm_CfoTracking.h"\r
+#include "odm_NoiseMonitor.h"\r
+\r
 //============================================================\r
 // Definition \r
 //============================================================\r
 #define                ANTTESTA                0x01            //Ant A will be Testing \r
 #define                ANTTESTB                0x02            //Ant B will be testing\r
 \r
-// LPS define\r
-#define DM_DIG_FA_TH0_LPS                              4 //-> 4 in lps\r
-#define DM_DIG_FA_TH1_LPS                              15 //-> 15 lps\r
-#define DM_DIG_FA_TH2_LPS                              30 //-> 30 lps\r
-#define RSSI_OFFSET_DIG                                        0x05;\r
-\r
-\r
-\r
 //for 8723A Ant Definition--2012--06--07 due to different IC may be different ANT define\r
 #define                MAIN_ANT                1               //Ant A or Ant Main\r
 #define                AUX_ANT         2               //AntB or Ant Aux\r
@@ -161,82 +162,11 @@ typedef           struct _WLAN_STA{
 \r
 #endif\r
 \r
-typedef struct _Dynamic_Initial_Gain_Threshold_\r
-{\r
-       u1Byte          Dig_Enable_Flag;\r
-       u1Byte          Dig_Ext_Port_Stage;\r
-       \r
-       int                     RssiLowThresh;\r
-       int                     RssiHighThresh;\r
-\r
-       u4Byte          FALowThresh;\r
-       u4Byte          FAHighThresh;\r
-\r
-       u1Byte          CurSTAConnectState;\r
-       u1Byte          PreSTAConnectState;\r
-       u1Byte          CurMultiSTAConnectState;\r
-\r
-       u1Byte          PreIGValue;\r
-       u1Byte          CurIGValue;\r
-       u1Byte          BT30_CurIGI;\r
-       u1Byte          BackupIGValue;\r
-\r
-       s1Byte          BackoffVal;\r
-       s1Byte          BackoffVal_range_max;\r
-       s1Byte          BackoffVal_range_min;\r
-       u1Byte          rx_gain_range_max;\r
-       u1Byte          rx_gain_range_min;\r
-       u1Byte          Rssi_val_min;\r
-\r
-       u1Byte          PreCCK_CCAThres;\r
-       u1Byte          CurCCK_CCAThres;\r
-       u1Byte          PreCCKPDState;\r
-       u1Byte          CurCCKPDState;\r
-\r
-       u1Byte          LargeFAHit;\r
-       u1Byte          ForbiddenIGI;\r
-       u4Byte          Recover_cnt;\r
-\r
-       u1Byte          DIG_Dynamic_MIN_0;\r
-       u1Byte          DIG_Dynamic_MIN_1;\r
-       BOOLEAN         bMediaConnect_0;\r
-       BOOLEAN         bMediaConnect_1;\r
-\r
-       u4Byte          AntDiv_RSSI_max;\r
-       u4Byte          RSSI_max;\r
-}DIG_T,*pDIG_T;\r
-\r
-typedef struct _Dynamic_Power_Saving_\r
-{\r
-       u1Byte          PreCCAState;\r
-       u1Byte          CurCCAState;\r
+//Remove DIG by Yuchen\r
 \r
-       u1Byte          PreRFState;\r
-       u1Byte          CurRFState;\r
+//Remoce BB power saving by Yuchn\r
 \r
-       int                 Rssi_val_min;\r
-       \r
-       u1Byte          initialize;\r
-       u4Byte          Reg874,RegC70,Reg85C,RegA74;\r
-       \r
-}PS_T,*pPS_T;\r
-\r
-typedef struct _FALSE_ALARM_STATISTICS{\r
-       u4Byte  Cnt_Parity_Fail;\r
-       u4Byte  Cnt_Rate_Illegal;\r
-       u4Byte  Cnt_Crc8_fail;\r
-       u4Byte  Cnt_Mcs_fail;\r
-       u4Byte  Cnt_Ofdm_fail;\r
-       u4Byte  Cnt_Cck_fail;\r
-       u4Byte  Cnt_all;\r
-       u4Byte  Cnt_Fast_Fsync;\r
-       u4Byte  Cnt_SB_Search_fail;\r
-       u4Byte  Cnt_OFDM_CCA;\r
-       u4Byte  Cnt_CCK_CCA;\r
-       u4Byte  Cnt_CCA_all;\r
-       u4Byte  Cnt_BW_USC;     //Gary\r
-       u4Byte  Cnt_BW_LSC;     //Gary\r
-}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;\r
+//Remove DIG by yuchen\r
 \r
 typedef struct _Dynamic_Primary_CCA{\r
        u1Byte          PriCCA_flag;\r
@@ -382,16 +312,8 @@ typedef struct _SW_Antenna_Switch_
 }SWAT_T, *pSWAT_T;\r
 //#endif\r
 \r
-typedef struct _EDCA_TURBO_\r
-{\r
-       BOOLEAN bCurrentTurboEDCA;\r
-       BOOLEAN bIsCurRDLState;\r
-\r
-       #if(DM_ODM_SUPPORT_TYPE == ODM_CE       )\r
-       u4Byte  prv_traffic_idx; // edca turbo\r
-       #endif\r
+//Remove Edca by YuChen\r
 \r
-}EDCA_T,*pEDCA_T;\r
 \r
 typedef struct _ODM_RATE_ADAPTIVE\r
 {\r
@@ -497,7 +419,7 @@ typedef struct _ODM_Phy_Status_Info_
        u1Byte          BTRxRSSIPercentage;     \r
        u1Byte          SignalStrength;                 // in 0-100 index.\r
  \r
-       u1Byte          RxPwr[4];                               //per-path's pwdb\r
+       s1Byte          RxPwr[4];                               //per-path's pwdb\r
 #endif\r
        u1Byte          RxSNR[4];                               //per-path's SNR        \r
        u1Byte          BandWidth;\r
@@ -520,9 +442,9 @@ typedef struct _ODM_Phy_Dbg_Info_
 {\r
        //ODM Write,debug info\r
        s1Byte          RxSNRdB[4];\r
-       u8Byte          NumQryPhyStatus;\r
-       u8Byte          NumQryPhyStatusCCK;\r
-       u8Byte          NumQryPhyStatusOFDM;\r
+       u4Byte          NumQryPhyStatus;\r
+       u4Byte          NumQryPhyStatusCCK;\r
+       u4Byte          NumQryPhyStatusOFDM;\r
        u1Byte          NumQryBeaconPkt;\r
        //Others\r
        s4Byte          RxEVM[4];       \r
@@ -705,7 +627,7 @@ typedef enum _ODM_Common_Info_Definition
        ODM_CMNINFO_RA_THRESHOLD_HIGH,          // u1Byte\r
        ODM_CMNINFO_RA_THRESHOLD_LOW,           // u1Byte\r
        ODM_CMNINFO_RF_ANTENNA_TYPE,            // u1Byte\r
-       ODM_CMNINFO_BT_DISABLED,\r
+       ODM_CMNINFO_BT_ENABLED,\r
        ODM_CMNINFO_BT_HS_CONNECT_PROCESS,\r
        ODM_CMNINFO_BT_HS_RSSI,\r
        ODM_CMNINFO_BT_OPERATION,\r
@@ -747,7 +669,7 @@ typedef enum _ODM_Support_Ability_Definition
        ODM_BB_PSD                                      = BIT11,\r
        ODM_BB_RXHP                                     = BIT12,\r
        ODM_BB_ADAPTIVITY                               = BIT13,\r
-       ODM_BB_DYNAMIC_ATC                      = BIT14,\r
+       ODM_BB_CFO_TRACKING                     = BIT14,\r
        \r
        //\r
        // MAC DM section BIT 16-23\r
@@ -785,12 +707,13 @@ typedef enum tag_ODM_Support_IC_Type_Definition
        ODM_RTL8821     =       BIT6,\r
        ODM_RTL8192E    =       BIT7,   \r
        ODM_RTL8723B    =       BIT8,\r
-       ODM_RTL8813A    =       BIT9,   \r
-       ODM_RTL8881A    =       BIT10\r
+       ODM_RTL8814A    =       BIT9,   \r
+       ODM_RTL8881A    =       BIT10,\r
+       ODM_RTL8821B    =       BIT11\r
 }ODM_IC_TYPE_E;\r
 \r
 #define ODM_IC_11N_SERIES              (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)\r
-#define ODM_IC_11AC_SERIES             (ODM_RTL8812|ODM_RTL8821|ODM_RTL8813A|ODM_RTL8881A)\r
+#define ODM_IC_11AC_SERIES             (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A)\r
 \r
 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
 #ifdef RTK_AC_SUPPORT\r
@@ -1067,30 +990,8 @@ typedef struct _IQK_MATRIX_REGS_SETTING{
        BOOLEAN         bBWIqkResultSaved[3];   \r
 }IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;\r
 \r
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
-typedef struct _PathDiv_Parameter_define_\r
-{\r
-       u4Byte org_5g_RegE30;\r
-       u4Byte org_5g_RegC14;\r
-       u4Byte org_5g_RegCA0;\r
-       u4Byte swt_5g_RegE30;\r
-       u4Byte swt_5g_RegC14;\r
-       u4Byte swt_5g_RegCA0;\r
-       //for 2G IQK information\r
-       u4Byte org_2g_RegC80;\r
-       u4Byte org_2g_RegC4C;\r
-       u4Byte org_2g_RegC94;\r
-       u4Byte org_2g_RegC14;\r
-       u4Byte org_2g_RegCA0;\r
-\r
-       u4Byte swt_2g_RegC80;\r
-       u4Byte swt_2g_RegC4C;\r
-       u4Byte swt_2g_RegC94;\r
-       u4Byte swt_2g_RegC14;\r
-       u4Byte swt_2g_RegCA0;\r
-}PATHDIV_PARA,*pPATHDIV_PARA;\r
-#endif\r
 \r
+//Remove PATHDIV_PARA struct to odm_PathDiv.h\r
 \r
 typedef struct ODM_RF_Calibration_Structure\r
 {\r
@@ -1306,10 +1207,9 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        u8Byte                  DebugComponents;\r
        u4Byte                  DebugLevel;\r
        \r
-       u8Byte                  NumQryPhyStatusAll;     //CCK + OFDM\r
-       u8Byte                  LastNumQryPhyStatusAll; \r
-       u8Byte                  RxPWDBAve;\r
-       u8Byte                  RxPWDBAve_final;\r
+       u4Byte                  NumQryPhyStatusAll;     //CCK + OFDM\r
+       u4Byte                  LastNumQryPhyStatusAll; \r
+       u4Byte                  RxPWDBAve;\r
        BOOLEAN                 MPDIG_2G;               //off MPDIG\r
        u1Byte                  Times_2G;\r
        \r
@@ -1434,7 +1334,7 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        BOOLEAN         bIsMPChip;\r
        BOOLEAN                 bOneEntryOnly;\r
        // Common info for BTDM\r
-       BOOLEAN                 bBtDisabled;                    // BT is disabled\r
+       BOOLEAN                 bBtEnabled;                     // BT is disabled\r
        BOOLEAN                 bBtConnectProcess;      // BT HS is under connection progress.\r
        u1Byte                  btHsRssi;                               // BT HS mode wifi rssi value.\r
        BOOLEAN                 bBtHsOperation;         // BT HS mode is under progress\r
@@ -1449,7 +1349,6 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        u8Byte                  RSSI_TRSW_iso;\r
 \r
        u1Byte                  RxRate;\r
-       BOOLEAN                 StopDIG;\r
        BOOLEAN                 bNoisyState;\r
        u1Byte                  TxRate;\r
        u1Byte                  LinkedInterval;\r
@@ -1478,6 +1377,28 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        u1Byte                  pre_AntType;\r
        u1Byte                  antdiv_period;\r
         u1Byte                 antdiv_select;  \r
+       u1Byte                  NdpaPeriod;\r
+\r
+       // add by Yu Cehn for adaptivtiy\r
+       BOOLEAN                 adaptivity_flag;\r
+       BOOLEAN                 NHM_disable;\r
+       BOOLEAN                 TxHangFlg;\r
+       BOOLEAN                 Carrier_Sense_enable;\r
+       u1Byte                  tolerance_cnt;\r
+       u8Byte                  NHMCurTxOkcnt;\r
+       u8Byte                  NHMCurRxOkcnt;\r
+       u8Byte                  NHMLastTxOkcnt;\r
+       u8Byte                  NHMLastRxOkcnt;\r
+       u1Byte                  txEdcca1;\r
+       u1Byte                  txEdcca0;\r
+       s1Byte                  H2L_lb;\r
+       s1Byte                  L2H_lb;\r
+       u1Byte                  Adaptivity_IGI_upper;\r
+       u1Byte                  NHM_cnt_0;\r
+\r
+\r
+       ODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM];\r
+       //\r
        //2 Define STA info.\r
        // _ODM_STA_INFO\r
        // 2012/01/12 MH For MP, we need to reduce one array pointer for default port.??\r
@@ -1513,17 +1434,18 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        //\r
        //ODM Structure\r
        //\r
-       FAT_T           DM_FatTable;\r
-       DIG_T           DM_DigTable;\r
-       PS_T            DM_PSTable;\r
-       Pri_CCA_T       DM_PriCCA;\r
-       RXHP_T          DM_RXHP_Table;\r
-       RA_T            DM_RA_Table;  \r
-       FALSE_ALARM_STATISTICS  FalseAlmCnt;\r
-       FALSE_ALARM_STATISTICS  FlaseAlmCntBuddyAdapter;\r
+       FAT_T                                           DM_FatTable;\r
+       DIG_T                                           DM_DigTable;\r
+       PS_T                                            DM_PSTable;\r
+       Pri_CCA_T                                       DM_PriCCA;\r
+       RXHP_T                                          DM_RXHP_Table;\r
+       RA_T                                            DM_RA_Table;  \r
+       FALSE_ALARM_STATISTICS          FalseAlmCnt;\r
+       FALSE_ALARM_STATISTICS          FlaseAlmCntBuddyAdapter;\r
        //#ifdef CONFIG_ANTENNA_DIVERSITY\r
-       SWAT_T          DM_SWAT_Table;\r
-       BOOLEAN         RSSI_test;\r
+       SWAT_T                                          DM_SWAT_Table;\r
+       BOOLEAN                                         RSSI_test;\r
+       CFO_TRACKING                                    DM_CfoTrack;\r
        //#endif \r
        \r
 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
@@ -1595,19 +1517,6 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        BOOLEAN                 Modify_TxAGC_Flag_PathA;\r
        BOOLEAN                 Modify_TxAGC_Flag_PathB;\r
        BOOLEAN                 Modify_TxAGC_Flag_PathA_CCK;\r
-\r
-       //\r
-       // Dynamic ATC switch\r
-       //\r
-       BOOLEAN                 bATCStatus;\r
-       BOOLEAN                 largeCFOHit;\r
-       BOOLEAN                 bIsfreeze;\r
-       int                             CFO_tail[2];\r
-       int                             CFO_ave_pre;\r
-       int                             CrystalCap;\r
-       u1Byte                  CFOThreshold;\r
-       u4Byte                  packetCount;\r
-       u4Byte                  packetCount_pre;\r
        \r
        //\r
        // ODM system resource.\r
@@ -1725,88 +1634,7 @@ typedef enum _RT_STATUS{
 //3 DIG\r
 //3===========================================================\r
 \r
-typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition\r
-{\r
-       DIG_TYPE_THRESH_HIGH    = 0,\r
-       DIG_TYPE_THRESH_LOW     = 1,\r
-       DIG_TYPE_BACKOFF                = 2,\r
-       DIG_TYPE_RX_GAIN_MIN    = 3,\r
-       DIG_TYPE_RX_GAIN_MAX    = 4,\r
-       DIG_TYPE_ENABLE                 = 5,\r
-       DIG_TYPE_DISABLE                = 6,    \r
-       DIG_OP_TYPE_MAX\r
-}DM_DIG_OP_E;\r
-/*\r
-typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition\r
-{\r
-       CCK_PD_STAGE_LowRssi = 0,\r
-       CCK_PD_STAGE_HighRssi = 1,\r
-       CCK_PD_STAGE_MAX = 3,\r
-}DM_CCK_PDTH_E;\r
-\r
-typedef enum tag_DIG_EXT_PORT_ALGO_Definition\r
-{\r
-       DIG_EXT_PORT_STAGE_0 = 0,\r
-       DIG_EXT_PORT_STAGE_1 = 1,\r
-       DIG_EXT_PORT_STAGE_2 = 2,\r
-       DIG_EXT_PORT_STAGE_3 = 3,\r
-       DIG_EXT_PORT_STAGE_MAX = 4,\r
-}DM_DIG_EXT_PORT_ALG_E;\r
-\r
-typedef enum tag_DIG_Connect_Definition\r
-{\r
-       DIG_STA_DISCONNECT = 0, \r
-       DIG_STA_CONNECT = 1,\r
-       DIG_STA_BEFORE_CONNECT = 2,\r
-       DIG_MultiSTA_DISCONNECT = 3,\r
-       DIG_MultiSTA_CONNECT = 4,\r
-       DIG_CONNECT_MAX\r
-}DM_DIG_CONNECT_E;\r
-\r
-\r
-#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}\r
-\r
-#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER)     \\r
-       DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT)\r
-\r
-#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER)  \\r
-       DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT)\r
-*/\r
-#define                DM_DIG_THRESH_HIGH                      40\r
-#define                DM_DIG_THRESH_LOW                       35\r
-\r
-#define                DM_FALSEALARM_THRESH_LOW        400\r
-#define                DM_FALSEALARM_THRESH_HIGH       1000\r
-\r
-#define                DM_DIG_MAX_NIC                          0x3e\r
-#define                DM_DIG_MIN_NIC                          0x1e //0x22//0x1c\r
-\r
-#define                DM_DIG_MAX_AP                                   0x32\r
-#define                DM_DIG_MIN_AP                                   0x20\r
-\r
-#define                DM_DIG_MAX_NIC_HP                       0x46\r
-#define                DM_DIG_MIN_NIC_HP                       0x2e\r
-\r
-#define                DM_DIG_MAX_AP_HP                                0x42\r
-#define                DM_DIG_MIN_AP_HP                                0x30\r
-\r
-//vivi 92c&92d has different definition, 20110504\r
-//this is for 92c\r
-#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\r
-#define                DM_DIG_FA_TH0                           0x80//0x20\r
-#else\r
-#define                DM_DIG_FA_TH0                           0x200//0x20\r
-#endif\r
-#define                DM_DIG_FA_TH1                           0x300//0x100\r
-#define                DM_DIG_FA_TH2                           0x400//0x200\r
-//this is for 92d\r
-#define                DM_DIG_FA_TH0_92D                       0x100\r
-#define                DM_DIG_FA_TH1_92D                       0x400\r
-#define                DM_DIG_FA_TH2_92D                       0x600\r
-\r
-#define                DM_DIG_BACKOFF_MAX                      12\r
-#define                DM_DIG_BACKOFF_MIN                      -4\r
-#define                DM_DIG_BACKOFF_DEFAULT          10\r
+//Remove DIG by Yuchen\r
 \r
 //3===========================================================\r
 //3 AGC RX High Power Mode\r
@@ -1829,20 +1657,8 @@ typedef enum tag_DIG_Connect_Definition
 //3 Dynamic Tx Power\r
 //3===========================================================\r
 //Dynamic Tx Power Control Threshold\r
-#define                TX_POWER_NEAR_FIELD_THRESH_LVL2 74\r
-#define                TX_POWER_NEAR_FIELD_THRESH_LVL1 67\r
-#define                TX_POWER_NEAR_FIELD_THRESH_AP           0x3F\r
-\r
-#define                TxHighPwrLevel_Normal           0       \r
-#define                TxHighPwrLevel_Level1           1\r
-#define                TxHighPwrLevel_Level2           2\r
-#define                TxHighPwrLevel_BT1                      3\r
-#define                TxHighPwrLevel_BT2                      4\r
-#define                TxHighPwrLevel_15                       5\r
-#define                TxHighPwrLevel_35                       6\r
-#define                TxHighPwrLevel_50                       7\r
-#define                TxHighPwrLevel_70                       8\r
-#define                TxHighPwrLevel_100                      9\r
+\r
+//Remove By YuChen\r
 \r
 //3===========================================================\r
 //3 Tx Power Tracking\r
@@ -1865,15 +1681,6 @@ typedef enum tag_DIG_Connect_Definition
 //3 BB Power Save\r
 //3===========================================================\r
 \r
-\r
-//3===========================================================\r
-//3 Dynamic ATC switch\r
-//3===========================================================\r
-#define                ATC_Status_Off                          0x0                     // enable\r
-#define                ATC_Status_On                           0x1                     // disable\r
-#define                CFO_Threshold_Xtal                      10                      // kHz\r
-#define                CFO_Threshold_ATC                       80                      // kHz\r
-\r
 typedef enum tag_1R_CCA_Type_Definition\r
 {\r
        CCA_1R =0,\r
@@ -1937,8 +1744,7 @@ static u1Byte DeltaSwingTableIdx_2GA_N_8188E[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4,
 #define SWAW_STEP_PEAK         0\r
 #define SWAW_STEP_DETERMINE    1\r
 \r
-VOID ODM_Write_DIG(IN  PDM_ODM_T       pDM_Odm,        IN      u1Byte  CurrentIGI);\r
-VOID ODM_Write_CCK_CCA_Thres(IN        PDM_ODM_T       pDM_Odm, IN     u1Byte  CurCCK_CCAThres);\r
+//Remove DIG by yuchen\r
 \r
 VOID\r
 ODM_SetAntenna(\r
@@ -1946,9 +1752,7 @@ ODM_SetAntenna(
        IN      u1Byte          Antenna);\r
 \r
 \r
-#define dm_RF_Saving   ODM_RF_Saving\r
-void ODM_RF_Saving(    IN      PDM_ODM_T       pDM_Odm,\r
-                                                       IN      u1Byte          bForceInNormal );\r
+//Remove BB power saving by Yuchen\r
 \r
 #define SwAntDivRestAfterLink  ODM_SwAntDivRestAfterLink\r
 VOID ODM_SwAntDivRestAfterLink(        IN      PDM_ODM_T       pDM_Odm);\r
@@ -1975,12 +1779,9 @@ ODM_RAStateCheck(
 //void ODM_ChangeDynamicInitGainThresh(IN      PADAPTER        pAdapter,\r
 //                                                                                     IN      INT32           DM_Type,\r
 //                                                                                     IN      INT32           DM_Value);\r
-VOID\r
-ODM_ChangeDynamicInitGainThresh(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      u4Byte  DM_Type,\r
-       IN      u4Byte DM_Value\r
-       );\r
+\r
+//Remove DIG by yuchen\r
+\r
 \r
 BOOLEAN\r
 ODM_CheckPowerStatus(\r
@@ -1997,22 +1798,7 @@ ODM_RateAdaptiveStateApInit(
 #endif\r
 #define AP_InitRateAdaptiveState       ODM_RateAdaptiveStateApInit\r
 \r
-\r
-#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
-#ifdef WIFI_WMM\r
-VOID\r
-ODM_IotEdcaSwitch(\r
-       IN      PDM_ODM_T       pDM_Odm,\r
-       IN      unsigned char           enable\r
-       );\r
-#endif\r
-\r
-BOOLEAN\r
-ODM_ChooseIotMainSTA(\r
-       IN      PDM_ODM_T               pDM_Odm,\r
-       IN      PSTA_INFO_T             pstat\r
-       );\r
-#endif\r
+//Remove Edca by Yuchen\r
 \r
 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
 #ifdef HW_ANT_SWITCH\r
@@ -2058,10 +1844,6 @@ GetPSDData(
 \r
 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
 \r
-VOID\r
-odm_DIGbyRSSI_LPS(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\r
 \r
 u4Byte ODM_Get_Rate_Bitmap(\r
        IN      PDM_ODM_T       pDM_Odm,\r
@@ -2081,11 +1863,6 @@ odm_PSDMonitorWorkItemCallback(
     IN PVOID            pContext\r
     );\r
 \r
-VOID\r
-ODM_MPT_DIG(\r
-       IN      PDM_ODM_T       pDM_Odm\r
-);\r
-\r
 VOID\r
 PatchDCTone(\r
        IN      PDM_ODM_T       pDM_Odm,\r
@@ -2117,7 +1894,10 @@ Beamforming_GetEntryBeamCapByMacId(
  );\r
 #endif\r
 \r
-\r
+VOID\r
+odm_TXPowerTrackingInit(\r
+       IN      PDM_ODM_T       pDM_Odm \r
+       );\r
 \r
 VOID ODM_DMInit( IN    PDM_ODM_T       pDM_Odm);\r
 \r
@@ -2180,11 +1960,6 @@ ODM_ResetIQKResult(
 VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm );\r
 VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm );\r
 \r
-VOID odm_PathDivChkAntSwitch(PDM_ODM_T pDM_Odm);\r
-VOID ODM_PathDivRestAfterLink(\r
-       IN      PDM_ODM_T               pDM_Odm\r
-       );\r
-\r
 \r
 //===========================================//\r
 // Neil Chen----2011--06--15--\r
@@ -2198,18 +1973,7 @@ VOID ODM_PathDivRestAfterLink(
 #define        TRAFFIC_HIGH           1\r
 \r
 //#define   PATHDIV_ENABLE      1\r
-\r
-//VOID odm_PathDivChkAntSwitch(PADAPTER        Adapter,u1Byte  Step);\r
-VOID ODM_PathDivRestAfterLink(\r
-       IN      PDM_ODM_T       pDM_Odm\r
-       );\r
-\r
-#define dm_PathDiv_RSSI_Check  ODM_PathDivChkPerPktRssi\r
-VOID ODM_PathDivChkPerPktRssi(PADAPTER         Adapter,\r
-                                                                               BOOLEAN                 bIsDefPort,\r
-                                                                               BOOLEAN                 bMatchBSSID,\r
-                                                                               PRT_WLAN_STA    pEntry,\r
-                                                                               PRT_RFD                 pRfd    );\r
+//#define dm_PathDiv_RSSI_Check        ODM_PathDivChkPerPktRssi\r
 \r
 u8Byte\r
 PlatformDivision64(\r
@@ -2230,12 +1994,7 @@ PlatformDivision64(
 //3 PathDiV End\r
 //====================================================\r
 \r
-#define PathDivCheckBeforeLink8192C    ODM_PathDiversityBeforeLink92C\r
-BOOLEAN \r
-ODM_PathDiversityBeforeLink92C(\r
-       //IN    PADAPTER        Adapter\r
-       IN              PDM_ODM_T               pDM_Odm\r
-       );\r
+//#define PathDivCheckBeforeLink8192C  ODM_PathDiversityBeforeLink92C\r
 \r
 #define DM_ChangeDynamicInitGainThresh         ODM_ChangeDynamicInitGainThresh\r
 //void ODM_ChangeDynamicInitGainThresh(IN      PADAPTER        pAdapter,\r
@@ -2244,17 +2003,6 @@ ODM_PathDiversityBeforeLink92C(
 //\r
 \r
 \r
-VOID\r
-ODM_CCKPathDiversityChkPerPktRssi(\r
-       PADAPTER                Adapter,\r
-       BOOLEAN                 bIsDefPort,\r
-       BOOLEAN                 bMatchBSSID,\r
-       PRT_WLAN_STA    pEntry,\r
-       PRT_RFD                 pRfd,\r
-       pu1Byte                 pDesc\r
-       );\r
-\r
-\r
 typedef enum tag_DIG_Connect_Definition\r
 {\r
        DIG_STA_DISCONNECT = 0, \r
@@ -2266,14 +2014,6 @@ typedef enum tag_DIG_Connect_Definition
 }DM_DIG_CONNECT_E;\r
 \r
 \r
-VOID\r
-ODM_FillTXPathInTXDESC(\r
-               IN      PADAPTER        Adapter,\r
-               IN      PRT_TCB         pTcb,\r
-               IN      pu1Byte         pDesc\r
-);\r
-\r
-\r
 #define dm_SWAW_RSSI_Check     ODM_SwAntDivChkPerPktRssi\r
 \r
 //\r
@@ -2324,12 +2064,6 @@ ODM_SingleDualAntennaDetection(
        IN              u1Byte                  mode\r
        );\r
 \r
-VOID\r
-ODM_DynamicATCSwitch(\r
-       IN              PDM_ODM_T               pDM_Odm\r
-);\r
-\r
-\r
 #endif // #if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE))\r
 VOID\r
 ODM_UpdateNoisyState(\r
index 4b361e2c5d5ec63b9915693d349453b8651b31e6..1f21d6c5c00e1c763a52fc49909b511f1ec445f6 100755 (executable)
@@ -163,12 +163,12 @@ odm_RX_HWAntDiv_Init_88E(
 \r
        pDM_Odm->AntType = ODM_AUTO_ANT;\r
 \r
-        #if (MP_DRIVER == 1)\r
+#if (MP_DRIVER == 1)\r
                pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\r
                ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv \r
                ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);  // 1:CG, 0:CS\r
                return;\r
-        #endif\r
+#else\r
        \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init =>  AntDivType=[CGCS_RX_HW_ANTDIV]\n"));\r
        \r
@@ -188,6 +188,7 @@ odm_RX_HWAntDiv_Init_88E(
        \r
        ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , 0xFFFF, 0x0102);       //antenna mapping table\r
 \r
+#endif\r
 }\r
 \r
 VOID\r
@@ -197,12 +198,12 @@ odm_TRX_HWAntDiv_Init_88E(
 {\r
        u4Byte  value32;\r
        \r
-        #if (MP_DRIVER == 1)\r
+#if (MP_DRIVER == 1)\r
                pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\r
                ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv \r
                ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX   (0/1)\r
                return;\r
-        #endif\r
+#else\r
 \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init =>  AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\n"));\r
        \r
@@ -228,6 +229,7 @@ odm_TRX_HWAntDiv_Init_88E(
        }\r
        else //MPchip\r
                ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0201);   //Reg914=3'b010, Reg915=3'b001\r
+#endif\r
 }\r
 \r
 VOID\r
@@ -244,7 +246,7 @@ odm_Smart_HWAntDiv_Init_88E(
 #if (MP_DRIVER == 1)\r
     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType));\r
     return;\r
-#endif\r
+#else\r
 \r
        for(i=0; i<6; i++)\r
        {\r
@@ -335,6 +337,8 @@ odm_Smart_HWAntDiv_Init_88E(
        //PHY_SetBBReg(Adapter, 0x864 , BIT11, 1);\r
        //PHY_SetBBReg(Adapter, 0x860 , BIT9, 0);\r
        //PHY_SetBBReg(Adapter, 0x860 , BIT8, 0);\r
+\r
+#endif\r
 }\r
 #endif //#if (RTL8188E_SUPPORT == 1)\r
 \r
@@ -2017,7 +2021,7 @@ ODM_AntDiv(
        #if (RTL8821A_SUPPORT == 1)\r
        else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
        {\r
-               if(pDM_Odm->bBtDisabled)  //BT disabled\r
+               if(!pDM_Odm->bBtEnabled)  //BT disabled\r
                {\r
                        if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV)\r
                        {\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_CfoTracking.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_CfoTracking.c
new file mode 100755 (executable)
index 0000000..e0c2a58
--- /dev/null
@@ -0,0 +1,363 @@
+/******************************************************************************
+ *
+ * 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"
+
+VOID
+odm_SetCrystalCap(
+       IN              PVOID                                   pDM_VOID,
+       IN              u1Byte                                  CrystalCap
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = &pDM_Odm->DM_CfoTrack;
+       BOOLEAN                                         bEEPROMCheck;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PADAPTER                                        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(Adapter);
+
+       bEEPROMCheck = (pHalData->EEPROMVersion >= 0x01)?TRUE:FALSE;
+#else
+       bEEPROMCheck = TRUE;
+#endif
+
+       if(pCfoTrack->CrystalCap == CrystalCap)
+               return;
+
+       pCfoTrack->CrystalCap = CrystalCap;
+
+       if(pDM_Odm->SupportICType & ODM_RTL8192D)
+       {
+               ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x000000F0, CrystalCap & 0x0F);
+               ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8188E)
+       {
+               // write 0x24[22:17] = 0x24[16:11] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x007ff800, (CrystalCap | (CrystalCap << 6)));
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8812)
+       {
+               // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
+       }       
+       else if (((pDM_Odm->SupportICType & ODM_RTL8723A) && bEEPROMCheck) ||
+               (pDM_Odm->SupportICType & ODM_RTL8723B) ||(pDM_Odm->SupportICType & ODM_RTL8192E) ||
+               (pDM_Odm->SupportICType & ODM_RTL8821))
+       {
+               // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x00FFF000, (CrystalCap | (CrystalCap << 6)));  
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8821B)
+       {
+               // write 0x28[6:1] = 0x24[30:25] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x7E000000, CrystalCap);
+               ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0x7E, CrystalCap);      
+       }
+       else if(pDM_Odm->SupportICType & ODM_RTL8814A)
+       {
+               // write 0x2C[26:21] = 0x2C[20:15] = CrystalCap
+               CrystalCap = CrystalCap & 0x3F;
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x07FF8000, (CrystalCap | (CrystalCap << 6)));
+       }
+       else 
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): Use default setting.\n"));
+               ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
+       }
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): CrystalCap = 0x%x\n", CrystalCap));
+}
+
+u1Byte
+odm_GetDefaultCrytaltalCap(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       u1Byte                                          CrystalCap = 0x20;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PADAPTER                                        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(Adapter);
+
+       CrystalCap = pHalData->CrystalCap;
+#else
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+
+       if(priv->pmib->dot11RFEntry.xcap > 0)
+               CrystalCap = priv->pmib->dot11RFEntry.xcap;
+#endif
+
+       CrystalCap = CrystalCap & 0x3f;
+
+       return CrystalCap;
+}
+
+VOID
+odm_SetATCStatus(
+       IN              PVOID                                   pDM_VOID,
+       IN              BOOLEAN                                 ATCStatus
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = &pDM_Odm->DM_CfoTrack;
+
+       if(pCfoTrack->bATCStatus == ATCStatus)
+               return;
+       
+       ODM_SetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm), ATCStatus);
+       pCfoTrack->bATCStatus = ATCStatus;
+}
+
+BOOLEAN
+odm_GetATCStatus(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       BOOLEAN                                         ATCStatus;
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+       ATCStatus = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm));
+       return ATCStatus;
+}
+
+VOID
+ODM_CfoTrackingReset(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = &pDM_Odm->DM_CfoTrack;
+       u1Byte                                          CrystalCap;
+
+       pCfoTrack->DefXCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
+       pCfoTrack->bAdjust = TRUE;
+       
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
+       odm_SetATCStatus(pDM_Odm, TRUE);
+#else
+       if(pCfoTrack->CrystalCap > pCfoTrack->DefXCap)
+       {
+               for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap >= pCfoTrack->DefXCap; CrystalCap--)
+                       odm_SetCrystalCap(pDM_Odm, CrystalCap);
+       }
+       else
+       {
+               for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap <= pCfoTrack->DefXCap; CrystalCap++)
+                       odm_SetCrystalCap(pDM_Odm, CrystalCap);
+       }
+#endif
+}
+
+VOID
+ODM_CfoTrackingInit(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = &pDM_Odm->DM_CfoTrack;
+      
+       pCfoTrack->DefXCap = pCfoTrack->CrystalCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
+       pCfoTrack->bATCStatus = odm_GetATCStatus(pDM_Odm);
+       pCfoTrack->bAdjust = TRUE;
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init()=========> \n"));
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init(): bATCStatus = %d, CrystalCap = 0x%x \n",pCfoTrack->bATCStatus, pCfoTrack->DefXCap));
+}
+
+VOID
+ODM_CfoTracking(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PCFO_TRACKING                           pCfoTrack = &pDM_Odm->DM_CfoTrack;
+       int                                                     CFO_kHz_A, CFO_kHz_B, CFO_ave = 0;
+       int                                                     CFO_ave_diff;
+       int                                                     CrystalCap = (int)pCfoTrack->CrystalCap;
+       u1Byte                                          Adjust_Xtal = 1;
+
+       //4 Support ability
+       if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Return: SupportAbility ODM_BB_CFO_TRACKING is disabled\n"));
+               return;
+       }
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking()=========> \n"));
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN && MP_DRIVER == 1)
+       if(0)
+#else
+       if(!pDM_Odm->bLinked || !pDM_Odm->bOneEntryOnly)
+#endif
+       {       
+               //4 No link or more than one entry
+               ODM_CfoTrackingReset(pDM_Odm);
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Reset: bLinked = %d, bOneEntryOnly = %d\n", 
+                       pDM_Odm->bLinked, pDM_Odm->bOneEntryOnly));
+       }
+       else
+       {
+               //3 1. CFO Tracking
+               //4 1.1 No new packet
+               if(pCfoTrack->packetCount == pCfoTrack->packetCount_pre)
+               {
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): packet counter doesn't change\n"));
+                       return;
+               }
+               pCfoTrack->packetCount_pre = pCfoTrack->packetCount;
+       
+               //4 1.2 Calculate CFO
+               CFO_kHz_A =  (int)(pCfoTrack->CFO_tail[0] * 3125)  / 1280;
+               CFO_kHz_B =  (int)(pCfoTrack->CFO_tail[1] * 3125)  / 1280;
+               
+               if(pDM_Odm->RFType < ODM_2T2R)
+                       CFO_ave = CFO_kHz_A;
+               else
+                       CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n", 
+                                               CFO_kHz_A, CFO_kHz_B, CFO_ave));
+
+               //4 1.3 Avoid abnormal large CFO
+               CFO_ave_diff = (pCfoTrack->CFO_ave_pre >= CFO_ave)?(pCfoTrack->CFO_ave_pre - CFO_ave):(CFO_ave - pCfoTrack->CFO_ave_pre);
+               if(CFO_ave_diff > 20 && pCfoTrack->largeCFOHit == 0 && !pCfoTrack->bAdjust)
+               {
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): first large CFO hit\n"));
+                       pCfoTrack->largeCFOHit = 1;
+                       return;
+               }
+               else
+                       pCfoTrack->largeCFOHit = 0;
+               pCfoTrack->CFO_ave_pre = CFO_ave;
+
+               //4 1.4 Dynamic Xtal threshold
+               if(pCfoTrack->bAdjust == FALSE)
+               {
+                       if(CFO_ave > CFO_TH_XTAL_HIGH || CFO_ave < (-CFO_TH_XTAL_HIGH))
+                               pCfoTrack->bAdjust = TRUE;
+               }
+               else
+               {
+                       if(CFO_ave < CFO_TH_XTAL_LOW && CFO_ave > (-CFO_TH_XTAL_LOW))
+                               pCfoTrack->bAdjust = FALSE;
+               }
+               
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+               //4 1.5 BT case: Disable CFO tracking
+               if(pDM_Odm->bBtEnabled)
+               {
+                       pCfoTrack->bAdjust = FALSE;
+                       odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable CFO tracking for BT!!\n"));
+               }
+               
+               //4 1.6 Big jump 
+               if(pCfoTrack->bAdjust)
+               {
+                       if(CFO_ave > CFO_TH_XTAL_LOW)
+                               Adjust_Xtal =  Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);
+                       else if(CFO_ave < (-CFO_TH_XTAL_LOW))
+                               Adjust_Xtal =  Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);
+
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap offset = %d\n", Adjust_Xtal));
+               }
+#endif
+
+               //4 1.7 Adjust Crystal Cap.
+               if(pCfoTrack->bAdjust)
+               {
+                       if(CFO_ave > CFO_TH_XTAL_LOW)
+                       CrystalCap = CrystalCap + Adjust_Xtal;
+                       else if(CFO_ave < (-CFO_TH_XTAL_LOW))
+                               CrystalCap = CrystalCap - Adjust_Xtal;
+
+                       if(CrystalCap > 0x3f)
+                               CrystalCap = 0x3f;
+                       else if (CrystalCap < 0)
+                               CrystalCap = 0;
+
+                       odm_SetCrystalCap(pDM_Odm, (u1Byte)CrystalCap);
+               }
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap = 0x%x, Default Crystal cap = 0x%x\n", 
+                       pCfoTrack->CrystalCap, pCfoTrack->DefXCap));
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+               if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+                       return;
+               
+               //3 2. Dynamic ATC switch
+               if(CFO_ave < CFO_TH_ATC && CFO_ave > -CFO_TH_ATC)
+               {
+                       odm_SetATCStatus(pDM_Odm, FALSE);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable ATC!!\n"));
+               }
+               else
+               {
+                       odm_SetATCStatus(pDM_Odm, TRUE);
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Enable ATC!!\n"));
+               }
+#endif
+       }
+}
+
+VOID
+ODM_ParsingCFO(
+       IN              PVOID                   pDM_VOID,
+       IN              PVOID                   pPktinfo_VOID,
+       IN              s1Byte*                         pcfotail
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PODM_PACKET_INFO_T              pPktinfo = (PODM_PACKET_INFO_T)pPktinfo_VOID;
+       PCFO_TRACKING   pCfoTrack = &pDM_Odm->DM_CfoTrack;
+       u1Byte                  i;
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
+               return;
+
+#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) && (MP_DRIVER == 1))
+       if(1)
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       if(pPktinfo->bPacketMatchBSSID)
+#else
+       if(pPktinfo->StationID != 0)
+#endif
+       {                               
+               //3 Update CFO report for path-A & path-B
+               // Only paht-A and path-B have CFO tail and short CFO
+               for(i = ODM_RF_PATH_A; i <= ODM_RF_PATH_B; i++)   
+               {
+                       pCfoTrack->CFO_tail[i] = (int)pcfotail[i];
+               }
+
+               //3 Update packet counter
+               if(pCfoTrack->packetCount == 0xffffffff)
+                       pCfoTrack->packetCount = 0;
+               else
+                       pCfoTrack->packetCount++;
+       }
+}
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_CfoTracking.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_CfoTracking.h
new file mode 100755 (executable)
index 0000000..48ead72
--- /dev/null
@@ -0,0 +1,66 @@
+/******************************************************************************
+ *
+ * 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        __ODMCFOTRACK_H__
+#define    __ODMCFOTRACK_H__
+
+#define                CFO_TH_XTAL_HIGH                        20                      // kHz
+#define                CFO_TH_XTAL_LOW                 10                      // kHz
+#define                CFO_TH_ATC                                      80                      // kHz
+
+typedef struct _CFO_TRACKING_
+{
+       BOOLEAN                 bATCStatus;
+       BOOLEAN                 largeCFOHit;
+       BOOLEAN                 bAdjust;
+       u1Byte                  CrystalCap;
+       u1Byte                  DefXCap;
+       int                             CFO_tail[2];
+       int                             CFO_ave_pre;
+       u4Byte                  packetCount;
+       u4Byte                  packetCount_pre;
+
+       BOOLEAN                 bForceXtalCap;
+       BOOLEAN                 bReset;
+}CFO_TRACKING, *PCFO_TRACKING;
+
+VOID
+ODM_CfoTrackingReset(
+       IN              PVOID                                   pDM_VOID
+);
+
+VOID
+ODM_CfoTrackingInit(
+       IN              PVOID                                   pDM_VOID
+);
+
+VOID
+ODM_CfoTracking(
+       IN              PVOID                                   pDM_VOID
+);
+
+VOID
+ODM_ParsingCFO(
+       IN              PVOID                                   pDM_VOID,
+       IN              PVOID                                   pPktinfo_VOID,
+       IN      s1Byte*                                         pcfotail
+);
+
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DIG.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DIG.c
new file mode 100755 (executable)
index 0000000..67f9606
--- /dev/null
@@ -0,0 +1,2591 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "odm_precomp.h"\r
+#define ADAPTIVITY_VERSION     "5.0"
+
+\r
+VOID\r
+ODM_ChangeDynamicInitGainThresh(
+       IN      PVOID           pDM_VOID,
+       IN      u4Byte          DM_Type,
+       IN      u4Byte          DM_Value
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       if (DM_Type == DIG_TYPE_THRESH_HIGH)
+       {
+               pDM_DigTable->RssiHighThresh = DM_Value;                
+       }
+       else if (DM_Type == DIG_TYPE_THRESH_LOW)
+       {
+               pDM_DigTable->RssiLowThresh = DM_Value;
+       }
+       else if (DM_Type == DIG_TYPE_ENABLE)
+       {
+               pDM_DigTable->Dig_Enable_Flag   = TRUE;
+       }       
+       else if (DM_Type == DIG_TYPE_DISABLE)
+       {
+               pDM_DigTable->Dig_Enable_Flag = FALSE;
+       }       
+       else if (DM_Type == DIG_TYPE_BACKOFF)
+       {
+               if(DM_Value > 30)
+                       DM_Value = 30;
+               pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
+       }
+       else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
+       {
+               if(DM_Value == 0)
+                       DM_Value = 0x1;
+               pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
+       }
+       else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
+       {
+               if(DM_Value > 0x50)
+                       DM_Value = 0x50;
+               pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
+       }
+}      // DM_ChangeDynamicInitGainThresh //\r
+
+VOID
+odm_NHMCounterStatisticsInit(
+       IN              PVOID                   pDM_VOID
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+       {
+               //PHY parameters initialize for ac series
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, 0x2710);      //0x990[31:16]=0x2710   Time duration for NHM unit: 4us, 0x2710=40ms
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff);   //0x994[31:16]=0xffff   th_9, th_10
+               //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff5c);     //0x998=0xffffff5c              th_3, th_2, th_1, th_0
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff52);       //0x998=0xffffff52              th_3, th_2, th_1, th_0
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff);       //0x99c=0xffffffff              th_7, th_6, th_5, th_4
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff);          //0x9a0[7:0]=0xff               th_8
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x7); //0x994[9:8]=3                  enable CCX
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1);         //0x9e8[7]=1                    max power among all RX ants     
+                               
+               //panic_printk("RTL8812AU phy parameters init %s,%d\n", __FUNCTION__, __LINE__);
+       }
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       {
+               //PHY parameters initialize for n series
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x2710);       //0x894[31:16]=0x2710   Time duration for NHM unit: 4us, 0x2710=40ms
+               //ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x4e20);     //0x894[31:16]=0x4e20   Time duration for NHM unit: 4us, 0x4e20=80ms
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff);    //0x890[31:16]=0xffff   th_9, th_10
+               //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c);      //0x898=0xffffff5c              th_3, th_2, th_1, th_0
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff52);        //0x898=0xffffff52              th_3, th_2, th_1, th_0
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff);        //0x89c=0xffffffff              th_7, th_6, th_5, th_4
+               ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff);         //0xe28[7:0]=0xff               th_8
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7);  //0x890[9:8]=3                  enable CCX
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1);             //0xc0c[7]=1                    max power among all RX ants                             
+       }
+}
+
+VOID
+odm_NHMCounterStatistics(
+       IN              PVOID                   pDM_VOID
+       )
+{
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+       // Get NHM report
+       odm_GetNHMCounterStatistics(pDM_Odm);
+       
+       // Reset NHM counter
+       odm_NHMCounterStatisticsReset(pDM_Odm);
+}
+
+VOID
+odm_GetNHMCounterStatistics(
+       IN              PVOID                   pDM_VOID
+       )
+{
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       u4Byte          value32 = 0;\r
+
+       if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);
+
+       pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);
+}
+
+VOID
+odm_NHMCounterStatisticsReset(
+       IN              PVOID                   pDM_VOID
+       )
+{
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       
+       if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+       {                       
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);
+       }
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       {
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);
+       }
+}
+
+VOID
+odm_NHMBBInit(
+       IN              PVOID                   pDM_VOID
+)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+       pDM_Odm->adaptivity_flag = 0;
+       pDM_Odm->tolerance_cnt = 3;
+       pDM_Odm->NHMLastTxOkcnt = 0;
+       pDM_Odm->NHMLastRxOkcnt = 0;
+       pDM_Odm->NHMCurTxOkcnt = 0;
+       pDM_Odm->NHMCurRxOkcnt = 0;
+}
+
+//
+VOID
+odm_NHMBB(
+       IN              PVOID                   pDM_VOID
+)
+{
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       u4Byte          value32;
+       //u1Byte        test_status;
+       //PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+
+       pDM_Odm->NHMCurTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_Odm->NHMLastTxOkcnt;
+       pDM_Odm->NHMCurRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_Odm->NHMLastRxOkcnt;
+       pDM_Odm->NHMLastTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast);
+       pDM_Odm->NHMLastRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast);       
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NHM_cnt_0=%d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n", 
+               pDM_Odm->NHM_cnt_0, pDM_Odm->NHMCurTxOkcnt, pDM_Odm->NHMCurRxOkcnt));
+
+       
+       if ( (pDM_Odm->NHMCurTxOkcnt) + 1 > (u8Byte)(pDM_Odm->NHMCurRxOkcnt<<2) + 1)            //Tx > 4*Rx possible for adaptivity test
+       {
+               if(pDM_Odm->NHM_cnt_0 >= 190 || pDM_Odm->adaptivity_flag == TRUE)
+               {
+                       //Enable EDCCA since it is possible running Adaptivity testing
+                       //test_status = 1;
+                       pDM_Odm->adaptivity_flag = TRUE;
+                       ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0);     //don't ignore EDCCA     reg520[15]=0\14
+                       ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1);  //reg524[11]=1  
+                       pDM_Odm->tolerance_cnt = 0;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;
+#endif
+               }
+               else
+               {
+                       if(pDM_Odm->tolerance_cnt<3)
+                               pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
+                       else
+                               pDM_Odm->tolerance_cnt = 4;     
+                       //test_status = 5;
+                       if(pDM_Odm->tolerance_cnt > 3)
+                       {
+                               //test_status = 3;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;
+#else                          
+                               ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1);     //ignore EDCCA  reg520[15]=1
+                               ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0);          //reg524[11]=0
+#endif
+                               pDM_Odm->adaptivity_flag = FALSE;
+                       }
+               }
+       }
+       else    // TX<RX 
+       {
+               if(pDM_Odm->adaptivity_flag == TRUE && pDM_Odm->NHM_cnt_0 <= 200)
+               {
+                       //test_status = 2;
+                       ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0);     //don't ignore EDCCA     reg520[15]=0\14
+                       ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1);  //reg524[11]=1  
+                       pDM_Odm->tolerance_cnt = 0;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;
+#endif
+               }
+               else
+               {
+                       if(pDM_Odm->tolerance_cnt<3)
+                               pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
+                       else
+                               pDM_Odm->tolerance_cnt = 4;     
+                       //test_status = 5;
+                       if(pDM_Odm->tolerance_cnt >3)
+                       {
+                               //test_status = 4;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+                       pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
+                       pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;
+#else
+                               ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1);     //ignore EDCCA  reg520[15]=1
+                               ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0);          //reg524[11]=0
+#endif
+                               pDM_Odm->adaptivity_flag = FALSE;
+                       }
+               }
+       }
+        
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag));
+}
+
+VOID
+odm_SearchPwdBLowerBound(
+       IN              PVOID           pDM_VOID,
+       IN              u1Byte          IGI_target
+)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       u4Byte                  value32 =0;
+       u1Byte                  cnt, IGI;
+       BOOLEAN                 bAdjust=TRUE;
+       s1Byte                  TH_L2H_dmc, TH_H2L_dmc;
+       s1Byte                  TH_L2H, TH_H2L, Diff;
+
+       IGI = 0x50; // find H2L, L2H lower bound
+       ODM_Write_DIG(pDM_Odm, IGI);
+       
+
+       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;
+       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);
+                                       
+       ODM_delay_ms(5);\r
+               
+               while(bAdjust)
+                       {
+                       for(cnt=0; cnt<20; cnt ++)
+                               {
+                               if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+                                       value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11N, bMaskDWord);
+                               else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+                                       value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11AC, bMaskDWord);
+                       
+                               if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8723B|ODM_RTL8188E)))
+                                       pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
+                               else if(value32 & BIT29)
+                                       pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
+                               else
+                                       pDM_Odm->txEdcca0 = pDM_Odm->txEdcca0 + 1;
+                               }
+                       //DbgPrint("txEdcca1 = %d, txEdcca0 = %d\n", pDM_Odm->txEdcca1, pDM_Odm->txEdcca0);
+                       
+                               if(pDM_Odm->txEdcca1 > 5 )
+                               {
+                                       IGI = IGI -1;
+                                       TH_L2H_dmc = TH_L2H_dmc + 1;
+                                               if(TH_L2H_dmc > 10)
+                                                       TH_L2H_dmc = 10;
+                                       TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
+                                       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);
+
+                                       pDM_Odm->TxHangFlg = TRUE;
+                                       pDM_Odm->txEdcca1 = 0;
+                                       pDM_Odm->txEdcca0 = 0;
+
+                                       if(TH_L2H_dmc == 10)
+                                               {
+                                               bAdjust = FALSE;
+                                               pDM_Odm->TxHangFlg = FALSE;
+                                               pDM_Odm->txEdcca1 = 0;
+                                               pDM_Odm->txEdcca0 = 0;
+                                               pDM_Odm->H2L_lb = TH_H2L_dmc;
+                                               pDM_Odm->L2H_lb = TH_L2H_dmc;
+                                               pDM_Odm->Adaptivity_IGI_upper = IGI;
+                                               }
+                                       }
+                               else
+                               {
+                                       bAdjust = FALSE;
+                                       pDM_Odm->TxHangFlg = FALSE;
+                                       pDM_Odm->txEdcca1 = 0;
+                                       pDM_Odm->txEdcca0 = 0;
+                                       pDM_Odm->H2L_lb = TH_H2L_dmc;
+                                       pDM_Odm->L2H_lb = TH_L2H_dmc;   
+                                       pDM_Odm->Adaptivity_IGI_upper = IGI;
+                               }
+                       }
+
+                                                       
+ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI = 0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", IGI, pDM_Odm->H2L_lb , pDM_Odm->L2H_lb));
+               
+}
+
+VOID
+odm_AdaptivityInit(
+       IN      PVOID           pDM_VOID
+)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;
+       PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);
+       pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense;
+#endif
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+
+       if(pDM_Odm->Carrier_Sense_enable == FALSE)\r
+       {
+               pDM_Odm->TH_L2H_ini = 0xf7; // -7
+       }
+       else
+               pDM_Odm->TH_L2H_ini = 0xa; \r
+
+       pDM_Odm->AdapEn_RSSI = 20;
+       pDM_Odm->TH_EDCCA_HL_diff = 7;
+
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+       if(pDM_Odm->Carrier_Sense_enable){
+               pDM_Odm->TH_L2H_ini = 10;
+               pDM_Odm->TH_EDCCA_HL_diff = 3;          
+               pDM_Odm->AdapEn_RSSI = 30;
+       }
+       else
+       {
+               pDM_Odm->TH_L2H_ini = 0xf7;
+               pDM_Odm->TH_EDCCA_HL_diff = 7;
+               pDM_Odm->AdapEn_RSSI = 20;
+       }
+
+       pDM_Odm->TH_L2H_ini_mode2 = 20;
+       pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;
+       pDM_Odm->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;
+       pDM_Odm->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff ;
+       
+#endif
+
+       pDM_Odm->IGI_Base = 0x32;       
+       pDM_Odm->IGI_target = 0x1c;
+       pDM_Odm->ForceEDCCA = 0;
+       pDM_Odm->NHM_disable = FALSE;
+       pDM_Odm->TxHangFlg = TRUE;
+       pDM_Odm->txEdcca0 = 0;
+       pDM_Odm->txEdcca1 = 0;
+       pDM_Odm->H2L_lb= 0;
+       pDM_Odm->L2H_lb= 0;
+       pDM_Odm->Adaptivity_IGI_upper = 0;
+       odm_NHMBBInit(pDM_Odm);
+
+       ODM_SetBBReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); // stop counting if EDCCA is asserted
+}
+
+
+VOID
+odm_Adaptivity(
+       IN              PVOID                   pDM_VOID,
+       IN              u1Byte                  IGI
+)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       s1Byte TH_L2H_dmc, TH_H2L_dmc;\r
+       s1Byte Diff, IGI_target;
+       BOOLEAN EDCCA_State = FALSE;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       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_WIN)
+               // 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->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 + 2;
+       else
+               IGI_target = pDM_Odm->IGI_Base;
+       pDM_Odm->IGI_target = (u1Byte) IGI_target;
+       
+       //Search pwdB lower bound
+       if(pDM_Odm->TxHangFlg == TRUE)
+       {
+               if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+                       ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);
+               else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+                       ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);
+               odm_SearchPwdBLowerBound(pDM_Odm, pDM_Odm->IGI_target );
+       }
+               
+       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(!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;
+\r
+       if(pDM_Odm->bLinked && pDM_Odm->Carrier_Sense_enable == FALSE && pDM_Odm->NHM_disable == FALSE &&pDM_Odm->TxHangFlg == FALSE)\r
+               odm_NHMBB(pDM_Odm);\r
+
+       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;
+
+               //replace lower bound to prevent EDCCA always equal 1
+                       if(TH_H2L_dmc < pDM_Odm->H2L_lb)                                
+                               TH_H2L_dmc = pDM_Odm->H2L_lb;
+                       if(TH_L2H_dmc < pDM_Odm->L2H_lb)
+                               TH_L2H_dmc = pDM_Odm->L2H_lb;
+       }
+       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);
+}
+\r
+int 
+getIGIForDiff(int value_IGI)
+{
+       #define ONERCCA_LOW_TH          0x30
+       #define ONERCCA_LOW_DIFF        8
+
+       if (value_IGI < ONERCCA_LOW_TH) {
+               if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
+                       return ONERCCA_LOW_TH;
+               else
+                       return value_IGI + ONERCCA_LOW_DIFF;
+       } else {
+               return value_IGI;
+       }
+}
+\r
+VOID
+ODM_Write_DIG(
+       IN      PVOID                   pDM_VOID,
+       IN      u1Byte                  CurrentIGI
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       if(pDM_DigTable->bStopDIG)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
+               return;
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("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)
+       {
+               //1 Check initial gain by upper bound           
+               if(!pDM_DigTable->bPSDInProgress)
+               {
+                       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",pDM_DigTable->rx_gain_range_max));
+                               CurrentIGI = pDM_DigTable->rx_gain_range_max;
+                       }
+
+               }
+
+               //1 Set IGI value
+               if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
+               { 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                       if(pDM_Odm->RFType > ODM_1T1R)
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+                       {
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,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->RFType > ODM_1T1R)
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       
+                                       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+                                       {
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,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->RFType != ODM_1T1R)
+                                               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->RFType != ODM_1T1R)
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       break;
+                       }
+               }
+               pDM_DigTable->CurIGValue = CurrentIGI;
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
+       
+}
+\r
+VOID
+odm_PauseDIG(
+       IN              PVOID                                   pDM_VOID,\r
+       IN              ODM_Pause_DIG_TYPE              PauseType,
+       IN              u1Byte                                  IGIValue
+)
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       static  BOOLEAN         bPaused = FALSE;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
+       if(*pDM_DigTable->pbP2pLinkInProgress)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
+               return;
+       }
+#endif
+
+       if((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && pDM_Odm->TxHangFlg == TRUE)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Dynamic adjust threshold in progress !!\n"));
+               return;
+       }
+
+       if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
+               return;
+       }
+       
+       switch(PauseType)
+       {
+               //1 Pause DIG
+               case ODM_PAUSE_DIG:
+                       //2 Disable DIG
+                       ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
+
+                       //2 Backup IGI value
+                       if(!bPaused)
+                       {
+                               pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
+                               bPaused = TRUE;
+                       }
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI  = 0x%x\n", pDM_DigTable->IGIBackup));
+
+                       //2 Write new IGI value
+                       ODM_Write_DIG(pDM_Odm, IGIValue);
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
+                       break;
+
+               //1 Resume DIG
+               case ODM_RESUME_DIG:
+                       if(bPaused)
+                       {
+                               //2 Write backup IGI value
+                               ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
+                               bPaused = FALSE;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
+
+                               //2 Enable DIG
+                               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);  
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
+                       }
+                       break;
+
+               default:
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong  type !!\n"));
+                       break;
+       }
+}
+
+BOOLEAN 
+odm_DigAbort(
+       IN              PVOID                   pDM_VOID
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv                         priv = pDM_Odm->priv;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\r
+#endif\r
+\r
+       //SupportAbility
+       if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
+               return  TRUE;\r
+       }\r
+\r
+       //SupportAbility\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))\r
+       {       \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
+               return  TRUE;\r
+       }\r
+\r
+       //ScanInProcess\r
+       if(*(pDM_Odm->pbScanInProcess))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
+               return  TRUE;\r
+       }\r
+\r
+       //add by Neil Chen to avoid PSD is processing\r
+       if(pDM_Odm->bDMInitialGainEnable == FALSE)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
+               return  TRUE;\r
+       }\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       #if OS_WIN_FROM_WIN7(OS_VERSION)\r
+       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\r
+\r
+       if(pDM_Odm->bBtHsOperation)\r
+       {\r
+               odm_DigForBtHsMode(pDM_Odm);\r
+       }       \r
+\r
+       if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))\r
+       {\r
+               if(pRX_HP_Table->RXHP_flag == 1)\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
+                       return  TRUE;   \r
+               }\r
+       }\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV      \r
+       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  TRUE;
+       }
+       #endif\r
+#else\r
+       if (!(priv->up_time > 5))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
+               return  TRUE;\r
+       }\r
+#endif\r
+\r
+       return  FALSE;
+}\r
+\r
+VOID
+odm_DIGInit(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+
+       pDM_DigTable->bStopDIG = FALSE;
+       pDM_DigTable->bPSDInProgress = FALSE;
+       pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
+       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;
+       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->bMediaConnect_0 = FALSE;
+       pDM_DigTable->bMediaConnect_1 = FALSE;
+
+       //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
+       pDM_Odm->bDMInitialGainEnable = TRUE;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
+       pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
+
+       // For AP\ ADSL modified DIG
+       pDM_DigTable->bTpTarget = FALSE;
+       pDM_DigTable->bNoiseEst = TRUE;
+       pDM_DigTable->IGIOffset_A = 0;
+       pDM_DigTable->IGIOffset_B = 0;
+       pDM_DigTable->TpTrainTH_min = 0;
+
+       // For RTL8881A
+       FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
+
+       //Dyanmic EDCCA
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+       {
+               ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
+       }
+#else
+       pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
+       pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
+
+       //To Initi BT30 IGI
+       pDM_DigTable->BT30_CurIGI=0x32;\r
+\r
+       #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       *pDM_DigTable->pbP2pLinkInProgress= FALSE;\r
+       #endif\r
+#endif
+
+       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;
+       }
+       
+}
+\r
+
+VOID 
+odm_DIG(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PADAPTER                                        pAdapter        = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv                         priv = pDM_Odm->priv;\r
+       PSTA_INFO_T                             pEntry;\r
+#endif\r
+\r
+       // Common parameters
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
+       BOOLEAN                                         FirstConnect,FirstDisConnect;
+       u1Byte                                          DIG_MaxOfMin, DIG_Dynamic_MIN, i;
+       u1Byte                                          dm_dig_max, dm_dig_min;\r
+       u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;\r
+       u1Byte                                          offset;\r
+       u4Byte                                          dm_FA_thres[3];\r
+       u1Byte                                          Adap_IGI_Upper = 0;
+       u4Byte                                          TxTp = 0, RxTp = 0;\r
+       BOOLEAN                                         bDFSBand = FALSE;\r
+       BOOLEAN                                         bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       u4Byte                                          TpTrainTH_MIN = DM_DIG_TP_Target_TH0;\r
+       static          u1Byte                  TimeCnt = 0;\r
+#endif\r
+\r
+       if(odm_DigAbort(pDM_Odm) == TRUE)\r
+               return;\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
+\r
+       if(pDM_Odm->adaptivity_flag == TRUE)
+               Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
+       
+\r
+       //1 Update status
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
+               {
+                       if(*(pDM_Odm->pbMasterOfDMSP))\r
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\r
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+                       }
+                       else\r
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;\r
+                               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)\r
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\r
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+                       }
+                       else\r
+                       {
+                               DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;\r
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
+                               FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
+                       }
+               }
+       }\r
+       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);\r
+       }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       //1 Noise Floor Estimate
+       //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
+       //odm_InbandNoiseCalculate (pDM_Odm);
+       
+       //1 Mode decision
+       if(pDM_Odm->bLinked)
+       {
+               //2 Calculate total TP
+               for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+               {
+                       pEntry = pDM_Odm->pODM_StaInfo[i];
+                       if(IS_STA_VALID(pEntry))
+                       {
+                               RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
+                               TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7);                        //Kbps
+                       }
+               }
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
+       }
+
+       switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
+       {
+               case 0:
+               {
+                       bPerformance = TRUE;
+                       break;
+               }
+               case 1:
+               {
+                       bPerformance = FALSE;
+                       break;
+               }
+               case 2:
+               {
+                       if(pDM_Odm->bLinked)
+                       {
+                               if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
+                                       TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
+
+                               if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
+                                       TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
+
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
+
+                               //2 Decide DIG mode by total TP
+                               if((TxTp + RxTp) > DM_DIG_TP_Target_TH1)                        // change to performance mode
+                               {
+                                       bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
+                                       pDM_DigTable->bTpTarget = TRUE;
+                                       bPerformance = TRUE;
+                               }
+                               else if((TxTp + RxTp) < TpTrainTH_MIN)  // change to coverage mode
+                               {
+                                       bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
+                                       
+                                       if(TimeCnt < DM_DIG_TP_Training_Period)
+                                       {
+                                               pDM_DigTable->bTpTarget = FALSE;
+                                               bPerformance = FALSE;
+                                               TimeCnt++;
+                                       }
+                                       else
+                                       {
+                                               pDM_DigTable->bTpTarget = TRUE;
+                                               bPerformance = TRUE;
+                                               bFirstTpTarget = TRUE;
+                                               TimeCnt = 0;
+                                       }
+                               }
+                               else                                                                            // remain previous mode
+                               {
+                                       bPerformance = pDM_DigTable->bTpTarget;
+
+                                       if(!bPerformance)
+                                       {
+                                               if(TimeCnt < DM_DIG_TP_Training_Period)
+                                                       TimeCnt++;
+                                               else
+                                               {
+                                                       pDM_DigTable->bTpTarget = TRUE;
+                                                       bPerformance = TRUE;
+                                                       bFirstTpTarget = TRUE;
+                                                       TimeCnt = 0;
+                                               }
+                                       }
+                               }
+
+                               if(!bPerformance)
+                                       pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
+
+                       }
+                       else
+                       {
+                               bPerformance = FALSE;
+                               pDM_DigTable->TpTrainTH_min = 0;
+                       }
+                       break;
+               }
+               default:
+                       bPerformance = TRUE;
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== DIG mode = %d  ======\n", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
+#endif
+
+       //1 Boundary Decision
+       if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
+       {
+               //2 High power case
+               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
+       {\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+               //2 For AP\ADSL\r
+               if(!bPerformance)\r
+               {\r
+                       dm_dig_max = DM_DIG_MAX_AP_COVERAGR;\r
+                       dm_dig_min = DM_DIG_MIN_AP_COVERAGE;\r
+                       DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;\r
+               }\r
+               else\r
+               {\r
+                       dm_dig_max = DM_DIG_MAX_AP;\r
+                       dm_dig_min = DM_DIG_MIN_AP;\r
+                       DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
+               }\r
+\r
+               //4 DFS band\r
+               if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||\r
+                       ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))\r
+               {\r
+                       bDFSBand = TRUE;\r
+                       dm_dig_min = DM_DIG_MIN_AP_DFS;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
+               }\r
+               
+               //4 TX2path\r
+               if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))\r
+                               dm_dig_max = 0x2A;\r
+
+#if RTL8192E_SUPPORT
+#ifdef HIGH_POWER_EXT_LNA
+               if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
+                       dm_dig_max = 0x42;                                              
+#endif
+#endif
+
+#else\r
+               //2 For WIN\CE\r
+               if(pDM_Odm->SupportICType >= ODM_RTL8188E)\r
+                       dm_dig_max = 0x5A;\r
+               else\r
+                       dm_dig_max = DM_DIG_MAX_NIC;\r
+               \r
+               if(pDM_Odm->SupportICType != ODM_RTL8821)\r
+                       dm_dig_min = DM_DIG_MIN_NIC;\r
+               else\r
+                       dm_dig_min = 0x1C;\r
+
+               DIG_MaxOfMin = DM_DIG_MAX_AP;
+#endif \r
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\n",dm_dig_max, dm_dig_min));
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       // for P2P case\r
+       if(0 < *pDM_Odm->pu1ForcedIgiLb)
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
+               dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
+               dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
+       }
+#endif
+\r
+       //1 Adjust boundary by RSSI\r
+       if(pDM_Odm->bLinked && bPerformance)\r
+       {\r
+               //2 Modify DIG upper bound\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+               offset = 15;\r
+#else\r
+               //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT\r
+               if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))
+               {
+                       offset = 10;\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));          
+               }
+               else\r
+                       offset = 15;\r
+#endif\r
+
+               if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )\r
+                       pDM_DigTable->rx_gain_range_max = dm_dig_max;\r
+               else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
+                       pDM_DigTable->rx_gain_range_max = dm_dig_min;
+               else\r
+                       pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;\r
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+               //2 Modify DIG lower bound\r
+               //if(pDM_Odm->bOneEntryOnly)\r
+               {
+                       if(pDM_Odm->RSSI_Min < dm_dig_min)\r
+                               DIG_Dynamic_MIN = dm_dig_min;\r
+                       else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\r
+                               DIG_Dynamic_MIN = DIG_MaxOfMin;\r
+                       else\r
+                               DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\r
+               }\r
+#else\r
+               {\r
+                       //4 For AP\r
+#ifdef __ECOS\r
+                       HAL_REORDER_BARRIER();\r
+#else\r
+                       rmb();\r
+#endif\r
+                       if (bDFSBand)\r
+                       {\r
+                               DIG_Dynamic_MIN = dm_dig_min;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));
+                       }\r
+                       else \r
+                       {\r
+                               if(pDM_Odm->RSSI_Min < dm_dig_min)\r
+                                       DIG_Dynamic_MIN = dm_dig_min;\r
+                               else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\r
+                                       DIG_Dynamic_MIN = DIG_MaxOfMin;\r
+                               else\r
+                                       DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\r
+                       }\r
+               }\r
+#endif\r
+       }
+       else
+       {\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+               if(bPerformance && bDFSBand)\r
+               {\r
+                       pDM_DigTable->rx_gain_range_max = 0x28;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\n", pDM_DigTable->rx_gain_range_max));
+               }\r
+               else\r
+#endif\r
+               {\r
+                       pDM_DigTable->rx_gain_range_max = dm_dig_max;\r
+               }\r
+               DIG_Dynamic_MIN = dm_dig_min;\r
+       }\r
+       
+       //1 Force Lower Bound for AntDiv
+       if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)\r
+       {\r
+               if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
+               {\r
+                       if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)\r
+                       {\r
+                               if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)\r
+                                       DIG_Dynamic_MIN = DIG_MaxOfMin;\r
+                               else\r
+                                       DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", DIG_Dynamic_MIN));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", pDM_DigTable->AntDiv_RSSI_max));
+                       }\r
+               }\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",\r
+               pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",\r
+               pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
+\r
+       //1 Modify DIG lower bound, deal with abnormal case
+       //2 Abnormal false alarm case
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       if(bDFSBand)\r
+       {
+               pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\r
+       }
+       else\r
+#endif\r
+       {\r
+               if(FirstDisConnect)
+               {\r
+                       pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\r
+                       pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;\r
+               }\r
+               else\r
+                       pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
+       }
+\r
+       //2 Abnormal # beacon case
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+               if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter))
+                       pDM_Odm->bsta_state = TRUE;
+#endif\r
+\r
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       if(pDM_Odm->bLinked && !FirstConnect)
+       {\r
+               if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
+               {
+                       pDM_DigTable->rx_gain_range_min = dm_dig_min;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",
+                               pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
+               }
+       }\r
+#endif\r
+\r
+       //2 Abnormal lower bound case
+       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;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",pDM_DigTable->rx_gain_range_min));
+       }
+\r
+       
+       //1 False alarm threshold decision\r
+       odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): False alarm threshold = %d, %d, %d \n\n", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));
+\r
+       //1 Adjust initial gain by false alarm
+       if(pDM_Odm->bLinked && bPerformance)
+       {\r
+               //2 After link
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
+
+               if(bFirstTpTarget || (FirstConnect && bPerformance))
+               {       \r
+                       pDM_DigTable->LargeFAHit = 0;\r
+                       \r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                       if(bDFSBand)\r
+                       {\r
+                               if(pDM_Odm->RSSI_Min > 0x28)\r
+                                       CurrentIGI = 0x28;\r
+                               else\r
+                                       CurrentIGI = pDM_Odm->RSSI_Min;\r
+                               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
+                       }\r
+                       else\r
+#endif\r
+                       {\r
+                               if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)\r
+                               {\r
+                                       if(CurrentIGI < pDM_Odm->RSSI_Min)\r
+                                               CurrentIGI = pDM_Odm->RSSI_Min;\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(CurrentIGI < DIG_MaxOfMin)\r
+                                               CurrentIGI = DIG_MaxOfMin;\r
+                               }\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+                               if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+                                       ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);\r
+#endif\r
+                       }\r
+
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", CurrentIGI));
+
+               }\r
+               else\r
+               {\r
+                       if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])\r
+                               CurrentIGI = CurrentIGI + 4;
+                       else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])\r
+                               CurrentIGI = CurrentIGI + 2;
+                       else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\r
+                               CurrentIGI = CurrentIGI - 2;
+
+                       //4 Abnormal # beacon case
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+                       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter)) //STA mode is linked to AP\r
+                               pDM_Odm->bsta_state = _TRUE;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+                       if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))\r
+                       {                                               \r
+                               CurrentIGI = pDM_DigTable->rx_gain_range_min;\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n", 
+                                       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
+                       }\r
+#endif\r
+               }\r
+       }       
+       else
+       {\r
+               //2 Before link
+               ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
+               
+               if(FirstDisConnect || bFirstCoverage)
+               {
+                       CurrentIGI = dm_dig_min;\r
+                       ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
+               }
+               else\r
+               {\r
+                       if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])\r
+                               CurrentIGI = CurrentIGI + 4;\r
+                       else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])\r
+                               CurrentIGI = CurrentIGI + 2;\r
+                       else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\r
+                               CurrentIGI = CurrentIGI - 2;\r
+               }\r
+       }
+\r
+       //1 Check initial gain by upper/lower bound
+       if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
+               CurrentIGI = pDM_DigTable->rx_gain_range_min;
+       
+       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+               CurrentIGI = pDM_DigTable->rx_gain_range_max;
+
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
+
+       //1 Force upper bound and lower bound for adaptivity
+       if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
+       {
+               if(CurrentIGI > Adap_IGI_Upper)
+                       CurrentIGI = Adap_IGI_Upper;
+               
+               if(pDM_Odm->IGI_LowerBound != 0)
+               {
+                       if(CurrentIGI < pDM_Odm->IGI_LowerBound)
+                               CurrentIGI = pDM_Odm->IGI_LowerBound;
+               }
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", Adap_IGI_Upper));
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force lower bound to 0x%x !!!!!!\n\n", pDM_Odm->IGI_LowerBound));
+       }
+       
+
+       //1 High power RSSI threshold
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    \r
+       if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
+       {
+               // 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_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;
+               }
+       }
+       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;
+                       }       
+               } 
+       }\r
+#endif
+
+       //1 Update status
+#if (RTL8192D_SUPPORT==1) 
+       if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               //sherry  delete DualMacSmartConncurrent 20110517
+               if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
+               {
+                       ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
+                       if(*(pDM_Odm->pbMasterOfDMSP))\r
+                       {
+                               pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
+                       }
+                       else\r
+                       {
+                               pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;\r
+                       }
+               }
+               else
+               {
+                       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+                       if(*(pDM_Odm->pBandType) == ODM_BAND_5G)\r
+                       {
+                               pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
+                       }
+                       else\r
+                       {
+                               pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
+                               pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;\r
+                       }
+               }
+       }
+       else
+#endif
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+               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);\r
+                                       
+                               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);\r
+                       pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+                       pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+               }
+       }
+}\r
+\r
+VOID
+odm_DIGbyRSSI_LPS(
+       IN              PVOID           pDM_VOID
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_CE)
+#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
+#endif
+
+       u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C
+       u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;
+
+       CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
+
+       // Using FW PS mode to make IGI
+       //Adjust by  FA in LPS MODE
+       if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
+               CurrentIGI = CurrentIGI+4;
+       else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
+               CurrentIGI = CurrentIGI+2;
+       else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
+               CurrentIGI = CurrentIGI-2;      
+
+
+       //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_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
+
+       ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+#endif
+}
+\r
+VOID
+odm_DigForBtHsMode(
+       IN              PVOID           pDM_VOID
+       )
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       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
+}
+\r
+
+//3============================================================
+//3 FASLE ALARM CHECK
+//3============================================================
+
+VOID 
+odm_FalseAlarmCounterStatistics(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+       u4Byte                                          ret_value;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+//Mark there, and check this in odm_DMWatchDog
+#if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+       if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
+               return;
+#endif
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
+               (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&&    ////modify by Guo.Mingzhi 2011-12-29
+               (!(*(pDM_Odm->pbMasterOfDMSP))))
+       {
+               odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
+               return;
+       }
+#endif         
+
+       if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
+               return;
+
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+       {
+
+               //hold ofdm counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
+       
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
+               FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);         
+
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); 
+               FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);    
+
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
+               FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
+
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
+               FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
+
+               FalseAlmCnt->Cnt_Ofdm_fail =    FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
+                                                               FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
+                                                               FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
+
+#if (RTL8188E_SUPPORT==1)
+               if(pDM_Odm->SupportICType == ODM_RTL8188E)
+               {
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
+                       FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
+                       FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
+               }
+#endif
+
+#if (RTL8192D_SUPPORT==1) 
+               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+               {
+                       odm_GetCCKFalseAlarm_92D(pDM_Odm);
+               }
+               else
+#endif
+               {
+                       //hold cck counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); 
+               
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
+                       FalseAlmCnt->Cnt_Cck_fail = ret_value;
+
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
+                       FalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;
+
+                       ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
+                       FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
+               }
+       
+               FalseAlmCnt->Cnt_all = (        FalseAlmCnt->Cnt_Fast_Fsync + 
+                                                       FalseAlmCnt->Cnt_SB_Search_fail +
+                                                       FalseAlmCnt->Cnt_Parity_Fail +
+                                                       FalseAlmCnt->Cnt_Rate_Illegal +
+                                                       FalseAlmCnt->Cnt_Crc8_fail +
+                                                       FalseAlmCnt->Cnt_Mcs_fail +
+                                                       FalseAlmCnt->Cnt_Cck_fail);     
+
+               FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
+
+#if (RTL8192C_SUPPORT==1)
+               if(pDM_Odm->SupportICType == ODM_RTL8192C)
+                       odm_ResetFACounter_92C(pDM_Odm);
+#endif
+
+#if (RTL8192D_SUPPORT==1)
+               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+                       odm_ResetFACounter_92D(pDM_Odm);
+#endif
+
+               if(pDM_Odm->SupportICType >=ODM_RTL8723A)
+               {
+                       //reset false alarm counter registers
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
+
+                       //update ofdm counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
+
+                       //reset CCK CCA counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); 
+                       //reset CCK FA counter
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); 
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); 
+               }
+               
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
+                       FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
+                       FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
+               FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
+       }
+       else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+       {
+               u4Byte CCKenable;
+               u4Byte Cnt_Ofdm_fail_temp = 0;
+               
+               //read OFDM FA counter
+               FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
+               FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
+
+               //read CCK/OFDM CCA counter
+               ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);\r
+               FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
+               FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
+
+               // For 8881A
+               if(pDM_Odm->SupportICType == ODM_RTL8881A)
+               {
+                       if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
+                       {
+                               Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
+                               FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
+                               FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
+                       }
+                       else
+                               FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail_pre));
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail_pre=%d\n",  Cnt_Ofdm_fail_temp));
+                       
+                       // Reset FA counter by enable/disable OFDM
+                       if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
+                       {
+                               // reset OFDM
+                               ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
+                               ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
+                               FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Reset false alarm counter\n"));
+                       }
+               }
+
+               // reset OFDM FA coutner
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
+
+               // reset CCK FA counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
+
+               // reset CCA counter
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
+               ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
+
+               CCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
+               if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
+               {
+                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
+                       FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
+               }
+               else
+               {
+                       FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
+                       FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
+               }
+
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_OFDM_CCA=%d\n",       FalseAlmCnt->Cnt_OFDM_CCA));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCK_CCA=%d\n",        FalseAlmCnt->Cnt_CCK_CCA));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCA_all=%d\n",        FalseAlmCnt->Cnt_CCA_all));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n",       FalseAlmCnt->Cnt_Cck_fail));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n",  FalseAlmCnt->Cnt_all));
+}
+
+
+VOID
+odm_FAThresholdCheck(
+       IN              PVOID                   pDM_VOID,
+       IN              BOOLEAN                 bDFSBand,
+       IN              BOOLEAN                 bPerformance,
+       IN              u4Byte                  RxTp,
+       IN              u4Byte                  TxTp,
+       OUT             u4Byte*                 dm_FA_thres
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       
+       if(pDM_Odm->bLinked && (bPerformance||bDFSBand))
+       {
+               if(pDM_Odm->SupportICType == ODM_RTL8192D)
+               {
+                       // 8192D special case
+                       dm_FA_thres[0] = DM_DIG_FA_TH0_92D;
+                       dm_FA_thres[1] = DM_DIG_FA_TH1_92D;
+                       dm_FA_thres[2] = DM_DIG_FA_TH2_92D;
+               }
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+               {
+                       // For AP
+                       if((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500)                      // 10Mbps & 0.5Mbps
+                       {
+                               dm_FA_thres[0] = 0x080;
+                               dm_FA_thres[1] = 0x100;
+                               dm_FA_thres[2] = 0x200;                 
+                       }
+                       else
+                       {
+                               dm_FA_thres[0] = 0x100;
+                               dm_FA_thres[1] = 0x200;
+                               dm_FA_thres[2] = 0x300; 
+                       }
+               }
+#else
+               else if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)
+               {
+                       // 8723A BT special case
+                       dm_FA_thres[0] = DM_DIG_FA_TH0;
+                       dm_FA_thres[1] = 0x250;
+                       dm_FA_thres[2] = 0x300;
+               }
+#endif
+               else
+               {
+                       // For NIC
+                       dm_FA_thres[0] = DM_DIG_FA_TH0;
+                       dm_FA_thres[1] = DM_DIG_FA_TH1;
+                       dm_FA_thres[2] = DM_DIG_FA_TH2;
+               }
+       }
+       else
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+               if(bDFSBand)
+               {
+                       // For DFS band and no link
+                       dm_FA_thres[0] = 250;
+                       dm_FA_thres[1] = 1000;
+                       dm_FA_thres[2] = 2000;
+               }
+               else
+#endif
+               {
+                       dm_FA_thres[0] = 2000;
+                       dm_FA_thres[1] = 4000;
+                       dm_FA_thres[2] = 5000;
+               }
+       }
+       return;
+}
+
+u1Byte
+odm_ForbiddenIGICheck(
+       IN              PVOID                   pDM_VOID,
+       IN              u1Byte                  DIG_Dynamic_MIN,
+       IN              u1Byte                  CurrentIGI
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+       u1Byte                                          rx_gain_range_min = pDM_DigTable->rx_gain_range_min;
+
+       if(pFalseAlmCnt->Cnt_all > 10000)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally 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 = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
+                       pDM_DigTable->LargeFAHit = 1;
+               }
+
+               if(pDM_DigTable->LargeFAHit >= 3)
+               {
+                       if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
+                               rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
+                       else
+                               rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
+                       pDM_DigTable->Recover_cnt = 1800;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));
+               }
+       }
+       else
+       {
+               if(pDM_DigTable->Recover_cnt != 0)\r
+               {\r
+                       pDM_DigTable->Recover_cnt --;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));\r
+               }\r
+               else
+               {
+                       if(pDM_DigTable->LargeFAHit < 3)
+                       {
+                               if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)
+                               {
+                                       pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
+                                       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 -= 2;
+                                       rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
+                               }
+                       }
+                       else
+                       {
+                               pDM_DigTable->LargeFAHit = 0;
+                       }
+               }
+       }
+       
+       return rx_gain_range_min;
+
+}
+
+VOID
+odm_InbandNoiseCalculate (     
+       IN              PVOID           pDM_VOID
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       u1Byte                          IGIBackup, TimeCnt = 0, ValidCnt = 0;
+       BOOLEAN                         bTimeout = TRUE;
+       s1Byte                          sNoise_A, sNoise_B;
+       s4Byte                          NoiseRpt_A = 0,NoiseRpt_B = 0;
+       u4Byte                          tmp = 0;
+       static  u1Byte          failCnt = 0;
+
+       if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))
+               return;
+
+       if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)
+               return;
+
+       if(!pDM_DigTable->bNoiseEst)
+               return;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));
+       
+       //1 Set initial gain.
+       IGIBackup = pDM_DigTable->CurIGValue;
+       pDM_DigTable->IGIOffset_A = 0;
+       pDM_DigTable->IGIOffset_B = 0;
+       ODM_Write_DIG(pDM_Odm, 0x24);
+
+       //1 Update idle time power report       
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);
+
+       delay_ms(2);
+
+       //1 Get noise power level
+       while(1)
+       {
+               //2 Read Noise Floor Report
+               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+                       tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);
+
+               sNoise_A = (s1Byte)(tmp & 0xff);
+               sNoise_B = (s1Byte)((tmp & 0xff00)>>8);
+
+               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
+
+               if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))
+               {
+                       ValidCnt++;
+                       NoiseRpt_A += sNoise_A;
+                       NoiseRpt_B += sNoise_B;
+                       //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
+               }
+
+               TimeCnt++;
+               bTimeout = (TimeCnt >= 150)?TRUE:FALSE;
+               
+               if(ValidCnt == 20 || bTimeout)
+                       break;
+
+               delay_ms(2);
+               
+       }
+
+       //1 Keep idle time power report 
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);
+
+       //1 Recover IGI
+       ODM_Write_DIG(pDM_Odm, IGIBackup);
+       
+       //1 Calculate Noise Floor
+       if(ValidCnt != 0)
+       {
+               NoiseRpt_A  /= (ValidCnt<<1);
+               NoiseRpt_B  /= (ValidCnt<<1);
+       }
+       
+       if(bTimeout)
+       {
+               NoiseRpt_A = 0;
+               NoiseRpt_B = 0;
+
+               failCnt ++;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));
+               
+               if(failCnt == 3)
+               {
+                       failCnt = 0;
+                       pDM_DigTable->bNoiseEst = FALSE;
+               }
+       }
+       else
+       {
+               NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;
+               NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;
+               pDM_DigTable->bNoiseEst = FALSE;
+               failCnt = 0;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));
+       }
+
+       //1 Calculate IGI Offset
+       if(NoiseRpt_A > NoiseRpt_B)
+       {
+               pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;
+               pDM_DigTable->IGIOffset_B = 0;
+       }
+       else
+       {
+               pDM_DigTable->IGIOffset_A = 0;
+               pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;
+       }
+
+#endif
+       return;
+}
+
+//3============================================================
+//3 CCK Packet Detect Threshold
+//3============================================================
+
+VOID
+odm_PauseCCKPacketDetection(
+       IN              PVOID                                   pDM_VOID,
+       IN              ODM_Pause_CCKPD_TYPE    PauseType,
+       IN              u1Byte                                  CCKPDThreshold
+)
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       static  BOOLEAN         bPaused = FALSE;
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
+       if(*pDM_DigTable->pbP2pLinkInProgress)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
+               return;
+       }
+#endif
+
+       if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n"));
+               return;
+       }
+
+       switch(PauseType)
+       {
+               //1 Pause CCK Packet Detection Threshold
+               case ODM_PAUSE_CCKPD:
+                       //2 Disable DIG
+                       ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Pause CCK packet detection threshold !!\n"));
+
+                       //2 Backup CCK Packet Detection Threshold value
+                       if(!bPaused)
+                       {
+                               pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
+                               bPaused = TRUE;
+                       }
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold  = %d\n", pDM_DigTable->CCKPDBackup));
+
+                       //2 Write new CCK Packet Detection Threshold value
+                       ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write new CCK packet detection tgreshold = %d\n", CCKPDThreshold));
+                       break;
+                       
+               //1 Resume CCK Packet Detection Threshold
+               case ODM_RESUME_CCKPD:
+                       if(bPaused)
+                       {
+                               //2 Write backup CCK Packet Detection Threshold value
+                               ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
+                               bPaused = FALSE;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
+
+                               //2 Enable CCK Packet Detection Threshold
+                               ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);               
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Resume CCK packet detection threshold  !!\n"));
+                       }
+                       break;
+                       
+               default:
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong  type !!\n"));
+                       break;
+       }       
+       return;
+}
+
+
+VOID 
+odm_CCKPacketDetectionThresh(
+       IN              PVOID           pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+       u1Byte                                          CurCCK_CCAThres;
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+//modify by Guo.Mingzhi 2011-12-29
+       if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
+//     if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
+               return;
+       if(pDM_Odm->bBtHsOperation)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
+               ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
+               return;
+       }
+#endif
+
+       if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  return==========\n"));
+               return;
+       }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       if(pDM_Odm->ExtLNA)
+               return;
+#endif
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  ==========>\n"));
+
+       if(pDM_Odm->bLinked)
+       {
+               if(pDM_Odm->RSSI_Min > 25)
+                       CurCCK_CCAThres = 0xcd;
+               else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
+                       CurCCK_CCAThres = 0x83;
+               else
+               {
+                       if(FalseAlmCnt->Cnt_Cck_fail > 1000)
+                               CurCCK_CCAThres = 0x83;
+                       else
+                               CurCCK_CCAThres = 0x40;
+               }
+       }
+       else
+       {
+               if(FalseAlmCnt->Cnt_Cck_fail > 1000)
+                       CurCCK_CCAThres = 0x83;
+               else
+                       CurCCK_CCAThres = 0x40;
+       }
+       
+#if (RTL8192D_SUPPORT==1) 
+       if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))
+               ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
+       else
+#endif
+               ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
+}
+
+VOID
+ODM_Write_CCK_CCA_Thres(
+       IN      PVOID                   pDM_VOID,
+       IN      u1Byte                  CurCCK_CCAThres
+       )
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)              //modify by Guo.Mingzhi 2012-01-03
+       {
+               ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
+       }
+       pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
+       pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+
+VOID
+odm_EnableEDCCA(
+       IN              PVOID                                   pDM_VOID\r
+)
+{
+
+       // This should be moved out of OUTSRC
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       // Enable EDCCA. The value is suggested by SD3 Wilson.
+
+       //
+       // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
+       //
+       if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
+       {
+               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
+               
+       }       
+       else
+       {
+               //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
+               ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
+       }       
+       
+       //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
+}
+
+VOID
+odm_DisableEDCCA(
+       IN              PVOID                                   pDM_VOID\r
+)
+{      
+       // Disable EDCCA..\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
+       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
+}
+
+//
+// Description: According to initial gain value to determine to enable or disable EDCCA.
+//
+// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
+//
+VOID
+odm_DynamicEDCCA(
+       IN              PVOID                                   pDM_VOID\r
+)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       u1Byte                  RegC50, RegC58;
+       BOOLEAN                 bEDCCAenable = FALSE;
+       
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))  
+       BOOLEAN                 bFwCurrentInPSMode=FALSE;       
+
+       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
+       //
+       // 2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA.
+       // 2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop
+       // to send beacon in noisy environment or platform.
+       //
+       if(ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter)))
+       //if(ACTING_AS_AP(pAdapter))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n"));
+               odm_DisableEDCCA(pDM_Odm);
+               if(pHalData->bPreEdccaEnable)
+                       odm_DisableEDCCA(pDM_Odm);
+               pHalData->bPreEdccaEnable = FALSE;
+               return;
+       }
+       
+       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;
+               }
+       }
+}
+\r
+// <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)\r
+VOID
+odm_RFEControl(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN  u8Byte              RSSIVal
+       )
+{
+       PADAPTER                Adapter = (PADAPTER)pDM_Odm->Adapter;
+    HAL_DATA_TYPE      *pHalData = GET_HAL_DATA(Adapter);
+       static u1Byte   TRSW_HighPwr = 0;
+        
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
+                        RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
+
+    if (pHalData->RFEType == 3) {         
+               
+        pDM_Odm->RSSI_TRSW = RSSIVal;
+
+        if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) 
+               {                                
+            TRSW_HighPwr = 1; // Switch to
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control
+            
+        } 
+               else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) 
+        {        
+            TRSW_HighPwr = 0; // Switched back
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
+            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control
+
+        }
+    }  
+
+       
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));           
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n", 
+                                RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));    
+}
+
+VOID
+odm_MPT_DIGWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       ODM_MPT_DIG(pDM_Odm);
+}
+
+VOID
+odm_MPT_DIGCallback(
+       PRT_TIMER               pTimer
+)
+{
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+         PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
+
+
+       #if DEV_BUS_TYPE==RT_PCI_INTERFACE
+               #if USE_WORKITEM
+                       PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+               #else
+                       ODM_MPT_DIG(pDM_Odm);
+               #endif
+       #else
+               PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+       #endif
+
+}
+
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+VOID
+odm_MPT_DIGCallback(
+       IN              PVOID                                   pDM_VOID
+)
+{
+       PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if USE_WORKITEM
+       PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+#else
+       ODM_MPT_DIG(pDM_Odm);
+#endif
+}
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)
+VOID
+odm_MPT_Write_DIG(
+       IN              PVOID                                   pDM_VOID,
+       IN              u1Byte                                  CurIGValue
+)
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+       ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
+
+       if(pDM_Odm->RFType > ODM_1T1R)
+               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
+
+       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+       {
+               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
+               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);   
+       }
+
+       pDM_DigTable->CurIGValue = CurIGValue;
+       
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
+}
+
+VOID
+ODM_MPT_DIG(
+       IN              PVOID                                   pDM_VOID
+       )
+{
+       PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
+       PFALSE_ALARM_STATISTICS         pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
+       u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
+       u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20;
+       u4Byte                                          RXOK_cal;
+       u4Byte                                          RxPWDBAve_final;
+       u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;
+       
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+       #if ODM_FIX_2G_DIG
+       IGI_A = 0x22;
+       IGI_B = 0x24;           
+       #endif
+       
+#else
+       if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
+               return;
+
+       if (*pDM_Odm->pBandType == ODM_BAND_5G)
+               DIG_Lower = 0x22;
+#endif
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
+       
+#if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)))
+       if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & ODM_RTL8814A)) // for 5G or 8814
+#else
+       if (1) // for both 2G/5G
+#endif
+               {
+               odm_FalseAlarmCounterStatistics(pDM_Odm);
+
+               RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
+               RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
+
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
+               pDM_Odm->RxPWDBAve = 0;
+               pDM_Odm->MPDIG_2G = FALSE;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+               pDM_Odm->Times_2G = 0;
+#endif
+
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
+       
+               if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
+               {
+                       if (CurrentIGI > 0x24)
+                               odm_MPT_Write_DIG(pDM_Odm, 0x24);
+               }
+               else
+               {
+                       if(pFalseAlmCnt->Cnt_all > 1000){
+                               CurrentIGI = CurrentIGI + 8;
+                       }
+                       else if(pFalseAlmCnt->Cnt_all > 200){
+                               CurrentIGI = CurrentIGI + 4;
+                       }
+                       else if (pFalseAlmCnt->Cnt_all > 50){
+                               CurrentIGI = CurrentIGI + 2;
+                       }
+                       else if (pFalseAlmCnt->Cnt_all < 2){
+                               CurrentIGI = CurrentIGI - 2;
+                       }
+                       
+                       if (CurrentIGI < DIG_Lower ){
+                               CurrentIGI = DIG_Lower;
+                       }
+
+                       if(CurrentIGI > DIG_Upper){
+                               CurrentIGI = DIG_Upper;
+                       }
+
+                       odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", 
+                               CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
+               }
+       }
+       else
+       {
+               if(pDM_Odm->MPDIG_2G == FALSE)
+               {
+                       if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A))
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
+                               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
+                               ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
+                               pDM_DigTable->CurIGValue = IGI_B;
+                       }
+                       else
+                               odm_MPT_Write_DIG(pDM_Odm, IGI_A);
+               }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+               pDM_Odm->Times_2G++;
+
+               if (pDM_Odm->Times_2G == 3)
+#endif
+               {
+                       pDM_Odm->MPDIG_2G = TRUE;
+               }
+       }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       if (pDM_Odm->SupportICType == ODM_RTL8812)
+               odm_RFEControl(pDM_Odm, RxPWDBAve_final);
+#endif
+
+       ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
+}\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DIG.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DIG.h
new file mode 100755 (executable)
index 0000000..8a9479a
--- /dev/null
@@ -0,0 +1,395 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODMDIG_H__\r
+#define    __ODMDIG_H__\r
+\r
+typedef struct _Dynamic_Initial_Gain_Threshold_\r
+{\r
+       BOOLEAN         bStopDIG;\r
+       BOOLEAN         bPSDInProgress;\r
+\r
+       u1Byte          Dig_Enable_Flag;\r
+       u1Byte          Dig_Ext_Port_Stage;\r
+       \r
+       int                     RssiLowThresh;\r
+       int                     RssiHighThresh;\r
+\r
+       u4Byte          FALowThresh;\r
+       u4Byte          FAHighThresh;\r
+\r
+       u1Byte          CurSTAConnectState;\r
+       u1Byte          PreSTAConnectState;\r
+       u1Byte          CurMultiSTAConnectState;\r
+\r
+       u1Byte          PreIGValue;\r
+       u1Byte          CurIGValue;\r
+       u1Byte          BackupIGValue;          //MP DIG\r
+       u1Byte          BT30_CurIGI;\r
+       u1Byte          IGIBackup;\r
+\r
+       s1Byte          BackoffVal;\r
+       s1Byte          BackoffVal_range_max;\r
+       s1Byte          BackoffVal_range_min;\r
+       u1Byte          rx_gain_range_max;\r
+       u1Byte          rx_gain_range_min;\r
+       u1Byte          Rssi_val_min;\r
+\r
+       u1Byte          PreCCK_CCAThres;\r
+       u1Byte          CurCCK_CCAThres;\r
+       u1Byte          PreCCKPDState;\r
+       u1Byte          CurCCKPDState;\r
+       u1Byte          CCKPDBackup;\r
+\r
+       u1Byte          LargeFAHit;\r
+       u1Byte          ForbiddenIGI;\r
+       u4Byte          Recover_cnt;\r
+\r
+       u1Byte          DIG_Dynamic_MIN_0;\r
+       u1Byte          DIG_Dynamic_MIN_1;\r
+       BOOLEAN         bMediaConnect_0;\r
+       BOOLEAN         bMediaConnect_1;\r
+\r
+       u4Byte          AntDiv_RSSI_max;\r
+       u4Byte          RSSI_max;\r
+\r
+       u1Byte          *pbP2pLinkInProgress;\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       BOOLEAN         bTpTarget;\r
+       BOOLEAN         bNoiseEst;\r
+       u4Byte          TpTrainTH_min;\r
+       u1Byte          IGIOffset_A;\r
+       u1Byte          IGIOffset_B;\r
+#endif\r
+}DIG_T,*pDIG_T;\r
+\r
+typedef struct _FALSE_ALARM_STATISTICS{\r
+       u4Byte  Cnt_Parity_Fail;\r
+       u4Byte  Cnt_Rate_Illegal;\r
+       u4Byte  Cnt_Crc8_fail;\r
+       u4Byte  Cnt_Mcs_fail;\r
+       u4Byte  Cnt_Ofdm_fail;\r
+       u4Byte  Cnt_Ofdm_fail_pre;      //For RTL8881A\r
+       u4Byte  Cnt_Cck_fail;\r
+       u4Byte  Cnt_all;\r
+       u4Byte  Cnt_Fast_Fsync;\r
+       u4Byte  Cnt_SB_Search_fail;\r
+       u4Byte  Cnt_OFDM_CCA;\r
+       u4Byte  Cnt_CCK_CCA;\r
+       u4Byte  Cnt_CCA_all;\r
+       u4Byte  Cnt_BW_USC;     //Gary\r
+       u4Byte  Cnt_BW_LSC;     //Gary\r
+}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;\r
+\r
+typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition\r
+{\r
+       DIG_TYPE_THRESH_HIGH    = 0,\r
+       DIG_TYPE_THRESH_LOW     = 1,\r
+       DIG_TYPE_BACKOFF                = 2,\r
+       DIG_TYPE_RX_GAIN_MIN    = 3,\r
+       DIG_TYPE_RX_GAIN_MAX    = 4,\r
+       DIG_TYPE_ENABLE                 = 5,\r
+       DIG_TYPE_DISABLE                = 6,    \r
+       DIG_OP_TYPE_MAX\r
+}DM_DIG_OP_E;\r
+\r
+typedef enum tag_ODM_PauseDIG_Type {\r
+       ODM_PAUSE_DIG                   =       BIT0,\r
+       ODM_RESUME_DIG                  =       BIT1\r
+} ODM_Pause_DIG_TYPE;\r
+\r
+typedef enum tag_ODM_PauseCCKPD_Type {\r
+       ODM_PAUSE_CCKPD         =       BIT0,\r
+       ODM_RESUME_CCKPD        =       BIT1\r
+} ODM_Pause_CCKPD_TYPE;\r
+\r
+/*\r
+typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition\r
+{\r
+       CCK_PD_STAGE_LowRssi = 0,\r
+       CCK_PD_STAGE_HighRssi = 1,\r
+       CCK_PD_STAGE_MAX = 3,\r
+}DM_CCK_PDTH_E;\r
+\r
+typedef enum tag_DIG_EXT_PORT_ALGO_Definition\r
+{\r
+       DIG_EXT_PORT_STAGE_0 = 0,\r
+       DIG_EXT_PORT_STAGE_1 = 1,\r
+       DIG_EXT_PORT_STAGE_2 = 2,\r
+       DIG_EXT_PORT_STAGE_3 = 3,\r
+       DIG_EXT_PORT_STAGE_MAX = 4,\r
+}DM_DIG_EXT_PORT_ALG_E;\r
+\r
+typedef enum tag_DIG_Connect_Definition\r
+{\r
+       DIG_STA_DISCONNECT = 0, \r
+       DIG_STA_CONNECT = 1,\r
+       DIG_STA_BEFORE_CONNECT = 2,\r
+       DIG_MultiSTA_DISCONNECT = 3,\r
+       DIG_MultiSTA_CONNECT = 4,\r
+       DIG_CONNECT_MAX\r
+}DM_DIG_CONNECT_E;\r
+\r
+\r
+#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}\r
+\r
+#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER)     \\r
+       DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT)\r
+\r
+#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER)  \\r
+       DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT)\r
+*/\r
+#define                DM_DIG_THRESH_HIGH                      40\r
+#define                DM_DIG_THRESH_LOW                       35\r
+\r
+#define                DM_FALSEALARM_THRESH_LOW        400\r
+#define                DM_FALSEALARM_THRESH_HIGH       1000\r
+\r
+#define                DM_DIG_MAX_NIC                          0x3e\r
+#define                DM_DIG_MIN_NIC                          0x1e //0x22//0x1c\r
+#define                DM_DIG_MAX_OF_MIN_NIC           0x3e\r
+\r
+#define                DM_DIG_MAX_AP                                   0x3e\r
+#define                DM_DIG_MIN_AP                                   0x1c\r
+#define                DM_DIG_MAX_OF_MIN                       0x2A    //0x32\r
+#define                DM_DIG_MIN_AP_DFS                               0x20\r
+\r
+#define                DM_DIG_MAX_NIC_HP                       0x46\r
+#define                DM_DIG_MIN_NIC_HP                               0x2e\r
+\r
+#define                DM_DIG_MAX_AP_HP                                0x42\r
+#define                DM_DIG_MIN_AP_HP                                0x30\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#define                DM_DIG_MAX_AP_COVERAGR          0x26\r
+#define                DM_DIG_MIN_AP_COVERAGE          0x1c\r
+#define                DM_DIG_MAX_OF_MIN_COVERAGE      0x22\r
+\r
+#define                DM_DIG_TP_Target_TH0                    500\r
+#define                DM_DIG_TP_Target_TH1                    1000\r
+#define                DM_DIG_TP_Training_Period               10\r
+#endif\r
+\r
+//vivi 92c&92d has different definition, 20110504\r
+//this is for 92c\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\r
+       #define         DM_DIG_FA_TH0                           0x80//0x20\r
+       #else\r
+       #define         DM_DIG_FA_TH0                           0x200//0x20\r
+       #endif\r
+#else\r
+       #define         DM_DIG_FA_TH0                           0x200//0x20\r
+#endif\r
+\r
+#define                DM_DIG_FA_TH1                                   0x300\r
+#define                DM_DIG_FA_TH2                                   0x400\r
+//this is for 92d\r
+#define                DM_DIG_FA_TH0_92D                               0x100\r
+#define                DM_DIG_FA_TH1_92D                               0x400\r
+#define                DM_DIG_FA_TH2_92D                               0x600\r
+\r
+#define                DM_DIG_BACKOFF_MAX                      12\r
+#define                DM_DIG_BACKOFF_MIN                      -4\r
+#define                DM_DIG_BACKOFF_DEFAULT          10\r
+\r
+#define                DM_DIG_FA_TH0_LPS                               4 //-> 4 in lps\r
+#define                DM_DIG_FA_TH1_LPS                               15 //-> 15 lps\r
+#define                DM_DIG_FA_TH2_LPS                               30 //-> 30 lps\r
+#define                RSSI_OFFSET_DIG                         0x05\r
+\r
+VOID\r
+ODM_ChangeDynamicInitGainThresh(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u4Byte                                          DM_Type,\r
+       IN              u4Byte                                  DM_Value\r
+       );\r
+\r
+VOID\r
+odm_NHMCounterStatisticsInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_NHMCounterStatistics(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_NHMBBInit(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_NHMBB(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_NHMCounterStatisticsReset(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_GetNHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_SearchPwdBLowerBound(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u1Byte                                  IGI_target\r
+);\r
+\r
+VOID \r
+odm_AdaptivityInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_Adaptivity(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u1Byte                                  IGI\r
+       );\r
+\r
+VOID\r
+ODM_Write_DIG(\r
+       IN              PVOID                                   pDM_VOID,       \r
+       IN              u1Byte                                  CurrentIGI\r
+       );\r
+\r
+VOID\r
+odm_PauseDIG(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              ODM_Pause_DIG_TYPE              PauseType,\r
+       IN              u1Byte                                  IGIValue\r
+       );\r
+\r
+VOID\r
+odm_DIGInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID   \r
+odm_DIG(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_DIGbyRSSI_LPS(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_DigForBtHsMode(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID 
+odm_FalseAlarmCounterStatistics(
+       IN              PVOID                                   pDM_VOID\r
+       );
+\r
+VOID\r
+odm_FAThresholdCheck(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              BOOLEAN                                 bDFSBand,\r
+       IN              BOOLEAN                                 bPerformance,\r
+       IN              u4Byte                                  RxTp,\r
+       IN              u4Byte                                  TxTp,\r
+       OUT             u4Byte*                                 dm_FA_thres\r
+       );\r
+
+u1Byte\r
+odm_ForbiddenIGICheck(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u1Byte                                  DIG_Dynamic_MIN,\r
+       IN              u1Byte                                  CurrentIGI\r
+       );\r
+\r
+VOID\r
+odm_InbandNoiseCalculate (     \r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+
+BOOLEAN 
+odm_DigAbort(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID\r
+odm_PauseCCKPacketDetection(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              ODM_Pause_CCKPD_TYPE    PauseType,\r
+       IN              u1Byte                                  CCKPDThreshold\r
+       );\r
+
+VOID 
+odm_CCKPacketDetectionThresh(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID \r
+ODM_Write_CCK_CCA_Thres(\r
+       IN              PVOID                                   pDM_VOID, \r
+       IN              u1Byte                                  CurCCK_CCAThres\r
+       );\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+VOID\r
+odm_DisableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+odm_DynamicEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID
+odm_MPT_DIGCallback(
+       PRT_TIMER                                               pTimer\r
+);
+
+VOID
+odm_MPT_DIGWorkItemCallback(
+    IN                 PVOID                                   pContext\r
+    );
+\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+VOID\r
+odm_MPT_DIGCallback(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)\r
+VOID\r
+ODM_MPT_DIG(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+#endif\r
+\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicBBPowerSaving.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicBBPowerSaving.c
new file mode 100755 (executable)
index 0000000..9ceb2fd
--- /dev/null
@@ -0,0 +1,218 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "odm_precomp.h"\r
+\r
+VOID \r
+odm_DynamicBBPowerSavingInit(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;\r
+
+       pDM_PSTable->PreCCAState = CCA_MAX;
+       pDM_PSTable->CurCCAState = CCA_MAX;
+       pDM_PSTable->PreRFState = RF_MAX;
+       pDM_PSTable->CurRFState = RF_MAX;
+       pDM_PSTable->Rssi_val_min = 0;
+       pDM_PSTable->initialize = 0;
+}
+
+
+VOID
+odm_DynamicBBPowerSaving(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{      
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+
+       if (pDM_Odm->SupportICType != ODM_RTL8723A)
+               return;
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
+               return;
+       if(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
+               return;
+       
+       //1 2.Power Saving for 92C
+       if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
+       {
+               odm_1R_CCA(pDM_Odm);
+       }
+       
+       // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
+       // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
+       //1 3.Power Saving for 88C
+       else
+       {
+               ODM_RF_Saving(pDM_Odm, FALSE);
+       }
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       
+}
+
+VOID
+odm_1R_CCA(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;\r
+
+       if(pDM_Odm->RSSI_Min!= 0xFF)
+       {
+                
+               if(pDM_PSTable->PreCCAState == CCA_2R)
+               {
+                       if(pDM_Odm->RSSI_Min >= 35)
+                               pDM_PSTable->CurCCAState = CCA_1R;
+                       else
+                               pDM_PSTable->CurCCAState = CCA_2R;
+                       
+               }
+               else{
+                       if(pDM_Odm->RSSI_Min <= 30)
+                               pDM_PSTable->CurCCAState = CCA_2R;
+                       else
+                               pDM_PSTable->CurCCAState = CCA_1R;
+               }
+       }
+       else{
+               pDM_PSTable->CurCCAState=CCA_MAX;
+       }
+       
+       if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
+       {
+               if(pDM_PSTable->CurCCAState == CCA_1R)
+               {
+                       if(  pDM_Odm->RFType ==ODM_2T2R )
+                       {
+                               ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x13);
+                               //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
+                       }
+                       else
+                       {
+                               ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x23);
+                               //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
+                       }
+               }
+               else
+               {
+                       ODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x33);
+                       //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
+               }
+               pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
+       }
+}
+
+void
+ODM_RF_Saving(
+       IN              PVOID                                   pDM_VOID,\r
+       IN      u1Byte          bForceInNormal 
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\r
+       pPS_T   pDM_PSTable = &pDM_Odm->DM_PSTable;
+       u1Byte  Rssi_Up_bound = 30 ;
+       u1Byte  Rssi_Low_bound = 25;
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
+       {
+               Rssi_Up_bound = 50 ;
+               Rssi_Low_bound = 45;
+       }
+#endif\r
+       if(pDM_PSTable->initialize == 0){
+               
+               pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
+               pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
+               pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
+               pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
+               //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
+               pDM_PSTable->initialize = 1;
+       }
+
+       if(!bForceInNormal)
+       {
+               if(pDM_Odm->RSSI_Min != 0xFF)
+               {                        
+                       if(pDM_PSTable->PreRFState == RF_Normal)
+                       {
+                               if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
+                                       pDM_PSTable->CurRFState = RF_Save;
+                               else
+                                       pDM_PSTable->CurRFState = RF_Normal;
+                       }
+                       else{
+                               if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
+                                       pDM_PSTable->CurRFState = RF_Normal;
+                               else
+                                       pDM_PSTable->CurRFState = RF_Save;
+                       }
+               }
+               else
+                       pDM_PSTable->CurRFState=RF_MAX;
+       }
+       else
+       {
+               pDM_PSTable->CurRFState = RF_Normal;
+       }
+       
+       if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
+       {
+               if(pDM_PSTable->CurRFState == RF_Save)
+               {
+                       // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
+                       // Suggested by SD3 Yu-Nan. 2011.01.20.
+                       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+                       {
+                               ODM_SetBBReg(pDM_Odm, 0x874  , BIT5, 0x1); //Reg874[5]=1b'1
+                       }
+                       ODM_SetBBReg(pDM_Odm, 0x874  , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
+                       ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
+                       ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
+                       ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
+                       ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
+                       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
+                       ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
+               }
+               else
+               {
+                       ODM_SetBBReg(pDM_Odm, 0x874  , 0x1CC000, pDM_PSTable->Reg874); 
+                       ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70); 
+                       ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
+                       ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74); 
+                       ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);  
+
+                       if(pDM_Odm->SupportICType == ODM_RTL8723A)
+                       {
+                               ODM_SetBBReg(pDM_Odm,0x874  , BIT5, 0x0); //Reg874[5]=1b'0
+                       }
+               }
+               pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
+       }
+#endif 
+}
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicBBPowerSaving.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicBBPowerSaving.h
new file mode 100755 (executable)
index 0000000..2fdcd6e
--- /dev/null
@@ -0,0 +1,61 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODMDYNAMICBBPOWERSAVING_H__\r
+#define    __ODMDYNAMICBBPOWERSAVING_H__\r
+\r
+typedef struct _Dynamic_Power_Saving_\r
+{\r
+       u1Byte          PreCCAState;\r
+       u1Byte          CurCCAState;\r
+\r
+       u1Byte          PreRFState;\r
+       u1Byte          CurRFState;\r
+\r
+       int                 Rssi_val_min;\r
+       \r
+       u1Byte          initialize;\r
+       u4Byte          Reg874,RegC70,Reg85C,RegA74;\r
+       \r
+}PS_T,*pPS_T;\r
+\r
+#define dm_RF_Saving   ODM_RF_Saving\r
+\r
+void ODM_RF_Saving(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN      u1Byte          bForceInNormal \r
+       );\r
+\r
+VOID 
+odm_DynamicBBPowerSavingInit(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicBBPowerSaving(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID
+odm_1R_CCA(
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicTxPower.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicTxPower.c
new file mode 100755 (executable)
index 0000000..7fbeb9f
--- /dev/null
@@ -0,0 +1,884 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\r
+#include "odm_precomp.h"\r
+\r
+VOID \r
+odm_DynamicTxPowerInit(
+       IN              PVOID                                   pDM_VOID        \r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+
+       #if DEV_BUS_TYPE==RT_USB_INTERFACE                                      
+       if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
+       {
+               odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
+               pMgntInfo->bDynamicTxPowerEnable = TRUE;
+       }               
+       else    
+       #else
+       //so 92c pci do not need dynamic tx power? vivi check it later
+       if(IS_HARDWARE_TYPE_8192D(Adapter))
+               pMgntInfo->bDynamicTxPowerEnable = TRUE;
+       else
+               pMgntInfo->bDynamicTxPowerEnable = FALSE;
+       #endif
+       
+
+       pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
+       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       pdmpriv->bDynamicTxPowerEnable = _FALSE;
+
+       #if (RTL8192C_SUPPORT==1) 
+       #ifdef CONFIG_USB_HCI
+
+       #ifdef CONFIG_INTEL_PROXIM
+       if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
+       #else
+       if(pHalData->BoardType == BOARD_USB_High_PA)
+       #endif
+
+       {
+               //odm_SavePowerIndex(Adapter);
+               odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
+               pdmpriv->bDynamicTxPowerEnable = _TRUE;
+       }               
+       else    
+       #else
+               pdmpriv->bDynamicTxPowerEnable = _FALSE;
+       #endif
+       #endif
+       
+       pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
+       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; 
+       
+#endif
+       
+}
+
+VOID
+odm_DynamicTxPowerSavePowerIndex(
+       IN              PVOID                                   pDM_VOID        \r
+       )
+{      
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       u1Byte          index;
+       u4Byte          Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\r
+       
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
+       for(index = 0; index< 6; index++)
+               pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)  
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       for(index = 0; index< 6; index++)
+               pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
+#endif
+#endif
+}
+
+VOID
+odm_DynamicTxPowerRestorePowerIndex(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       u1Byte                  index;
+       PADAPTER                Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       for(index = 0; index< 6; index++)
+               PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
+#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)   
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       for(index = 0; index< 6; index++)
+               rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
+#endif
+#endif
+}
+
+VOID
+odm_DynamicTxPowerWritePowerIndex(
+       IN              PVOID                                   pDM_VOID, \r
+       IN      u1Byte          Value)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u1Byte                  index;\r
+       u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+       
+       for(index = 0; index< 6; index++)
+               //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
+               ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
+
+}
+
+
+VOID 
+odm_DynamicTxPower(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       // 
+       // For AP/ADSL use prtl8192cd_priv
+       // For CE/NIC use PADAPTER
+       //
+       //PADAPTER              pAdapter = pDM_Odm->Adapter;
+//     prtl8192cd_priv priv            = pDM_Odm->priv;
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
+               return;
+       //
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all
+       // HW dynamic mechanism.
+       //
+       switch  (pDM_Odm->SupportPlatform)
+       {
+               case    ODM_WIN:
+               case    ODM_CE:
+                       odm_DynamicTxPowerNIC(pDM_Odm);
+                       break;  
+               case    ODM_AP:
+                       odm_DynamicTxPowerAP(pDM_Odm);
+                       break;          
+
+               case    ODM_ADSL:
+                       //odm_DIGAP(pDM_Odm);
+                       break;  
+       }
+
+       
+}
+
+
+VOID 
+odm_DynamicTxPowerNIC(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{      
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       
+       if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))\r
+               return;
+       
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+       if(pDM_Odm->SupportICType == ODM_RTL8192C)      
+       {
+               odm_DynamicTxPower_92C(pDM_Odm);
+       }
+       else if(pDM_Odm->SupportICType == ODM_RTL8192D)
+       {
+               odm_DynamicTxPower_92D(pDM_Odm);
+       }
+       else if (pDM_Odm->SupportICType == ODM_RTL8821)
+       {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+               PADAPTER                Adapter  =  pDM_Odm->Adapter;
+               PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);
+
+               if (pMgntInfo->RegRspPwr == 1)
+               {
+                       if(pDM_Odm->RSSI_Min > 60)
+                       {
+                               ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
+
+                       }
+                       else if(pDM_Odm->RSSI_Min < 55)
+                       {
+                               ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
+                       }
+               }
+#endif
+       }
+#endif 
+}
+
+VOID 
+odm_DynamicTxPowerAP(
+       IN              PVOID                                   pDM_VOID\r
+
+       )
+{      \r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+
+//#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))
+
+
+       prtl8192cd_priv priv            = pDM_Odm->priv;
+       s4Byte i;
+       s2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;
+
+       if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
+               return;
+       
+#if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1))
+       if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A))
+               pwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812;
+#endif
+
+#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
+       if(CHIP_VER_92X_SERIES(priv))
+       {
+#ifdef HIGH_POWER_EXT_PA
+       if(pDM_Odm->ExtPA)
+               tx_power_control(priv);
+#endif         
+       }
+#endif 
+       /*
+        *      Check if station is near by to use lower tx power
+        */
+
+       if ((priv->up_time % 3) == 0 )  {
+               int disable_pwr_ctrl = ((pDM_Odm->FalseAlmCnt.Cnt_all > 1000 ) || ((pDM_Odm->FalseAlmCnt.Cnt_all > 300 ) && ((RTL_R8(0xc50) & 0x7f) >= 0x32))) ? 1 : 0;
+                       
+               for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
+                       PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
+                       if(IS_STA_VALID(pstat) ) {
+                                       if(disable_pwr_ctrl)
+                                               pstat->hp_level = 0;
+                                        else if ((pstat->hp_level == 0) && (pstat->rssi > pwr_thd))
+                                       pstat->hp_level = 1;
+                                               else if ((pstat->hp_level == 1) && (pstat->rssi < (pwr_thd-8)))
+                                       pstat->hp_level = 0;
+                       }
+               }
+
+#if defined(CONFIG_WLAN_HAL_8192EE)
+               if (GET_CHIP_VER(priv) == VERSION_8192E) {
+                       if( !disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff) ) {
+                               if(pDM_Odm->RSSI_Min > pwr_thd)
+                                       RRSR_power_control_11n(priv,  1 );
+                               else if(pDM_Odm->RSSI_Min < (pwr_thd-8))
+                                       RRSR_power_control_11n(priv,  0 );
+                       } else {
+                                       RRSR_power_control_11n(priv,  0 );
+                       }
+               }
+#endif                 
+       }
+//#endif       
+
+#endif 
+}
+
+
+VOID 
+odm_DynamicTxPower_92C(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       s4Byte                          UndecoratedSmoothedPWDB;
+
+       // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
+       if (pDM_Odm->ExtPA == FALSE)
+               return;
+
+       // STA not connected and AP not connected
+       if((!pMgntInfo->bMediaConnect) &&       
+               (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
+               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+               //the LastDTPlvl should reset when disconnect, 
+               //otherwise the tx power level wouldn't change when disconnect and connect again.
+               // Maddest 20091220.
+                pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+               return;
+       }
+
+#if (INTEL_PROXIMITY_SUPPORT == 1)
+       // Intel set fixed tx power 
+       if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
+       {
+               switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
+                       case 1:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
+                               break;
+                       case 2:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
+                               break;
+                       case 3:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
+                               break;
+                       case 4:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
+                               break;
+                       case 5:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
+                               break;
+                       default:
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
+                               break;
+               }               
+       }
+       else
+#endif         
+       { 
+               if(     (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
+                       (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
+                       pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               }
+               else
+               {
+                       if(pMgntInfo->bMediaConnect)    // Default port
+                       {
+                               if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
+                               {
+                                       UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                               }
+                               else
+                               {
+                                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                               }
+                       }
+                       else // associated entry pwdb
+                       {       
+                               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                       }
+                               
+                       if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+                       {
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+                       }
+                       else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                               (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+                       {
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+                       }
+                       else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+                       {
+                               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+                       }
+               }
+       }
+       if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
+               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+               if(     (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
+                       (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
+                       odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
+               else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
+               else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+       }
+       pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
+
+       
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+
+       #if (RTL8192C_SUPPORT==1) 
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
+       struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;
+       int     UndecoratedSmoothedPWDB;
+
+       if(!pdmpriv->bDynamicTxPowerEnable)
+               return;
+
+#ifdef CONFIG_INTEL_PROXIM
+       if(Adapter->proximity.proxim_on== _TRUE){
+               struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
+               // Intel set fixed tx power 
+               printk("\n %s  Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
+               if(prox_priv!=NULL){
+                       if(prox_priv->proxim_modeinfo->power_output> 0) 
+                       {
+                               switch(prox_priv->proxim_modeinfo->power_output)
+                               {
+                                       case 1:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_100;
+                                               printk("TxHighPwrLevel_100\n");
+                                               break;
+                                       case 2:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_70;
+                                               printk("TxHighPwrLevel_70\n");
+                                               break;
+                                       case 3:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_50;
+                                               printk("TxHighPwrLevel_50\n");
+                                               break;
+                                       case 4:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_35;
+                                               printk("TxHighPwrLevel_35\n");
+                                               break;
+                                       case 5:
+                                               pdmpriv->DynamicTxHighPowerLvl  = TxHighPwrLevel_15;
+                                               printk("TxHighPwrLevel_15\n");
+                                               break;
+                                       default:
+                                               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+                                               printk("TxHighPwrLevel_100\n");
+                                               break;
+                               }               
+                       }
+               }
+       }
+       else
+#endif 
+       {
+               // STA not connected and AP not connected
+               if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&   
+                       (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+               {
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+                       //the LastDTPlvl should reset when disconnect, 
+                       //otherwise the tx power level wouldn't change when disconnect and connect again.
+                       // Maddest 20091220.
+                       pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
+                       return;
+               }
+               
+               if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port
+               {
+               #if 0
+                       //todo: AP Mode
+                       if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
+                              (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+                       {
+                               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+                               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                       }
+                       else
+                       {
+                               UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
+                               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+                       }
+               #else
+               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;     
+               #endif
+               }
+               else // associated entry pwdb
+               {       
+                       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+                       
+               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+               }
+       }
+       if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+       {
+               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+               if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal  or HP2 -> Normal
+                       odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
+               else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
+               else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
+                       odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+       }
+       pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
+       #endif
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+
+
+VOID 
+odm_DynamicTxPower_92D(
+       IN              PVOID                                   pDM_VOID\r
+       )
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       s4Byte                          UndecoratedSmoothedPWDB;
+
+       PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;
+       BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
+       u1Byte          HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+
+       // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
+       if (pDM_Odm->ExtPA == FALSE)
+               return;
+
+       // If dynamic high power is disabled.
+       if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
+               (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
+               pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+       {
+               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               return;
+       }
+
+       // STA not connected and AP not connected
+       if((!pMgntInfo->bMediaConnect) &&       
+               (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
+               pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+               //the LastDTPlvl should reset when disconnect, 
+               //otherwise the tx power level wouldn't change when disconnect and connect again.
+               // Maddest 20091220.
+                pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+               return;
+       }
+       
+       if(pMgntInfo->bMediaConnect)    // Default port
+       {
+               if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
+               {
+                       UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+               else
+               {
+                       UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+       }
+       else // associated entry pwdb
+       {       
+               UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+       }
+       
+       if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
+               if(UndecoratedSmoothedPWDB >= 0x33)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB <0x33) &&
+                       (UndecoratedSmoothedPWDB >= 0x2b) )
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < 0x2b)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+               }
+
+       }
+       else
+       
+       {
+               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               {
+                       pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+               }
+
+       }
+
+//sherry  delete flag 20110517
+       if(bGetValueFromBuddyAdapter)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
+               if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
+               {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
+                       HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
+                       pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
+                       PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
+                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
+               }                                               
+       }
+
+       if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
+       {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
+                       if(Adapter->DualMacSmartConcurrent == TRUE)
+                       {
+                               if(BuddyAdapter == NULL)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
+                                       if(!Adapter->bSlaveOfDMSP)
+                                       {
+                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                                       }
+                               }
+                               else
+                               {
+                                       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+                                       {
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
+                                               if(Adapter->bSlaveOfDMSP)
+                                               {
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));
+                                                       BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
+                                                       BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+                                               }
+                                               else
+                                               {
+                                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                  
+                                                       if(!bGetValueFromBuddyAdapter)
+                                                       {
+                                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
+                                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                                                       }
+                                               }
+                                       }
+                                       else
+                                       {
+                                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
+                                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+                       }
+
+               }
+       pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+#if (RTL8192D_SUPPORT==1) 
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);
+
+       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
+       DM_ODM_T                *podmpriv = &pHalData->odmpriv;
+       int     UndecoratedSmoothedPWDB;
+       #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+       PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;
+       BOOLEAN         bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
+       u8              HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+       #endif
+
+       // If dynamic high power is disabled.
+       if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
+               (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
+       {
+               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               return;
+       }
+
+       // STA not connected and AP not connected
+       if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&   
+               (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+       {
+               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
+               pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+               //the LastDTPlvl should reset when disconnect, 
+               //otherwise the tx power level wouldn't change when disconnect and connect again.
+               // Maddest 20091220.
+               pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
+               return;
+       }
+               
+       if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port
+       {
+       #if 0
+               //todo: AP Mode
+               if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
+              (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+               {
+                       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+               else
+               {
+                       UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+               }
+       #else
+       UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+       #endif
+       }
+       else // associated entry pwdb
+       {       
+               UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+       }
+#if TX_POWER_FOR_5G_BAND == 1
+       if(pHalData->CurrentBandType92D == BAND_ON_5G){
+               if(UndecoratedSmoothedPWDB >= 0x33)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB <0x33) &&
+                       (UndecoratedSmoothedPWDB >= 0x2b) )
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < 0x2b)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+               }
+       }
+       else
+#endif
+       {
+               if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+               }
+               else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+                       (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+               }
+               else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+               {
+                       pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+                       //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+               }
+       }
+#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+       if(bGetValueFromBuddyAdapter)
+       {
+               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
+               if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
+               {
+                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
+                       HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
+                       pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
+                       PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                       pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
+                       Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
+               }                                               
+       }
+#endif
+
+       if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+       {
+               //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
+#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+               if(BuddyAdapter == NULL)
+               {
+                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
+                       if(!Adapter->bSlaveOfDMSP)
+                       {
+                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                       }
+               }
+               else
+               {
+                       if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+                       {
+                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
+                               if(Adapter->bSlaveOfDMSP)
+                               {
+                                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));
+                                       BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
+                                       BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+                               }
+                               else
+                               {
+                                       //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                     
+                                       if(!bGetValueFromBuddyAdapter)
+                                       {
+                                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
+                                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
+                               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+                       }
+               }
+#else
+               PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+#endif
+       }
+       pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
+#endif 
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicTxPower.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_DynamicTxPower.h
new file mode 100755 (executable)
index 0000000..67221e5
--- /dev/null
@@ -0,0 +1,87 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODMDYNAMICTXPOWER_H__\r
+#define    __ODMDYNAMICTXPOWER_H__\r
+\r
+#define                TX_POWER_NEAR_FIELD_THRESH_LVL2 74\r
+#define                TX_POWER_NEAR_FIELD_THRESH_LVL1 67\r
+#define                TX_POWER_NEAR_FIELD_THRESH_AP           0x3F\r
+#define                TX_POWER_NEAR_FIELD_THRESH_8812 60\r
+\r
+#define                TxHighPwrLevel_Normal           0       \r
+#define                TxHighPwrLevel_Level1           1\r
+#define                TxHighPwrLevel_Level2           2\r
+#define                TxHighPwrLevel_BT1                      3\r
+#define                TxHighPwrLevel_BT2                      4\r
+#define                TxHighPwrLevel_15                       5\r
+#define                TxHighPwrLevel_35                       6\r
+#define                TxHighPwrLevel_50                       7\r
+#define                TxHighPwrLevel_70                       8\r
+#define                TxHighPwrLevel_100                      9\r
+\r
+VOID 
+odm_DynamicTxPowerInit(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID
+odm_DynamicTxPowerRestorePowerIndex(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicTxPowerNIC(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+VOID
+odm_DynamicTxPowerSavePowerIndex(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID
+odm_DynamicTxPowerWritePowerIndex(
+       IN              PVOID                                   pDM_VOID, \r
+       IN      u1Byte          Value);
+
+VOID 
+odm_DynamicTxPower_92C(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicTxPower_92D(
+       IN              PVOID                                   pDM_VOID\r
+       );
+#endif
+\r
+VOID 
+odm_DynamicTxPower(
+       IN              PVOID                                   pDM_VOID\r
+       );
+
+VOID 
+odm_DynamicTxPowerAP(
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_EdcaTurboCheck.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_EdcaTurboCheck.c
new file mode 100755 (executable)
index 0000000..34bfd08
--- /dev/null
@@ -0,0 +1,1915 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+//#include "Mp_Precomp.h"\r
+#include "odm_precomp.h"\r
+\r
+VOID\r
+ODM_EdcaTurboInit(\r
+       IN      PVOID           pDM_VOID)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))\r
+       odm_EdcaParaInit(pDM_Odm);\r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+       PADAPTER        Adapter = NULL;\r
+       HAL_DATA_TYPE   *pHalData = NULL;\r
+\r
+       if(pDM_Odm->Adapter==NULL)      {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));\r
+               return;\r
+       }\r
+\r
+       Adapter=pDM_Odm->Adapter;\r
+       pHalData=GET_HAL_DATA(Adapter);\r
+\r
+       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       \r
+       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
+       pHalData->bIsAnyNonBEPkts = FALSE;\r
+       \r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;     \r
+       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       \r
+       pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
+       Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;\r
+\r
+#endif \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));\r
+\r
+       \r
+}      // ODM_InitEdcaTurbo\r
+\r
+VOID\r
+odm_EdcaTurboCheck(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       // \r
+       // For AP/ADSL use prtl8192cd_priv\r
+       // For CE/NIC use PADAPTER\r
+       //\r
+\r
+       //\r
+       // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
+       // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
+       // HW dynamic mechanism.\r
+       //\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));\r
+       \r
+       if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))\r
+               return;\r
+\r
+       switch  (pDM_Odm->SupportPlatform)\r
+       {\r
+               case    ODM_WIN:\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+                       odm_EdcaTurboCheckMP(pDM_Odm);\r
+#endif\r
+                       break;\r
+\r
+               case    ODM_CE:\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+                       odm_EdcaTurboCheckCE(pDM_Odm);\r
+#endif\r
+                       break;\r
+\r
+               case    ODM_AP:\r
+               case    ODM_ADSL:\r
+\r
+#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))\r
+               odm_IotEngine(pDM_Odm);\r
+#endif\r
+                       break;  \r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));\r
+\r
+}      // odm_CheckEdcaTurbo\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+\r
+\r
+VOID\r
+odm_EdcaTurboCheckCE(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       u32     EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\r
+       u32     EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\r
+       u32     ICType=pDM_Odm->SupportICType;\r
+       u32     IOTPeer=0;\r
+       u8      WirelessMode=0xFF;                   //invalid value\r
+       u32     trafficIndex;\r
+       u32     edca_param;\r
+       u64     cur_tx_bytes = 0;\r
+       u64     cur_rx_bytes = 0;\r
+       u8      bbtchange = _FALSE;\r
+       u8      bBiasOnRx = _FALSE;\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+       struct dvobj_priv               *pdvobjpriv = adapter_to_dvobj(Adapter);\r
+       struct xmit_priv                *pxmitpriv = &(Adapter->xmitpriv);\r
+       struct recv_priv                *precvpriv = &(Adapter->recvpriv);\r
+       struct registry_priv    *pregpriv = &Adapter->registrypriv;\r
+       struct mlme_ext_priv    *pmlmeext = &(Adapter->mlmeextpriv);\r
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
+\r
+       if(pDM_Odm->bLinked != _TRUE)\r
+       {\r
+               precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+               return;\r
+       }\r
+\r
+       if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))\r
+       {\r
+               precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+               return;\r
+       }\r
+\r
+       if(pDM_Odm->pWirelessMode!=NULL)\r
+               WirelessMode=*(pDM_Odm->pWirelessMode);\r
+\r
+       IOTPeer = pmlmeinfo->assoc_AP_vendor;\r
+\r
+       if (IOTPeer >=  HT_IOT_PEER_MAX)\r
+       {\r
+               precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+               return;\r
+       }\r
+\r
+       if(     (pDM_Odm->SupportICType == ODM_RTL8192C) ||\r
+               (pDM_Odm->SupportICType == ODM_RTL8723A) ||\r
+               (pDM_Odm->SupportICType == ODM_RTL8188E))\r
+       {\r
+               if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))\r
+                       bBiasOnRx = _TRUE;\r
+       }\r
+\r
+       // Check if the status needs to be changed.\r
+       if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )\r
+       {\r
+               cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
+               cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
+\r
+               //traffic, TX or RX\r
+               if(bBiasOnRx)\r
+               {\r
+                       if (cur_tx_bytes > (cur_rx_bytes << 2))\r
+                       { // Uplink TP is present.\r
+                               trafficIndex = UP_LINK; \r
+                       }\r
+                       else\r
+                       { // Balance TP is present.\r
+                               trafficIndex = DOWN_LINK;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (cur_rx_bytes > (cur_tx_bytes << 2))\r
+                       { // Downlink TP is present.\r
+                               trafficIndex = DOWN_LINK;\r
+                       }\r
+                       else\r
+                       { // Balance TP is present.\r
+                               trafficIndex = UP_LINK;\r
+                       }\r
+               }\r
+\r
+               //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))\r
+               {\r
+                       if(ICType==ODM_RTL8192D)\r
+                       {      \r
+                               // Single PHY\r
+                               if(pDM_Odm->RFType==ODM_2T2R)\r
+                               {\r
+                                       EDCA_BE_UL = 0x60a42b;    //0x5ea42b;\r
+                                       EDCA_BE_DL = 0x60a42b;    //0x5ea42b;\r
+                               }\r
+                               else\r
+                               {\r
+                                       EDCA_BE_UL = 0x6ea42b;\r
+                                       EDCA_BE_DL = 0x6ea42b;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {\r
+                                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {\r
+                                               EDCA_BE_UL = 0x60a42b;\r
+                                               EDCA_BE_DL = 0x60a42b;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               EDCA_BE_UL = 0x6ea42b;\r
+                                               EDCA_BE_DL = 0x6ea42b;\r
+                                       }\r
+                               }\r
+                       }\r
+               \r
+                       //92D txop can't be set to 0x3e for cisco1250\r
+                       if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\r
+                       {\r
+                               EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+                               EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
+                       }\r
+                       //merge from 92s_92c_merge temp brunch v2445    20120215 \r
+                       else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))\r
+                       {\r
+                               EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];\r
+                       }\r
+                       else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
+                       {\r
+                               EDCA_BE_DL = 0xa630;\r
+                       }\r
+                       else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
+                       {\r
+                               EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+                               EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
+                       }\r
+                       else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
+                       {\r
+                               // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
+                               EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+                       }\r
+\r
+                       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
+                       {\r
+                               EDCA_BE_UL = 0x5ea42b;\r
+                               EDCA_BE_DL = 0x5ea42b;\r
+\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));\r
+                       }\r
+\r
+                       if (trafficIndex == DOWN_LINK)\r
+                               edca_param = EDCA_BE_DL;\r
+                       else\r
+                               edca_param = EDCA_BE_UL;\r
+\r
+                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);\r
+\r
+                       pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;\r
+               }\r
+               \r
+               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;\r
+       }\r
+       else\r
+       {\r
+               //\r
+               // Turn Off EDCA turbo here.\r
+               // Restore original EDCA according to the declaration of AP.\r
+               //\r
+                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
+               {\r
+                       rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);\r
+                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;\r
+               }\r
+       }\r
+\r
+}\r
+\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+VOID\r
+odm_EdcaTurboCheckMP(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+\r
+       PADAPTER                        pDefaultAdapter = GetDefaultAdapter(Adapter);\r
+       PADAPTER                        pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;\r
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
+       PSTA_QOS                        pStaQos = Adapter->MgntInfo.pStaQos;\r
+       //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn\r
+       u8Byte                          Ext_curTxOkCnt = 0;\r
+       u8Byte                          Ext_curRxOkCnt = 0;     \r
+       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.      \r
+       u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
+\r
+       // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.\r
+       u8Byte                          curTxOkCnt = 0;\r
+       u8Byte                          curRxOkCnt = 0; \r
+       u4Byte                          EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\r
+       u4Byte                          EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\r
+       u4Byte                         EDCA_BE = 0x5ea42b;\r
+       u1Byte                         IOTPeer=0;\r
+       BOOLEAN                      *pbIsCurRDLState=NULL;\r
+       BOOLEAN                      bLastIsCurRDLState=FALSE;\r
+       BOOLEAN                          bBiasOnRx=FALSE;\r
+       BOOLEAN                         bEdcaTurboOn=FALSE;\r
+       u1Byte                          TxRate = 0xFF;\r
+       u8Byte                          value64;        \r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));\r
+\r
+////===============================\r
+////list paramter for different platform\r
+////===============================\r
+       bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;\r
+       pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);       \r
+\r
+       //2012/09/14 MH Add \r
+       if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)\r
+               pHalData->bIsAnyNonBEPkts = TRUE;\r
+\r
+       pMgntInfo->NumNonBePkt = 0;\r
+\r
+       // Caculate TX/RX TP:\r
+       //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
+       //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
+       curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;\r
+       curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;\r
+       pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
+       pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
+\r
+       if(pExtAdapter == NULL) \r
+               pExtAdapter = pDefaultAdapter;\r
+\r
+       Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;\r
+       Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;\r
+       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
+       //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.\r
+       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
+       {\r
+               curTxOkCnt = Ext_curTxOkCnt ;\r
+               curRxOkCnt = Ext_curRxOkCnt ;\r
+       }\r
+       //\r
+       IOTPeer=pMgntInfo->IOTPeer;\r
+       bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;\r
+       bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx  \n",pHalData->bIsAnyNonBEPkts));\r
+\r
+\r
+////===============================\r
+////check if edca turbo is disabled\r
+////===============================\r
+       if(odm_IsEdcaTurboDisable(pDM_Odm))\r
+       {\r
+               pHalData->bIsAnyNonBEPkts = FALSE;\r
+               pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
+               pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
+               pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;\r
+               pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;\r
+\r
+       }\r
+\r
+////===============================\r
+////remove iot case out\r
+////===============================\r
+       ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);\r
+\r
+\r
+////===============================\r
+////Check if the status needs to be changed.\r
+////===============================\r
+       if(bEdcaTurboOn)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));\r
+               if(bBiasOnRx)\r
+                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);\r
+               else\r
+                       odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);\r
+\r
+//modify by Guo.Mingzhi 2011-12-29\r
+                       EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;\r
+                       if(IS_HARDWARE_TYPE_8821U(Adapter))\r
+                       {\r
+                               if(pMgntInfo->RegTxDutyEnable)\r
+                               {\r
+                                       //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)\r
+                                       if(!pMgntInfo->ForcedDataRate) //auto rate\r
+                                       {\r
+                                               if(pDM_Odm->TxRate != 0xFF)\r
+                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
+                                       }\r
+                                       else //force rate\r
+                                       {\r
+                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
+                                       }\r
+\r
+                                       value64 = (curRxOkCnt<<2);\r
+                                       if(curTxOkCnt < value64) //Downlink\r
+                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                       else //Uplink\r
+                                       {\r
+                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);\r
+                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)\r
+                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
+                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                               else\r
+                                               {\r
+                                                       switch (TxRate)\r
+                                                       {\r
+                                                               case MGN_VHT1SS_MCS6:\r
+                                                               case MGN_VHT1SS_MCS5:\r
+                                                               case MGN_MCS6:\r
+                                                               case MGN_MCS5:\r
+                                                               case MGN_48M:\r
+                                                               case MGN_54M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS4:\r
+                                                               case MGN_MCS4:\r
+                                                               case MGN_36M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS3:\r
+                                                               case MGN_MCS3:\r
+                                                               case MGN_24M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS2:\r
+                                                               case MGN_MCS2:\r
+                                                               case MGN_18M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS1:\r
+                                                               case MGN_MCS1:\r
+                                                               case MGN_9M:\r
+                                                               case MGN_12M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);\r
+                                                               break;\r
+                                                               case MGN_VHT1SS_MCS0:\r
+                                                               case MGN_MCS0:\r
+                                                               case MGN_6M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
+                                                               break;\r
+                                                               default:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }                               \r
+                               }\r
+                               else\r
+                               {\r
+                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                               }\r
+\r
+                       }\r
+                       else if (IS_HARDWARE_TYPE_8812AU(Adapter)){\r
+                               if(pMgntInfo->RegTxDutyEnable)\r
+                               {\r
+                                       //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)\r
+                                       // it;s the same issue as 8811AU\r
+                                       if(!pMgntInfo->ForcedDataRate) //auto rate\r
+                                       {\r
+                                               if(pDM_Odm->TxRate != 0xFF)\r
+                                                       TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
+                                       }\r
+                                       else //force rate\r
+                                       {\r
+                                               TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
+                                       }\r
+\r
+                                       value64 = (curRxOkCnt<<2);\r
+                                       if(curTxOkCnt < value64) //Downlink\r
+                                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                       else //Uplink\r
+                                       {\r
+                                               //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);\r
+                                               //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)\r
+                                               if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
+                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                               else\r
+                                               {\r
+                                                       switch (TxRate)\r
+                                                       {\r
+                                                               case MGN_VHT2SS_MCS9:\r
+                                                               case MGN_VHT1SS_MCS9:                                                                   \r
+                                                               case MGN_VHT1SS_MCS8:\r
+                                                               case MGN_MCS15:\r
+                                                               case MGN_MCS7:                                                                  \r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     \r
+                                                               case MGN_VHT2SS_MCS8:\r
+                                                               case MGN_VHT1SS_MCS7:\r
+                                                               case MGN_MCS14:\r
+                                                               case MGN_MCS6:\r
+                                                               case MGN_54M:                                                                   \r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);\r
+                                                               case MGN_VHT2SS_MCS7:\r
+                                                               case MGN_VHT2SS_MCS6:\r
+                                                               case MGN_VHT1SS_MCS6:\r
+                                                               case MGN_VHT1SS_MCS5:\r
+                                                               case MGN_MCS13:\r
+                                                               case MGN_MCS5:\r
+                                                               case MGN_48M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);\r
+                                                               break;\r
+                                                               case MGN_VHT2SS_MCS5:\r
+                                                               case MGN_VHT2SS_MCS4:\r
+                                                               case MGN_VHT1SS_MCS4:\r
+                                                               case MGN_VHT1SS_MCS3:   \r
+                                                               case MGN_MCS12:\r
+                                                               case MGN_MCS4:  \r
+                                                               case MGN_MCS3:  \r
+                                                               case MGN_36M:\r
+                                                               case MGN_24M:   \r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);\r
+                                                               break;\r
+                                                               case MGN_VHT2SS_MCS3:\r
+                                                               case MGN_VHT2SS_MCS2:\r
+                                                               case MGN_VHT2SS_MCS1:\r
+                                                               case MGN_VHT1SS_MCS2:\r
+                                                               case MGN_VHT1SS_MCS1:   \r
+                                                               case MGN_MCS11: \r
+                                                               case MGN_MCS10: \r
+                                                               case MGN_MCS9:          \r
+                                                               case MGN_MCS2:  \r
+                                                               case MGN_MCS1:\r
+                                                               case MGN_18M:   \r
+                                                               case MGN_12M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);\r
+                                                               break;\r
+                                                               case MGN_VHT2SS_MCS0:\r
+                                                               case MGN_VHT1SS_MCS0:\r
+                                                               case MGN_MCS0:  \r
+                                                               case MGN_MCS8:\r
+                                                               case MGN_9M:    \r
+                                                               case MGN_6M:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
+                                                               break;\r
+                                                               default:\r
+                                                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }                               \r
+                               }\r
+                               else\r
+                               {\r
+                                       ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+                               }\r
+                       }\r
+                       else\r
+                               ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));\r
+\r
+               pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;\r
+               \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx  EDCA_BE_UL : 0x%lx  EDCA_BE : 0x%lx  \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));\r
+\r
+       }\r
+       else\r
+       {\r
+               // Turn Off EDCA turbo here.\r
+               // Restore original EDCA according to the declaration of AP.\r
+                if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
+               {\r
+                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );\r
+\r
+                       pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx  \n",pDM_Odm->WMMEDCA_BE));\r
+\r
+               }\r
+       }\r
+\r
+}\r
+\r
+\r
+//check if edca turbo is disabled\r
+BOOLEAN\r
+odm_IsEdcaTurboDisable(\r
+       IN      PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
+       u4Byte                          IOTPeer=pMgntInfo->IOTPeer;\r
+\r
+       if(pDM_Odm->bBtDisableEdcaTurbo)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));\r
+               return TRUE;\r
+       }\r
+\r
+       if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||\r
+               (pDM_Odm->bWIFITest)||\r
+               (IOTPeer>= HT_IOT_PEER_MAX))\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));\r
+               return TRUE;\r
+       }\r
+\r
+\r
+       // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue\r
+       // 2. User may disable EDCA Turbo mode with OID settings.\r
+       if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));\r
+               return  TRUE;\r
+               }\r
+               \r
+       return  FALSE;\r
+       \r
+\r
+}\r
+\r
+//add iot case here: for MP/CE\r
+VOID \r
+ODM_EdcaParaSelByIot(\r
+       IN      PVOID           pDM_VOID,\r
+       OUT     u4Byte          *EDCA_BE_UL,\r
+       OUT u4Byte              *EDCA_BE_DL\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                       Adapter = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+       u4Byte                         IOTPeer=0;\r
+       u4Byte                         ICType=pDM_Odm->SupportICType;\r
+       u1Byte                         WirelessMode=0xFF;                   //invalid value\r
+       u4Byte                          RFType=pDM_Odm->RFType;\r
+         u4Byte                         IOTPeerSubType=0;\r
+\r
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
+       u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
+\r
+       if(pDM_Odm->pWirelessMode!=NULL)\r
+               WirelessMode=*(pDM_Odm->pWirelessMode);\r
+               \r
+///////////////////////////////////////////////////////////\r
+////list paramter for different platform\r
+\r
+       IOTPeer=pMgntInfo->IOTPeer;\r
+       IOTPeerSubType=pMgntInfo->IOTPeerSubtype;\r
+       GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
+\r
+\r
+       if(ICType==ODM_RTL8192D)\r
+       {      \r
+               // Single PHY\r
+               if(pDM_Odm->RFType==ODM_2T2R)\r
+               {\r
+                       (*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;\r
+                       (*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;\r
+\r
+               }\r
+               else\r
+               {\r
+                       (*EDCA_BE_UL) = 0x6ea42b;\r
+                       (*EDCA_BE_DL) = 0x6ea42b;\r
+               }\r
+\r
+       }\r
+////============================\r
+/// IOT case for MP\r
+////============================       \r
+\r
+       else\r
+       {\r
+\r
+               if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){\r
+                       if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))                 {\r
+                               (*EDCA_BE_UL) = 0x60a42b;\r
+                               (*EDCA_BE_DL) = 0x60a42b;\r
+                       }\r
+                       else\r
+                       {\r
+                               (*EDCA_BE_UL) = 0x6ea42b;\r
+                               (*EDCA_BE_DL) = 0x6ea42b;\r
+                       }\r
+               }\r
+       }\r
\r
+       if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
+       {\r
+               (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];\r
+               (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];\r
+       }\r
+     \r
+       #if (INTEL_PROXIMITY_SUPPORT == 1)\r
+       if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)\r
+       {\r
+               (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;\r
+       }\r
+       else\r
+       #endif          \r
+       {\r
+               if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))\r
+               {// To check whether we shall force turn on TXOP configuration.\r
+                       if(!((*EDCA_BE_UL) & 0xffff0000))\r
+                               (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.\r
+                       if(!((*EDCA_BE_DL) & 0xffff0000))\r
+                               (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.\r
+               }\r
+               \r
+               //92D txop can't be set to 0x3e for cisco1250\r
+               if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\r
+               {\r
+                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
+               }\r
+               //merge from 92s_92c_merge temp brunch v2445    20120215 \r
+               else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))\r
+               {\r
+                       (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
+               }\r
+               else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
+               {\r
+                       (*EDCA_BE_DL) = 0xa630;\r
+               }\r
+\r
+               else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
+               {\r
+                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+                       (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
+               }\r
+               else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
+               {\r
+                       // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
+                       if(WirelessMode==ODM_WM_G)\r
+                               (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
+                       else\r
+                       (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+                       \r
+                       if(ICType == ODM_RTL8821)\r
+                                (*EDCA_BE_DL) = 0x5ea630;\r
+                       \r
+               }\r
+       }\r
+\r
+       if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))\r
+       {\r
+               (*EDCA_BE_DL) = 0x432b;\r
+               (*EDCA_BE_UL) = 0x432b;\r
+       }               \r
+\r
+\r
+\r
+       if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
+       {\r
+               (*EDCA_BE_UL) = 0x5ea42b;\r
+               (*EDCA_BE_DL) = 0x5ea42b;\r
+\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));\r
+       }\r
+\r
+       // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.\r
+       if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) && \r
+               (pMgntInfo->dot11CurrentChannelNumber == 6))\r
+       {\r
+               (*EDCA_BE_DL) = 0xa92b;\r
+       }\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));\r
+\r
+}\r
+\r
+\r
+VOID\r
+odm_EdcaChooseTrafficIdx( \r
+       IN      PVOID           pDM_VOID,\r
+       IN      u8Byte                          cur_tx_bytes,  \r
+       IN      u8Byte                          cur_rx_bytes, \r
+       IN      BOOLEAN                 bBiasOnRx,\r
+       OUT BOOLEAN             *pbIsCurRDLState\r
+       )\r
+{      \r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       \r
+       if(bBiasOnRx)\r
+       {\r
+         \r
+               if(cur_tx_bytes>(cur_rx_bytes*4))\r
+               {\r
+                       *pbIsCurRDLState=FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));\r
+\r
+               }\r
+               else\r
+               {\r
+                       *pbIsCurRDLState=TRUE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
+\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(cur_rx_bytes>(cur_tx_bytes*4))\r
+               {\r
+                       *pbIsCurRDLState=TRUE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));\r
+\r
+               }\r
+               else\r
+               {\r
+                       *pbIsCurRDLState=FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
+               }\r
+       }\r
+\r
+       return ;\r
+}\r
+\r
+#endif\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))\r
+\r
+void odm_EdcaParaInit(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       prtl8192cd_priv priv            = pDM_Odm->priv;\r
+       int   mode=priv->pmib->dot11BssType.net_work_type;\r
+       \r
+       static unsigned int slot_time, sifs_time;\r
+       struct ParaRecord EDCA[4];\r
+\r
+        memset(EDCA, 0, 4*sizeof(struct ParaRecord));\r
+\r
+       sifs_time = 10;\r
+       slot_time = 20;\r
+\r
+       if (mode & (ODM_WM_N24G|ODM_WM_N5G))\r
+               sifs_time = 16;\r
+\r
+       if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))\r
+               slot_time = 9;\r
+\r
+\r
+#ifdef RTK_AC_SUPPORT //for 11ac logo,  edit aifs time for cca test cases\r
+       if(AC_SIGMA_MODE != AC_SIGMA_NONE)\r
+               sifs_time = 10; \r
+#endif\r
+\r
+\r
+#if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))\r
+        if( priv->pmib->dot11QosEntry.ManualEDCA ) {\r
+                if( OPMODE & WIFI_AP_STATE )\r
+                        memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));\r
+                else\r
+                        memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));\r
+\r
+               #ifdef WIFI_WMM\r
+               if (QOS_ENABLE)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+               else\r
+               #endif\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+\r
+       }else\r
+       #endif //RTL_MANUAL_EDCA\r
+       {\r
+\r
+                if(OPMODE & WIFI_AP_STATE)\r
+                {\r
+                       memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));\r
+\r
+                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))\r
+                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));\r
+                       else\r
+                               memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));\r
+                }\r
+                else\r
+                {\r
+                       memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));\r
+\r
+                       if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))\r
+                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));\r
+                       else\r
+                               memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));\r
+                }\r
+                \r
+       #ifdef WIFI_WMM\r
+               if (QOS_ENABLE)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+               else\r
+       #endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM,  (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));\r
+#endif\r
+                       \r
+\r
+       }\r
+\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VO_PARAM, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time));\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time));\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time));\r
+\r
+#if defined(RTK_AC_SUPPORT) && defined(RTL_MANUAL_EDCA) //for 11ac logo,  make BK worse to seperate with BE.\r
+       if((AC_SIGMA_MODE != AC_SIGMA_NONE) && (priv->pmib->dot11QosEntry.ManualEDCA))\r
+       {\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | 0xa4 );\r
+       }\r
+#endif\r
+\r
+//     ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);\r
+\r
+       priv->pshare->iot_mode_enable = 0;\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if (priv->pshare->rf_ft_var.wifi_beq_iot)\r
+               priv->pshare->iot_mode_VI_exist = 0;\r
+       \r
+       #ifdef WMM_VIBE_PRI\r
+       priv->pshare->iot_mode_BE_exist = 0;\r
+       #endif\r
+       \r
+#ifdef WMM_BEBK_PRI\r
+       priv->pshare->iot_mode_BK_exist = 0;\r
+#endif\r
+       \r
+       #ifdef LOW_TP_TXOP\r
+       priv->pshare->BE_cwmax_enhance = 0;\r
+       #endif\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+      priv->pshare->iot_mode_BE_exist = 0;   \r
+#endif\r
+       priv->pshare->iot_mode_VO_exist = 0;\r
+}\r
+\r
+BOOLEAN\r
+ODM_ChooseIotMainSTA(\r
+       IN      PVOID           pDM_VOID,\r
+       IN      PSTA_INFO_T             pstat\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       prtl8192cd_priv priv = pDM_Odm->priv;\r
+       BOOLEAN         bhighTP_found_pstat=FALSE;\r
+       \r
+       if ((GET_ROOT(priv)->up_time % 2) == 0) {\r
+               unsigned int tx_2s_avg = 0;\r
+               unsigned int rx_2s_avg = 0;\r
+               int i=0, aggReady=0;\r
+               unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);\r
+               int assoc_num = GET_ROOT(priv)->assoc_num;\r
+#ifdef MBSSID\r
+               if (GET_ROOT(priv)->pmib->miscEntry.vap_enable){\r
+                       for (i=0; i<RTL8192CD_NUM_VWLAN; ++i)\r
+                               assoc_num += GET_ROOT(priv)->pvap_priv[i]-> assoc_num;\r
+               }\r
+#endif \r
+#ifdef UNIVERSAL_REPEATER\r
+               if (IS_DRV_OPEN(GET_VXD_PRIV(GET_ROOT(priv))))\r
+                       assoc_num += GET_VXD_PRIV(GET_ROOT(priv))-> assoc_num;\r
+#endif\r
+#ifdef WDS\r
+                if(GET_ROOT(priv)->pmib->dot11WdsInfo.wdsEnabled)\r
+                       assoc_num ++;\r
+#endif\r
+\r
+\r
+               pstat->current_tx_bytes += pstat->tx_byte_cnt;\r
+               pstat->current_rx_bytes += pstat->rx_byte_cnt;\r
+\r
+               if (total_sum != 0) {\r
+                       if (total_sum <= 1000000) {\r
+                       tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);\r
+                       rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);\r
+                       } else {\r
+                               tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));\r
+                               rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));\r
+                       }\r
+\r
+               }\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+               if (pstat->ht_cap_len) {\r
+                       if ((tx_2s_avg + rx_2s_avg) >=25 ) {//50//\r
+\r
+                                       priv->pshare->highTP_found_pstat = pstat;\r
+                                       bhighTP_found_pstat=TRUE;\r
+                               }\r
+                       }\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               for(i=0; i<8; i++)\r
+                       aggReady += (pstat->ADDBA_ready[i]);\r
+\r
+               if ((pstat->ht_cap_len && (\r
+#ifdef SUPPORT_TX_AMSDU                        \r
+                       AMSDU_ENABLE || \r
+#endif                 \r
+                       aggReady)) || (pstat->IOTPeer==HT_IOT_PEER_INTEL))\r
+               {\r
+                       if ((assoc_num==1) || (tx_2s_avg + rx_2s_avg >= 25)) {\r
+                               priv->pshare->highTP_found_pstat = pstat;\r
+                       }\r
+                       \r
+               #ifdef CLIENT_MODE\r
+                       if (OPMODE & WIFI_STATION_STATE) {\r
+                               if ((tx_2s_avg + rx_2s_avg) >= 20)\r
+                                       priv->pshare->highTP_found_pstat = pstat;\r
+               }\r
+               #endif                          \r
+       }\r
+#endif\r
+       } \r
+       else {\r
+               pstat->current_tx_bytes = pstat->tx_byte_cnt;\r
+               pstat->current_rx_bytes = pstat->rx_byte_cnt;\r
+       }\r
+\r
+       return bhighTP_found_pstat;\r
+}\r
+\r
+\r
+#ifdef WIFI_WMM\r
+VOID\r
+ODM_IotEdcaSwitch(\r
+       IN      PVOID           pDM_VOID,\r
+       IN      unsigned char           enable\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       prtl8192cd_priv priv    = pDM_Odm->priv;\r
+       int   mode=priv->pmib->dot11BssType.net_work_type;\r
+       unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;\r
+       unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       u32 be_edca, vi_edca;\r
+       u16 disable_cfe;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||\r
+               ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+       #ifdef CLIENT_MODE\r
+               || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+       #endif\r
+               ))\r
+               return;\r
+#endif\r
+\r
+#ifdef RTK_AC_SUPPORT //for 11ac logo, do not dynamic switch edca \r
+       if(AC_SIGMA_MODE != AC_SIGMA_NONE)\r
+               return;\r
+#endif\r
+\r
+       if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num\r
+       #ifdef WDS\r
+               || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)\r
+       #endif\r
+               ))\r
+               sifs_time = 16;\r
+\r
+       if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {\r
+               slot_time = 9;\r
+       } \r
+       else\r
+       {\r
+               BE_TXOP = 94;\r
+               VI_TXOP = 188;\r
+       }\r
+\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       vi_edca = -1;\r
+       disable_cfe = -1;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+       if (priv->pshare->iot_mode_VO_exist) {\r
+               // to separate AC_VI and AC_BE to avoid using the same EDCA settings\r
+               if (priv->pshare->iot_mode_BE_exist) {\r
+                       vi_cw_max = 5;\r
+                       vi_cw_min = 3;\r
+               } else {\r
+                       vi_cw_max = 6;\r
+                       vi_cw_min = 4;\r
+               }\r
+       }\r
+       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);\r
+\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs;\r
+#else\r
+       ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);\r
+#endif\r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {\r
+               if (priv->pshare->iot_mode_VO_exist) {\r
+       #ifdef WMM_VIBE_PRI\r
+                       if (priv->pshare->iot_mode_BE_exist) \r
+                       {\r
+                               vi_cw_max = 5;\r
+                               vi_cw_min = 3;\r
+                               vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);\r
+                       }\r
+                       else \r
+       #endif\r
+                       {\r
+                       vi_cw_max = 6;\r
+                       vi_cw_min = 4;\r
+                       vi_aifs = 0x2b;\r
+                       }\r
+               } \r
+               else {\r
+                       vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);\r
+               }\r
+\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+               vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)\r
+                       | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs;\r
+#else\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)\r
+                       | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);\r
+#endif\r
+\r
+       #ifdef WMM_BEBK_PRI\r
+       #ifdef CONFIG_RTL_88E_SUPPORT\r
+               if ((GET_CHIP_VER(priv) == VERSION_8188E) && priv->pshare->iot_mode_BK_exist) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (10 << 12) | (6 << 8) | 0x4f;\r
+#else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (10 << 12) | (6 << 8) | 0x4f);\r
+#endif\r
+               }\r
+       #endif          \r
+       #endif\r
+#if defined(CONFIG_WLAN_HAL_8881A) \r
+               if (GET_CHIP_VER(priv) == VERSION_8881A) \r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM,  0xa64f);\r
+#endif         \r
+       }\r
+#endif\r
+\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) {\r
+#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)\r
+               if (GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8812E) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (10 << 12) | (6 << 8) | 0x4f;\r
+#else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (6 << 8) | 0x4f);\r
+#endif\r
+               }\r
+               else\r
+#endif\r
+               {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (10 << 12) | (4 << 8) | 0x4f;\r
+#else\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);\r
+#endif\r
+               }\r
+       } else if(!enable)\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)      \r
+       if(!enable)                                 //if iot is disable ,maintain original BEQ PARAM\r
+#endif\r
+       {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+               be_edca = (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)\r
+                       | (sifs_time + 3 * slot_time);\r
+               disable_cfe = 1;\r
+#else\r
+               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)\r
+                       | (sifs_time + 3 * slot_time));\r
+#endif\r
+#ifdef CONFIG_PCI_HCI\r
+//             ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));\r
+#endif\r
+       }\r
+       else\r
+       {\r
+               int txop;\r
+               unsigned int cw_max;\r
+#ifdef LOW_TP_TXOP\r
+               unsigned int txop_close;\r
+#endif\r
+               \r
+       #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))\r
+                       cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);\r
+                       txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);\r
+\r
+                       if(priv->pshare->txop_enlarge == 0xe)   //if intel case\r
+                               txop = (txop_close ? 0 : (BE_TXOP*2));\r
+                       else                                                        //if other case\r
+                               txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));\r
+       #else\r
+                       cw_max=6;\r
+                       if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))\r
+                               txop=BE_TXOP*2;\r
+                       else\r
+                               txop=BE_TXOP*priv->pshare->txop_enlarge;\r
+\r
+       #endif\r
+                           \r
+               if (priv->pshare->ht_sta_num\r
+       #ifdef WDS\r
+                       || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&\r
+                       priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)\r
+       #endif\r
+                       ) \r
+                       {\r
+\r
+                       if (priv->pshare->txop_enlarge == 0xe) {\r
+                               // is intel client, use a different edca value\r
+                               //ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);\r
+                               if (pDM_Odm->RFType==ODM_1T1R) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (5 << 12) | (3 << 8) | 0x1f;\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (5 << 12) | (3 << 8) | 0x1f);\r
+#endif\r
+                               }\r
+                               else {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (8 << 12) | (5 << 8) | 0x1f;\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (8 << 12) | (5 << 8) | 0x1f);\r
+#endif\r
+                               }\r
+                               \r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                               disable_cfe = 0;\r
+#endif\r
+#ifdef CONFIG_PCI_HCI\r
+//                             ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE));\r
+#endif\r
+                               priv->pshare->txop_enlarge = 2;\r
+                       } \r
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+       #ifndef LOW_TP_TXOP\r
+                        else if (priv->pshare->txop_enlarge == 0xd) {\r
+                               // is intel ralink, use a different edca value\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                               be_edca = (txop << 16) | (6 << 12) | (5 << 8) | 0x2b;\r
+#else\r
+                               ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (6 << 12) | (5 << 8) | 0x2b);\r
+#endif\r
+                               priv->pshare->txop_enlarge = 2;\r
+                       } \r
+       #endif\r
+#endif\r
+                       else \r
+                       {\r
+//                             if (txop == 0) {\r
+//#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+//                                     disable_cfe = 1;\r
+//#endif\r
+//#ifdef CONFIG_PCI_HCI\r
+//                                     ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));\r
+//#endif\r
+//                             }\r
+                                       \r
+                               if (pDM_Odm->RFType==ODM_2T2R) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |\r
+                                               (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));\r
+#endif\r
+                               }\r
+                               else\r
+                               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)\r
+                               {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) |\r
+                                               (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time);\r
+#else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |\r
+                                               (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));\r
+#endif\r
+                               }\r
+                               #else\r
+                               {\r
+                                       PSTA_INFO_T             pstat = priv->pshare->highTP_found_pstat;\r
+                                       if ((GET_CHIP_VER(priv)==VERSION_8881A) && pstat && (pstat->IOTPeer == HT_IOT_PEER_HTC))\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, 0x642b);\r
+                                       else {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                                       be_edca = (txop << 16) | (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time);\r
+                               #else\r
+                                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |\r
+                                               (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));\r
+#endif\r
+                                       }\r
+                               }\r
+                               #endif\r
+                       }\r
+               }\r
+              else \r
+              {\r
+ #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                        be_edca = (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);\r
+#else\r
+                        ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));\r
+#endif\r
+ #else\r
+               #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8197DL) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time);\r
+ #else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));\r
+#endif\r
+               #else\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);\r
+               #else\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM,  (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));\r
+               #endif\r
+               #endif\r
+/*             \r
+               if (priv->pshare->txop_enlarge == 0xe) {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       disable_cfe = 0;\r
+#endif\r
+       #ifdef CONFIG_PCI_HCI\r
+                       ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE));\r
+       #endif\r
+               } else {\r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+                       disable_cfe = 1;\r
+#endif\r
+       #ifdef CONFIG_PCI_HCI\r
+                       ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));\r
+       #endif\r
+               }\r
+*/                     \r
+ #endif\r
+              }\r
+\r
+       }\r
+       \r
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
+       notify_IOT_EDCA_switch(priv, be_edca, vi_edca, disable_cfe);\r
+#endif\r
+}\r
+#endif\r
+\r
+VOID \r
+odm_IotEngine(\r
+       IN      PVOID           pDM_VOID\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       struct rtl8192cd_priv *priv=pDM_Odm->priv;\r
+       PSTA_INFO_T pstat = NULL;\r
+       u4Byte i;\r
+       \r
+#ifdef WIFI_WMM\r
+       unsigned int switch_turbo = 0, avg_tp;\r
+#endif \r
+////////////////////////////////////////////////////////\r
+//  if EDCA Turbo function is not supported or Manual EDCA Setting\r
+//  then return\r
+////////////////////////////////////////////////////////\r
+       if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));\r
+               return;\r
+       }\r
+       \r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))\r
+       if(priv->pmib->dot11QosEntry.ManualEDCA){\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));\r
+               return ;\r
+       }\r
+#endif \r
+\r
+#if !(DM_ODM_SUPPORT_TYPE &ODM_AP)\r
+ //////////////////////////////////////////////////////\r
+ //find high TP STA every 2s\r
+//////////////////////////////////////////////////////\r
+       if ((GET_ROOT(priv)->up_time % 2) == 0) \r
+               priv->pshare->highTP_found_pstat==NULL;\r
+\r
+#if 0\r
+       phead = &priv->asoc_list;\r
+       plist = phead->next;\r
+       while(plist != phead)   {\r
+               pstat = list_entry(plist, struct stat_info, asoc_list);\r
+\r
+               if(ODM_ChooseIotMainSTA(pDM_Odm, pstat));              //find the correct station\r
+                       break;\r
+               if (plist == plist->next)                                          //the last plist \r
+                       break;\r
+               plist = plist->next;\r
+       };\r
+#endif\r
+\r
+       //find highTP STA\r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
+               pstat = pDM_Odm->pODM_StaInfo[i];\r
+               if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat)))        //find the correct station\r
+                               break;\r
+       }\r
+\r
+ //////////////////////////////////////////////////////\r
+ //if highTP STA is not found, then return\r
+ //////////////////////////////////////////////////////\r
+       if(priv->pshare->highTP_found_pstat==NULL)      {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));\r
+               return;\r
+       }\r
+#endif\r
+\r
+       pstat=priv->pshare->highTP_found_pstat;\r
+       if(pstat) {\r
+               if((pstat->tx_avarage + pstat->rx_avarage) < (1<<17))   // 1M bps\r
+                       pstat = NULL;\r
+       }\r
+\r
+#ifdef WIFI_WMM\r
+       if (QOS_ENABLE) {\r
+               if (!priv->pmib->dot11OperationEntry.wifi_specific \r
+               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+                       ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+               #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+                       || (priv->pmib->dot11OperationEntry.wifi_specific == 2)\r
+               #endif\r
+                       ) {\r
+                       if (priv->pshare->iot_mode_enable &&\r
+                               ((priv->pshare->phw->VO_pkt_count > 50) ||\r
+                                (priv->pshare->phw->VI_pkt_count > 50) ||\r
+                                (priv->pshare->phw->BK_pkt_count > 50))) {\r
+                               priv->pshare->iot_mode_enable = 0;\r
+                               switch_turbo++;\r
+#ifdef CONFIG_WLAN_HAL_8881A\r
+                               if (GET_CHIP_VER(priv) == VERSION_8881A) {\r
+                                       RTL_W32(0x460, 0x03086666);\r
+                               }\r
+#endif //CONFIG_WLAN_HAL_8881A\r
+                       } else if ((!priv->pshare->iot_mode_enable) &&\r
+                               ((priv->pshare->phw->VO_pkt_count < 50) &&\r
+                                (priv->pshare->phw->VI_pkt_count < 50) &&\r
+                                (priv->pshare->phw->BK_pkt_count < 50))) {\r
+                               priv->pshare->iot_mode_enable++;\r
+                               switch_turbo++;\r
+//#ifdef CONFIG_WLAN_HAL_8881A\r
+#if 0\r
+                               if (GET_CHIP_VER(priv) == VERSION_8881A) {\r
+                                       if (get_bonding_type_8881A()==BOND_8881AB) {\r
+                                               RTL_W32(0x460, 0x03086666);\r
+                                       }\r
+                                       else {\r
+                                               RTL_W32(0x460, 0x0320ffff);\r
+                                       }\r
+                               }\r
+#endif //CONFIG_WLAN_HAL_8881A\r
+                       }\r
+               }\r
+\r
+\r
+               #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)\r
+               #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+               if (priv->pmib->dot11OperationEntry.wifi_specific) \r
+               #endif\r
+               {\r
+                       if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {\r
+                               priv->pshare->iot_mode_VO_exist++;\r
+                               switch_turbo++;\r
+                       } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {\r
+                               priv->pshare->iot_mode_VO_exist = 0;\r
+                               switch_turbo++;\r
+                       }\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))\r
+                       if (priv->pshare->iot_mode_VO_exist) {\r
+                               //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);\r
+                               if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {\r
+                                       priv->pshare->iot_mode_BE_exist++;\r
+                                       switch_turbo++;\r
+                               } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {\r
+                                       priv->pshare->iot_mode_BE_exist = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_BEBK_PRI)))\r
+                       if (priv->pshare->phw->BE_pkt_count) {\r
+                               //printk("[%s %d] BK_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BK_pkt_count);\r
+                               if (!priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count > 250)) {\r
+                                       priv->pshare->iot_mode_BK_exist++;\r
+                                       switch_turbo++;\r
+                               } else if (priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count < 250)) {\r
+                                       priv->pshare->iot_mode_BK_exist = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+                       if (priv->pshare->rf_ft_var.wifi_beq_iot) \r
+                       {\r
+                               if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {\r
+                                       priv->pshare->iot_mode_VI_exist++;\r
+                                       switch_turbo++;\r
+                               } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {\r
+                                       priv->pshare->iot_mode_VI_exist = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+\r
+               }\r
+               else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {\r
+                  if (priv->pshare->txop_enlarge) {\r
+                          priv->pshare->txop_enlarge = 0;\r
+                          if (priv->pshare->iot_mode_enable)\r
+                                       switch_turbo++;\r
+                               }\r
+               }\r
+\r
+#if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))\r
+        if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))\r
+        {\r
+            if (priv->pshare->iot_mode_enable &&\r
+                (((priv->pshare->phw->VO_pkt_count > 50) ||\r
+                 (priv->pshare->phw->VI_pkt_count > 50) ||\r
+                 (priv->pshare->phw->BK_pkt_count > 50)) ||\r
+                 (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))\r
+            {\r
+                priv->pshare->iot_mode_enable = 0;\r
+                switch_turbo++;\r
+            }\r
+            else if ((!priv->pshare->iot_mode_enable) &&\r
+                (((priv->pshare->phw->VO_pkt_count < 50) &&\r
+                 (priv->pshare->phw->VI_pkt_count < 50) &&\r
+                 (priv->pshare->phw->BK_pkt_count < 50)) &&\r
+                 (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))\r
+            {\r
+                priv->pshare->iot_mode_enable++;\r
+                switch_turbo++;\r
+            }\r
+        }\r
+#endif\r
+\r
+               priv->pshare->phw->VO_pkt_count = 0;\r
+               priv->pshare->phw->VI_pkt_count = 0;\r
+               priv->pshare->phw->BK_pkt_count = 0;\r
+\r
+       #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))\r
+               priv->pshare->phw->BE_pkt_count = 0;\r
+       #endif\r
+               \r
+       #if(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               if (priv->pshare->rf_ft_var.wifi_beq_iot)\r
+                       priv->pshare->phw->VI_rx_pkt_count = 0;\r
+               #endif\r
+\r
+       }\r
+#endif\r
+\r
+       if ((priv->up_time % 2) == 0) {\r
+               /*\r
+                * decide EDCA content for different chip vendor\r
+                */\r
+#ifdef WIFI_WMM\r
+       #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)\r
+               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)\r
+       \r
+       #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)\r
+               if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || \r
+                       ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))\r
+               #ifdef CLIENT_MODE\r
+            || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))\r
+               #endif\r
+       #endif\r
+               ))\r
+       \r
+               {\r
+\r
+                       if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {\r
+#ifdef LOW_TP_TXOP\r
+                               if (pstat->IOTPeer==HT_IOT_PEER_INTEL)\r
+                               {\r
+                                       if (priv->pshare->txop_enlarge != 0xe)\r
+                                       {\r
+                                               priv->pshare->txop_enlarge = 0xe;\r
+\r
+                                               if (priv->pshare->iot_mode_enable)\r
+                                                       switch_turbo++;\r
+                                       }\r
+                               } \r
+                               else if (priv->pshare->txop_enlarge != 2) \r
+                               {\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       if (priv->pshare->iot_mode_enable)\r
+                                               switch_turbo++;\r
+                               }\r
+#else\r
+                               if (priv->pshare->txop_enlarge != 2)\r
+                               {\r
+                                       if (pstat->IOTPeer==HT_IOT_PEER_INTEL)\r
+                                               priv->pshare->txop_enlarge = 0xe;                                               \r
+                                       else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)\r
+                                               priv->pshare->txop_enlarge = 0xd;                                               \r
+                                       else if (pstat->IOTPeer==HT_IOT_PEER_HTC)\r
+                                               priv->pshare->txop_enlarge = 0;         \r
+                                       else\r
+                                               priv->pshare->txop_enlarge = 2;\r
+\r
+                                       if (priv->pshare->iot_mode_enable)\r
+                                               switch_turbo++;\r
+                               }\r
+#endif\r
+                       }\r
+                       else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) \r
+                       {\r
+                               if (priv->pshare->txop_enlarge) {\r
+                                       priv->pshare->txop_enlarge = 0;\r
+                                       if (priv->pshare->iot_mode_enable)\r
+                                               switch_turbo++;\r
+                               }\r
+                       }\r
+\r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))\r
+                       // for Intel IOT, need to enlarge CW MAX from 6 to 10\r
+                       if (pstat && pstat->IOTPeer==HT_IOT_PEER_INTEL && (((pstat->tx_avarage+pstat->rx_avarage)>>10) < \r
+                                       priv->pshare->rf_ft_var.cwmax_enhance_thd)) \r
+                       {\r
+                               if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)\r
+                               {\r
+                                       priv->pshare->BE_cwmax_enhance = 1;\r
+                                       switch_turbo++;\r
+                               }\r
+                       } else {\r
+                               if (priv->pshare->BE_cwmax_enhance) {\r
+                                       priv->pshare->BE_cwmax_enhance = 0;\r
+                                       switch_turbo++;\r
+                               }\r
+                       }\r
+#endif\r
+               }\r
+#endif\r
+               priv->pshare->current_tx_bytes = 0;\r
+               priv->pshare->current_rx_bytes = 0;\r
+       }else {\r
+               if ((GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8192E)|| (GET_CHIP_VER(priv) == VERSION_8188E) ){\r
+                       unsigned int uldl_tp = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes)>>17;\r
+                       if((uldl_tp > 40) && (priv->pshare->agg_to!= 1)) {\r
+                               RTL_W8(0x462, 0x08);\r
+                               priv->pshare->agg_to = 1;\r
+                       } else if((uldl_tp < 35) && (priv->pshare->agg_to !=0)) {\r
+                               RTL_W8(0x462, 0x02);\r
+                               priv->pshare->agg_to = 0;\r
+                       } \r
+               }\r
+       }\r
+       \r
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))\r
+       if(AMPDU_ENABLE) {\r
+#ifdef TX_EARLY_MODE\r
+               if (GET_TX_EARLY_MODE) {\r
+                       if (!GET_EM_SWQ_ENABLE &&\r
+                               ((priv->assoc_num > 1) ||\r
+                               (pstat && pstat->IOTPeer != HT_IOT_PEER_UNKNOWN))) {\r
+                               if ((priv->pshare->em_tx_byte_cnt >> 17) > EM_TP_UP_BOUND) \r
+                                       priv->pshare->reach_tx_limit_cnt++;                             \r
+                               else                                    \r
+                                       priv->pshare->reach_tx_limit_cnt = 0;   \r
+\r
+                               if (priv->pshare->txop_enlarge && priv->pshare->reach_tx_limit_cnt) { //>= WAIT_TP_TIME//\r
+                                       GET_EM_SWQ_ENABLE = 1;                  \r
+                                       priv->pshare->reach_tx_limit_cnt = 0;\r
+\r
+                                       if (pstat->IOTPeer == HT_IOT_PEER_INTEL)\r
+                                               MAX_EM_QUE_NUM = 12;\r
+                                       else if (pstat->IOTPeer == HT_IOT_PEER_RALINK)\r
+                                               MAX_EM_QUE_NUM = 10;\r
+                                       \r
+                                       enable_em(priv);                        \r
+                               }\r
+                       }\r
+                       else if (GET_EM_SWQ_ENABLE) {\r
+                               if ((priv->pshare->em_tx_byte_cnt >> 17) < EM_TP_LOW_BOUND)\r
+                                       priv->pshare->reach_tx_limit_cnt++;                             \r
+                               else                                    \r
+                                       priv->pshare->reach_tx_limit_cnt = 0;   \r
+\r
+                               if (!priv->pshare->txop_enlarge || priv->pshare->reach_tx_limit_cnt >= WAIT_TP_TIME) {\r
+                                       GET_EM_SWQ_ENABLE = 0;\r
+                                       priv->pshare->reach_tx_limit_cnt = 0;\r
+                                       disable_em(priv);\r
+                               }\r
+                       }\r
+               }\r
+#endif\r
+\r
+#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812) {        \r
+               if (priv->assoc_num > 9)\r
+       {\r
+               if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){\r
+                               if ((priv->swq_decision == 0)){\r
+                               switch_turbo++;\r
+                               if (priv->pshare->txop_enlarge == 0)\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       priv->swq_decision = 1;\r
+                               }\r
+                       else\r
+                       {\r
+                               if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))\r
+                               {\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       switch_turbo--;\r
+                               }\r
+                       }\r
+               }\r
+               else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){\r
+                               priv->swq_decision = 0;\r
+               }\r
+                       else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))        {\r
+                       priv->pshare->txop_enlarge = 2;\r
+                       switch_turbo--;\r
+               }\r
+               } else {\r
+                       priv->swq_decision = 0;\r
+    }\r
+       } else if(CONFIG_WLAN_NOT_HAL_EXIST)\r
+#endif\r
+               {       \r
+               if (priv->assoc_num > 1)\r
+       {\r
+               if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){\r
+                               if ((priv->swq_decision == 0)){\r
+                               switch_turbo++;\r
+                               if (priv->pshare->txop_enlarge == 0)\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       priv->swq_decision = 1;\r
+                               }\r
+                       else\r
+                       {\r
+                               if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))\r
+                               {\r
+                                       priv->pshare->txop_enlarge = 2;\r
+                                       switch_turbo--;\r
+                               }\r
+                       }\r
+               }\r
+               else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){\r
+                               priv->swq_decision = 0;\r
+               }\r
+                       else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))        {\r
+                       priv->pshare->txop_enlarge = 2;\r
+                       switch_turbo--;\r
+               }\r
+    }\r
+       //#if (defined CONFIG_RTL_819XD))\r
+               else if (priv->assoc_num == 1 && (priv->up_time % 2 == 0)\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE)\r
+                       && (!GET_TX_EARLY_MODE || !GET_EM_SWQ_ENABLE) \r
+#endif\r
+               ) {\r
+                       if ((pstat) && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3])) {\r
+                               //int en_thd = 14417920>>(priv->up_time % 2);\r
+                               avg_tp = (pstat->current_tx_bytes >> 17);\r
+\r
+                               //if ((priv->swq_decision == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) )  { //50Mbps\r
+                               if ((priv->swq_decision == 0) && (avg_tp  > TP_HIGH_WATER_MARK)) { //55Mbps\r
+                                       //printk("[%s:%d] swq_decision=1 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp);\r
+                                       priv->swq_decision = 1;\r
+                               }\r
+                               //else if ((priv->swq_decision == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps\r
+                               else if ((priv->swq_decision == 1) && (avg_tp < TP_LOW_WATER_MARK)) { //35Mbps\r
+                                       //printk("[%s:%d] swq_decision=0 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp);\r
+                                       priv->swq_decision = 0;\r
+                               }\r
+                       } else {\r
+                               priv->swq_decision = 0;\r
+            }\r
+            }\r
+        }\r
+               if( (priv->swq_decision == 1) \r
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE)            \r
+               || (GET_EM_SWQ_ENABLE == 1) \r
+#endif         \r
+               ) {\r
+                       priv->swq_en = 1;\r
+                       priv->swqen_keeptime = priv->up_time;\r
+               } else {\r
+            priv->swq_en = 0;\r
+                       priv->swqen_keeptime = 0;\r
+        }\r
+    }\r
+#endif\r
+\r
+#ifdef WIFI_WMM\r
+#ifdef LOW_TP_TXOP\r
+       if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))\r
+               && QOS_ENABLE) {\r
+               if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {\r
+                       unsigned int thd_tp;\r
+                       unsigned char under_thd;\r
+                       unsigned int curr_tp;\r
+\r
+                       if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))\r
+                       {\r
+                               // Determine the upper bound throughput threshold.\r
+                               if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {\r
+                                       if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)\r
+                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;\r
+                                       else\r
+                                               thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;\r
+                               }\r
+                               else\r
+                                       thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;\r
+\r
+                               // Determine to close txop.\r
+#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\r
+                               if(IS_STA_VALID(pstat)) \r
+                               {       \r
+                                       struct rtl8192cd_priv *tmppriv;\r
+                                       struct aid_obj *aidarray;       \r
+                                       aidarray = container_of(pstat, struct aid_obj, station);\r
+                                       tmppriv = aidarray->priv;\r
+\r
+                                       curr_tp = (unsigned int)(tmppriv->ext_stats.tx_avarage>>17) + (unsigned int)(tmppriv->ext_stats.rx_avarage>>17);\r
+                               } \r
+                               else \r
+#endif\r
+                               curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);\r
+                               if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)\r
+                                       under_thd = 1;\r
+                               else\r
+                                       under_thd = 0;\r
+                       }\r
+                       else\r
+                       {\r
+                               under_thd = 0;\r
+                       }\r
+\r
+                       if (switch_turbo) \r
+                       {\r
+                               priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;\r
+                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;\r
+                       }\r
+                       else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {\r
+                               priv->pshare->rf_ft_var.low_tp_txop_count++;\r
+                               if (priv->pshare->rf_ft_var.low_tp_txop_close) {\r
+                                       priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;\r
+                               }\r
+                               if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay) \r
+\r
+                               {                                       \r
+                                       priv->pshare->rf_ft_var.low_tp_txop_count = 0;\r
+                                       priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;\r
+                                       switch_turbo++;\r
+                               }\r
+                       } \r
+                       else \r
+                       {\r
+                               priv->pshare->rf_ft_var.low_tp_txop_count = 0;\r
+                       }\r
+               }\r
+       }\r
+#endif         \r
+\r
+#ifdef WMM_DSCP_C42\r
+       if (switch_turbo) {\r
+               if (!priv->pshare->iot_mode_enable && !priv->pshare->aggrmax_change) {\r
+                       RTL_W16(0x4ca, 0x0404);\r
+                       priv->pshare->aggrmax_change = 1;\r
+               }\r
+               else if (priv->pshare->iot_mode_enable && priv->pshare->aggrmax_change) {\r
+                       RTL_W16(0x4ca, priv->pshare->aggrmax_bak);\r
+                       priv->pshare->aggrmax_change = 0;\r
+               }\r
+       } \r
+#endif\r
+#ifdef TX_EARLY_MODE\r
+               unsigned int em_tp = ((priv->ext_stats.tx_avarage>>17) + (priv->ext_stats.rx_avarage>>17));\r
+               if (em_tp > 80)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (4 << 12) | (3 << 8) | 0x19);\r
+               else //if (em_tp < 75)\r
+                       ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (6 << 12) | (5 << 8) | 0x2b);\r
+#endif\r
+       if (switch_turbo)\r
+               ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );\r
+#endif\r
+}\r
+#endif\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_EdcaTurboCheck.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_EdcaTurboCheck.h
new file mode 100755 (executable)
index 0000000..8fba8a2
--- /dev/null
@@ -0,0 +1,150 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODMEDCATURBOCHECK_H__\r
+#define    __ODMEDCATURBOCHECK_H__\r
+\r
+typedef struct _EDCA_TURBO_\r
+{\r
+       BOOLEAN bCurrentTurboEDCA;\r
+       BOOLEAN bIsCurRDLState;\r
+\r
+       #if(DM_ODM_SUPPORT_TYPE == ODM_CE       )\r
+       u4Byte  prv_traffic_idx; // edca turbo\r
+       #endif\r
+\r
+}EDCA_T,*pEDCA_T;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] = \r
+// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU        MARVELL     92U_AP          SELF_AP(DownLink/Tx)\r
+{ 0x5e4322,            0xa44f,                 0x5e4322,               0x5ea32b,               0x5ea422,       0x5ea322,       0x3ea430,       0x5ea42b, 0x5ea44f,     0x5e4322,       0x5e4322};\r
+\r
+\r
+static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] = \r
+// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP(UpLink/Rx)\r
+{ 0xa44f,              0x5ea44f,       0x5e4322,               0x5ea42b,               0xa44f,                 0xa630,                 0x5ea630,       0x5ea42b, 0xa44f,               0xa42b,         0xa42b};\r
+\r
+static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] = \r
+// UNKNOWN             REALTEK_90      REALTEK_92SE    BROADCOM                RALINK          ATHEROS         CISCO           MERU,       MARVELL     92U_AP          SELF_AP\r
+{ 0x4322,              0xa44f,                 0x5e4322,               0xa42b,                         0x5e4322,       0x4322,                 0xa42b,         0x5ea42b, 0xa44f,               0x5e4322,       0x5ea42b};\r
+\r
+\r
+//============================================================\r
+// EDCA Paramter for AP/ADSL   by Mingzhi 2011-11-22\r
+//============================================================\r
+#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)\r
+enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };\r
+\r
+static const struct ParaRecord rtl_ap_EDCA[] =\r
+{\r
+//ACM,AIFSN, ECWmin, ECWmax, TXOplimit\r
+     {0,     7,      4,      10,     0},            //BK\r
+     {0,     3,      4,      6,      0},             //BE\r
+     {0,     1,      3,      4,      188},         //VI\r
+     {0,     1,      2,      3,      102},         //VO\r
+     {0,     1,      3,      4,      94},          //VI_AG\r
+     {0,     1,      2,      3,      47},          //VO_AG\r
+};\r
+\r
+static const struct ParaRecord rtl_sta_EDCA[] =\r
+{\r
+//ACM,AIFSN, ECWmin, ECWmax, TXOplimit\r
+     {0,     7,      4,      10,     0},\r
+     {0,     3,      4,      10,     0},\r
+     {0,     2,      3,      4,      188},\r
+     {0,     2,      2,      3,      102},\r
+     {0,     2,      3,      4,      94},\r
+     {0,     2,      2,      3,      47},\r
+};\r
+#endif\r
+\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+#ifdef WIFI_WMM\r
+VOID\r
+ODM_IotEdcaSwitch(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN      unsigned char           enable\r
+       );\r
+#endif\r
+\r
+BOOLEAN\r
+ODM_ChooseIotMainSTA(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN      PSTA_INFO_T             pstat\r
+       );\r
+#endif\r
+\r
+VOID\r
+odm_EdcaTurboCheck(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+VOID\r
+ODM_EdcaTurboInit(\r
+       IN      PVOID           pDM_VOID\r
+);\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+VOID\r
+odm_EdcaTurboCheckMP(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+\r
+//check if edca turbo is disabled\r
+BOOLEAN\r
+odm_IsEdcaTurboDisable(\r
+       IN      PVOID           pDM_VOID\r
+);\r
+//choose edca paramter for special IOT case\r
+VOID \r
+ODM_EdcaParaSelByIot(\r
+       IN              PVOID                                   pDM_VOID,\r
+       OUT     u4Byte          *EDCA_BE_UL,\r
+       OUT u4Byte              *EDCA_BE_DL\r
+       );\r
+//check if it is UL or DL\r
+VOID\r
+odm_EdcaChooseTrafficIdx( \r
+       IN      PVOID           pDM_VOID,\r
+       IN      u8Byte                          cur_tx_bytes,  \r
+       IN      u8Byte                          cur_rx_bytes, \r
+       IN      BOOLEAN                 bBiasOnRx,\r
+       OUT BOOLEAN             *pbIsCurRDLState\r
+       );\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+VOID\r
+odm_EdcaTurboCheckCE(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+#else\r
+VOID \r
+odm_IotEngine(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+\r
+VOID\r
+odm_EdcaParaInit(\r
+       IN      PVOID           pDM_VOID\r
+       );\r
+#endif\r
+\r
+#endif\r
index 2b6920b767a42de587c58ba931f6d32fba7ec7f9..b37efd10f455a6a845e7f36b8fc0a905c41d1275 100755 (executable)
                                                \r
 #define GET_VERSION_MP(ic, txt)                (ODM_GetVersion_MP_##ic##txt())\r
 #define GET_VERSION_TC(ic, txt)                (ODM_GetVersion_TC_##ic##txt())\r
-       \r
-#define GET_VERSION(ic, txt) do {\\r
-                                                       if (pDM_Odm->bIsMPChip)\\r
-                                                               GET_VERSION_MP(ic,txt);\\r
-                                                       else\\r
-                                                               GET_VERSION_TC(ic,txt);\\r
-                                               } while(0)\r
+#define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic,txt):GET_VERSION_TC(ic,txt))\r
 \r
 \r
 u1Byte\r
@@ -682,60 +676,60 @@ odm_RxPhyStatus92CSeries_Parsing(
                        VGA_idx = (cck_agc_rpt & 0x1F); \r
                        if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E))\r
                        {\r
-                       switch(LNA_idx)\r
-                       {\r
-                               case 7:\r
-                                       if(VGA_idx <= 27)\r
-                                               rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2\r
-                                       else\r
-                                               rx_pwr_all = -100;\r
-                                       break;\r
-                               case 6:\r
-                                               rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0\r
-                                       break;\r
-                               case 5:\r
-                                               rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5\r
-                                       break;\r
-                               case 4:\r
-                                               rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4\r
-                                       break;\r
-                               case 3:\r
-                                               //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
-                                               rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
-                                       break;\r
-                               case 2:\r
-                                       if(cck_highpwr)\r
-                                               rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0\r
-                                       else\r
-                                               rx_pwr_all = -6+ 2*(5-VGA_idx);\r
-                                       break;\r
-                               case 1:\r
-                                               rx_pwr_all = 8-2*VGA_idx;\r
-                                       break;\r
-                               case 0:\r
-                                               rx_pwr_all = 14-2*VGA_idx;\r
-                                       break;\r
-                               default:\r
-                                       //DbgPrint("CCK Exception default\n");\r
-                                       break;\r
-                       }\r
-                       rx_pwr_all += 6;\r
+                               switch(LNA_idx)\r
+                               {\r
+                                       case 7:\r
+                                               if(VGA_idx <= 27)\r
+                                                       rx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2\r
+                                               else\r
+                                                       rx_pwr_all = -100;\r
+                                               break;\r
+                                       case 6:\r
+                                                       rx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0\r
+                                               break;\r
+                                       case 5:\r
+                                                       rx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5\r
+                                               break;\r
+                                       case 4:\r
+                                                       rx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4\r
+                                               break;\r
+                                       case 3:\r
+                                                       //rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
+                                                       rx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0\r
+                                               break;\r
+                                       case 2:\r
+                                               if(cck_highpwr)\r
+                                                       rx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0\r
+                                               else\r
+                                                       rx_pwr_all = -6+ 2*(5-VGA_idx);\r
+                                               break;\r
+                                       case 1:\r
+                                                       rx_pwr_all = 8-2*VGA_idx;\r
+                                               break;\r
+                                       case 0:\r
+                                                       rx_pwr_all = 14-2*VGA_idx;\r
+                                               break;\r
+                                       default:\r
+                                               //DbgPrint("CCK Exception default\n");\r
+                                               break;\r
+                               }\r
+                               rx_pwr_all += 6;\r
 \r
-                       //2012.10.08 LukeLee: Modify for 92E CCK RSSI\r
-                       if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
-                               rx_pwr_all += 10;\r
-                       \r
-                       PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
-                       if(cck_highpwr == FALSE)\r
-                       {\r
-                               if(PWDB_ALL >= 80)\r
-                                       PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80;\r
-                               else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20))\r
-                                       PWDB_ALL += 3;\r
-                               if(PWDB_ALL>100)\r
-                                       PWDB_ALL = 100;\r
+                               //2012.10.08 LukeLee: Modify for 92E CCK RSSI\r
+                               if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+                                       rx_pwr_all += 10;\r
+                               \r
+                               PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\r
+                               if(cck_highpwr == FALSE)\r
+                               {\r
+                                       if(PWDB_ALL >= 80)\r
+                                               PWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80;\r
+                                       else if((PWDB_ALL <= 78) && (PWDB_ALL >= 20))\r
+                                               PWDB_ALL += 3;\r
+                                       if(PWDB_ALL>100)\r
+                                               PWDB_ALL = 100;\r
+                               }\r
                        }\r
-               }\r
                        else if(pDM_Odm->SupportICType & (ODM_RTL8723B))\r
                        {\r
 #if (RTL8723B_SUPPORT == 1)                    \r
@@ -832,7 +826,7 @@ odm_RxPhyStatus92CSeries_Parsing(
                //\r
                // (3) Get Signal Quality (EVM)\r
                //\r
-               if(pPktinfo->bPacketMatchBSSID)\r
+               //if(pPktinfo->bPacketMatchBSSID)\r
                {\r
                        u1Byte  SQ,SQ_rpt;                      \r
                        \r
@@ -917,7 +911,7 @@ odm_RxPhyStatus92CSeries_Parsing(
                #endif\r
                \r
                        /* Record Signal Strength for next packet */\r
-                       if(pPktinfo->bPacketMatchBSSID)\r
+                       //if(pPktinfo->bPacketMatchBSSID)\r
                        {                               \r
                                if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
                                        (pDM_Odm->PatchID==RT_CID_819x_Lenovo))\r
@@ -976,7 +970,7 @@ odm_RxPhyStatus92CSeries_Parsing(
                                //RT_DISP(FRX, RX_PHY_SQ, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", \r
                                //GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], "%", EVM));\r
                                \r
-                               if(pPktinfo->bPacketMatchBSSID)\r
+                               //if(pPktinfo->bPacketMatchBSSID)\r
                                {\r
                                        if(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only\r
                                        {                                               \r
@@ -987,29 +981,7 @@ odm_RxPhyStatus92CSeries_Parsing(
                        }\r
                }\r
 \r
-               //2 For dynamic ATC switch\r
-               if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC)\r
-               {\r
-                       if(pPktinfo->bPacketMatchBSSID && ( *(pDM_Odm->mp_mode) == 0))\r
-                       {\r
-                               // TODO:\r
-                               \r
-                               //3 Update CFO report for path-A & path-B\r
-                                for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \r
-                               {\r
-                                       pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->path_cfotail[i];\r
-                               }\r
-\r
-                               //3 Update packet counter\r
-                               if(pDM_Odm->packetCount == 0xffffffff)\r
-                                       pDM_Odm->packetCount = 0;\r
-                               else\r
-                                       pDM_Odm->packetCount++;\r
-                               \r
-                               //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, \r
-                                       //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1]));\r
-                       }\r
-               }\r
+               ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->path_cfotail);\r
                \r
        }\r
 #if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\r
@@ -1020,8 +992,12 @@ odm_RxPhyStatus92CSeries_Parsing(
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
                // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/   \r
                pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL;\r
+#else\r
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING\r
+               pPhyInfo->SignalStrength = (u1Byte)PWDB_ALL;\r
 #else\r
                pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL;\r
+#endif\r
 #endif\r
        }\r
        else\r
@@ -1031,8 +1007,13 @@ odm_RxPhyStatus92CSeries_Parsing(
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
                        // 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/   \r
                        pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL;\r
+#else\r
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING\r
+                       total_rssi/=rf_rx_num;\r
+                       pPhyInfo->SignalStrength = (u1Byte)total_rssi;\r
 #else\r
                        pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num));\r
+#endif\r
 #endif\r
                }\r
        }\r
@@ -1214,7 +1195,7 @@ odm_RxPhyStatusJaguarSeries_Parsing(
                //\r
                // (3) Get Signal Quality (EVM)\r
                //\r
-               if(pPktinfo->bPacketMatchBSSID)\r
+               //if(pPktinfo->bPacketMatchBSSID)\r
                {\r
                        u1Byte  SQ,SQ_rpt;                      \r
                        \r
@@ -1293,7 +1274,7 @@ odm_RxPhyStatusJaguarSeries_Parsing(
                        pPhyInfo->Cfo_tail[i] = odm_Cfo( (pPhyStaRpt->cfotail[i]) );\r
 \r
                        /* Record Signal Strength for next packet */\r
-                       if(pPktinfo->bPacketMatchBSSID)\r
+                       //if(pPktinfo->bPacketMatchBSSID)\r
                        {                               \r
                                if((pDM_Odm->SupportPlatform == ODM_WIN) &&\r
                                        (pDM_Odm->PatchID==RT_CID_819x_Lenovo))\r
@@ -1347,7 +1328,7 @@ odm_RxPhyStatusJaguarSeries_Parsing(
                        else\r
                                Max_spatial_stream = 1; \r
 \r
-                       if(pPktinfo->bPacketMatchBSSID)\r
+                       //if(pPktinfo->bPacketMatchBSSID)\r
                        {\r
                                //DbgPrint("pPktinfo->DataRate = %d\n", pPktinfo->DataRate);\r
 \r
@@ -1398,27 +1379,9 @@ odm_RxPhyStatusJaguarSeries_Parsing(
                                }\r
                        }\r
                }\r
-               //2 For dynamic ATC switch\r
-               if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC)\r
-               {\r
-                       if(pPktinfo->bPacketMatchBSSID && ( *(pDM_Odm->mp_mode) == 0) )\r
-                       {\r
-                               //3 Update CFO report for path-A & path-B\r
-                                for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \r
-                               {\r
-                                       pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->cfotail[i];\r
-                               }\r
 \r
-                               //3 Update packet counter\r
-                               if(pDM_Odm->packetCount == 0xffffffff)\r
-                                       pDM_Odm->packetCount = 0;\r
-                               else\r
-                                       pDM_Odm->packetCount++;\r
-                               \r
-                               //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, \r
-                                       //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1]));\r
-                       }\r
-               }\r
+               ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->cfotail);\r
+               \r
        }\r
        //DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num);\r
        \r
@@ -1620,7 +1583,7 @@ odm_Process_RSSIForDM(
                {\r
                        RSSI_Ave = pPhyInfo->RxPWDBAll;\r
                        pDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll;\r
-                       pDM_Odm->RSSI_B = 0xFF;\r
+                       pDM_Odm->RSSI_B = 0;\r
 \r
                        //1 Process CCK RSSI\r
                        if(UndecoratedSmoothedCCK <= 0) // initialize\r
@@ -1812,7 +1775,7 @@ ODM_ConfigRFWithHeaderFile(
        {\r
                if(ConfigType == CONFIG_RF_RADIO) {\r
                        if(eRFPath == ODM_RF_PATH_A)\r
-                               READ_AND_CONFIG_MP(8723A,_RadioA_1T);\r
+                               READ_AND_CONFIG_MP(8723A,_RadioA);\r
                }\r
        }\r
 #endif\r
@@ -1821,15 +1784,11 @@ ODM_ConfigRFWithHeaderFile(
        if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
        {\r
                if(ConfigType == CONFIG_RF_RADIO) {\r
-                       if(eRFPath == ODM_RF_PATH_A){\r
-                               if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                                       READ_AND_CONFIG(8188E,_RadioA_1T_ICUT);\r
-                               else\r
-                                       READ_AND_CONFIG(8188E,_RadioA_1T);\r
-                               }\r
+                       if(eRFPath == ODM_RF_PATH_A)\r
+                                       READ_AND_CONFIG_MP(8188E,_RadioA);\r
                }\r
                else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
-                       READ_AND_CONFIG(8188E,_TXPWR_LMT);\r
+                       READ_AND_CONFIG_MP(8188E,_TXPWR_LMT);\r
                }\r
        }\r
 #endif\r
@@ -1859,18 +1818,18 @@ ODM_ConfigRFWithHeaderFile(
                if(ConfigType == CONFIG_RF_RADIO) {\r
                        if(eRFPath == ODM_RF_PATH_A)\r
                        {\r
-                               READ_AND_CONFIG(8821A,_RadioA);\r
+                               READ_AND_CONFIG_MP(8821A,_RadioA);\r
                        }\r
                }\r
                else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
                        \r
                        if (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\r
                                if (pDM_Odm->ExtPA5G || pDM_Odm->ExtLNA5G)\r
-                                       READ_AND_CONFIG(8821A,_TXPWR_LMT_8811AU_FEM);\r
+                                       READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_FEM);\r
                                else\r
-                                       READ_AND_CONFIG(8821A,_TXPWR_LMT_8811AU_IPA);                           \r
+                                       READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_IPA);                                \r
                        } else {\r
-                               READ_AND_CONFIG(8821A,_TXPWR_LMT_8821A);                        \r
+                               READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A);                     \r
                        }\r
                }\r
                ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n"));\r
@@ -1894,18 +1853,18 @@ ODM_ConfigRFWithHeaderFile(
        {\r
                if(ConfigType == CONFIG_RF_RADIO) {\r
                        if(eRFPath == ODM_RF_PATH_A)\r
-                               READ_AND_CONFIG(8192E,_RadioA);\r
+                               READ_AND_CONFIG_MP(8192E,_RadioA);\r
                        else if(eRFPath == ODM_RF_PATH_B)\r
-                               READ_AND_CONFIG(8192E,_RadioB);\r
+                               READ_AND_CONFIG_MP(8192E,_RadioB);\r
                }\r
                else if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
-                       READ_AND_CONFIG(8192E,_TXPWR_LMT);\r
+                       READ_AND_CONFIG_MP(8192E,_TXPWR_LMT);\r
                }\r
        }\r
 #endif\r
 \r
-#if (RTL8813A_SUPPORT == 1)\r
-       if (pDM_Odm->SupportICType == ODM_RTL8813A)\r
+#if (RTL8814A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
        {\r
                /*\r
                if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
@@ -1936,11 +1895,11 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile(
        else if(pDM_Odm->SupportICType == ODM_RTL8821)\r
        {\r
                if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
-                       READ_AND_CONFIG(8821A,_TxPowerTrack_PCIE);\r
+                       READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);\r
                else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(8821A,_TxPowerTrack_USB);\r
+                       READ_AND_CONFIG_MP(8821A,_TxPowerTrack_USB);\r
                else\r
-                       READ_AND_CONFIG(8821A,_TxPowerTrack_PCIE);\r
+                       READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);\r
        }\r
 #endif\r
 #if (RTL8812A_SUPPORT == 1)\r
@@ -1961,9 +1920,9 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile(
        else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
        {\r
                if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
-                       READ_AND_CONFIG(8192E,_TxPowerTrack_PCIE);\r
+                       READ_AND_CONFIG_MP(8192E,_TxPowerTrack_PCIE);\r
                else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(8192E,_TxPowerTrack_USB); \r
+                       READ_AND_CONFIG_MP(8192E,_TxPowerTrack_USB); \r
        }\r
 #endif\r
 #if RTL8723B_SUPPORT   \r
@@ -1981,9 +1940,11 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile(
        else if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
        {\r
                if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\r
-                       READ_AND_CONFIG(8188E,_TxPowerTrack_PCIE);\r
+                       READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);\r
                else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\r
-                       READ_AND_CONFIG(8188E,_TxPowerTrack_USB);\r
+                       READ_AND_CONFIG_MP(8188E,_TxPowerTrack_USB);\r
+               else\r
+                       READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);\r
        }\r
 #endif\r
 \r
@@ -2014,11 +1975,11 @@ ODM_ConfigBBWithHeaderFile(
        {\r
                if(ConfigType == CONFIG_BB_PHY_REG)\r
                {\r
-                       READ_AND_CONFIG_MP(8723A,_PHY_REG_1T);\r
+                       READ_AND_CONFIG_MP(8723A,_PHY_REG);\r
                }\r
                else if(ConfigType == CONFIG_BB_AGC_TAB)\r
                {\r
-                       READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T);\r
+                       READ_AND_CONFIG_MP(8723A,_AGC_TAB);\r
                }\r
        }               \r
 #endif\r
@@ -2028,21 +1989,15 @@ ODM_ConfigBBWithHeaderFile(
        {\r
                if(ConfigType == CONFIG_BB_PHY_REG)\r
                {\r
-                       if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                               READ_AND_CONFIG(8188E,_PHY_REG_1T_ICUT);\r
-                       else\r
-                               READ_AND_CONFIG(8188E,_PHY_REG_1T);\r
+                               READ_AND_CONFIG_MP(8188E,_PHY_REG);\r
                }\r
                else if(ConfigType == CONFIG_BB_AGC_TAB)\r
                {\r
-                       if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                               READ_AND_CONFIG(8188E,_AGC_TAB_1T_ICUT);\r
-                       else\r
-                               READ_AND_CONFIG(8188E,_AGC_TAB_1T);\r
+                               READ_AND_CONFIG_MP(8188E,_AGC_TAB);\r
                }\r
                else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
                {\r
-                       READ_AND_CONFIG(8188E,_PHY_REG_PG);\r
+                       READ_AND_CONFIG_MP(8188E,_PHY_REG_PG);\r
                }\r
        }\r
 #endif\r
@@ -2088,15 +2043,15 @@ ODM_ConfigBBWithHeaderFile(
        {\r
                if(ConfigType == CONFIG_BB_PHY_REG)\r
                {\r
-                       READ_AND_CONFIG(8821A,_PHY_REG);\r
+                       READ_AND_CONFIG_MP(8821A,_PHY_REG);\r
                }\r
                else if(ConfigType == CONFIG_BB_AGC_TAB)\r
                {\r
-                       READ_AND_CONFIG(8821A,_AGC_TAB);\r
+                       READ_AND_CONFIG_MP(8821A,_AGC_TAB);\r
                }\r
                else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
                {\r
-                       READ_AND_CONFIG(8821A,_PHY_REG_PG);\r
+                       READ_AND_CONFIG_MP(8821A,_PHY_REG_PG);\r
                }\r
        }\r
 #endif\r
@@ -2124,20 +2079,20 @@ ODM_ConfigBBWithHeaderFile(
 \r
                if(ConfigType == CONFIG_BB_PHY_REG)\r
                {\r
-                       READ_AND_CONFIG(8192E,_PHY_REG);\r
+                       READ_AND_CONFIG_MP(8192E,_PHY_REG);\r
                }\r
                else if(ConfigType == CONFIG_BB_AGC_TAB)\r
                {\r
-                       READ_AND_CONFIG(8192E,_AGC_TAB);\r
+                       READ_AND_CONFIG_MP(8192E,_AGC_TAB);\r
                }\r
                else if(ConfigType == CONFIG_BB_PHY_REG_PG)\r
                {\r
-                       READ_AND_CONFIG(8192E,_PHY_REG_PG);\r
+                       READ_AND_CONFIG_MP(8192E,_PHY_REG_PG);\r
                }\r
        }\r
 #endif\r
-#if (RTL8813A_SUPPORT == 1)\r
-    if(pDM_Odm->SupportICType == ODM_RTL8813A)\r
+#if (RTL8814A_SUPPORT == 1)\r
+    if(pDM_Odm->SupportICType == ODM_RTL8814A)\r
        {\r
 \r
                if(ConfigType == CONFIG_BB_PHY_REG)\r
@@ -2182,10 +2137,7 @@ ODM_ConfigMACWithHeaderFile(
 #if (RTL8188E_SUPPORT == 1)  \r
        if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
        {\r
-               if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))\r
-                       result = READ_AND_CONFIG(8188E,_MAC_REG_ICUT);\r
-               else\r
-                       result = READ_AND_CONFIG(8188E,_MAC_REG);\r
+               READ_AND_CONFIG_MP(8188E,_MAC_REG);\r
        }\r
 #endif\r
 #if (RTL8812A_SUPPORT == 1)\r
@@ -2197,7 +2149,7 @@ ODM_ConfigMACWithHeaderFile(
 #if (RTL8821A_SUPPORT == 1)\r
        if (pDM_Odm->SupportICType == ODM_RTL8821)\r
        {\r
-               READ_AND_CONFIG(8821A,_MAC_REG);\r
+               READ_AND_CONFIG_MP(8821A,_MAC_REG);\r
 \r
                ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n"));\r
        }\r
@@ -2211,7 +2163,7 @@ ODM_ConfigMACWithHeaderFile(
 #if (RTL8192E_SUPPORT == 1)  \r
        if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
        {\r
-               READ_AND_CONFIG(8192E,_MAC_REG);\r
+               READ_AND_CONFIG_MP(8192E,_MAC_REG);\r
        }\r
 #endif\r
 \r
@@ -2232,19 +2184,19 @@ ODM_ConfigFWWithHeaderFile(
        {\r
                if (ConfigType == CONFIG_FW_NIC)\r
                {\r
-                       READ_FIRMWARE(8188E,_FW_NIC_T);\r
+                       READ_FIRMWARE_MP(8188E,_FW_NIC_T);\r
                }\r
                else if (ConfigType == CONFIG_FW_WoWLAN)\r
                {\r
-                       READ_FIRMWARE(8188E,_FW_WoWLAN_T);\r
+                       READ_FIRMWARE_MP(8188E,_FW_WoWLAN_T);\r
                }\r
                else if(ConfigType == CONFIG_FW_NIC_2)\r
                {\r
-                       READ_FIRMWARE(8188E,_FW_NIC_S);\r
+                       READ_FIRMWARE_MP(8188E,_FW_NIC_S);\r
                }\r
                else if (ConfigType == CONFIG_FW_WoWLAN_2)\r
                {\r
-                       READ_FIRMWARE(8188E,_FW_WoWLAN_S);\r
+                       READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S);\r
                }\r
        }\r
 #endif\r
@@ -2259,10 +2211,12 @@ ODM_ConfigFWWithHeaderFile(
                {\r
                        READ_FIRMWARE(8723B,_FW_WoWLAN);\r
                }\r
+#ifdef CONFIG_AP_WOWLAN\r
                else if (ConfigType == CONFIG_FW_AP_WoWLAN)\r
                {\r
                        READ_FIRMWARE(8723B,_FW_AP_WoWLAN);\r
                }\r
+#endif\r
                else if (ConfigType == CONFIG_FW_BT)\r
                {\r
                        READ_FIRMWARE_MP(8723B,_FW_BT);\r
@@ -2300,7 +2254,7 @@ ODM_ConfigFWWithHeaderFile(
                }\r
                else if (ConfigType == CONFIG_FW_WoWLAN)\r
                {\r
-                       READ_FIRMWARE(8821A,_FW_WoWLAN);\r
+                       READ_FIRMWARE_MP(8821A,_FW_WoWLAN);\r
                }\r
                else if (ConfigType == CONFIG_FW_BT)\r
                {\r
@@ -2313,12 +2267,19 @@ ODM_ConfigFWWithHeaderFile(
        {\r
                if (ConfigType == CONFIG_FW_NIC)\r
                {\r
-                       READ_FIRMWARE(8192E,_FW_NIC);\r
+                       READ_FIRMWARE_MP(8192E,_FW_NIC);\r
                }\r
                else if (ConfigType == CONFIG_FW_WoWLAN)\r
                {\r
-                       READ_FIRMWARE(8192E,_FW_WoWLAN);\r
+                       READ_FIRMWARE_MP(8192E,_FW_WoWLAN);\r
                }\r
+#ifdef CONFIG_AP_WOWLAN\r
+               else if (ConfigType == CONFIG_FW_AP_WoWLAN)\r
+               {\r
+                       READ_FIRMWARE_MP(8192E,_FW_AP_WoWLAN);\r
+               }\r
+#endif\r
+\r
        }\r
 #endif\r
        return HAL_STATUS_SUCCESS;    \r
@@ -2330,13 +2291,34 @@ ODM_GetHWImgVersion(
        IN      PDM_ODM_T       pDM_Odm\r
        )\r
 {\r
+    u4Byte  Version=0;\r
+\r
+#if (RTL8723A_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8723A)\r
+               Version = GET_VERSION_MP(8723A,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8188E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
+               Version = GET_VERSION_MP(8188E,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8821A_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
+               Version = GET_VERSION_MP(8821A,_MAC_REG);\r
+#endif\r
+\r
+#if (RTL8192E_SUPPORT == 1)  \r
+       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
+               Version = GET_VERSION_MP(8192E,_MAC_REG);\r
+#endif\r
 \r
 #if (RTL8812A_SUPPORT == 1)  \r
        if (pDM_Odm->SupportICType == ODM_RTL8812)\r
-               return GET_VERSION_MP(8812A,_MAC_REG);\r
+               Version = GET_VERSION_MP(8812A,_MAC_REG);\r
 #endif\r
 \r
-       return 0;\r
+       return Version;\r
 }\r
 \r
 \r
index 16a26f6da78011c0e31683ec3db2a2adc8f82088..da0e5fc1cfcec829cd620ceb0cef74824a0e531a 100755 (executable)
@@ -24,7 +24,7 @@
 \r
 \r
 /*--------------------------Define -------------------------------------------*/ \r
-#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
+//#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
 #define AGC_DIFF_CONFIG_MP(ic, band) (ODM_ReadAndConfig_MP_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_MP_##ic##_AGC_TAB_DIFF_##band, \\r
                                                                               sizeof(Array_MP_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte)))\r
 #define AGC_DIFF_CONFIG_TC(ic, band) (ODM_ReadAndConfig_TC_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_TC_##ic##_AGC_TAB_DIFF_##band, \\r
@@ -225,6 +225,12 @@ ODM_GetHWImgVersion(
        IN      PDM_ODM_T       pDM_Odm\r
        );\r
 \r
+s4Byte\r
+odm_SignalScaleMapping(        \r
+       IN OUT PDM_ODM_T pDM_Odm,\r
+       IN      s4Byte CurrSig \r
+       );\r
+\r
 #endif\r
 \r
 #endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_NoiseMonitor.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_NoiseMonitor.c
new file mode 100755 (executable)
index 0000000..cda06bd
--- /dev/null
@@ -0,0 +1,197 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+//#include "Mp_Precomp.h"\r
+#include "odm_precomp.h"\r
+\r
+//=================================================\r
+// This function is for inband noise test utility only\r
+// To obtain the inband noise level(dbm), do the following.\r
+// 1. disable DIG and Power Saving \r
+// 2. Set initial gain = 0x1a\r
+// 3. Stop updating idle time pwer report (for driver read)\r
+//     - 0x80c[25]\r
+//\r
+//=================================================\r
+\r
+#define Valid_Min                              -35\r
+#define Valid_Max                      10\r
+#define ValidCnt                               5       \r
+\r
+s2Byte odm_InbandNoise_Monitor_NSeries(PDM_ODM_T       pDM_Odm,u8 bPauseDIG,u8 IGIValue,u32 max_time)\r
+{\r
+       u4Byte                          tmp4b;  \r
+       u1Byte                          max_rf_path=0,rf_path;  \r
+       u1Byte                          reg_c50, reg_c58,valid_done=0;  \r
+       struct noise_level              noise_data;\r
+       u32 start  = 0,         func_start=0,   func_end = 0;\r
+\r
+       func_start = ODM_GetCurrentTime(pDM_Odm);\r
+       pDM_Odm->noise_level.noise_all = 0;\r
+       \r
+       if((pDM_Odm->RFType == ODM_1T2R) ||(pDM_Odm->RFType == ODM_2T2R))       \r
+               max_rf_path = 2;\r
+       else\r
+               max_rf_path = 1;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() ==> \n"));\r
+\r
+       ODM_Memory_Set(pDM_Odm,&noise_data,0,sizeof(struct noise_level));\r
+       \r
+       //\r
+       // Step 1. Disable DIG && Set initial gain.\r
+       //\r
+       \r
+       if(bPauseDIG)\r
+       {\r
+               odm_PauseDIG(pDM_Odm,ODM_PAUSE_DIG,IGIValue);\r
+       }\r
+       //\r
+       // Step 2. Disable all power save for read registers\r
+       //\r
+       //dcmd_DebugControlPowerSave(pAdapter, PSDisable);\r
+\r
+       //\r
+       // Step 3. Get noise power level\r
+       //\r
+       start = ODM_GetCurrentTime(pDM_Odm);\r
+       while(1)\r
+       {\r
+               \r
+               //Stop updating idle time pwer report (for driver read)\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 1);    \r
+               \r
+               //Read Noise Floor Report\r
+               tmp4b = ODM_GetBBReg(pDM_Odm, 0x8f8,bMaskDWord );\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Noise Floor Report (0x8f8) = 0x%08x\n", tmp4b));\r
+               \r
+               //ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, TestInitialGain);\r
+               //if(max_rf_path == 2)\r
+               //      ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, TestInitialGain);\r
+               \r
+               //update idle time pwer report per 5us\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 0);\r
+               \r
+               noise_data.value[ODM_RF_PATH_A] = (u1Byte)(tmp4b&0xff);         \r
+               noise_data.value[ODM_RF_PATH_B]  = (u1Byte)((tmp4b&0xff00)>>8);\r
+       \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("value_a = 0x%x(%d), value_b = 0x%x(%d)\n", \r
+                       noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_B], noise_data.value[ODM_RF_PATH_B]));\r
+\r
+                for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) \r
+                {\r
+                       noise_data.sval[rf_path] = (s1Byte)noise_data.value[rf_path];\r
+                       noise_data.sval[rf_path] /= 2;\r
+                }      \r
+                       \r
+               \r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("sval_a = %d, sval_b = %d\n", \r
+                       noise_data.sval[ODM_RF_PATH_A], noise_data.sval[ODM_RF_PATH_B]));\r
+               //ODM_delay_ms(10);\r
+               //ODM_sleep_ms(10);\r
+\r
+               for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) \r
+               {\r
+                       if( (noise_data.valid_cnt[rf_path] < ValidCnt) && (noise_data.sval[rf_path] < Valid_Max && noise_data.sval[rf_path] >= Valid_Min))\r
+                       {\r
+                               noise_data.valid_cnt[rf_path]++;\r
+                               noise_data.sum[rf_path] += noise_data.sval[rf_path];\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("RF_Path:%d Valid sval = %d\n", rf_path,noise_data.sval[rf_path]));\r
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Sum of sval = %d, \n", noise_data.sum[rf_path]));\r
+                               if(noise_data.valid_cnt[rf_path] == ValidCnt)\r
+                               {                               \r
+                                       valid_done++;\r
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("After divided, RF_Path:%d ,sum = %d \n", rf_path,noise_data.sum[rf_path]));\r
+                               }                               \r
+                       \r
+                       }\r
+                       \r
+               }\r
+\r
+               //printk("####### valid_done:%d #############\n",valid_done);\r
+               if ((valid_done==max_rf_path) || (ODM_GetProgressingTime(pDM_Odm,start) > max_time))\r
+               {\r
+                       for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++)\r
+                       { \r
+                               //printk("%s PATH_%d - sum = %d, valid_cnt = %d \n",__FUNCTION__,rf_path,noise_data.sum[rf_path], noise_data.valid_cnt[rf_path]);\r
+                               if(noise_data.valid_cnt[rf_path])\r
+                                       noise_data.sum[rf_path] /= noise_data.valid_cnt[rf_path];               \r
+                               else\r
+                                       noise_data.sum[rf_path]  = 0;\r
+                       }\r
+                       break;\r
+               }\r
+       }\r
+       reg_c50 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XAAGCCore1,bMaskByte0);\r
+       reg_c50 &= ~BIT7;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XAAGCCore1, reg_c50, reg_c50));\r
+       pDM_Odm->noise_level.noise[ODM_RF_PATH_A] = -110 + reg_c50 + noise_data.sum[ODM_RF_PATH_A];\r
+       pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_A];\r
+               \r
+       if(max_rf_path == 2){\r
+               reg_c58 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XBAGCCore1,bMaskByte0);\r
+               reg_c58 &= ~BIT7;\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XBAGCCore1, reg_c58, reg_c58));\r
+               pDM_Odm->noise_level.noise[ODM_RF_PATH_B] = -110 + reg_c58 + noise_data.sum[ODM_RF_PATH_B];\r
+               pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_B];\r
+       }\r
+       pDM_Odm->noise_level.noise_all /= max_rf_path;\r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("noise_a = %d, noise_b = %d\n", \r
+               pDM_Odm->noise_level.noise[ODM_RF_PATH_A],\r
+               pDM_Odm->noise_level.noise[ODM_RF_PATH_B]));\r
+\r
+       //\r
+       // Step 4. Recover the Dig\r
+       //\r
+       if(bPauseDIG)\r
+       {\r
+               odm_PauseDIG(pDM_Odm,ODM_RESUME_DIG,IGIValue);\r
+       }       \r
+       func_end = ODM_GetProgressingTime(pDM_Odm,func_start) ; \r
+       //printk("%s noise_a = %d, noise_b = %d noise_all:%d (%d ms)\n",__FUNCTION__,\r
+       //      pDM_Odm->noise_level.noise[ODM_RF_PATH_A],\r
+       //      pDM_Odm->noise_level.noise[ODM_RF_PATH_B],\r
+       //      pDM_Odm->noise_level.noise_all,func_end);       \r
+       \r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() <== \n"));\r
+       return pDM_Odm->noise_level.noise_all;\r
+\r
+}\r
+s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time)\r
+{\r
+\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES )\r
+       {\r
+               //odm_InbandNoise_Monitor_JaguarSeries(pDM_Odm,bPauseDIG,IGIValue,max_time);\r
+               return 0;\r
+       }\r
+       else\r
+       {\r
+               return odm_InbandNoise_Monitor_NSeries(pDM_VOID,bPauseDIG,IGIValue,max_time);\r
+       }\r
+}\r
+\r
+\r
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_NoiseMonitor.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_NoiseMonitor.h
new file mode 100755 (executable)
index 0000000..6625be6
--- /dev/null
@@ -0,0 +1,49 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ *****************************************************************************/\r
+#ifndef        __ODMNOISEMONITOR_H__\r
+#define __ODMNOISEMONITOR_H__\r
+\r
+#define        ODM_MAX_CHANNEL_NUM                                     38//14+24\r
+struct noise_level\r
+{\r
+       //u1Byte                                value_a, value_b;\r
+       u1Byte                          value[MAX_RF_PATH];\r
+       //s1Byte                                sval_a, sval_b;\r
+       s1Byte                          sval[MAX_RF_PATH];\r
+       \r
+       //s4Byte                                noise_a=0, noise_b=0,sum_a=0, sum_b=0;\r
+       //s4Byte                                noise[ODM_RF_PATH_MAX];\r
+       s4Byte                          sum[MAX_RF_PATH];\r
+       //u1Byte                                valid_cnt_a=0, valid_cnt_b=0, \r
+       u1Byte                          valid[MAX_RF_PATH];\r
+       u1Byte                          valid_cnt[MAX_RF_PATH];\r
+\r
+};\r
+\r
+\r
+typedef struct _ODM_NOISE_MONITOR_\r
+{\r
+       s1Byte                  noise[MAX_RF_PATH];\r
+       s2Byte                  noise_all;      \r
+}ODM_NOISE_MONITOR;\r
+\r
+s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time);\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_PathDiv.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_PathDiv.c
new file mode 100755 (executable)
index 0000000..f24e3c4
--- /dev/null
@@ -0,0 +1,1580 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "odm_precomp.h"\r
+\r
+
+\r
+VOID
+odm_PathDiversityInit(
+       IN      PVOID   pDM_VOID\r
+)
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
+               return;
+       }
+
+#if RTL8812A_SUPPORT
+
+       if(pDM_Odm->SupportICType & ODM_RTL8812)
+               ODM_PathDiversityInit_8812A(pDM_Odm);
+#endif 
+#endif
+}
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+VOID
+odm_PathDiversity(
+       IN      PVOID   pDM_VOID\r
+)
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+       {
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
+               return;
+       }
+
+#if RTL8812A_SUPPORT
+
+       if(pDM_Odm->SupportICType & ODM_RTL8812)
+               ODM_PathDiversity_8812A(pDM_Odm);
+#endif 
+}\r
+#endif  //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) \r
+\r
+\r
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+//\r
+// 2011/12/02 MH Copy from MP oursrc for temporarily test.
+//\r
+\r
+BOOLEAN\r
+odm_IsConnected_92C(
+       IN      PADAPTER        Adapter
+)
+{
+       PRT_WLAN_STA    pEntry;
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       u4Byte          i;
+       BOOLEAN         bConnected=FALSE;
+       
+       if(pMgntInfo->mAssoc)
+       {
+               bConnected = TRUE;
+       }
+       else
+       {
+               for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+               {
+                       if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                               pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+                       else
+                               pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+                       if(pEntry!=NULL)
+                       {
+                               if(pEntry->bAssociated)
+                               {
+                                       bConnected = TRUE;
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               break;
+                       }
+               }
+       }
+       return  bConnected;
+}
+\r
+BOOLEAN
+ODM_PathDiversityBeforeLink92C(
+       //IN    PADAPTER        Adapter
+       IN              PDM_ODM_T               pDM_Odm
+       )
+{
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE*  pHalData = NULL;
+       PMGNT_INFO              pMgntInfo = NULL;
+       //pSWAT_T               pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
+       pPD_T                   pDM_PDTable = NULL;
+
+       s1Byte                  Score = 0;
+       PRT_WLAN_BSS    pTmpBssDesc;
+       PRT_WLAN_BSS    pTestBssDesc;
+
+       u1Byte                  target_chnl = 0;
+       u1Byte                  index;
+
+       if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413
+       {       // The ODM structure is not initialized.
+               return FALSE;
+       }
+       pHalData = GET_HAL_DATA(Adapter);
+       pMgntInfo = &Adapter->MgntInfo;
+       pDM_PDTable = &Adapter->DM_PDTable;
+       
+       // Condition that does not need to use path diversity.
+       if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
+       {
+               RT_TRACE(COMP_INIT, DBG_LOUD, 
+                               ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
+               return FALSE;
+       }
+
+       // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
+       PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
+       {
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       
+               RT_TRACE(COMP_INIT, DBG_LOUD, 
+                               ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", 
+                               pMgntInfo->RFChangeInProgress,
+                               pHalData->eRFPowerState));
+       
+               //pDM_SWAT_Table->SWAS_NoLink_State = 0;
+               pDM_PDTable->PathDiv_NoLink_State = 0;
+               
+               return FALSE;
+       }
+       else
+       {
+               PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+       }
+
+       //1 Run AntDiv mechanism "Before Link" part.
+       //if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
+       if(pDM_PDTable->PathDiv_NoLink_State == 0)
+       {
+               //1 Prepare to do Scan again to check current antenna state.
+
+               // Set check state to next step.
+               //pDM_SWAT_Table->SWAS_NoLink_State = 1;
+               pDM_PDTable->PathDiv_NoLink_State = 1;
+       
+               // Copy Current Scan list.
+               Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
+               PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
+
+               // Switch Antenna to another one.
+               if(pDM_PDTable->DefaultRespPath == 0)
+               {
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // TRX path = PathB
+                       odm_SetRespPath_92C(Adapter, 1);
+                       pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
+                       pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
+               }
+               else
+               {
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // TRX path = PathA
+                       odm_SetRespPath_92C(Adapter, 0);
+                       pDM_PDTable->OFDMTXPath = 0x0;
+                       pDM_PDTable->CCKTXPath = 0x0;
+               }
+#if 0  
+
+               pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+               pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
+               
+               RT_TRACE(COMP_INIT, DBG_LOUD, 
+                       ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
+               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+               pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+               PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+#endif
+
+               // Go back to scan function again.
+               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
+               pMgntInfo->ScanStep=0;
+               target_chnl = odm_SwAntDivSelectScanChnl(Adapter);
+               odm_SwAntDivConstructScanChnl(Adapter, target_chnl);
+               PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
+
+               return TRUE;
+       }
+       else
+       {
+               //1 ScanComple() is called after antenna swiched.
+               //1 Check scan result and determine which antenna is going
+               //1 to be used.
+
+               for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
+               {
+                       pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
+                       pTestBssDesc = &(pMgntInfo->bssDesc[index]);
+
+                       if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
+                       {
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
+                               continue;
+                       }
+
+                       if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
+                       {
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
+                               RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                       
+                               Score++;
+                               PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
+                       }
+                       else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
+                       {
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
+                               RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
+                               RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+                               Score--;
+                       }
+
+               }
+
+               if(pMgntInfo->NumBssDesc!=0 && Score<=0)
+               {
+                       RT_TRACE(COMP_INIT, DBG_LOUD,
+                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
+
+                       //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+               }
+               else
+               {
+                       RT_TRACE(COMP_INIT, DBG_LOUD, 
+                               ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
+
+                       if(pDM_PDTable->DefaultRespPath == 0)
+                       {
+                               pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
+                               pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
+                               odm_SetRespPath_92C(Adapter, 1);
+                       }
+                       else
+                       {
+                               pDM_PDTable->OFDMTXPath = 0x0;
+                               pDM_PDTable->CCKTXPath = 0x0;
+                               odm_SetRespPath_92C(Adapter, 0);
+                       }
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); // RX path = PathAB
+
+                       //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
+
+                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+                       //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+                       //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+               }
+
+               // Check state reset to default and wait for next time.
+               //pDM_SWAT_Table->SWAS_NoLink_State = 0;
+               pDM_PDTable->PathDiv_NoLink_State = 0;
+
+               return FALSE;
+       }
+#else
+               return  FALSE;
+#endif
+       
+}
+
+
+
+VOID
+odm_PathDiversityAfterLink_92C(
+       IN      PADAPTER        Adapter
+)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pPD_T           pDM_PDTable = &Adapter->DM_PDTable;
+       u1Byte          DefaultRespPath=0;
+
+       if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
+       {
+               if(pHalData->PathDivCfg == 0)
+               {
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
+               }
+               else
+               {
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
+               }
+               return;
+       }
+       if(!odm_IsConnected_92C(Adapter))
+       {
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
+               return;
+       }
+       
+       
+       if(pDM_PDTable->TrainingState == 0)
+       {
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
+               odm_OFDMTXPathDiversity_92C(Adapter);
+
+               if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
+               {
+                       //RT_TRACE(     COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
+                       
+                       if(pDM_PDTable->CCK_Pkt_Cnt > 300)
+                               pDM_PDTable->Timer = 20;
+                       else if(pDM_PDTable->CCK_Pkt_Cnt > 100)
+                               pDM_PDTable->Timer = 60;
+                       else
+                               pDM_PDTable->Timer = 250;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
+
+                       PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // RX path = PathA
+                       pDM_PDTable->TrainingState = 1;
+                       pHalData->RSSI_test = TRUE;
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
+               }
+               else
+               {
+                       pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
+                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
+                       odm_SetRespPath_92C(Adapter, DefaultRespPath);
+                       odm_ResetPathDiversity_92C(Adapter);
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
+               }
+       }
+       else if(pDM_PDTable->TrainingState == 1)
+       {               
+               //RT_TRACE(     COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));\r
+               PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // RX path = PathB
+               pDM_PDTable->TrainingState = 2;
+               ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
+       }
+       else
+       {
+               //RT_TRACE(     COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));\r
+               pDM_PDTable->TrainingState = 0; 
+               odm_CCKTXPathDiversity_92C(Adapter); 
+               if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
+               {
+                       DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
+               }
+               else
+               {
+                       DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
+               }
+               odm_SetRespPath_92C(Adapter, DefaultRespPath);
+               odm_ResetPathDiversity_92C(Adapter);
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
+       }
+
+}
+\r
+VOID
+odm_SetRespPath_92C(
+       IN      PADAPTER        Adapter,
+       IN      u1Byte  DefaultRespPath
+       )
+{
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+
+       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
+       if(DefaultRespPath != pDM_PDTable->DefaultRespPath)
+       {
+               if(DefaultRespPath == 0)
+               {
+                       PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);      
+               }
+               else
+               {
+                       PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
+               }       
+       }
+       pDM_PDTable->DefaultRespPath = DefaultRespPath;
+}\r
+\r
+VOID
+odm_OFDMTXPathDiversity_92C(
+       IN      PADAPTER        Adapter)
+{
+//     HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       PRT_WLAN_STA    pEntry;
+       u1Byte  i, DefaultRespPath = 0;
+       s4Byte  MinRSSI = 0xFF;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       pDM_PDTable->OFDMTXPath = 0;
+       
+       //1 Default Port
+       if(pMgntInfo->mAssoc)
+       {
+               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
+                       Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
+               if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
+               {
+                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
+                       MinRSSI =  Adapter->RxStats.RxRSSIPercentage[1];
+                       DefaultRespPath = 0;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
+               }
+               else
+               {
+                       pDM_PDTable->OFDMTXPath =  pDM_PDTable->OFDMTXPath | BIT0;
+                       MinRSSI =  Adapter->RxStats.RxRSSIPercentage[0];
+                       DefaultRespPath = 1;
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
+               }
+                       //RT_TRACE(     COMP_INIT, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));\r
+       }
+       //1 Extension Port
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+               else
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+               if(pEntry!=NULL)
+               {
+                       if(pEntry->bAssociated)
+                       {
+                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n", 
+                                       pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
+                               
+                               if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
+                               {
+                                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));
+                                       //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId));
+                                       if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
+                                       {
+                                               MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
+                                               DefaultRespPath = 0;
+                                       }
+                               }
+                               else
+                               {
+                                       pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);
+                                       //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId));
+                                       if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
+                                       {
+                                               MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
+                                               DefaultRespPath = 1;
+                                       }
+                               }
+                       }
+               }
+               else
+               {
+                       break;
+               }
+       }
+
+       pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
+}
+\r
+\r
+VOID
+odm_CCKTXPathDiversity_92C(
+       IN      PADAPTER        Adapter
+)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);
+       PRT_WLAN_STA    pEntry;
+       s4Byte  MinRSSI = 0xFF;
+       u1Byte  i, DefaultRespPath = 0;
+//     BOOLEAN bBModePathDiv = FALSE;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+
+       //1 Default Port
+       if(pMgntInfo->mAssoc)
+       {
+               if(pHalData->OFDM_Pkt_Cnt == 0)
+               {
+                       for(i=0; i<2; i++)
+                       {
+                               if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
+                                       pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
+                               else
+                                       pDM_PDTable->RSSI_CCK_Path[i] = 0;
+                       }
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
+                               pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n",
+                               pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
+               
+                       if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
+                       {
+                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
+                               MinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];
+                               DefaultRespPath = 0;
+                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
+                       }
+                       else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
+                       {
+                               pDM_PDTable->CCKTXPath =  pDM_PDTable->CCKTXPath | BIT0;
+                               MinRSSI =  pDM_PDTable->RSSI_CCK_Path[0];
+                               DefaultRespPath = 1;
+                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
+                       }
+                       else
+                       {
+                               if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
+                               {
+                                       pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
+                                       MinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];
+                                       DefaultRespPath = 0;
+                               }
+                               else
+                               {
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
+                               }
+                       }
+               }
+               else //Follow OFDM decision
+               {
+                       pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
+                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
+                               pDM_PDTable->CCKTXPath &BIT0));
+               }
+       }
+       //1 Extension Port
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+               else
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+               if(pEntry!=NULL)
+               {
+                       if(pEntry->bAssociated)
+                       {
+                               if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
+                               {
+                                       u1Byte j=0;
+                                       for(j=0; j<2; j++)
+                                       {
+                                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)
+                                                       pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);
+                                               else
+                                                       pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
+                                       }
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n", 
+                                               pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
+                                       
+                                       if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
+                                       {
+                                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
+                                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
+                                               if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
+                                               {
+                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
+                                                       DefaultRespPath = 0;
+                                               }
+                                       }
+                                       else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
+                                       {
+                                               pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);
+                                               RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId));
+                                               if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
+                                               {
+                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
+                                                       DefaultRespPath = 1;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
+                                               {
+                                                       pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
+                                                       MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
+                                                       DefaultRespPath = 0;
+                                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
+                                               }
+                                               else
+                                               {
+                                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId));
+                                               }
+                                       }
+                               }
+                               else //Follow OFDM decision
+                               {
+                                       pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));
+                                       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
+                                               pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));
+                               }
+                       }
+               }
+               else
+               {
+                       break;
+               }
+       }
+
+       RT_TRACE(       COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
+
+       if(MinRSSI == 0xFF)
+               DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
+
+       pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
+}
+\r
+\r
+VOID
+odm_ResetPathDiversity_92C(
+               IN      PADAPTER        Adapter
+)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       PRT_WLAN_STA    pEntry;
+       u4Byte  i,j;
+
+       pHalData->RSSI_test = FALSE;
+       pDM_PDTable->CCK_Pkt_Cnt = 0;
+       pDM_PDTable->OFDM_Pkt_Cnt = 0;
+       pHalData->CCK_Pkt_Cnt =0;
+       pHalData->OFDM_Pkt_Cnt =0;
+       
+       if(pDM_PDTable->CCKPathDivEnable == TRUE)       
+               PHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); //RX path = PathAB
+
+       for(i=0; i<2; i++)
+       {
+               pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
+               pDM_PDTable->RSSI_CCK_Path[i] = 0;
+       }
+       for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+       {
+               if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+               else
+                       pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+               if(pEntry!=NULL)
+               {
+                       pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
+                       pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
+                       for(j=0; j<2; j++)
+                       {
+                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;
+                               pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
+                       }
+               }
+               else
+                       break;
+       }
+}
+
+
+
+
+
+VOID
+odm_CCKTXPathDiversityCallback(
+       PRT_TIMER               pTimer
+)
+{
+#if USE_WORKITEM
+       PADAPTER        Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+          PDM_ODM_T            pDM_Odm = &pHalData->DM_OutSrc;
+#else
+       PADAPTER        Adapter = (PADAPTER)pTimer->Adapter;
+#endif
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+#if USE_WORKITEM
+       PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
+#else
+       odm_PathDiversityAfterLink_92C(Adapter);
+#endif
+#else
+       PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
+#endif
+
+}
+
+
+VOID
+odm_CCKTXPathDiversityWorkItemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        Adapter = (PADAPTER)pContext;
+
+       odm_CCKTXPathDiversity_92C(Adapter);
+}
+
+//
+// 20100514 Luke/Joseph:
+// Callback function for 500ms antenna test trying.
+//
+VOID
+odm_PathDivChkAntSwitchCallback(
+       PRT_TIMER               pTimer
+)
+{
+       PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+
+#if USE_WORKITEM
+       PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
+#else
+       odm_PathDivChkAntSwitch(pDM_Odm);
+#endif
+#else
+       PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
+#endif
+
+//odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
+
+}
+
+
+VOID
+odm_PathDivChkAntSwitchWorkitemCallback(
+    IN PVOID            pContext
+    )
+{
+       PADAPTER        pAdapter = (PADAPTER)pContext;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+
+       odm_PathDivChkAntSwitch(pDM_Odm);
+}\r
+\r
+\r
+ //MAC0_ACCESS_PHY1
+
+// 2011-06-22 Neil Chen & Gary Hsin
+// Refer to Jr.Luke's SW ANT DIV
+// 92D Path Diversity Main function
+// refer to 88C software antenna diversity
+// 
+VOID
+odm_PathDivChkAntSwitch(
+       PDM_ODM_T               pDM_Odm
+       //PADAPTER              Adapter,
+       //u1Byte                        Step
+)
+{
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;
+
+
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+       s4Byte                  curRSSI=100, RSSI_A, RSSI_B;
+       u1Byte                  nextAntenna=AUX_ANT;
+       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       u8Byte                  curTxOkCnt, curRxOkCnt;
+       static u8Byte           TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
+       u8Byte                  CurByteCnt=0, PreByteCnt=0;
+       static u1Byte           TrafficLoad = TRAFFIC_LOW;
+       u1Byte                  Score_A=0, Score_B=0;
+       u1Byte                  i=0x0;
+       // Neil Chen
+       static u1Byte        pathdiv_para=0x0;     
+       static u1Byte        switchfirsttime=0x00;
+       // u1Byte                 regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
+       u1Byte                  regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
+
+
+       //u1Byte                 reg637 =0x0;   
+       static u1Byte        fw_value=0x0;         
+       //u8Byte                        curTxOkCnt_tmp, curRxOkCnt_tmp;
+       PADAPTER            BuddyAdapter = Adapter->BuddyAdapter;     // another adapter MAC
+        // Path Diversity   //Neil Chen--2011--06--22
+
+       //u1Byte                 PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
+       u1Byte                 PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
+       u1Byte                 PathDiv_Enable = pHalData->bPathDiv_Enable;
+
+
+       //DbgPrint("Path Div PG Value:%x \n",PathDiv_Enable);   
+       if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))
+       {
+           return;
+       }
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
+
+       // The first time to switch path excluding 2nd, 3rd, ....etc....
+       if(switchfirsttime==0)
+       {
+           if(regB33==0)
+           {
+              pDM_SWAT_Table->CurAntenna = MAIN_ANT;    // Default MAC0_5G-->Path A (current antenna)     
+           }       
+       }
+
+       // Condition that does not need to use antenna diversity.
+       if(pDM_Odm->SupportICType != ODM_RTL8192D)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
+               return;
+       }
+
+       // Radio off: Status reset to default and return.
+       if(pHalData->eRFPowerState==eRfOff)
+       {
+               //ODM_SwAntDivRestAfterLink(Adapter);
+               return;
+       }
+
+       /*
+       // Handling step mismatch condition.
+       // Peak step is not finished at last time. Recover the variable and check again.
+       if(     Step != pDM_SWAT_Table->try_flag        )
+       {
+               ODM_SwAntDivRestAfterLink(Adapter);
+       } */
+       
+       if(pDM_SWAT_Table->try_flag == 0xff)
+       {
+               // Select RSSI checking target
+               if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
+               {
+                       // Target: Infrastructure mode AP.
+                       pHalData->RSSI_target = NULL;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
+               }
+               else
+               {
+                       u1Byte                  index = 0;
+                       PRT_WLAN_STA    pEntry = NULL;
+                       PADAPTER                pTargetAdapter = NULL;
+               
+                       if(     pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
+                       {
+                               // Target: AP/IBSS peer.
+                               pTargetAdapter = Adapter;
+                       }
+                       else if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)
+                       {
+                               // Target: VWIFI peer.
+                               pTargetAdapter = GetFirstExtAdapter(Adapter);
+                       }
+
+                       if(pTargetAdapter != NULL)
+                       {
+                               for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
+                               {
+                                       pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
+                                       if(pEntry != NULL)
+                                       {
+                                               if(pEntry->bAssociated)
+                                                       break;                  
+                                       }
+                               }
+                       }
+
+                       if(pEntry == NULL)
+                       {
+                               ODM_PathDivRestAfterLink(pDM_Odm);
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
+                               return;
+                       }
+                       else
+                       {
+                               pHalData->RSSI_target = pEntry;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
+                       }
+               }
+                       
+               pHalData->RSSI_cnt_A = 0;
+               pHalData->RSSI_cnt_B = 0;
+               pDM_SWAT_Table->try_flag = 0;
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
+               return;
+       }
+       else
+       {
+              // 1st step
+               curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
+               curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
+               lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
+               lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
+       
+               if(pDM_SWAT_Table->try_flag == 1)   // Training State
+               {
+                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                       {
+                               TXByteCnt_A += curTxOkCnt;
+                               RXByteCnt_A += curRxOkCnt;
+                       }
+                       else
+                       {
+                               TXByteCnt_B += curTxOkCnt;
+                               RXByteCnt_B += curRxOkCnt;
+                       }
+               
+                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                       pDM_SWAT_Table->RSSI_Trying--;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
+                       if(pDM_SWAT_Table->RSSI_Trying == 0)
+                       {
+                               CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
+                               PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
+                               
+                               if(TrafficLoad == TRAFFIC_HIGH)
+                               {
+                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
+                                       PreByteCnt =PreByteCnt*9;
+                               }
+                               else if(TrafficLoad == TRAFFIC_LOW)
+                               {
+                                       //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
+                                       PreByteCnt =PreByteCnt*2;
+                               }
+                               if(pHalData->RSSI_cnt_A > 0)
+                                       RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; 
+                               else
+                                       RSSI_A = 0;
+                               if(pHalData->RSSI_cnt_B > 0)
+                                       RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; 
+                            else
+                                       RSSI_B = 0;
+                               curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                               pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n", 
+                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+                                       RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
+                       }
+
+               }
+               else   // try_flag=0
+               {
+               
+                       if(pHalData->RSSI_cnt_A > 0)
+                               RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; 
+                       else
+                               RSSI_A = 0;
+                       if(pHalData->RSSI_cnt_B > 0)
+                               RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; 
+                       else
+                               RSSI_B = 0;     
+                       curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                       pDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
+                      ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n", 
+                       (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+                               RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
+               }
+
+               //1 Trying State
+               if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
+               {
+
+                       if(pDM_SWAT_Table->TestMode == TP_MODE)
+                       {
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));             
+                               if(CurByteCnt < PreByteCnt)
+                               {
+                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+                                       else
+                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+                               }
+                               else
+                               {
+                                       if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                                               pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+                                       else
+                                               pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+                               }
+                               for (i= 0; i<8; i++)
+                               {
+                                       if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
+                                               Score_A++;
+                                       else
+                                               Score_B++;
+                               }
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
+                       
+                               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+                               {
+                                       nextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;
+                               }
+                               else
+                               {
+                                       nextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;
+                               }
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==MAIN_ANT)?"MAIN":"AUX"));
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s \n", 
+                               (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+                               if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
+                               }
+                               else
+                               {
+                                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
+                               }       
+                       }
+
+                    
+                       if(pDM_SWAT_Table->TestMode == RSSI_MODE)
+                       {       
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
+                               pDM_SWAT_Table->SelectAntennaMap=0xAA;
+                               if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
+                               {
+                                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: Switch back to another antenna"));
+                                       nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;
+                               }
+                               else // current anntena is good
+                               {
+                                       nextAntenna =pDM_SWAT_Table->CurAntenna;
+                                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: current anntena is good\n"));
+                               }
+                       }
+                       
+                       pDM_SWAT_Table->try_flag = 0;
+                       pHalData->RSSI_test = FALSE;
+                       pHalData->RSSI_sum_A = 0;
+                       pHalData->RSSI_cnt_A = 0;
+                       pHalData->RSSI_sum_B = 0;
+                       pHalData->RSSI_cnt_B = 0;
+                       TXByteCnt_A = 0;
+                       TXByteCnt_B = 0;
+                       RXByteCnt_A = 0;
+                       RXByteCnt_B = 0;
+                       
+               }
+
+               //1 Normal State
+               else if(pDM_SWAT_Table->try_flag == 0)
+               {
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                       {
+                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+                                       TrafficLoad = TRAFFIC_HIGH;
+                               else
+                                       TrafficLoad = TRAFFIC_LOW;
+                       }
+                       else if(TrafficLoad == TRAFFIC_LOW)
+                               {
+                               if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+                                       TrafficLoad = TRAFFIC_HIGH;
+                               else
+                                       TrafficLoad = TRAFFIC_LOW;
+                       }
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                               pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
+
+                       //Prepare To Try Antenna                
+                               nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+                               pDM_SWAT_Table->try_flag = 1;
+                               pHalData->RSSI_test = TRUE;
+                       if((curRxOkCnt+curTxOkCnt) > 1000)
+                       {
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                           pDM_SWAT_Table->RSSI_Trying = 4;                           
+#else
+                           pDM_SWAT_Table->RSSI_Trying = 2;
+#endif
+                               pDM_SWAT_Table->TestMode = TP_MODE;
+                       }
+                       else
+                       {
+                               pDM_SWAT_Table->RSSI_Trying = 2;
+                               pDM_SWAT_Table->TestMode = RSSI_MODE;
+
+                       }
+                          
+                       //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));                     
+                       pHalData->RSSI_sum_A = 0;
+                       pHalData->RSSI_cnt_A = 0;
+                       pHalData->RSSI_sum_B = 0;
+                       pHalData->RSSI_cnt_B = 0;
+               } // end of try_flag=0
+       }
+       
+       //1 4.Change TRX antenna
+       if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+       {
+       
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
+               //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
+               if(nextAntenna==MAIN_ANT)
+               {
+                   ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
+                   pathdiv_para = 0x02;   //02 to switchback to RF path A
+                   fw_value = 0x03;
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+                 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));      
+#endif
+               }       
+              else if(nextAntenna==AUX_ANT)
+              {
+                  ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
+                  if(switchfirsttime==0)  // First Time To Enter Path Diversity
+                  {
+                      switchfirsttime=0x01;
+                      pathdiv_para = 0x00;
+                         fw_value=0x00;    // to backup RF Path A Releated Registers             
+                                         
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+                     ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
+                     //for(u1Byte n=0; n<80,n++)
+                     //{
+                     //delay_us(500);
+                         ODM_delay_ms(500);
+                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+                                        
+                        fw_value=0x01;         // to backup RF Path A Releated Registers                
+                     ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
+#endif 
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));    
+                  }               
+                   else
+                   {
+                       pathdiv_para = 0x01;
+                        fw_value = 0x02;       
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+                     ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));  
+#endif 
+                   }           
+              }
+           //   odm_PathDiversity_8192D(Adapter, pathdiv_para);
+       }
+
+       //1 5.Reset Statistics
+       pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+       pDM_SWAT_Table->CurAntenna = nextAntenna;
+       pDM_SWAT_Table->PreRSSI = curRSSI;
+
+       //1 6.Set next timer
+
+       if(pDM_SWAT_Table->RSSI_Trying == 0)
+               return;
+
+       if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
+       {
+               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               {
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                       {
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
+#else
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
+#endif                         
+                       }
+                       else if(TrafficLoad == TRAFFIC_LOW)
+                       {
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
+                               ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
+                       }
+               }
+               else   // TestMode == RSSI_MODE
+               {
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
+               }
+       }
+       else
+       {
+               if(pDM_SWAT_Table->TestMode == TP_MODE)
+               {
+                       if(TrafficLoad == TRAFFIC_HIGH)
+                               
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
+                               //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
+#else          
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
+#endif                         
+                       else if(TrafficLoad == TRAFFIC_LOW)
+                               ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
+               }
+               else
+                       ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
+       }
+}
+\r
+\r
+\r
+VOID
+ODM_CCKPathDiversityChkPerPktRssi(
+       PADAPTER                Adapter,
+       BOOLEAN                 bIsDefPort,
+       BOOLEAN                 bMatchBSSID,
+       PRT_WLAN_STA    pEntry,
+       PRT_RFD                 pRfd,
+       pu1Byte                 pDesc
+       )
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       BOOLEAN                 bCount = FALSE;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+       //BOOLEAN       isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
+#if DEV_BUS_TYPE != RT_SDIO_INTERFACE
+       BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
+#else  //below code would be removed if we have verified SDIO
+       BOOLEAN isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
+#endif
+
+       if((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))
+               return;
+               
+       if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
+               bCount = TRUE;
+       else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
+               bCount = TRUE;
+
+       if(bCount && isCCKrate)
+       {
+               if(pDM_PDTable->TrainingState == 1 )
+               {
+                       if(pEntry)
+                       {
+                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
+                                       pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
+                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
+                       }
+                       else
+                       {
+                               if(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
+                                       pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
+                               pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
+                       }
+               }
+               else if(pDM_PDTable->TrainingState == 2 )
+               {
+                       if(pEntry)
+                       {
+                               if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
+                                       pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
+                               pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
+                       }
+                       else
+                       {
+                               if(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
+                                       pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
+                               pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
+                       }
+               }
+       }
+}
+
+
+
+
+//Neil Chen---2011--06--22
+//----92D Path Diversity----//
+//#ifdef PathDiv92D
+//==================================
+//3 Path Diversity 
+//==================================
+//
+// 20100514 Luke/Joseph:
+// Add new function for antenna diversity after link.
+// This is the main function of antenna diversity after link.
+// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
+// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
+// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
+// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
+// listened on the air with the RSSI of original antenna.
+// It chooses the antenna with better RSSI.
+// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting 
+// penalty to get next try.
+//
+//
+// 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.
+//
+
+
+//
+// 20100514 Luke/Joseph:
+// This function is used to gather the RSSI information for antenna testing.
+// It selects the RSSI of the peer STA that we want to know.
+//
+VOID
+ODM_PathDivChkPerPktRssi(
+       PADAPTER                Adapter,
+       BOOLEAN                 bIsDefPort,
+       BOOLEAN                 bMatchBSSID,
+       PRT_WLAN_STA    pEntry,
+       PRT_RFD                 pRfd
+       )
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      
+       BOOLEAN                 bCount = FALSE;
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+
+       if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
+               bCount = TRUE;
+       else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
+               bCount = TRUE;
+
+       if(bCount)
+       {
+               //1 RSSI for SW Antenna Switch
+               if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+               {
+                       pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
+                       pHalData->RSSI_cnt_A++;
+               }
+               else
+               {
+                       pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
+                       pHalData->RSSI_cnt_B++;
+
+               }
+       }
+}
+\r
+\r
+//
+// 20100514 Luke/Joseph:
+// Add new function to reset antenna diversity state after link.
+//
+VOID
+ODM_PathDivRestAfterLink(
+       IN      PDM_ODM_T               pDM_Odm
+       )
+{
+       PADAPTER                Adapter=pDM_Odm->Adapter;
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+
+       pHalData->RSSI_cnt_A = 0;
+       pHalData->RSSI_cnt_B = 0;
+       pHalData->RSSI_test = FALSE;
+       pDM_SWAT_Table->try_flag = 0x0;       // NOT 0xff
+       pDM_SWAT_Table->RSSI_Trying = 0;
+       pDM_SWAT_Table->SelectAntennaMap=0xAA;
+       pDM_SWAT_Table->CurAntenna = MAIN_ANT;  
+}\r
+\r
+\r
+//==================================================
+//3 PathDiv End
+//==================================================\r
+\r
+\r
+VOID
+ODM_FillTXPathInTXDESC(
+               IN      PADAPTER        Adapter,
+               IN      PRT_TCB         pTcb,
+               IN      pu1Byte         pDesc
+)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       u4Byte  TXPath;
+       pPD_T   pDM_PDTable = &Adapter->DM_PDTable;
+
+       //2011.09.05  Add by Luke Lee for path diversity
+       if(pHalData->PathDivCfg == 1)
+       {       
+               TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
+               //RT_TRACE(     COMP_INIT, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
+               //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
+               if(TXPath == 0)
+               {
+                       SET_TX_DESC_TX_ANTL_92C(pDesc,1);
+                       SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
+               }
+               else
+               {
+                       SET_TX_DESC_TX_ANTL_92C(pDesc,2);
+                       SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
+               }
+               TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
+               if(TXPath == 0)
+               {
+                       SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
+               }
+               else
+               {
+                       SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
+               }
+       }
+}
+
+//Only for MP //Neil Chen--2012--0502--
+VOID
+odm_PathDivInit_92D(
+IN     PDM_ODM_T       pDM_Odm)
+{
+       pPATHDIV_PARA   pathIQK = &pDM_Odm->pathIQK;
+
+       pathIQK->org_2g_RegC14=0x0;
+       pathIQK->org_2g_RegC4C=0x0;
+       pathIQK->org_2g_RegC80=0x0;
+       pathIQK->org_2g_RegC94=0x0;
+       pathIQK->org_2g_RegCA0=0x0;
+       pathIQK->org_5g_RegC14=0x0;
+       pathIQK->org_5g_RegCA0=0x0;
+       pathIQK->org_5g_RegE30=0x0;
+       pathIQK->swt_2g_RegC14=0x0;
+       pathIQK->swt_2g_RegC4C=0x0;
+       pathIQK->swt_2g_RegC80=0x0;
+       pathIQK->swt_2g_RegC94=0x0;
+       pathIQK->swt_2g_RegCA0=0x0;
+       pathIQK->swt_5g_RegC14=0x0;
+       pathIQK->swt_5g_RegCA0=0x0;
+       pathIQK->swt_5g_RegE30=0x0;
+
+}\r
+\r
+\r
+u1Byte
+odm_SwAntDivSelectScanChnl(
+       IN      PADAPTER        Adapter
+       )
+{
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+       PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(Adapter);
+       PMGNT_INFO                      pMgntInfo = &(Adapter->MgntInfo);
+       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;
+       u1Byte                          i, j, ScanChannel = 0, ChannelNum = 0;
+       PRT_CHANNEL_LIST        pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+       u1Byte                          EachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};
+
+       if(pMgntInfo->tmpNumBssDesc == 0)
+               return 0;
+
+       for(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)
+       {               
+               ChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;
+               for(j = 0; j < pChannelList->ChannelLen; j++)
+               {
+                       if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
+                       {
+                               EachChannelSTAs[j]++;
+                               break;
+                       }
+               }
+       }
+       
+       for(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)
+               {
+               if(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])
+                       ScanChannel = i;
+               }
+
+       if(EachChannelSTAs[ScanChannel] == 0)
+       {
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("odm_SwAntDivSelectScanChnl(): Scan List is empty.\n"));
+               return 0;
+       }
+       
+       ScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;
+
+       
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, 
+               ("odm_SwAntDivSelectScanChnl(): Channel (( %d )) is select as scan channel.\n", ScanChannel));
+
+       return ScanChannel;
+#else
+       return  0;
+#endif 
+}
+
+
+VOID
+odm_SwAntDivConstructScanChnl(
+       IN      PADAPTER        Adapter,
+       IN      u1Byte          ScanChnl
+       )
+{
+
+       PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
+
+       if(ScanChnl == 0)
+       {
+               u1Byte                          i;              
+               PRT_CHANNEL_LIST        pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+       
+               // 20100519 Joseph: Original antenna scanned nothing. 
+               // Test antenna shall scan all channel with half period in this condition.
+
+               RT_TRACE_F(COMP_SCAN, DBG_TRACE, (" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \n", ScanChnl));
+
+               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
+               for(i = 0; i < pChannelList->ChannelLen; i++)
+                       pChannelList->ChnlListEntry[i].ScanPeriod /= 2;
+       }
+       else
+       {
+               // The using of this CustomizedScanRequest is a trick to rescan the two channels 
+               //      under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
+               CUSTOMIZED_SCAN_REQUEST CustomScanReq;
+
+               CustomScanReq.bEnabled = TRUE;
+               CustomScanReq.Channels[0] = ScanChnl;
+               CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
+               CustomScanReq.nChannels = 2;
+               CustomScanReq.ScanType = SCAN_ACTIVE;
+               CustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;
+
+               RT_TRACE_F(COMP_SCAN, DBG_TRACE, (" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \n", ScanChnl));
+
+               RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
+       }
+
+}
+\r
+\r
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_PathDiv.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/OUTSRC/odm_PathDiv.h
new file mode 100755 (executable)
index 0000000..85791d0
--- /dev/null
@@ -0,0 +1,196 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
\r
+#ifndef        __ODMPATHDIV_H__\r
+#define    __ODMPATHDIV_H__\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) \r
+\r
+VOID   \r
+odm_PathDiversityInit(\r
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+VOID    \r
+odm_PathDiversity(\r
+       IN      PVOID   pDM_VOID\r
+       );\r
+\r
+#endif  //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) \r
+\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \r
+\r
+//#define   PATHDIV_ENABLE      1\r
+#define dm_PathDiv_RSSI_Check  ODM_PathDivChkPerPktRssi\r
+#define PathDivCheckBeforeLink8192C    ODM_PathDiversityBeforeLink92C\r
+\r
+typedef struct _PathDiv_Parameter_define_\r
+{\r
+       u4Byte org_5g_RegE30;\r
+       u4Byte org_5g_RegC14;\r
+       u4Byte org_5g_RegCA0;\r
+       u4Byte swt_5g_RegE30;\r
+       u4Byte swt_5g_RegC14;\r
+       u4Byte swt_5g_RegCA0;\r
+       //for 2G IQK information\r
+       u4Byte org_2g_RegC80;\r
+       u4Byte org_2g_RegC4C;\r
+       u4Byte org_2g_RegC94;\r
+       u4Byte org_2g_RegC14;\r
+       u4Byte org_2g_RegCA0;\r
+\r
+       u4Byte swt_2g_RegC80;\r
+       u4Byte swt_2g_RegC4C;\r
+       u4Byte swt_2g_RegC94;\r
+       u4Byte swt_2g_RegC14;\r
+       u4Byte swt_2g_RegCA0;\r
+}PATHDIV_PARA,*pPATHDIV_PARA;\r
+\r
+VOID   \r
+odm_PathDiversityInit_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_2TPathDiversityInit_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_1TPathDiversityInit_92C(   \r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+BOOLEAN\r
+odm_IsConnected_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+BOOLEAN \r
+ODM_PathDiversityBeforeLink92C(\r
+       //IN    PADAPTER        Adapter\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       );\r
+\r
+VOID   \r
+odm_PathDiversityAfterLink_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID\r
+odm_SetRespPath_92C(   \r
+       IN      PADAPTER        Adapter,        \r
+       IN      u1Byte  DefaultRespPath\r
+       );\r
+\r
+VOID   \r
+odm_OFDMTXPathDiversity_92C(\r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_CCKTXPathDiversity_92C(    \r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID   \r
+odm_ResetPathDiversity_92C(    \r
+       IN      PADAPTER        Adapter\r
+       );\r
+\r
+VOID\r
+odm_CCKTXPathDiversityCallback(\r
+       PRT_TIMER               pTimer\r
+       );\r
+\r
+VOID\r
+odm_CCKTXPathDiversityWorkItemCallback(\r
+       IN PVOID            pContext\r
+       );\r
+\r
+VOID\r
+odm_PathDivChkAntSwitchCallback(\r
+       PRT_TIMER               pTimer\r
+       );\r
+\r
+VOID\r
+odm_PathDivChkAntSwitchWorkitemCallback(\r
+       IN PVOID            pContext\r
+       );\r
+\r
+\r
+VOID \r
+odm_PathDivChkAntSwitch(\r
+       PDM_ODM_T    pDM_Odm\r
+       );\r
+\r
+VOID\r
+ODM_CCKPathDiversityChkPerPktRssi(\r
+       PADAPTER                Adapter,\r
+       BOOLEAN                 bIsDefPort,\r
+       BOOLEAN                 bMatchBSSID,\r
+       PRT_WLAN_STA    pEntry,\r
+       PRT_RFD                 pRfd,\r
+       pu1Byte                 pDesc\r
+       );\r
+\r
+VOID \r
+ODM_PathDivChkPerPktRssi(\r
+       PADAPTER                Adapter,\r
+       BOOLEAN                 bIsDefPort,\r
+       BOOLEAN                 bMatchBSSID,\r
+       PRT_WLAN_STA    pEntry,\r
+       PRT_RFD                 pRfd    \r
+       );\r
+\r
+VOID
+ODM_PathDivRestAfterLink(
+       IN      PDM_ODM_T               pDM_Odm
+       );\r
+\r
+VOID
+ODM_FillTXPathInTXDESC(
+               IN      PADAPTER        Adapter,
+               IN      PRT_TCB         pTcb,
+               IN      pu1Byte         pDesc
+       );\r
+\r
+VOID
+odm_PathDivInit_92D(
+       IN      PDM_ODM_T       pDM_Odm\r
+       );\r
+\r
+u1Byte\r
+odm_SwAntDivSelectScanChnl(
+       IN      PADAPTER        Adapter
+       );\r
+\r
+VOID
+odm_SwAntDivConstructScanChnl(
+       IN      PADAPTER        Adapter,
+       IN      u1Byte          ScanChnl
+       );\r
+       \r
+ #endif       //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \r
\r
\r
+ #endif                 //#ifndef  __ODMPATHDIV_H__\r
+\r
index 1193653a52726a4473afc0991e2d25c2a92f1ee7..855aa161b8ed0e3a21ee40d24d278bcc3246b607 100755 (executable)
 //PAGE 8\r
 #define        ODM_REG_CCK_RPT_FORMAT_11AC     0x804\r
 #define        ODM_REG_BB_RX_PATH_11AC                 0x808\r
+#define        ODM_REG_BB_ATC_11AC                             0x860\r
+#define        ODM_REG_DBG_RPT_11AC                            0x8fc\r
 //PAGE 9\r
 #define        ODM_REG_OFDM_FA_RST_11AC                0x9A4\r
+#define        ODM_REG_NHM_TIMER_11AC                  0x990\r
+#define        ODM_REG_NHM_TH9_TH10_11AC               0x994\r
+#define        ODM_REG_NHM_TH3_TO_TH0_11AC     0x998\r
+#define        ODM_REG_NHM_TH7_TO_TH4_11AC     0x99c\r
+#define        ODM_REG_NHM_TH8_11AC                    0x9a0\r
+#define        ODM_REG_NHM_9E8_11AC                    0x9e8\r
 //PAGE A\r
 #define        ODM_REG_CCK_CCA_11AC                    0xA0A\r
 #define        ODM_REG_CCK_FA_RST_11AC                 0xA2C\r
 #define        ODM_REG_CCK_FA_11AC                             0xA5C\r
+//PAGE B\r
+#define        ODM_REG_RST_RPT_11AC                            0xB58\r
 //PAGE C\r
+#define        ODM_REG_TRMUX_11AC                              0xC08\r
 #define        ODM_REG_IGI_A_11AC                              0xC50\r
 //PAGE E\r
 #define        ODM_REG_IGI_B_11AC                              0xE50\r
 //PAGE F\r
+#define        ODM_REG_CCK_CCA_CNT_11AC                0xF08\r
 #define        ODM_REG_OFDM_FA_11AC                    0xF48\r
-\r
+#define        ODM_REG_RPT_11AC                                        0xfa0\r
+#define        ODM_REG_NHM_CNT_11AC                    0xfa8\r
+//PAGE 18\r
+#define        ODM_REG_IGI_C_11AC                              0x1850\r
+//PAGE 1A\r
+#define        ODM_REG_IGI_D_11AC                              0x1A50\r
 \r
 //2 MAC REG LIST\r
 #define        ODM_REG_RESP_TX_11AC                            0x6D8\r
@@ -52,6 +69,7 @@
 #define        ODM_BIT_IGI_11AC                                        0xFFFFFFFF\r
 #define        ODM_BIT_CCK_RPT_FORMAT_11AC             BIT16\r
 #define        ODM_BIT_BB_RX_PATH_11AC                 0xF\r
+#define        ODM_BIT_BB_ATC_11AC                             BIT14\r
 \r
 #endif\r
 \r
index b6236092fb5a4d8bd200abb370faedb2f979da29..c6e4b186f27b81a4118fff8d5d08efae261bc2b2 100755 (executable)
 #define        ODM_REG_RF_PIN_11N                              0x804\r
 #define        ODM_REG_PSD_CTRL_11N                            0x808\r
 #define        ODM_REG_TX_ANT_CTRL_11N                 0x80C\r
-#define        ODM_REG_BB_PWR_SAV5_11N                 0x818\r
+#define        ODM_REG_BB_PWR_SAV5_11N         0x818\r
 #define        ODM_REG_CCK_RPT_FORMAT_11N              0x824\r
 #define        ODM_REG_RX_DEFUALT_A_11N                0x858\r
 #define        ODM_REG_RX_DEFUALT_B_11N                0x85A\r
-#define        ODM_REG_BB_PWR_SAV3_11N                 0x85C\r
+#define        ODM_REG_BB_PWR_SAV3_11N         0x85C\r
 #define        ODM_REG_ANTSEL_CTRL_11N                 0x860\r
 #define        ODM_REG_RX_ANT_CTRL_11N                 0x864\r
 #define        ODM_REG_PIN_CTRL_11N                            0x870\r
-#define        ODM_REG_BB_PWR_SAV1_11N                 0x874\r
+#define        ODM_REG_BB_PWR_SAV1_11N         0x874\r
 #define        ODM_REG_ANTSEL_PATH_11N                 0x878\r
 #define        ODM_REG_BB_3WIRE_11N                    0x88C\r
 #define        ODM_REG_SC_CNT_11N                              0x8C4\r
-#define        ODM_REG_PSD_DATA_11N                    0x8B4\r
+#define        ODM_REG_PSD_DATA_11N                            0x8B4\r
+#define        ODM_REG_PSD_DATA_11N                            0x8B4\r
+#define        ODM_REG_NHM_TIMER_11N                   0x894\r
+#define        ODM_REG_NHM_TH9_TH10_11N                0x890\r
+#define        ODM_REG_NHM_TH3_TO_TH0_11N              0x898\r
+#define        ODM_REG_NHM_TH7_TO_TH4_11N              0x89c\r
+#define        ODM_REG_NHM_CNT_11N                             0x8d8\r
 //PAGE 9\r
+#define        ODM_REG_DBG_RPT_11N                             0x908\r
 #define        ODM_REG_ANT_MAPPING1_11N                0x914\r
 #define        ODM_REG_ANT_MAPPING2_11N                0x918\r
 //PAGE A\r
@@ -78,7 +85,7 @@
 #define        ODM_REG_CCK_FA_MSB_11N                  0xA58\r
 #define        ODM_REG_CCK_FA_LSB_11N                  0xA5C\r
 #define        ODM_REG_CCK_CCA_CNT_11N                 0xA60\r
-#define        ODM_REG_BB_PWR_SAV4_11N                 0xA74\r
+#define        ODM_REG_BB_PWR_SAV4_11N         0xA74\r
 //PAGE B\r
 #define        ODM_REG_LNA_SWITCH_11N                  0xB2C\r
 #define        ODM_REG_PATH_SWITCH_11N                 0xB30\r
@@ -90,9 +97,9 @@
 #define        ODM_REG_BB_RX_PATH_11N                  0xC04\r
 #define        ODM_REG_TRMUX_11N                               0xC08\r
 #define        ODM_REG_OFDM_FA_RSTC_11N                0xC0C\r
-#define        ODM_REG_RXIQI_MATRIX_11N                0xC14\r
+#define        ODM_REG_RXIQI_MATRIX_11N                        0xC14\r
 #define        ODM_REG_TXIQK_MATRIX_LSB1_11N   0xC4C\r
-#define        ODM_REG_IGI_A_11N                               0xC50\r
+#define        ODM_REG_IGI_A_11N                                       0xC50\r
 #define        ODM_REG_ANTDIV_PARA2_11N                0xC54\r
 #define        ODM_REG_IGI_B_11N                                       0xC58\r
 #define        ODM_REG_ANTDIV_PARA3_11N                0xC5C\r
 #define        ODM_REG_OFDM_FA_TYPE1_11N               0xCF0\r
 //PAGE D\r
 #define        ODM_REG_OFDM_FA_RSTD_11N                0xD00\r
+#define        ODM_REG_BB_ATC_11N                              0xD2C\r
 #define        ODM_REG_OFDM_FA_TYPE2_11N               0xDA0\r
 #define        ODM_REG_OFDM_FA_TYPE3_11N               0xDA4\r
 #define        ODM_REG_OFDM_FA_TYPE4_11N               0xDA8\r
+#define        ODM_REG_RPT_11N                                 0xDF4\r
 //PAGE E\r
 #define        ODM_REG_TXAGC_A_6_18_11N                0xE00\r
 #define        ODM_REG_TXAGC_A_24_54_11N               0xE04\r
 #define        ODM_REG_STANDBY_11N                             0xEDC\r
 #define        ODM_REG_SLEEP_11N                               0xEE0\r
 #define        ODM_REG_PMPD_ANAEN_11N                  0xEEC\r
-\r
-\r
-\r
-\r
-\r
-\r
+#define        ODM_REG_IGI_C_11N                                       0xF84\r
+#define        ODM_REG_IGI_D_11N                                       0xF88\r
 \r
 //2 MAC REG LIST\r
 #define        ODM_REG_BB_RST_11N                              0x02\r
 #define        ODM_REG_EDCA_BK_11N                             0x50C\r
 #define        ODM_REG_TXPAUSE_11N                             0x522\r
 #define        ODM_REG_RESP_TX_11N                             0x6D8\r
-#define        ODM_REG_ANT_TRAIN_PARA1_11N     0x7b0\r
-#define        ODM_REG_ANT_TRAIN_PARA2_11N     0x7b4\r
+#define        ODM_REG_ANT_TRAIN_PARA1_11N             0x7b0\r
+#define        ODM_REG_ANT_TRAIN_PARA2_11N             0x7b4\r
 \r
 \r
 //DIG Related\r
 #define        ODM_BIT_IGI_11N                                 0x0000007F\r
 #define        ODM_BIT_CCK_RPT_FORMAT_11N              BIT9\r
 #define        ODM_BIT_BB_RX_PATH_11N                  0xF\r
+#define        ODM_BIT_BB_ATC_11N                              BIT11\r
 \r
 #endif\r
 \r
index 1547ff10450bfbeaad5e2da8dcc73b3cfd04deda..6dc171a2ad27bce3a1850c8723d793043f350386 100755 (executable)
@@ -50,7 +50,7 @@ pDM_Odm->DebugComponents                      =
 //                                                                     ODM_COMP_DYNAMIC_PRICCA         |\r
 //                                                                     ODM_COMP_RXHP                                   |\r
 //                                                                     ODM_COMP_MP                                     |\r
-//                                                                     ODM_COMP_DYNAMIC_ATC            |\r
+//                                                                     ODM_COMP_CFO_TRACKING           |\r
 \r
 //MAC Functions\r
 //                                                                     ODM_COMP_EDCA_TURBO                     |\r
index 0a32f85ef34d35bddaae8d1079727a247b163ac4..802d0dfc42f30301ff3eed96a6f8e201a88d071a 100755 (executable)
 //\r
 //-----------------------------------------------------------------------------\r
 //BB Functions\r
-#define ODM_COMP_DIG                           BIT0    \r
-#define ODM_COMP_RA_MASK                       BIT1    \r
+#define ODM_COMP_DIG                                   BIT0    \r
+#define ODM_COMP_RA_MASK                               BIT1    \r
 #define ODM_COMP_DYNAMIC_TXPWR         BIT2\r
 #define ODM_COMP_FA_CNT                                BIT3\r
 #define ODM_COMP_RSSI_MONITOR          BIT4\r
 #define ODM_COMP_CCK_PD                                BIT5\r
-#define ODM_COMP_ANT_DIV                       BIT6\r
+#define ODM_COMP_ANT_DIV                               BIT6\r
 #define ODM_COMP_PWR_SAVE                      BIT7\r
 #define ODM_COMP_PWR_TRAIN                     BIT8\r
 #define ODM_COMP_RATE_ADAPTIVE         BIT9\r
-#define ODM_COMP_PATH_DIV                      BIT10\r
-#define ODM_COMP_PSD                           BIT11\r
+#define ODM_COMP_PATH_DIV                              BIT10\r
+#define ODM_COMP_PSD                                   BIT11\r
 #define ODM_COMP_DYNAMIC_PRICCA                BIT12\r
-#define ODM_COMP_RXHP                          BIT13                   \r
+#define ODM_COMP_RXHP                                  BIT13                   \r
 #define ODM_COMP_MP                                    BIT14\r
-#define ODM_COMP_DYNAMIC_ATC                   BIT15\r
+#define ODM_COMP_CFO_TRACKING          BIT15\r
 //MAC Functions\r
 #define ODM_COMP_EDCA_TURBO                    BIT16\r
 #define ODM_COMP_EARLY_MODE                    BIT17\r
 //RF Functions\r
 #define ODM_COMP_TX_PWR_TRACK          BIT24\r
 #define ODM_COMP_RX_GAIN_TRACK         BIT25\r
-#define ODM_COMP_CALIBRATION           BIT26\r
+#define ODM_COMP_CALIBRATION                   BIT26\r
 //Common Functions\r
 #define ODM_COMP_COMMON                                BIT30\r
-#define ODM_COMP_INIT                          BIT31\r
+#define ODM_COMP_INIT                                  BIT31\r
 \r
 /*------------------------Export Marco Definition---------------------------*/\r
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
index 9cf4ff45d3ef417d99613eb62a65dd793281d471..36908dc025800a1c0f6835e64d91c79150fe2f01 100755 (executable)
@@ -312,6 +312,20 @@ ODM_MoveMemory(
 #endif \r
 }\r
 \r
+void ODM_Memory_Set\r
+       (IN     PDM_ODM_T       pDM_Odm,\r
+               IN  PVOID       pbuf,\r
+               IN  s1Byte      value,\r
+               IN  u4Byte      length)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       \r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )  \r
+       _rtw_memset(pbuf,value, length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       PlatformFillMemory(pbuf,length,value);\r
+#endif\r
+}\r
 s4Byte ODM_CompareMemory(\r
        IN      PDM_ODM_T               pDM_Odm,\r
        IN      PVOID           pBuf1,\r
@@ -718,6 +732,33 @@ ODM_FillH2CCmd(
 #endif\r
 \r
 \r
+u4Byte\r
+ODM_GetCurrentTime(    \r
+       IN      PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return  0;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       return rtw_get_current_time();\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+       return  0;\r
+#endif\r
+}\r
 \r
+s4Byte\r
+ODM_GetProgressingTime(        \r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  Start_Time\r
+       )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       return  0;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       return rtw_get_passing_time_ms(Start_Time);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)   \r
+       return  0;\r
+#endif\r
+}\r
 \r
 \r
index 7d75575cc585203dd52c0836496d6c735c25cb1b..689318aad4f8b344b7adff0a2321ce76605a0223 100755 (executable)
@@ -251,6 +251,12 @@ s4Byte ODM_CompareMemory(
       IN       PVOID           pBuf2,\r
       IN       u4Byte          length\r
        );\r
+\r
+void ODM_Memory_Set\r
+       (IN     PDM_ODM_T       pDM_Odm,\r
+               IN  PVOID       pbuf,\r
+               IN  s1Byte      value,\r
+               IN  u4Byte      length);\r
        \r
 //\r
 // ODM MISC-spin lock relative API.\r
@@ -379,5 +385,16 @@ ODM_FillH2CCmd(
        IN      pu1Byte         CmdStartSeq\r
        );\r
 #endif\r
+\r
+u4Byte\r
+ODM_GetCurrentTime(    \r
+       IN      PDM_ODM_T               pDM_Odm\r
+       );\r
+s4Byte\r
+ODM_GetProgressingTime(        \r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       IN      u4Byte                  Start_Time\r
+       );\r
+\r
 #endif // __ODM_INTERFACE_H__\r
 \r
index e3c71d2d34dac3e438db873f33f43720fbbecda5..74877a86bf0bb5e8d54d3c00c1be801635f99fd4 100755 (executable)
 #include "odm_RegDefine11AC.h"\r
 #include "odm_RegDefine11N.h"\r
 #include "odm_AntDiv.h"\r
+#include "odm_EdcaTurboCheck.h"\r
+#include "odm_DIG.h"\r
+#include "odm_PathDiv.h"\r
+#include "odm_DynamicBBPowerSaving.h"\r
+#include "odm_DynamicTxPower.h"\r
+#include "odm_CfoTracking.h"\r
+#include "odm_NoiseMonitor.h"\r
 \r
 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
 #if (RTL8192C_SUPPORT==1)\r
index 27cecceeec61a03b10cb894464cc20aabd1f8113..4ebbe720b84f014383f681af548742c425783c78 100755 (executable)
 #define        ODM_ENDIAN_BIG  0
 #define        ODM_ENDIAN_LITTLE       1
 
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+#define GET_ODM(__pAdapter)    ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->DM_OutSrc)))
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+#define GET_ODM(__pAdapter)    ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->odmpriv)))
+#endif
+
 #if (DM_ODM_SUPPORT_TYPE != ODM_WIN)
 #define        RT_PCI_INTERFACE                                1
 #define        RT_USB_INTERFACE                                2
@@ -260,6 +266,9 @@ typedef enum _RT_SPINLOCK_TYPE{
        #define RTL8881A_SUPPORT        0
 #endif
 
+#define READ_NEXT_PAIR(v1, v2, i) do { if (i+2 >= ArrayLen) break; i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
+#define COND_ELSE  2
+#define COND_ENDIF 3
 
 #endif // __ODM_TYPES_H__
 
index 5debf5036eb47695e0ab370b3525080ae1420a88..c92a04864b91565a04a21587032a447963ea33f5 100755 (executable)
 //-----------------------------------------------------\r
 #define REG_RQPN_8723B                                 0x0200\r
 #define REG_FIFOPAGE_8723B                             0x0204\r
-#define REG_TDECTRL_8723B                              0x0208\r
+#define REG_DWBCN0_CTRL_8723B                  REG_TDECTRL\r
 #define REG_TXDMA_OFFSET_CHK_8723B     0x020C\r
-#define REG_TXDMA_STATUS_8723B                 0x0210\r
-#define REG_RQPN_NPQ_8723B                             0x0214\r
-#define REG_TDECTRL1_8723B                             0x0228\r
+#define REG_TXDMA_STATUS_8723B         0x0210\r
+#define REG_RQPN_NPQ_8723B                     0x0214\r
+#define REG_DWBCN1_CTRL_8723B                  0x0228\r
 \r
 \r
 //-----------------------------------------------------\r
index ec9d02e4d7eed3806fc4de226834f8f964408f1c..89e1ae23755b4b1db55c25a5e4a1f38e313dd1bc 100755 (executable)
 * \r
 ******************************************************************************/\r
 \r
-//#include "Mp_Precomp.h"\r
+\r
 #include "../odm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 static BOOLEAN\r
-CheckCondition(\r
-    const u4Byte  Condition,\r
-    const u4Byte  Hex\r
+CheckPositive(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
     )\r
 {\r
-    u4Byte _board     = (Hex & 0x000000FF);\r
-    u4Byte _interface = (Hex & 0x0000FF00) >> 8;\r
-    u4Byte _platform  = (Hex & 0x00FF0000) >> 16;\r
-    u4Byte cond = Condition;\r
-\r
-    if ( Condition == 0xCDCDCDCD )\r
-        return TRUE;\r
-\r
-    cond = Condition & 0x000000FF;\r
-    if ( (_board != cond) && (cond != 0xFF) )\r
-        return FALSE;\r
-\r
-    cond = Condition & 0x0000FF00;\r
-    cond = cond >> 8;\r
-    if ( ((_interface & cond) == 0) && (cond != 0x07) )\r
-        return FALSE;\r
-\r
-    cond = Condition & 0x00FF0000;\r
-    cond = cond >> 16;\r
-    if ( ((_platform & cond) == 0) && (cond != 0x0F) )\r
+    u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
+                           ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
+                           ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
+                           ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
+                           ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
+\r
+       u4Byte    cond1   = Condition1, cond2 = Condition2;\r
+       u4Byte    driver1 = pDM_Odm->CutVersion       << 24 |  \r
+                               pDM_Odm->SupportPlatform  << 16 | \r
+                               pDM_Odm->PackageType      << 12 | \r
+                               pDM_Odm->SupportInterface << 8  |\r
+                               _BoardType;\r
+\r
+       u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
+                               pDM_Odm->TypeGPA  <<  8 | \r
+                               pDM_Odm->TypeALNA << 16 | \r
+                               pDM_Odm->TypeAPA  << 24; \r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
+\r
+\r
+       //============== Value Defined Check ===============//\r
+       //QFN Type [15:12] and Cut Version [27:24] need to do value check\r
+       \r
+       if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
+               return FALSE;\r
+       if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
+               return FALSE;           \r
+\r
+       //=============== Bit Defined Check ================//\r
+    // We don't care [31:28] and [23:20]\r
+    //\r
+       cond1   &= 0x000F0FFF; \r
+       driver1 &= 0x000F0FFF; \r
+\r
+    if ((cond1 & driver1) == cond1) \r
+    {\r
+        u4Byte bitMask = 0;\r
+        if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE\r
+            return TRUE;\r
+\r
+        if ((cond1 & BIT0) != 0) //GLNA\r
+            bitMask |= 0x000000FF;\r
+        if ((cond1 & BIT1) != 0) //GPA\r
+            bitMask |= 0x0000FF00;\r
+        if ((cond1 & BIT2) != 0) //ALNA\r
+            bitMask |= 0x00FF0000;\r
+        if ((cond1 & BIT3) != 0) //APA\r
+            bitMask |= 0xFF000000;\r
+\r
+        if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched\r
+            return TRUE;\r
+        else\r
+            return FALSE;\r
+    }\r
+    else \r
+    {\r
         return FALSE;\r
+    }\r
+}\r
+static BOOLEAN\r
+CheckNegative(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
+    )\r
+{\r
     return TRUE;\r
 }\r
 \r
-\r
 /******************************************************************************\r
 *                           AGC_TAB.TXT\r
 ******************************************************************************/\r
@@ -188,6 +242,7 @@ u4Byte Array_MP_8723B_AGC_TAB[] = {
                0xC78, 0x017F0001,\r
                0xC50, 0x69553422,\r
                0xC50, 0x69553420,\r
+               0x824, 0x00390204,\r
 \r
 };\r
 \r
@@ -196,69 +251,73 @@ ODM_ReadAndConfig_MP_8723B_AGC_TAB(
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8723B_AGC_TAB;\r
-\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB, hex = 0x%X\n", hex));\r
-\r
-       for (i = 0; i < ArrayLen; i += 2 )\r
-       {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
+    u4Byte     i         = 0;\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8723B_AGC_TAB;\r
        \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                   odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       i -= 2; // prevent from for-loop += 2\r
-                   }\r
-                   else // Configure matched pairs and skip to end of if-else.\r
-                   {\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                               odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB\n"));\r
+\r
+    for (i = 0; i < ArrayLen; i += 2 )\r
+    {\r
+        u4Byte v1 = Array[i];\r
+        u4Byte v2 = Array[i+1];\r
+    \r
+        // This (offset, data) pair doesn't care the condition.\r
+        if ( v1 < 0x40000000 )\r
+        {\r
+           odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
+           continue;\r
+        }\r
+        else\r
+        {   // This line is the beginning of branch.\r
+            BOOLEAN bMatched = TRUE;\r
+            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+\r
+            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
+                bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
+                bMatched = FALSE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else {\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
+                    bMatched = FALSE;\r
+                else\r
+                    bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            }\r
+\r
+            if ( bMatched == FALSE )\r
+            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
+                while (v1 < 0x40000000 && i < ArrayLen -2)\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+\r
+                i -= 2; // prevent from for-loop += 2\r
+            }\r
+            else // Configure matched pairs and skip to end of if-else.\r
+            {\r
+                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
+                    odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                }\r
+\r
+                // Keeps reading until ENDIF.\r
+                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                }\r
+            }\r
+        } \r
+    }\r
+}\r
 \r
+u4Byte\r
+ODM_GetVersion_MP_8723B_AGC_TAB(void)\r
+{\r
+          return 11;\r
 }\r
 \r
 /******************************************************************************\r
@@ -275,7 +334,7 @@ u4Byte Array_MP_8723B_PHY_REG[] = {
                0x818, 0x02200385,\r
                0x81C, 0x00000000,\r
                0x820, 0x01000100,\r
-               0x824, 0x00390204,\r
+               0x824, 0x00190204,\r
                0x828, 0x00000000,\r
                0x82C, 0x00000000,\r
                0x830, 0x00000000,\r
@@ -312,9 +371,8 @@ u4Byte Array_MP_8723B_PHY_REG[] = {
                0x90C, 0x81121111,\r
                0x910, 0x00000002,\r
                0x914, 0x00000201,\r
-               0x948, 0x00000280,\r
                0xA00, 0x00D047C8,\r
-               0xA04, 0x80FF000C,\r
+               0xA04, 0x80FF800C,\r
                0xA08, 0x8C838300,\r
                0xA0C, 0x2E7F120F,\r
                0xA10, 0x9500BB78,\r
@@ -468,69 +526,73 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG(
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8723B_PHY_REG;\r
-\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG, hex = 0x%X\n", hex));\r
-\r
-       for (i = 0; i < ArrayLen; i += 2 )\r
-       {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
+    u4Byte     i         = 0;\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8723B_PHY_REG;\r
        \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       i -= 2; // prevent from for-loop += 2\r
-                   }\r
-                   else // Configure matched pairs and skip to end of if-else.\r
-                   {\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG\n"));\r
+\r
+    for (i = 0; i < ArrayLen; i += 2 )\r
+    {\r
+        u4Byte v1 = Array[i];\r
+        u4Byte v2 = Array[i+1];\r
+    \r
+        // This (offset, data) pair doesn't care the condition.\r
+        if ( v1 < 0x40000000 )\r
+        {\r
+           odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
+           continue;\r
+        }\r
+        else\r
+        {   // This line is the beginning of branch.\r
+            BOOLEAN bMatched = TRUE;\r
+            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+\r
+            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
+                bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
+                bMatched = FALSE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else {\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
+                    bMatched = FALSE;\r
+                else\r
+                    bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            }\r
+\r
+            if ( bMatched == FALSE )\r
+            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
+                while (v1 < 0x40000000 && i < ArrayLen -2)\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+\r
+                i -= 2; // prevent from for-loop += 2\r
+            }\r
+            else // Configure matched pairs and skip to end of if-else.\r
+            {\r
+                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
+                    odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                }\r
+\r
+                // Keeps reading until ENDIF.\r
+                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                }\r
+            }\r
+        } \r
+    }\r
+}\r
 \r
+u4Byte\r
+ODM_GetVersion_MP_8723B_PHY_REG(void)\r
+{\r
+          return 11;\r
 }\r
 \r
 /******************************************************************************\r
@@ -551,22 +613,15 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       u4Byte     hex = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8723B_PHY_REG_PG)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8723B_PHY_REG_PG;\r
+    u4Byte     i         = 0;\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8723B_PHY_REG_PG)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8723B_PHY_REG_PG;\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG_PG\n"));\r
 \r
        pDM_Odm->PhyRegPgVersion = 1;\r
        pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
+\r
        for (i = 0; i < ArrayLen; i += 6 )\r
        {\r
            u4Byte v1 = Array[i];\r
@@ -576,29 +631,7 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(
            u4Byte v5 = Array[i+4];\r
            u4Byte v6 = Array[i+5];\r
 \r
-           // this line is a line of pure_body\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                        odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6);\r
-                        continue;\r
-           }\r
-           else\r
-           { // this line is the start of branch\r
-               if ( !CheckCondition(Array[i], hex) )\r
-               { // don't need the hw_body\r
-                   i += 2; // skip the pair of expression\r
-                   v1 = Array[i];\r
-                   v2 = Array[i+1];\r
-                   v3 = Array[i+2];\r
-                   while (v2 != 0xDEAD)\r
-                   {\r
-                       i += 3;\r
-                       v1 = Array[i];\r
-                       v2 = Array[i+1];\r
-                       v3 = Array[i+1];\r
-                   }\r
-               }\r
-           }\r
+           odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6);\r
        }\r
 }\r
 \r
index 0d5b29296726e2d01cfc97575be12c515d0c5248..f5b9036249c4a6689288feb52d5a32cf83763875 100755 (executable)
@@ -22,7 +22,6 @@
 #ifndef __INC_MP_BB_HW_IMG_8723B_H\r
 #define __INC_MP_BB_HW_IMG_8723B_H\r
 \r
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);\r
 \r
 /******************************************************************************\r
 *                           AGC_TAB.TXT\r
@@ -32,6 +31,7 @@ void
 ODM_ReadAndConfig_MP_8723B_AGC_TAB( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_AGC_TAB(void);\r
 \r
 /******************************************************************************\r
 *                           PHY_REG.TXT\r
@@ -41,6 +41,7 @@ void
 ODM_ReadAndConfig_MP_8723B_PHY_REG( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_PHY_REG(void);\r
 \r
 /******************************************************************************\r
 *                           PHY_REG_PG.TXT\r
@@ -50,6 +51,7 @@ void
 ODM_ReadAndConfig_MP_8723B_PHY_REG_PG( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_PHY_REG_PG(void);\r
 \r
 #endif\r
 #endif // end of HWIMG_SUPPORT\r
index 39c04a13488e4359ef65dcc3460fda9b4f49bef2..f3b435ee2c1d544dac9e993c4c370fdba11667c4 100755 (executable)
@@ -22,7 +22,7 @@
 #include "../odm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
-#if 1\r
+#ifdef CONFIG_AP_WOWLAN\r
 u1Byte Array_MP_8723B_FW_AP_WoWLAN[] = {\r
 0x01, 0x53, 0x20, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x02, 0x11, 0x28, 0x4A, 0x3C, 0x00, 0x00, \r
 0x9E, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -1010,6 +1010,7 @@ ODM_ReadFirmware_MP_8723B_FW_AP_WoWLAN(
        *pFirmwareSize = ArrayLength_MP_8723B_FW_AP_WoWLAN;\r
 #endif\r
 }\r
+#endif\r
 \r
 u1Byte Array_MP_8723B_FW_BT[] = {\r
 0xFC, 0x63, 0x07, 0x62, 0xCF, 0xF7, 0x12, 0x6B, 0x6B, 0xEB, 0x34, 0xB2, 0x60, 0xCA, 0xC8, 0xF1, \r
@@ -1603,16 +1604,16 @@ ODM_ReadFirmware_MP_8723B_FW_BT(
 }\r
 \r
 \r
-// v19.00 20131217 by Glayrainx <glayrainx@realtek.com>\r
+// v27.01 20140429 by Isaachsu <isaachsu@realtek.com>\r
 u1Byte Array_MP_8723B_FW_NIC[] = {\r
-0x01, 0x53, 0x10, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x16, 0x18, 0x16, 0xA2, 0x76, 0x00, 0x00, \r
-0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x45, 0x8D, 0x02, 0x6F, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x6C, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x79, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x01, 0x53, 0x10, 0x00, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x29, 0x13, 0x45, 0x38, 0x78, 0x00, 0x00, \r
+0xD1, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x45, 0xED, 0x02, 0x67, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x68, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5E, 0xBE, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x70, 0xCC, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, \r
+0x00, 0x00, 0x00, 0x02, 0x68, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0xEE, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x77, 0xBD, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, \r
 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, \r
 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, \r
 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, \r
@@ -1642,7 +1643,13 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
 0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, \r
 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x19, \r
 0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x34, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x94, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, \r
 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
@@ -1657,7 +1664,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, \r
 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, \r
 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, \r
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x2D, 0x74, 0x01, 0x93, \r
+0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x90, 0x74, 0x01, 0x93, \r
 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, \r
 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, \r
@@ -1667,10 +1674,10 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, \r
 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
-0x04, 0x90, 0x46, 0x2D, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
+0x04, 0x90, 0x46, 0x90, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, \r
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0x7D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, \r
+0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0xDD, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, \r
 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, \r
 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
@@ -1678,12 +1685,12 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, \r
 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, \r
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0x7C, 0x8F, 0xF0, \r
+0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0xDC, 0x8F, 0xF0, \r
 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, \r
 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, \r
 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, \r
 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, \r
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0x7D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
+0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0xDD, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
 0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, \r
 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, \r
 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, \r
@@ -1695,1819 +1702,1838 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, \r
 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, \r
 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, \r
-0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x45, 0xCB, \r
-0x02, 0x43, 0x0D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, \r
+0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x46, 0x2B, \r
+0x02, 0x43, 0x6D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, \r
 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, \r
 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, \r
-0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x10, 0xE4, 0x7E, \r
+0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x70, 0xE4, 0x7E, \r
 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, \r
 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, \r
 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, \r
 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, \r
-0x00, 0x41, 0xA3, 0xD3, 0x00, 0x41, 0xA3, 0xD4, 0x00, 0x41, 0xA3, 0xD5, 0x00, 0x41, 0xA3, 0xD9, \r
-0x00, 0x41, 0xA3, 0xDA, 0x00, 0x41, 0xA3, 0xDB, 0x00, 0x41, 0xA3, 0xFC, 0x00, 0x51, 0x59, 0x58, \r
-0x1D, 0x67, 0xF3, 0x7F, 0x02, 0xF1, 0xD5, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0xD1, 0x49, 0x7F, \r
-0x02, 0xF1, 0xD5, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0xF1, 0xD5, 0xEF, 0x20, \r
-0xE6, 0x02, 0xE1, 0x95, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x6E, 0x7F, 0x8D, 0xF1, 0xD5, 0x90, 0x00, \r
-0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, 0x60, 0x0D, 0x24, 0x03, 0x60, 0x02, 0xE1, 0x87, 0xAF, \r
-0x6E, 0x12, 0xAC, 0xF7, 0xE1, 0x87, 0x74, 0x96, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, \r
-0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xF1, 0x9F, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, \r
-0xB1, 0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xF1, 0x9F, 0x75, 0xF0, 0x04, \r
-0xE5, 0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, \r
-0xE4, 0xFF, 0xF1, 0x9F, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, 0xC4, \r
-0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xF1, 0x9F, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x16, \r
-0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1, 0x9F, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, \r
-0x17, 0xF1, 0x9A, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x18, 0xB1, 0x49, 0xE0, 0xC4, 0x13, \r
-0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xF1, 0x9F, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x18, \r
-0xB1, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xF1, 0x9F, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, \r
-0x00, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1, 0x9F, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, \r
-0x89, 0x01, 0xF1, 0x9A, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x02, 0xF1, 0x9A, 0x75, 0xF0, \r
-0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0xF1, 0x9A, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x04, \r
-0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1, 0x9F, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, \r
-0x05, 0xF1, 0x9A, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x06, 0xF1, 0x9A, 0x75, 0xF0, 0x08, \r
-0xE5, 0x6E, 0x90, 0x89, 0x07, 0xF1, 0x9A, 0x7F, 0x8F, 0xF1, 0xD5, 0xEF, 0x30, 0xE0, 0x06, 0xE4, \r
-0xFD, 0x7F, 0x8D, 0xD1, 0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0x49, 0xE0, 0xFB, 0x0D, 0xEF, \r
-0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, \r
-0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x7F, 0x4E, 0xF1, 0xD5, 0xEF, 0x44, 0x80, 0xFD, 0x7F, \r
-0x4E, 0xD1, 0x49, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, \r
-0x00, 0xE0, 0x90, 0xA3, 0xF3, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xF3, \r
-0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC1, 0x63, 0x90, 0xA2, 0x20, 0xE0, 0xC3, 0x13, 0x54, \r
-0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x2D, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, \r
-0xEF, 0x90, 0xA2, 0x2C, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA3, 0xA2, 0xF0, 0x90, 0xA3, 0xA1, 0xEE, \r
-0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA3, 0x9D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xA1, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, \r
-0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA3, 0x9D, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, \r
-0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x20, 0xE0, 0x30, 0xE0, \r
-0x79, 0x90, 0xA2, 0x22, 0xE0, 0x70, 0x3B, 0x7D, 0x16, 0x7F, 0x6F, 0x31, 0x5D, 0x91, 0x07, 0x90, \r
-0xA2, 0x20, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0D, 0x11, 0xDB, 0x90, 0xA2, 0x20, 0xE0, \r
-0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x2B, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x01, \r
-0xF0, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0xA3, 0x74, 0x03, 0x11, 0x20, 0x90, 0xA2, 0x22, 0x74, 0x01, \r
-0xF0, 0x22, 0x90, 0xA2, 0x22, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA2, 0x20, 0xE0, 0xC3, 0x13, \r
-0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x2B, 0x12, 0x45, 0x49, 0xE0, 0x30, 0xE0, 0x18, \r
-0x75, 0xF0, 0x0D, 0xEF, 0x11, 0xDB, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, \r
-0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x01, 0x28, 0xD1, 0x50, 0x22, 0x90, 0xA2, 0x2F, 0x12, 0x45, \r
-0x49, 0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, \r
-0xA3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2D, 0x90, \r
-0x05, 0x22, 0xE0, 0x90, 0xA3, 0xA8, 0xF0, 0x7D, 0x14, 0x91, 0x03, 0xBF, 0x01, 0x13, 0x51, 0xA7, \r
-0x90, 0xA3, 0xA6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xA5, 0xE0, 0xFF, 0x51, \r
-0x27, 0x90, 0xA3, 0xA8, 0xE0, 0xFF, 0x7D, 0x15, 0x31, 0x5D, 0x80, 0x13, 0x51, 0xA7, 0x90, 0xA3, \r
-0xA6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xA5, 0xE0, 0xFF, 0x51, 0x27, 0x90, \r
-0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x2F, 0x12, \r
-0x45, 0x49, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xE7, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, \r
-0xEF, 0xF0, 0x90, 0x9F, 0x9B, 0xED, 0xF0, 0x22, 0x90, 0xA1, 0xC8, 0xE0, 0x44, 0x02, 0xF0, 0x7D, \r
-0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xAE, 0xEF, 0xF0, 0xA3, \r
-0xED, 0xF0, 0x90, 0x9F, 0x99, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x42, 0x90, 0x05, \r
-0x22, 0xE0, 0x90, 0xA3, 0xB2, 0xF0, 0x7D, 0x26, 0x91, 0x03, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0x51, \r
-0x0A, 0x90, 0xA2, 0x20, 0xE0, 0x20, 0xE0, 0x1A, 0x80, 0x15, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, \r
-0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0x51, 0x0A, 0x90, 0xA2, 0x20, 0xE0, 0x20, 0xE0, 0x03, 0x12, \r
-0xB5, 0x95, 0x90, 0xA3, 0xB2, 0xE0, 0xFF, 0x7D, 0x27, 0x31, 0x5D, 0x12, 0xB6, 0x21, 0x80, 0x0F, \r
-0x12, 0xB6, 0x21, 0x51, 0x0A, 0x90, 0xA2, 0x20, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xB5, 0x95, 0x90, \r
-0xA1, 0xC1, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, \r
-0xE0, 0x0B, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x28, 0x31, 0x5D, 0x90, 0x04, 0x1F, \r
-0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, \r
-0xA3, 0xAF, 0xE0, 0xFB, 0x7D, 0x01, 0x51, 0xB1, 0x90, 0xA3, 0xB0, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, \r
-0xF0, 0xFD, 0x90, 0xA3, 0xAE, 0xE0, 0xFF, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, \r
-0xA1, 0xD8, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, \r
-0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA3, 0xA3, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, \r
-0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xE0, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, \r
-0x90, 0xA3, 0xDF, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xB6, 0x8C, 0x7C, 0x00, 0xAD, 0x07, 0x90, \r
-0xA3, 0xDF, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3, 0xE0, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA3, 0xE1, 0xE0, 0x25, 0xE0, 0x25, \r
-0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, \r
-0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, \r
-0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, \r
-0xCF, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x30, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0xD2, \r
-0xF0, 0x7D, 0x29, 0x91, 0x03, 0xBF, 0x01, 0x16, 0x90, 0x9F, 0xA0, 0x51, 0xAB, 0x90, 0xA3, 0xD0, \r
-0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xCF, 0xE0, 0xFF, 0x51, 0x27, 0x90, 0xA3, \r
-0xD2, 0xE0, 0xFF, 0x7D, 0x2A, 0x31, 0x5D, 0x80, 0x16, 0x90, 0x9F, 0xA0, 0x51, 0xAB, 0x90, 0xA3, \r
-0xD0, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xCF, 0xE0, 0xFF, 0x51, 0x27, 0x90, \r
-0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0xA3, 0x0B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1C, 0x90, \r
-0x05, 0x22, 0xE0, 0x90, 0xA3, 0x0F, 0xF0, 0x7D, 0x36, 0x91, 0x03, 0xBF, 0x01, 0x02, 0xF1, 0xB8, \r
-0x90, 0xA3, 0x0F, 0xE0, 0xFF, 0x7D, 0x37, 0x31, 0x5D, 0x80, 0x02, 0xF1, 0xB8, 0x90, 0x05, 0x22, \r
-0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x38, 0x31, 0x5D, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x31, 0x5D, 0xE4, 0x90, 0xA3, 0xED, 0xF0, 0xA3, 0xF0, 0x90, 0x05, \r
-0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, \r
-0x7F, 0x01, 0x22, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x15, 0xD3, \r
-0x90, 0xA3, 0xEE, 0xE0, 0x94, 0x03, 0x90, 0xA3, 0xED, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, 0x13, \r
-0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA3, 0xEE, 0xE0, 0x94, 0xE8, 0x90, 0xA3, 0xED, 0xE0, 0x94, \r
-0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, \r
-0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xED, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0x9E, \r
-0x90, 0xA3, 0x09, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, \r
-0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x0E, 0xF0, 0x7D, 0x01, 0x91, 0x03, 0xEF, 0x64, 0x01, \r
-0x70, 0x02, 0xD1, 0xEE, 0x90, 0xA3, 0x0E, 0xE0, 0xFF, 0x7D, 0x02, 0x31, 0x5D, 0x80, 0x02, 0xD1, \r
-0xEE, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA3, 0x08, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, \r
-0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0D, 0x90, \r
-0xA3, 0x09, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x5D, 0x90, 0xA3, 0x08, 0xE0, \r
-0x70, 0x0B, 0x90, 0xA3, 0x0A, 0xE0, 0xFF, 0x7D, 0x05, 0x31, 0x73, 0x80, 0x26, 0x90, 0xA3, 0x08, \r
-0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA3, 0x0A, 0xE0, 0xFF, 0x71, 0x57, 0x80, 0x16, 0x90, 0xA3, 0x08, \r
-0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA2, 0x1B, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0x71, 0xBA, 0x90, 0xA2, 0x0D, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0A, 0x90, \r
-0xA3, 0x09, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x5D, 0x22, 0x8F, 0x54, 0x7D, 0x17, 0x91, 0x03, \r
-0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA2, 0x23, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0x75, 0xF0, 0x0D, \r
-0xE5, 0x54, 0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, \r
-0x54, 0x07, 0xFB, 0x90, 0xA2, 0x20, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0xCA, 0xF0, 0xAF, \r
-0x04, 0x12, 0xAF, 0xE6, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x12, 0xAD, 0xD0, 0x75, 0xF0, 0x0D, 0xE5, \r
-0x54, 0x31, 0x4C, 0xAD, 0x54, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, \r
-0xCB, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA3, 0xCD, 0xE0, 0xFF, 0xC3, 0x94, \r
-0x02, 0x40, 0x02, 0xC1, 0x4B, 0x90, 0xA3, 0xCC, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x25, \r
-0x12, 0x45, 0x49, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, \r
-0x8C, 0x83, 0xE0, 0x90, 0xA3, 0xCE, 0xF0, 0x90, 0xA3, 0xCB, 0xE0, 0x60, 0x31, 0x90, 0xA3, 0xCE, \r
-0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA2, 0x27, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, \r
-0x90, 0xA3, 0xCD, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE0, 0xFE, \r
-0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x33, 0x90, 0xA3, \r
-0xCE, 0xE0, 0xFF, 0x90, 0xA3, 0xCC, 0xE0, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x27, 0x12, 0x45, 0x49, \r
-0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xCD, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, \r
-0x45, 0x49, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0x5F, 0x90, 0xA3, 0xCE, 0xF0, 0x90, 0xA3, 0xCE, 0xE0, 0xFF, 0x90, 0xA3, 0xCC, 0xE0, 0x75, 0xF0, \r
-0x0D, 0x90, 0xA2, 0x25, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xCD, 0xE0, 0xD0, \r
-0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, \r
-0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xCD, 0xE0, 0x04, 0xF0, 0xA1, 0x79, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x90, 0xA2, 0x20, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, 0x07, \r
-0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0xA2, 0x20, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, \r
-0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x47, 0xF9, 0xE4, 0x90, 0xA2, 0x22, 0xF0, 0x91, \r
-0x07, 0x90, 0xA2, 0x20, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, \r
-0x23, 0x12, 0x45, 0x49, 0xE0, 0xFA, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, \r
-0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, 0x0F, 0x90, \r
-0xA3, 0xCA, 0xF0, 0xAF, 0x02, 0x12, 0xAF, 0xE6, 0x90, 0xA2, 0x20, 0xE0, 0xC3, 0x13, 0x54, 0x07, \r
-0x75, 0xF0, 0x0D, 0x12, 0xAD, 0xD0, 0x90, 0xA2, 0x20, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, \r
-0xF0, 0x0D, 0x90, 0xA2, 0x2E, 0x12, 0x45, 0x49, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x31, \r
-0x4C, 0x90, 0xA2, 0x20, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xA1, 0x67, 0x90, 0x9F, \r
-0xA1, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x51, 0xB1, 0x90, 0xA3, 0x0C, 0xEE, 0xF0, 0xFC, 0xA3, \r
-0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x09, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA3, 0x13, \r
-0xF0, 0x90, 0xA3, 0x10, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA3, 0x10, 0xE0, \r
-0xFC, 0xA3, 0xE0, 0xFD, 0x51, 0x27, 0x90, 0xA3, 0x10, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA3, 0x12, 0xE0, 0xFF, 0x90, 0xA3, 0x10, 0xA3, 0xE0, 0xFE, 0x24, \r
-0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0x13, 0xE0, 0xFF, 0x74, \r
-0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x12, 0xB4, 0xB0, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x64, 0x0C, 0x60, 0x12, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x54, 0x4B, 0xE4, 0xFD, 0xFF, 0x31, \r
-0x5D, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0x73, 0x22, 0x90, 0x9F, 0xA2, 0xE0, 0xFF, 0xE4, 0xFB, 0x7D, \r
-0x01, 0x51, 0xB1, 0x90, 0xA3, 0x0D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x0B, 0xE0, 0xFC, \r
-0xA3, 0xE0, 0xFD, 0xAB, 0x07, 0x90, 0xA3, 0x10, 0xED, 0xF0, 0xEC, 0xF9, 0xE0, 0xFF, 0xAE, 0x03, \r
-0x74, 0x2A, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2B, 0x2E, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0x22, 0x7F, 0xF4, 0x12, 0x47, 0xD5, 0xEF, 0x20, \r
-0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x47, 0xD5, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, \r
-0x7F, 0x03, 0x22, 0x12, 0x4F, 0xF9, 0x90, 0x9F, 0x9C, 0xEF, 0xF0, 0x11, 0x4B, 0x90, 0x01, 0x64, \r
-0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x12, 0x47, 0xD5, 0xEF, \r
-0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0x49, 0x7F, 0x38, 0x12, 0x47, 0xD5, 0xEF, \r
-0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x46, 0x49, 0x02, 0x37, 0x99, 0x11, 0xBD, 0x11, 0xED, 0x11, \r
-0x79, 0x11, 0x98, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, \r
-0x50, 0x12, 0x46, 0x49, 0xAD, 0x0E, 0x7F, 0x51, 0x12, 0x46, 0x49, 0xAD, 0x0F, 0x7F, 0x52, 0x12, \r
-0x46, 0x49, 0xAD, 0x10, 0x7F, 0x53, 0x02, 0x46, 0x49, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, \r
-0x17, 0x07, 0x75, 0x18, 0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, \r
-0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, \r
-0x03, 0x75, 0x20, 0x62, 0x43, 0x20, 0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, \r
-0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, \r
-0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x46, 0x49, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0x49, 0xE4, \r
-0xFD, 0x7F, 0x52, 0x12, 0x46, 0x49, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x46, 0x49, 0x90, 0x01, 0x34, \r
-0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0x49, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x46, 0x49, \r
-0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0x49, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0x49, 0x90, 0x01, \r
-0xCF, 0xE0, 0x90, 0xA2, 0xF8, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, \r
-0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, \r
-0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x11, 0xBD, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, \r
-0xFD, 0x7F, 0x03, 0x12, 0x46, 0x49, 0x80, 0xFE, 0x22, 0x7F, 0x81, 0x12, 0x47, 0xD5, 0xEF, 0x54, \r
-0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x49, 0x7F, 0x80, 0x12, 0x47, 0xD5, 0xEF, 0x44, 0x80, 0xFD, \r
-0x7F, 0x80, 0x12, 0x46, 0x49, 0x12, 0x92, 0xCC, 0x12, 0x3E, 0x11, 0x12, 0x92, 0xD9, 0x12, 0x93, \r
-0x9D, 0x7F, 0x01, 0x12, 0x43, 0x45, 0x90, 0xA2, 0x1F, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0x45, \r
-0x90, 0xA2, 0x1F, 0xE0, 0x04, 0xF0, 0x11, 0x13, 0x31, 0xCA, 0x7F, 0x80, 0x12, 0x47, 0xD5, 0xEF, \r
-0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0x49, 0x75, 0x28, 0xFF, 0x12, 0x58, 0x16, 0x12, 0x93, \r
-0x1A, 0x7F, 0x81, 0x12, 0x47, 0xD5, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x49, 0x12, \r
-0x93, 0xAB, 0x12, 0xB0, 0xEE, 0xE4, 0xFF, 0x02, 0x43, 0xCE, 0x12, 0xB1, 0xA5, 0x12, 0x92, 0x03, \r
-0x12, 0x97, 0xB8, 0x12, 0xB1, 0xAB, 0x51, 0x69, 0x12, 0xB5, 0x86, 0x12, 0xB0, 0x60, 0x90, 0xA1, \r
-0xF1, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0xF8, 0x12, 0x08, 0x6D, \r
-0x90, 0xA1, 0xF8, 0x12, 0x45, 0x11, 0x90, 0xA1, 0xF4, 0x12, 0x08, 0x6D, 0xE4, 0x90, 0xA1, 0xFE, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, \r
-0x12, 0x85, 0x00, 0x12, 0x85, 0x5A, 0x90, 0xA1, 0xDA, 0x74, 0x01, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, \r
-0xA1, 0xE4, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x01, 0x12, 0x77, 0xE4, 0xE4, 0x90, 0xA2, 0x01, 0xF0, \r
-0x90, 0xA2, 0x07, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, \r
-0x54, 0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x1A, 0xF0, 0xA3, 0xF0, \r
-0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, \r
-0xF0, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xF7, 0xF0, 0x90, \r
-0xA1, 0x20, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, \r
-0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x22, 0x74, 0x08, 0xF0, 0x90, 0xA1, \r
-0x25, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x1E, 0xF0, 0x90, 0xA1, 0x16, 0xE0, \r
-0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0xFF, 0x71, 0xAD, 0x7D, 0x0C, 0x7F, 0x02, 0x71, 0xAD, 0x71, 0xA9, \r
-0x90, 0xA1, 0x16, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, \r
-0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, \r
-0x90, 0xA1, 0x45, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x90, 0x9F, 0x9C, 0xE0, 0xB4, 0x01, 0x08, 0x90, \r
-0xA1, 0x24, 0x74, 0xDD, 0xF0, 0x80, 0x12, 0x90, 0x9F, 0x9C, 0xE0, 0x90, 0xA1, 0x24, 0xB4, 0x03, \r
-0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x47, 0xD5, 0xEF, 0x54, \r
-0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x47, 0xD5, 0xEF, 0x30, 0xE2, 0x06, 0x90, 0xA1, \r
-0x45, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xAD, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, \r
-0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xA1, 0x2C, 0xF0, 0x90, 0xA1, \r
-0x45, 0xE0, 0x24, 0x04, 0x90, 0xA1, 0x2F, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, \r
-0xA1, 0xB8, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x87, 0x0D, 0xE4, 0x90, 0xA1, 0x2D, 0xF0, 0xA3, 0xF0, \r
-0x90, 0xA1, 0xB1, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, \r
-0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, \r
-0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0xE4, \r
-0x90, 0xA1, 0xB3, 0xF0, 0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xF8, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, \r
-0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, \r
-0x0C, 0x90, 0xA1, 0x1D, 0xED, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x1C, 0xED, 0xF0, 0x7F, 0x8F, 0x12, \r
-0x47, 0xD5, 0xEF, 0x30, 0xE4, 0x31, 0x90, 0xA3, 0xF8, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, \r
-0x24, 0x02, 0x70, 0x23, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, \r
-0xFF, 0x90, 0xA1, 0x1D, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0xA1, 0x1C, \r
-0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, 0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x17, 0xE0, \r
-0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0xAD, \r
-0x80, 0x0F, 0x71, 0xA5, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x0C, \r
-0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5D, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA3, 0xFA, 0xED, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x02, 0xA1, 0x94, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, \r
-0xA1, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xA1, 0x94, 0xEF, 0x70, 0x02, 0xA1, \r
-0x0B, 0x24, 0xFE, 0x70, 0x02, 0xA1, 0x44, 0x24, 0xFE, 0x60, 0x48, 0x24, 0xFC, 0x70, 0x02, 0xA1, \r
-0x7F, 0x24, 0xFC, 0x60, 0x02, 0xA1, 0x94, 0xEE, 0xB4, 0x0E, 0x02, 0xB1, 0xCE, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0xFF, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x1C, \r
-0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x0E, 0x90, 0xA3, 0xFA, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xB5, \r
-0x10, 0x80, 0x02, 0xF1, 0x66, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xA1, 0x94, 0xD1, \r
-0x62, 0xA1, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xB1, 0xFF, 0x90, 0xA1, 0x1D, \r
-0xE0, 0xB4, 0x06, 0x02, 0x91, 0x1C, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0x99, 0xBF, \r
-0x01, 0x02, 0xB1, 0xCE, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xA1, 0x94, 0xB1, 0x99, \r
-0xEF, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x94, 0xD1, 0x20, 0xA1, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, \r
-0x0E, 0x07, 0xB1, 0x99, 0xBF, 0x01, 0x02, 0xB1, 0xCE, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, \r
-0x91, 0x1C, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x07, 0xB1, 0x99, 0xBF, 0x01, 0x02, 0xD1, 0x20, \r
-0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0xB3, 0x58, 0xEF, 0x64, 0x01, 0x70, 0x54, \r
-0xD1, 0x74, 0x80, 0x50, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xB1, 0x99, 0xBF, 0x01, 0x02, \r
-0xB1, 0xCE, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x1C, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, \r
-0x0C, 0x07, 0xB1, 0x99, 0xBF, 0x01, 0x02, 0xD1, 0x20, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, \r
-0x01, 0xB1, 0xFF, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0xB5, 0x4F, 0x80, 0x15, 0x90, \r
-0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
-0xE0, 0x02, 0xD1, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xC1, 0xE0, 0x30, 0xE0, 0x0D, \r
-0x90, 0xA1, 0xC7, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x80, 0x1E, 0x12, 0xB3, 0x3F, \r
-0xBF, 0x01, 0x18, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0C, 0x90, \r
-0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, \r
-0x17, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x71, 0xA9, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, 0x44, \r
-0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0xAD, 0x90, 0x05, 0x27, 0xE0, \r
-0x44, 0x80, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5D, 0x90, \r
-0xA3, 0xF9, 0xEF, 0xF0, 0x12, 0x7E, 0xFF, 0x90, 0xA3, 0xF9, 0xE0, 0x60, 0x06, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x49, 0x5D, 0x7D, 0x04, 0x7F, 0x01, 0x71, 0xAD, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0x22, \r
-0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, \r
-0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x5D, 0x12, 0x49, 0x68, 0xBF, 0x01, 0x13, 0x90, 0xA1, 0x16, 0xE0, \r
-0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x71, 0xAD, 0x90, 0xA1, 0x15, 0x74, 0x0E, 0xF0, 0x22, \r
-0x7D, 0x2F, 0x12, 0x74, 0xD4, 0x7D, 0x08, 0x7F, 0x01, 0x71, 0xAD, 0x90, 0xA1, 0x15, 0x74, 0x08, \r
-0xF0, 0x22, 0x12, 0x7E, 0xFF, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x71, 0xA9, 0x90, 0xA1, 0x15, \r
-0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4C, 0x03, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, \r
-0x7F, 0x03, 0x12, 0x5A, 0xB2, 0x12, 0x74, 0xD9, 0xE4, 0xFD, 0x7F, 0x01, 0x71, 0xAD, 0xE4, 0x90, \r
-0xA1, 0x15, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x6A, 0xD1, 0x74, 0x90, 0x01, 0x38, 0xE0, 0x90, \r
-0xA1, 0xB9, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0xA1, 0xBA, 0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, \r
-0xA1, 0xBB, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0xA1, 0xBC, 0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, \r
-0xA1, 0xBD, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0xA1, 0xBE, 0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, \r
-0xA1, 0xBF, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0xA1, 0xC0, 0xF0, 0x90, 0x01, 0x38, 0xE4, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, \r
-0x80, 0xF0, 0x22, 0x12, 0x97, 0x1C, 0x90, 0xA1, 0xBE, 0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0xA1, \r
-0xBF, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0xA1, 0xC0, 0xE0, 0x90, 0x01, 0x33, 0xF0, 0x90, 0xA1, \r
-0xB9, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0xA1, 0xBC, 0xE0, 0x90, 0x01, 0x3B, 0xF0, 0x7F, 0x01, \r
-0xB1, 0xFF, 0x41, 0x69, 0x90, 0xA1, 0xC1, 0xE0, 0x20, 0xE0, 0x2A, 0x90, 0xA1, 0x1A, 0xE0, 0x64, \r
-0x01, 0x70, 0x22, 0x12, 0x81, 0x5C, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x0F, 0xE4, 0xFD, \r
-0x7F, 0x0C, 0x91, 0x4B, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x02, 0xB4, 0xB0, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x70, 0x02, 0x91, 0x47, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x49, 0x5D, 0x7D, 0x0C, 0x7F, 0x01, 0x61, 0xAD, 0xEF, 0x70, 0x4F, 0x7D, 0x78, 0x7F, 0x02, \r
-0x12, 0x5A, 0xD1, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x5A, 0xD1, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x62, \r
-0x7A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0x90, 0xE0, \r
-0x70, 0x14, 0x12, 0x7E, 0xFF, 0xF1, 0x66, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, \r
-0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0x91, 0x4B, 0x90, 0xA1, 0x16, 0xE0, \r
-0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, \r
-0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x5A, 0xB2, 0x7D, 0x02, 0x7F, 0x03, 0x12, \r
-0x5A, 0xB2, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, \r
-0x58, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x54, 0x4B, 0x90, 0xA1, \r
-0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0xA2, \r
-0xD0, 0xF0, 0x90, 0xA2, 0xD0, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x1D, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, 0xA1, 0x1A, 0xE0, \r
-0x60, 0x0E, 0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0x1C, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x6E, \r
-0xC2, 0xAF, 0x12, 0x93, 0x74, 0xBF, 0x01, 0x02, 0xF1, 0x9A, 0xD2, 0xAF, 0x90, 0xA2, 0x4A, 0xE0, \r
-0xB4, 0x01, 0x03, 0x12, 0xB1, 0x15, 0x12, 0x47, 0xF7, 0x12, 0x42, 0x7D, 0x80, 0xB4, 0x90, 0xA1, \r
-0x11, 0xE0, 0x90, 0xA1, 0x1C, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x80, 0x21, 0xE0, 0xFF, 0x7D, 0x01, \r
-0x02, 0x54, 0x4B, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x13, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, \r
-0x02, 0xB4, 0xB0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x11, 0x6E, 0x22, 0xAE, 0x07, 0x11, \r
-0xBD, 0xBF, 0x01, 0x16, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0A, \r
-0xAF, 0x06, 0x7D, 0x01, 0x12, 0x54, 0x4B, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, \r
-0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x54, 0x12, 0x06, 0x89, 0xFF, \r
-0x54, 0x01, 0xFE, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, \r
-0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, \r
-0x4D, 0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, \r
-0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0x11, 0xF0, \r
-0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, \r
-0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x21, \r
-0xE3, 0xE0, 0x20, 0xE0, 0x02, 0x21, 0xCA, 0x75, 0x54, 0x21, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x07, 0x51, 0xA9, 0x43, 0x54, 0x08, 0x80, 0x0C, 0xE4, 0x90, 0xA1, 0x12, 0xF0, 0xA3, 0xF0, 0x7D, \r
-0x40, 0xFF, 0x51, 0xD1, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
-0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, 0xA1, \r
-0x11, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0xA1, 0x11, 0xE0, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x90, 0x05, 0x27, 0xE5, 0x54, \r
-0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0xB1, 0xE5, 0x90, 0xA1, 0x11, 0xE0, \r
-0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x21, 0x11, 0xBD, 0xEF, \r
-0x60, 0x04, 0x7F, 0x01, 0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, \r
-0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x41, 0xA4, 0xFF, 0x12, 0xB1, \r
-0xE5, 0x41, 0xA4, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0x41, 0x70, 0x43, 0x54, 0x31, \r
-0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x51, 0xA9, 0x43, 0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, \r
-0xE4, 0xFF, 0x51, 0xD1, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
-0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x04, 0x90, 0x05, \r
-0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, \r
-0x0E, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x6B, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x22, 0x90, \r
-0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0xB5, 0x6B, \r
-0x11, 0xBD, 0xBF, 0x01, 0x09, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, \r
-0xFF, 0x12, 0x54, 0x4B, 0x80, 0x3E, 0x90, 0xA1, 0x1D, 0xE0, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x34, \r
-0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x06, \r
-0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, \r
-0x0C, 0x12, 0x54, 0x4B, 0x12, 0xB3, 0x36, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x54, \r
-0x4B, 0x12, 0xB1, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, \r
-0xE4, 0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x51, 0xD1, 0x7D, 0x01, 0x7F, \r
-0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0xE0, 0x30, 0xE0, 0x33, \r
-0x90, 0xA1, 0xB6, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, 0xB7, 0xE0, 0x60, 0x05, 0x14, 0xF0, \r
-0x02, 0x56, 0x50, 0x90, 0xA1, 0xB5, 0xE0, 0x14, 0x90, 0xA1, 0xB7, 0xF0, 0x90, 0x05, 0x73, 0x74, \r
-0x01, 0xF0, 0xE4, 0xFF, 0x12, 0x60, 0x12, 0x7D, 0x02, 0x7F, 0x02, 0x51, 0xB2, 0x7D, 0x01, 0x7F, \r
-0x02, 0x51, 0xB2, 0x22, 0x71, 0x7E, 0x90, 0xA1, 0x20, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, \r
-0x02, 0x7F, 0x02, 0x51, 0xB2, 0xF1, 0x8D, 0x80, 0xB0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, \r
-0x08, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x34, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x04, 0xEF, \r
-0x30, 0xE0, 0x0A, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x02, 0x60, 0x22, 0x71, 0xE1, 0x90, 0xA1, 0x17, \r
-0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0xA1, 0x20, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x6F, 0x70, 0x0A, 0xF1, 0xEE, 0x51, 0xC7, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0x22, 0xE4, 0x90, \r
-0xA3, 0x08, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x57, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, \r
-0x4F, 0x90, 0xA3, 0x08, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, \r
-0xE0, 0x15, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA3, 0x08, 0xF0, 0x11, 0xBD, \r
-0xEF, 0x70, 0x04, 0x90, 0xA3, 0x08, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0x60, 0x23, 0x90, 0xA1, 0x1E, \r
-0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0x90, 0xA1, 0x22, 0xE0, 0x90, 0xA3, 0xA2, \r
-0x12, 0x48, 0x20, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x54, 0x47, 0x12, 0x81, 0x5C, \r
-0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x8F, 0x90, 0xA1, 0x1A, 0xE0, 0x70, \r
-0x02, 0x81, 0x8F, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, \r
-0x06, 0xAB, 0xE0, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0xA1, 0x20, 0xF0, \r
-0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0xA1, 0x20, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, \r
-0x90, 0xA1, 0x21, 0xEF, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x87, 0x2E, 0x90, \r
-0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, \r
-0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, \r
-0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, \r
-0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0E, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xB4, \r
-0x16, 0x80, 0x02, 0x91, 0xA0, 0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
-0x0E, 0x90, 0xA1, 0x20, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0xF1, 0xEE, 0x51, 0xCD, 0x90, \r
-0xA1, 0x11, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, \r
-0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, 0x70, 0x0C, 0x90, 0xA1, 0x1E, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x01, 0x6E, 0xE5, 0x63, 0x30, 0xE6, 0x23, 0x90, 0xA1, \r
-0x1A, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, \r
-0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x6F, 0x86, 0x80, 0x0C, 0x12, 0x4F, 0x9A, 0x80, \r
-0x07, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, 0x63, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, \r
-0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x90, 0xA3, 0xA2, \r
-0x12, 0x48, 0x20, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, \r
-0x90, 0xA1, 0xDC, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x85, 0xD8, 0x80, 0x03, 0x12, 0x7C, 0x18, 0x90, \r
-0xA2, 0x07, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x08, 0xE0, 0x64, 0x08, \r
-0x70, 0x35, 0x90, 0xA2, 0x07, 0xE0, 0x30, 0xE0, 0x29, 0x90, 0xA2, 0x01, 0xE0, 0x70, 0x09, 0x90, \r
-0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, 0x7F, 0x4E, 0x12, 0x47, 0xD5, 0xEF, 0x54, 0x7F, \r
-0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x49, 0x90, 0xA2, 0x07, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, \r
-0x80, 0x05, 0xE4, 0x90, 0xA2, 0x08, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x13, 0x90, 0xA2, 0x09, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, \r
-0x9C, 0xE4, 0xF0, 0x90, 0xA2, 0x09, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0xA1, \r
-0x13, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x6E, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, \r
-0x23, 0x90, 0xA1, 0x2E, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, \r
-0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x41, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, \r
-0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x51, 0xC7, 0x90, 0xA1, 0x20, 0xE0, 0x14, 0x90, 0x05, \r
-0x73, 0xF0, 0x90, 0xA3, 0xE7, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0xA3, 0xE8, \r
-0xE0, 0x94, 0x80, 0x90, 0xA3, 0xE7, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, \r
-0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0xD1, 0x29, 0x90, 0xA1, 0xB4, 0xE0, \r
-0x30, 0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x51, 0xC7, 0x90, 0xA1, 0xB6, 0xE0, \r
-0x90, 0x05, 0x73, 0xF0, 0x22, 0xD1, 0x98, 0x7F, 0x04, 0x8F, 0x70, 0x7F, 0x02, 0x12, 0x44, 0x57, \r
-0x90, 0x9F, 0x97, 0xE0, 0x45, 0x70, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xA9, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x7F, \r
-0xA3, 0x12, 0x47, 0xD5, 0xEF, 0x54, 0xF8, 0x44, 0x05, 0xFD, 0x7F, 0xA3, 0x12, 0x46, 0x49, 0x7F, \r
-0xA0, 0x12, 0x47, 0xD5, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, \r
-0xE0, 0x13, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0x55, 0x12, 0x8A, \r
-0xA9, 0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0xD1, 0x25, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0xD1, \r
-0x25, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA3, 0x7E, 0x74, 0x15, 0xF0, 0x90, 0xA3, 0x8C, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x80, 0xEF, 0xF0, \r
-0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x7E, 0x12, 0x67, 0x5E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, \r
-0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, \r
-0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xBE, \r
-0xF0, 0x74, 0x5E, 0xA3, 0xF0, 0x12, 0x93, 0xB5, 0xE5, 0x21, 0x30, 0xE1, 0x03, 0x12, 0x94, 0x14, \r
-0xE5, 0x21, 0x30, 0xE2, 0x02, 0x11, 0x83, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0xF1, 0x7A, 0xE5, 0x22, \r
-0x30, 0xE0, 0x03, 0x12, 0x94, 0x69, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x67, 0x16, 0xE5, 0x23, \r
-0x30, 0xE0, 0x03, 0x12, 0x66, 0x8C, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xE0, 0xE5, 0x23, 0x30, \r
-0xE2, 0x0A, 0x12, 0x83, 0x7B, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, \r
-0x04, 0x7F, 0x04, 0xD1, 0x29, 0xE5, 0x24, 0x30, 0xE4, 0x02, 0x71, 0x24, 0xE5, 0x24, 0x30, 0xE5, \r
-0x03, 0x12, 0x95, 0x73, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x95, 0xAF, 0xE5, 0x24, 0x30, 0xE7, \r
-0x03, 0x12, 0x77, 0x14, 0x74, 0xBE, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5E, 0xA3, 0xF0, 0xD0, \r
-0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, \r
-0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA2, 0x20, 0xE0, 0x30, 0xE0, \r
-0x0B, 0x12, 0x62, 0x76, 0xE4, 0x90, 0xA2, 0x22, 0xF0, 0x12, 0x47, 0xF9, 0x22, 0x90, 0xA1, 0xC1, \r
-0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x79, 0xE1, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, \r
-0x19, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x0F, 0xC3, 0x13, 0x30, 0xE0, 0x08, 0x12, 0xB3, \r
-0x29, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xF1, 0xBB, 0x22, 0x90, 0xA1, 0x1D, 0xE0, 0xFF, \r
-0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0xB4, 0xF0, 0xBF, 0x01, 0x02, 0xF1, 0xCE, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x97, 0x54, 0x12, 0x96, 0xDD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x22, 0x7D, 0x01, 0x7F, 0x17, 0xC1, 0x3C, 0x12, 0x90, 0xB3, 0x7F, 0x02, 0xC1, 0x29, 0xEF, 0x14, \r
-0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, \r
-0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xB4, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, \r
-0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x5F, 0xFD, \r
-0x90, 0xA1, 0xB6, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x51, \r
-0x7A, 0x02, 0x56, 0x62, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, \r
-0xFF, 0xBF, 0x0F, 0x1B, 0x90, 0xA2, 0x20, 0xE0, 0x54, 0xFE, 0xF0, 0x51, 0x76, 0xAB, 0x51, 0xAA, \r
-0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4D, 0x1A, 0x02, 0xB0, 0x60, 0xAB, \r
-0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, \r
-0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x23, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x90, 0x00, \r
-0x02, 0x12, 0x06, 0xA2, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x24, 0x12, 0x45, \r
-0x49, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, \r
-0x54, 0x0F, 0xFE, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE3, 0x4F, \r
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA2, \r
-0x24, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, \r
-0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0xE4, 0xFB, 0x31, 0x6C, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, \r
-0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x31, \r
-0x6C, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, \r
-0x54, 0xF8, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x2C, \r
-0x12, 0x45, 0x49, 0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, \r
-0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x2D, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, \r
-0xFF, 0x14, 0x6D, 0x70, 0x26, 0x90, 0xA2, 0x21, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, \r
-0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA2, 0x20, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, \r
-0xF0, 0x44, 0x01, 0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x12, 0x5F, 0xFD, 0x22, 0x8F, 0x54, 0x8D, 0x55, \r
-0xAE, 0x03, 0x74, 0x1F, 0xC3, 0x95, 0x54, 0x40, 0x14, 0x90, 0xA2, 0xE2, 0xEE, 0xF0, 0xAB, 0x55, \r
-0xE4, 0xFD, 0x31, 0xFF, 0x90, 0xA2, 0xDE, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, \r
-0x95, 0x54, 0x40, 0x16, 0x90, 0xA2, 0xE2, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x31, \r
-0xFF, 0x90, 0xA2, 0xDE, 0xEF, 0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, \r
-0x16, 0x90, 0xA2, 0xE2, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x31, 0xFF, 0x90, 0xA2, \r
-0xDE, 0xEF, 0xF0, 0x24, 0xD0, 0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA2, \r
-0xE2, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x60, 0xAF, 0x54, 0x31, 0xFF, 0x90, 0xA2, 0xDE, 0xEF, 0xF0, \r
-0x24, 0x84, 0xFD, 0xE4, 0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x55, 0x90, 0xA2, 0x25, 0x12, \r
-0x45, 0x49, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xC3, \r
-0xEF, 0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75, 0xF0, 0x0D, 0xEB, \r
-0x90, 0xA2, 0x27, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, 0xE2, 0xE0, 0xD0, 0x82, \r
-0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE5, 0x56, 0xF0, 0x80, 0x46, 0xE5, 0x56, 0xC3, \r
-0x94, 0x10, 0x50, 0x09, 0x75, 0x57, 0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, \r
-0x94, 0x18, 0x50, 0x09, 0x75, 0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, \r
-0xE5, 0x56, 0x24, 0xE8, 0xFF, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA2, 0x27, 0x12, 0x45, 0x49, 0xC0, \r
-0x83, 0xC0, 0x82, 0x90, 0xA2, 0xE2, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, \r
-0x49, 0xEF, 0xF0, 0xAF, 0x57, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, \r
-0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x5E, 0x90, 0xA2, 0xDA, 0xEF, 0xF0, 0x12, 0x45, 0x67, \r
-0x62, 0xFB, 0x00, 0x63, 0x04, 0x01, 0x63, 0x0D, 0x02, 0x63, 0x15, 0x10, 0x63, 0x1E, 0x11, 0x63, \r
-0x26, 0x12, 0x63, 0x2E, 0x14, 0x63, 0x36, 0x20, 0x63, 0x3F, 0x21, 0x63, 0x48, 0x23, 0x63, 0x50, \r
-0x24, 0x63, 0x59, 0x25, 0x63, 0x62, 0x27, 0x63, 0x6A, 0x28, 0x63, 0x73, 0x40, 0x63, 0x7C, 0x42, \r
-0x63, 0x85, 0x44, 0x63, 0x8D, 0x60, 0x63, 0x96, 0x61, 0x63, 0x9E, 0x62, 0x63, 0xA7, 0x63, 0x63, \r
-0xAF, 0x64, 0x63, 0xB8, 0x65, 0x63, 0xC1, 0x66, 0x63, 0xC9, 0x67, 0x63, 0xD1, 0x68, 0x63, 0xDA, \r
-0x69, 0x63, 0xE3, 0x6B, 0x63, 0xEC, 0x6C, 0x00, 0x00, 0x63, 0xF5, 0x90, 0xA2, 0xDB, 0x12, 0x45, \r
-0x55, 0x02, 0x86, 0x22, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x86, 0x6E, 0x90, 0xA2, 0xDB, \r
-0x12, 0x45, 0x55, 0xC1, 0x00, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x87, 0xDE, 0x90, 0xA2, \r
-0xDB, 0x12, 0x45, 0x55, 0x01, 0x44, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x81, 0x05, 0x90, 0xA2, \r
-0xDB, 0x12, 0x45, 0x55, 0xE1, 0xD0, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x88, 0x06, 0x90, \r
-0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x89, 0xF0, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0xE1, 0xC8, \r
-0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x58, 0xC9, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, \r
-0x8A, 0x36, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x81, 0x38, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, \r
-0x02, 0x8A, 0x7F, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0xAB, 0x8D, 0x90, 0xA2, 0xDB, 0x12, \r
-0x45, 0x55, 0x02, 0x9C, 0x97, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0xA1, 0x39, 0x90, 0xA2, 0xDB, \r
-0x12, 0x45, 0x55, 0x02, 0x8B, 0x20, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x80, 0x7B, 0x90, 0xA2, \r
-0xDB, 0x12, 0x45, 0x55, 0x02, 0x5F, 0xE1, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0xE1, 0xDF, 0x90, \r
-0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x8E, 0xCB, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x8F, \r
-0x2D, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x81, 0x6B, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x81, \r
-0xC6, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x8F, 0x46, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, \r
-0x02, 0x80, 0x50, 0x90, 0xA2, 0xDB, 0x12, 0x45, 0x55, 0x02, 0x8F, 0x65, 0x90, 0xA2, 0xDB, 0x12, \r
-0x45, 0x55, 0x02, 0x90, 0x89, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA2, 0xDA, 0xE0, \r
-0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA0, 0x8F, 0xF0, 0xBF, 0x01, 0x08, \r
-0x12, 0x92, 0x11, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, 0x22, 0x90, 0xA1, 0xE7, 0xE0, 0x44, 0x04, 0xF0, \r
-0x7D, 0x01, 0x7F, 0x23, 0x12, 0x5E, 0x3C, 0x8F, 0x51, 0xE5, 0x51, 0xB4, 0x03, 0x09, 0xE4, 0xFF, \r
-0x12, 0x72, 0xEC, 0x7F, 0x04, 0x91, 0xAB, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA1, \r
-0xB4, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xB5, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xB6, 0xF0, 0x90, 0xA1, 0xB5, 0xE0, 0x90, 0xA1, \r
-0xB7, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x54, 0x01, 0xFF, 0x01, 0x12, 0x90, 0xA2, 0xDE, 0x12, 0x45, \r
-0x5E, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x0A, 0xF0, 0x90, 0x00, \r
-0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x0B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, \r
-0x0C, 0xF0, 0x90, 0xA1, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x12, \r
-0x5E, 0x38, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, 0x91, 0xAB, 0x22, 0x90, 0xA3, 0xF4, 0xEF, 0xF0, \r
-0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x90, 0xA3, 0xF4, 0xE0, 0xFE, 0xEF, \r
-0x4E, 0x90, 0x9F, 0x97, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, \r
-0x90, 0xA2, 0xDE, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xDF, 0xF0, 0x90, 0x00, \r
-0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xE0, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, \r
-0xE1, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xE2, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x90, 0xA1, 0xE7, 0xE0, 0x44, 0x40, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x7D, 0x07, \r
-0x7F, 0x30, 0x12, 0x5E, 0x3C, 0x8F, 0x51, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, \r
-0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA2, 0xDE, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0x12, 0x80, 0xFD, \r
-0x7F, 0x04, 0x91, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x5E, 0xE4, \r
-0x90, 0xA2, 0xE3, 0xF0, 0xFD, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x8D, 0x82, 0x75, 0x83, 0x00, \r
-0x12, 0x06, 0xA2, 0xF4, 0x60, 0x4D, 0x90, 0xA2, 0xE3, 0xE0, 0xFF, 0x90, 0xA2, 0xDE, 0x12, 0x45, \r
-0x55, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, \r
-0x12, 0x45, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFC, 0xA8, 0x05, 0x08, 0x80, 0x02, \r
-0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x90, 0xA2, 0xE3, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, \r
-0x12, 0x45, 0x49, 0xE0, 0xFF, 0x74, 0xE4, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x80, 0x0D, 0x74, 0xE4, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0xFF, 0xF0, \r
-0x0D, 0xED, 0xB4, 0x07, 0x90, 0x90, 0xA2, 0xE1, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0xEF, 0x74, 0x08, \r
-0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xE1, 0xF1, 0x5E, 0x7F, 0x04, 0x81, 0xAB, 0x90, 0xA2, 0xE9, \r
-0x74, 0x12, 0xF0, 0x90, 0xA2, 0xF7, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0xA3, 0xED, \r
-0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xE7, 0xE0, 0x90, 0xA2, 0xEE, 0xF0, 0x90, 0xA2, 0xE8, 0xE0, \r
-0x90, 0xA2, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xE9, 0xF1, 0x5E, 0x7F, 0x04, 0x81, 0xAB, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, \r
-0xFF, 0x90, 0xA1, 0x10, 0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, \r
-0x60, 0x22, 0x80, 0x1E, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0x64, 0x01, 0x60, 0x10, 0x90, 0xA1, 0x11, 0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0xB1, 0xE5, \r
-0x80, 0x02, 0xD1, 0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0xA1, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0C, 0x12, 0x58, 0xBD, 0xBF, 0x01, \r
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB1, 0xE5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC3, \r
-0x13, 0x30, 0xE0, 0x02, 0xD1, 0x49, 0x12, 0x81, 0x96, 0x02, 0x5F, 0x8D, 0x90, 0xA1, 0x11, 0xE0, \r
-0xFF, 0x30, 0xE0, 0x3D, 0x90, 0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, \r
-0xA1, 0x14, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x23, 0xEF, 0xC3, \r
-0x13, 0x30, 0xE0, 0x02, 0x80, 0x93, 0xD1, 0xD2, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x06, 0xE4, \r
-0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x54, \r
-0x4B, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, \r
-0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x54, 0x4B, 0x90, 0xA1, \r
-0x15, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xD1, 0xF9, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x60, \r
-0x14, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x0C, 0x12, 0xB3, 0x3F, 0xEF, 0x70, 0x06, 0xFD, \r
-0x7F, 0x0C, 0x12, 0x54, 0x4B, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0xA1, \r
-0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, 0xE0, 0x7D, 0x00, 0xB4, \r
-0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0xC1, 0x49, \r
-0x12, 0xB3, 0xC7, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, \r
-0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x54, 0x4B, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, \r
-0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, \r
-0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, \r
-0x90, 0xA0, 0x8C, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xA8, \r
-0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0xA0, 0x8C, \r
-0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, \r
-0xA0, 0x8C, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x24, 0xF0, 0x22, \r
-0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x4B, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x90, \r
-0xA1, 0xE7, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x5E, 0x3C, 0x90, 0xA2, 0xDE, \r
-0xEF, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0x7E, 0x90, 0xA2, 0xD9, 0xEF, \r
-0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x97, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0A, 0x54, 0xFE, \r
-0xF0, 0xE4, 0xFF, 0x31, 0x79, 0x12, 0xA0, 0xC5, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, \r
-0xFF, 0x30, 0xE1, 0x05, 0x54, 0xFD, 0xF0, 0x11, 0xA1, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, \r
-0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0x4F, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, \r
-0x97, 0xE0, 0xFF, 0x30, 0xE6, 0x05, 0x54, 0xBF, 0xF0, 0x51, 0xE3, 0xD2, 0xAF, 0x80, 0xB4, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xFE, 0x90, 0xA0, 0x8B, \r
-0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x2C, \r
-0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, \r
-0x06, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0xA0, 0x8B, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, \r
-0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF4, 0xE0, 0xFF, 0x90, 0x9F, 0xF3, \r
-0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x44, 0x90, 0x9F, 0xF3, \r
-0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, \r
-0x08, 0xA4, 0x24, 0xA4, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x62, \r
-0x92, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, \r
-0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x12, 0x90, 0xB3, 0x90, 0x9F, 0x97, 0xE0, 0x44, 0x02, \r
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xBF, \r
-0x12, 0x45, 0x5E, 0x7F, 0x96, 0x7E, 0x02, 0x71, 0x0B, 0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, \r
-0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, \r
-0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA3, 0xC2, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, \r
-0xA3, 0xC2, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xBF, 0x12, 0x45, \r
-0x55, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x71, 0x61, 0x90, \r
-0xA3, 0xC2, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA3, 0xBF, 0x12, 0x45, 0x55, 0x71, 0xBC, 0x90, 0x02, \r
-0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x4C, 0xEF, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x47, 0x74, 0x4E, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, \r
-0x49, 0xE0, 0x90, 0xA2, 0x4D, 0x30, 0xE7, 0x0E, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
-0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x14, 0xE0, 0xFF, 0x51, 0xD4, 0x90, 0xA2, 0x4D, 0xE0, 0x24, 0x4E, \r
-0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0x04, 0xF0, \r
-0x80, 0xAF, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA2, 0x4D, 0xF0, 0x90, 0xA2, \r
-0x4D, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x41, 0xCF, 0x74, 0x4E, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0xC7, 0x90, 0xA2, 0x4D, 0xE0, 0xFF, 0x75, 0xF0, \r
-0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x07, \r
-0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x4D, 0xE0, 0xFC, 0x25, 0xE0, 0x24, 0x01, \r
-0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, \r
-0x90, 0x81, 0x0A, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0B, 0x12, \r
-0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x4D, 0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, \r
-0x12, 0x45, 0x49, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA2, 0x4D, 0xE0, 0xFE, 0x75, \r
-0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
-0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0x75, 0xF0, \r
-0x02, 0xEF, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xCB, 0x90, \r
-0xA2, 0x4D, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x74, \r
-0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0xFF, \r
-0x90, 0xA2, 0x4C, 0xE0, 0xFD, 0x91, 0x35, 0x90, 0xA2, 0x4D, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, \r
-0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x4D, 0xE0, 0x04, 0xF0, 0x21, 0xDE, 0x22, \r
-0xE4, 0xFF, 0x21, 0x79, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, 0x44, \r
-0x40, 0xF0, 0x22, 0xE4, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x0A, 0x12, 0x5E, 0x38, 0xEF, 0xB4, 0x02, \r
-0x19, 0x90, 0xA3, 0xD3, 0xE0, 0x64, 0x04, 0x60, 0x0C, 0x7F, 0x40, 0x12, 0x64, 0xAB, 0x90, 0xA3, \r
-0xD3, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xD3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA3, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
-0xA3, 0xB7, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, \r
-0xBA, 0xE0, 0x94, 0xE8, 0x90, 0xA3, 0xB9, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, \r
-0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0xB9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, \r
-0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, \r
-0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, \r
-0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, \r
-0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, 0xBB, 0xEF, \r
-0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x90, 0xA3, 0xDB, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, \r
-0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, \r
-0x02, 0xC0, 0x01, 0x90, 0xA3, 0xBC, 0x12, 0x45, 0x55, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, \r
-0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA3, 0xBB, 0xE0, 0x24, \r
-0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, \r
-0x45, 0x55, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA3, \r
-0xBC, 0x12, 0x45, 0x55, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, \r
-0xD0, 0x03, 0x02, 0x35, 0x26, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, \r
-0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, \r
-0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, \r
-0x8D, 0x05, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, \r
-0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x45, \r
-0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, \r
-0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, \r
-0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xBF, 0x44, 0x80, \r
-0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, \r
-0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, \r
-0x01, 0xC4, 0x74, 0xC2, 0xF0, 0x74, 0x6C, 0xA3, 0xF0, 0xF1, 0xB1, 0xE5, 0x19, 0x30, 0xE1, 0x02, \r
-0xD1, 0x70, 0xE5, 0x19, 0x30, 0xE4, 0x03, 0x12, 0x5F, 0xE7, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, \r
-0x51, 0x1E, 0xE5, 0x19, 0x30, 0xE6, 0x02, 0xF1, 0x13, 0xE5, 0x1B, 0x30, 0xE0, 0x03, 0x12, 0x66, \r
-0x6F, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x5D, 0x10, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x5B, \r
-0x39, 0xE5, 0x1B, 0x30, 0xE3, 0x02, 0xF1, 0x5D, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x93, 0xE5, \r
-0xE5, 0x1B, 0x30, 0xE5, 0x02, 0xD1, 0xF6, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0xF1, 0x20, 0xE5, 0x1C, \r
-0x30, 0xE1, 0x02, 0xF1, 0x3C, 0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0xD0, 0xE5, 0x1C, 0x30, 0xE5, \r
-0x02, 0xB1, 0x79, 0x74, 0xC2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6C, 0xA3, 0xF0, 0xD0, 0x07, \r
-0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, \r
-0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x63, 0x74, 0x90, 0x25, 0x63, \r
-0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0xC1, 0x64, 0xE5, 0x63, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, \r
-0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0x64, 0x75, 0xF0, \r
-0x10, 0xE5, 0x63, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, \r
-0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, \r
-0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x7C, 0xEF, 0x30, 0xE6, 0x21, 0x75, 0xF0, 0x10, 0xE5, \r
-0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, \r
-0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, 0x52, 0x74, 0x96, 0x25, \r
-0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x96, 0x25, 0x63, 0xF5, \r
-0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, 0xAF, 0x63, 0x12, 0x9C, \r
-0x20, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x24, \r
-0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, \r
-0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, \r
-0x63, 0x12, 0x9A, 0x10, 0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0xA1, 0x7C, 0x22, \r
-0xE4, 0xFF, 0x90, 0xA2, 0xF8, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0xF5, \r
-0x65, 0x65, 0x64, 0x60, 0x70, 0x90, 0xA2, 0xF9, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0x07, 0x74, 0x08, \r
-0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, 0x08, \r
-0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0xFB, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA2, \r
-0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, \r
-0xF9, 0x12, 0x67, 0x5E, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, \r
-0x65, 0x90, 0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA2, 0xF8, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, \r
-0x5E, 0x29, 0x12, 0x64, 0xAB, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0xA1, 0x1A, \r
-0xE0, 0x60, 0x0F, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, 0x77, 0x12, \r
-0x4F, 0x9A, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, \r
-0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0x1E, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x6E, 0x22, 0x90, 0xA1, 0x1A, 0xE0, \r
-0x70, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x09, \r
-0x12, 0x58, 0xBD, 0xBF, 0x01, 0x06, 0x02, 0x66, 0xF9, 0x12, 0x57, 0x34, 0x22, 0x90, 0xA0, 0x90, \r
-0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, \r
-0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x90, \r
-0xA3, 0xA2, 0x12, 0x48, 0x20, 0x22, 0x90, 0xA1, 0xB2, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x20, \r
-0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, \r
-0x4A, 0xB1, 0x90, 0xA3, 0xF1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, \r
-0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, \r
-0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, \r
-0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0xC0, 0xE0, \r
-0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xDE, 0x90, \r
-0x01, 0xC4, 0xED, 0xF0, 0x74, 0x6F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, \r
-0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, \r
-0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, \r
-0x0F, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x11, 0x84, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0x65, 0x74, \r
-0x0F, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x47, \r
-0xD5, 0xEF, 0x20, 0xE6, 0x0E, 0x7F, 0x05, 0x12, 0x47, 0xD5, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, \r
-0x12, 0x46, 0x49, 0x22, 0x7F, 0x54, 0x12, 0x47, 0xD5, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, \r
-0x12, 0x47, 0xD5, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x12, 0x47, 0xD5, 0xE5, 0x0F, 0x5F, \r
-0xF5, 0x13, 0x7F, 0x57, 0x12, 0x47, 0xD5, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, \r
-0x12, 0x46, 0x49, 0xAD, 0x12, 0x7F, 0x55, 0x12, 0x46, 0x49, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x46, \r
-0x49, 0xAD, 0x14, 0x7F, 0x57, 0x12, 0x46, 0x49, 0x53, 0x91, 0xEF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, \r
+0x00, 0x41, 0xA1, 0xE9, 0x00, 0x41, 0xA1, 0xEA, 0x00, 0x41, 0xA1, 0xEB, 0x00, 0x41, 0xA1, 0xEF, \r
+0x00, 0x01, 0x70, 0x00, 0x41, 0xA1, 0xF0, 0x00, 0x41, 0xA1, 0xF1, 0x00, 0x41, 0xA2, 0x13, 0x00, \r
+0x59, 0x55, 0x51, 0xD7, 0x61, 0x3F, 0x7F, 0x02, 0xD1, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, \r
+0xD1, 0xAC, 0x7F, 0x02, 0xD1, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, \r
+0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xA3, 0xD1, 0xD6, 0xEF, 0x54, 0xF8, 0x44, 0x05, 0xFD, \r
+0x7F, 0xA3, 0xD1, 0xAC, 0x7F, 0xA0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, \r
+0x83, 0x00, 0xE0, 0x90, 0xA2, 0x09, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, \r
+0x09, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5C, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4C, 0x08, 0xD1, 0xA2, 0xD1, 0x96, 0xD1, 0x96, 0x90, 0x01, 0x00, \r
+0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, \r
+0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x5A, 0xD8, \r
+0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x33, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x08, \r
+0x90, 0xA2, 0x01, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x01, 0xF0, 0xEF, 0xC4, 0x13, \r
+0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x02, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x02, 0x74, \r
+0x02, 0xF0, 0x90, 0xA2, 0x01, 0x12, 0x87, 0xB8, 0x7F, 0x01, 0x12, 0x5A, 0xD8, 0x90, 0x9F, 0xBA, \r
+0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0xD1, 0xD6, 0xE5, 0x0D, \r
+0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0xD6, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0xD1, 0xD6, \r
+0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, 0xD6, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, \r
+0x7F, 0x54, 0xD1, 0xAC, 0xAD, 0x12, 0x7F, 0x55, 0xD1, 0xAC, 0xAD, 0x13, 0x7F, 0x56, 0xD1, 0xAC, \r
+0xAD, 0x14, 0x7F, 0x57, 0xD1, 0xAC, 0x53, 0x91, 0xEF, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, \r
+0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0xD1, 0xAC, 0xAD, 0x0E, 0x7F, 0x51, 0xD1, 0xAC, \r
+0xAD, 0x0F, 0x7F, 0x52, 0xD1, 0xAC, 0xAD, 0x10, 0x7F, 0x53, 0xC1, 0xAC, 0x7F, 0x01, 0x7E, 0x00, \r
+0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0xD1, 0xD6, 0xEF, 0x20, 0xE6, 0x0C, 0x7F, 0x05, 0xD1, 0xD6, 0xEF, \r
+0x44, 0x80, 0xFD, 0x7F, 0x05, 0xD1, 0xAC, 0x22, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, \r
+0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x36, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0xEF, \r
+0x90, 0xA0, 0x35, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, 0x90, 0xA1, 0xAE, 0xEE, 0xF0, \r
+0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
+0xAA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, \r
+0x12, 0x36, 0x3E, 0x90, 0xA1, 0xAA, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3, \r
+0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x29, 0xE0, 0x30, 0xE0, 0x79, \r
+0x90, 0xA0, 0x2B, 0xE0, 0x70, 0x3B, 0x7D, 0x16, 0x7F, 0x6F, 0x31, 0x5C, 0x91, 0x08, 0x90, 0xA0, \r
+0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x11, 0xDA, 0x90, 0xA0, 0x29, 0xE0, 0xC3, \r
+0x13, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x34, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x01, 0xF0, \r
+0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0xA3, 0x74, 0x03, 0x11, 0x1F, 0x90, 0xA0, 0x2B, 0x74, 0x01, 0xF0, \r
+0x22, 0x90, 0xA0, 0x2B, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, \r
+0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x34, 0x12, 0x45, 0xA9, 0xE0, 0x30, 0xE0, 0x18, 0x75, \r
+0xF0, 0x0E, 0xEF, 0x11, 0xDA, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB, \r
+0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x01, 0x27, 0xD1, 0x51, 0x22, 0x90, 0xA0, 0x38, 0x12, 0x45, 0xA9, \r
+0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB0, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2D, 0x90, 0x05, \r
+0x22, 0xE0, 0x90, 0xA1, 0xB5, 0xF0, 0x7D, 0x14, 0x91, 0x04, 0xBF, 0x01, 0x13, 0x51, 0xA6, 0x90, \r
+0xA1, 0xB3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0x51, 0x26, \r
+0x90, 0xA1, 0xB5, 0xE0, 0xFF, 0x7D, 0x15, 0x31, 0x5C, 0x80, 0x13, 0x51, 0xA6, 0x90, 0xA1, 0xB3, \r
+0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0x51, 0x26, 0x90, 0x04, \r
+0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x38, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xE6, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, \r
+0xF0, 0x90, 0x9D, 0x97, 0xED, 0xF0, 0x22, 0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, \r
+0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xBB, 0xEF, 0xF0, 0xA3, 0xED, \r
+0xF0, 0x90, 0x9D, 0x95, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x42, 0x90, 0x05, 0x22, \r
+0xE0, 0x90, 0xA1, 0xBF, 0xF0, 0x7D, 0x26, 0x91, 0x04, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0x51, 0x09, \r
+0x90, 0xA0, 0x29, 0xE0, 0x20, 0xE0, 0x1A, 0x80, 0x15, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x30, 0xE0, 0x0C, 0x51, 0x09, 0x90, 0xA0, 0x29, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xB6, \r
+0xDD, 0x90, 0xA1, 0xBF, 0xE0, 0xFF, 0x7D, 0x27, 0x31, 0x5C, 0x12, 0xB7, 0x69, 0x80, 0x0F, 0x12, \r
+0xB7, 0x69, 0x51, 0x09, 0x90, 0xA0, 0x29, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xB6, 0xDD, 0x90, 0x9F, \r
+0xCA, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, \r
+0x0B, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x28, 0x31, 0x5C, 0x90, 0x04, 0x1F, 0x74, \r
+0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9D, 0x9B, 0xE0, 0xFF, 0x90, 0xA1, \r
+0xBC, 0xE0, 0xFB, 0x7D, 0x01, 0x51, 0xB0, 0x90, 0xA1, 0xBD, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, \r
+0xFD, 0x90, 0xA1, 0xBB, 0xE0, 0xFF, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x44, 0x80, 0xF0, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, 0x9F, \r
+0xE1, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, \r
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA1, 0xB0, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF6, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, \r
+0xA1, 0xF5, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xB8, 0x21, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA1, \r
+0xF5, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA1, 0xF6, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xF7, 0xE0, 0x25, 0xE0, 0x25, 0xE0, \r
+0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, \r
+0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, \r
+0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE5, \r
+0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x30, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xE8, 0xF0, \r
+0x7D, 0x29, 0x91, 0x04, 0xBF, 0x01, 0x16, 0x90, 0x9D, 0x9C, 0x51, 0xAA, 0x90, 0xA1, 0xE6, 0xEE, \r
+0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xE5, 0xE0, 0xFF, 0x51, 0x26, 0x90, 0xA1, 0xE8, \r
+0xE0, 0xFF, 0x7D, 0x2A, 0x31, 0x5C, 0x80, 0x16, 0x90, 0x9D, 0x9C, 0x51, 0xAA, 0x90, 0xA1, 0xE6, \r
+0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xE5, 0xE0, 0xFF, 0x51, 0x26, 0x90, 0x04, \r
+0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0xA1, 0xC0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05, \r
+0x22, 0xE0, 0x90, 0xA1, 0xC4, 0xF0, 0x7D, 0x36, 0x91, 0x04, 0xBF, 0x01, 0x03, 0x12, 0xB7, 0xD4, \r
+0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0x7D, 0x37, 0x31, 0x5C, 0x80, 0x03, 0x12, 0xB7, 0xD4, 0x90, 0x05, \r
+0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x38, 0x31, 0x5C, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x31, 0x5C, 0xE4, 0x90, 0xA2, 0x03, 0xF0, 0xA3, 0xF0, 0x90, \r
+0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, \r
+0x03, 0x7F, 0x01, 0x22, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x15, \r
+0xD3, 0x90, 0xA2, 0x04, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x03, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, \r
+0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA2, 0x04, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0x03, 0xE0, \r
+0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, \r
+0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, 0x03, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, \r
+0x9E, 0x90, 0xA1, 0x16, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, \r
+0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0x1B, 0xF0, 0x7D, 0x01, 0x91, 0x04, 0xEF, 0x64, \r
+0x01, 0x70, 0x02, 0xD1, 0xEF, 0x90, 0xA1, 0x1B, 0xE0, 0xFF, 0x7D, 0x02, 0x31, 0x5C, 0x80, 0x02, \r
+0xD1, 0xEF, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x15, 0xEF, 0xF0, 0xA3, 0xED, \r
+0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0D, \r
+0x90, 0xA1, 0x16, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x5C, 0x90, 0xA1, 0x15, \r
+0xE0, 0x70, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x7D, 0x05, 0x31, 0x72, 0x80, 0x26, 0x90, 0xA1, \r
+0x15, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x71, 0x56, 0x80, 0x16, 0x90, 0xA1, \r
+0x15, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA0, 0x24, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x71, 0xB9, 0x90, 0xA0, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0A, \r
+0x90, 0xA1, 0x16, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x5C, 0x22, 0x8F, 0x54, 0x7D, 0x17, 0x91, \r
+0x04, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x90, 0xA0, 0x2C, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x75, 0xF0, \r
+0x0E, 0xE5, 0x54, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, \r
+0x13, 0x54, 0x07, 0xFB, 0x90, 0xA0, 0x29, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0xF0, \r
+0xAF, 0x04, 0x12, 0xB0, 0x18, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x12, 0xAE, 0x02, 0x75, 0xF0, 0x0E, \r
+0xE5, 0x54, 0x31, 0x4B, 0xAD, 0x54, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0xA1, 0xE1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, 0xC3, \r
+0x94, 0x02, 0x40, 0x02, 0xC1, 0x4C, 0x90, 0xA1, 0xE2, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0x90, 0xA0, \r
+0x2E, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, \r
+0x82, 0x8C, 0x83, 0xE0, 0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xE1, 0xE0, 0x60, 0x31, 0x90, 0xA1, \r
+0xE4, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x90, 0xA0, 0x30, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, \r
+0x82, 0x90, 0xA1, 0xE3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0, \r
+0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x33, 0x90, \r
+0xA1, 0xE4, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x30, 0x12, 0x45, \r
+0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, \r
+0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0xF4, 0x5F, 0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x75, \r
+0xF0, 0x0E, 0x90, 0xA0, 0x2E, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE3, 0xE0, \r
+0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, \r
+0x8C, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0xA1, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x90, 0xA0, 0x29, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, \r
+0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0xA0, 0x29, 0xE0, 0xFE, 0xC3, 0x13, 0x54, \r
+0x07, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x47, 0xF8, 0xE4, 0x90, 0xA0, 0x2B, 0xF0, \r
+0x91, 0x08, 0x90, 0xA0, 0x29, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0E, 0x90, \r
+0xA0, 0x2C, 0x12, 0x45, 0xA9, 0xE0, 0xFA, 0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, 0x2D, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, 0x0F, \r
+0x90, 0xA1, 0xE0, 0xF0, 0xAF, 0x02, 0x12, 0xB0, 0x18, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, \r
+0x07, 0x75, 0xF0, 0x0E, 0x12, 0xAE, 0x02, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, \r
+0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x37, 0x12, 0x45, 0xA9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0E, 0xEF, \r
+0x31, 0x4B, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xA1, 0x68, 0x90, \r
+0x9D, 0x9D, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x51, 0xB0, 0x90, 0xA1, 0x19, 0xEE, 0xF0, 0xFC, \r
+0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA1, \r
+0x20, 0xF0, 0x90, 0xA1, 0x1D, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0x1D, \r
+0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x51, 0x26, 0x90, 0xA1, 0x1D, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA1, 0x1F, 0xE0, 0xFF, 0x90, 0xA1, 0x1D, 0xA3, 0xE0, 0xFE, \r
+0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0x20, 0xE0, 0xFF, \r
+0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x12, 0xB5, 0x5E, 0x90, 0x9F, \r
+0x1A, 0xE0, 0x64, 0x0C, 0x60, 0x12, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x52, 0x40, 0xE4, 0xFD, 0xFF, \r
+0x31, 0x5C, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0x72, 0x22, 0x12, 0x5D, 0x10, 0xE4, 0xFD, 0xFF, 0x31, \r
+0x5C, 0x90, 0x9F, 0x11, 0x74, 0x01, 0xF0, 0x22, 0x7D, 0x12, 0x7F, 0xFF, 0x31, 0x5C, 0x7F, 0x01, \r
+0x12, 0x5A, 0xD8, 0x90, 0xA0, 0x09, 0xE0, 0xFF, 0xE4, 0xFD, 0x02, 0x87, 0xBD, 0xF1, 0xB9, 0x90, \r
+0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x9F, 0x11, 0xF0, 0x22, 0x12, 0xB4, 0x1F, 0x80, \r
+0xEE, 0xF1, 0xF5, 0x80, 0xEA, 0xE4, 0xFD, 0xFF, 0x31, 0x5C, 0x90, 0x9F, 0x11, 0x74, 0x01, 0xF0, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE6, \r
+0x02, 0x21, 0x3E, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x6E, 0x7F, 0x8D, 0x12, 0x46, 0xD6, 0x90, 0x00, \r
+0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, 0x60, 0x0C, 0x24, 0x03, 0x60, 0x02, 0x21, 0x2E, 0xAF, \r
+0x6E, 0x31, 0x71, 0x21, 0x2E, 0x74, 0x92, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, \r
+0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x15, 0x12, \r
+0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, \r
+0xE5, 0x6E, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, \r
+0x0D, 0xE4, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, \r
+0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, \r
+0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, \r
+0x6E, 0x90, 0x96, 0x13, 0x31, 0x43, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x14, 0x12, 0x45, \r
+0xA9, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, \r
+0x6E, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0x31, 0x49, 0x75, 0xF0, \r
+0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x49, \r
+0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x01, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, \r
+0x89, 0x02, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0x31, 0x43, 0x75, 0xF0, \r
+0x08, 0xE5, 0x6E, 0x90, 0x89, 0x04, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x49, \r
+0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x05, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, \r
+0x89, 0x06, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x07, 0x31, 0x43, 0x7F, 0x8F, \r
+0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46, 0xAC, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, \r
+0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, \r
+0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x05, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, \r
+0x46, 0xD6, 0xEF, 0x30, 0xE6, 0x4C, 0x7F, 0x8D, 0x12, 0x46, 0xD6, 0xEF, 0x64, 0x01, 0x70, 0x42, \r
+0x90, 0xA2, 0x06, 0xF0, 0x90, 0xA2, 0x06, 0xE0, 0xFD, 0x90, 0xA2, 0x05, 0xE0, 0x75, 0xF0, 0x10, \r
+0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, \r
+0xE0, 0xFB, 0xE4, 0xFF, 0x31, 0x49, 0x90, 0xA2, 0x06, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, \r
+0x40, 0xD2, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, \r
+0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA0, 0xDD, 0xF0, 0x90, 0xA0, 0xDD, 0xE0, \r
+0x64, 0x01, 0xF0, 0x24, 0xD7, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x51, 0xA3, 0xF0, 0x12, 0x3E, 0x44, \r
+0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0E, 0x90, 0x9F, 0x1A, 0xE0, \r
+0xFF, 0x90, 0x9F, 0x19, 0xE0, 0x6F, 0x60, 0x02, 0x51, 0x28, 0xC2, 0xAF, 0x12, 0x99, 0xC9, 0xBF, \r
+0x01, 0x03, 0x12, 0x8D, 0x41, 0xD2, 0xAF, 0x90, 0xA0, 0x56, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0xB2, \r
+0x00, 0x11, 0x01, 0x12, 0x42, 0xDD, 0x80, 0xB4, 0x90, 0x9F, 0x0E, 0xE0, 0x90, 0x9F, 0x19, 0x30, \r
+0xE0, 0x04, 0xE0, 0xFF, 0xC1, 0x1D, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x10, 0xED, 0xF0, 0x90, 0x9F, 0x13, 0xE0, \r
+0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0x89, 0xEE, 0xC4, 0x13, 0x13, 0x13, \r
+0x54, 0x01, 0x30, 0xE0, 0x02, 0x61, 0x89, 0x90, 0x9F, 0x1A, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61, \r
+0x89, 0xEF, 0x70, 0x02, 0x61, 0x00, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x39, 0x24, 0xFE, 0x60, 0x48, \r
+0x24, 0xFC, 0x70, 0x02, 0x61, 0x74, 0x24, 0xFC, 0x60, 0x02, 0x61, 0x89, 0xEE, 0xB4, 0x0E, 0x02, \r
+0x71, 0xED, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x1E, 0x90, 0x9F, 0x1A, 0xE0, \r
+0xB4, 0x06, 0x02, 0x71, 0xC2, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x04, 0x0E, 0x90, 0xA2, 0x10, 0xE0, \r
+0xFF, 0x60, 0x05, 0x12, 0xB6, 0x0E, 0x80, 0x02, 0xF1, 0xD5, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x08, \r
+0x60, 0x02, 0x61, 0x89, 0xD1, 0x0B, 0x61, 0x89, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, \r
+0x91, 0x1E, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xC2, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, \r
+0x0E, 0x07, 0x71, 0x8E, 0xBF, 0x01, 0x02, 0x71, 0xED, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x0C, 0x60, \r
+0x02, 0x61, 0x89, 0x71, 0x8E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0x89, 0x91, 0xB6, 0x61, 0x89, \r
+0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0x8E, 0xBF, 0x01, 0x02, 0x71, 0xED, 0x90, 0x9F, \r
+0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xC2, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x8E, \r
+0xBF, 0x01, 0x02, 0x91, 0xB6, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0xB5, 0x9E, \r
+0xEF, 0x64, 0x01, 0x70, 0x54, 0xD1, 0x3D, 0x80, 0x50, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0E, 0x07, \r
+0x71, 0x8E, 0xBF, 0x01, 0x02, 0x71, 0xED, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xC2, \r
+0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x8E, 0xBF, 0x01, 0x02, 0x91, 0xB6, 0x90, 0x9F, \r
+0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x1E, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x04, 0x1A, 0x12, \r
+0xB6, 0x4D, 0x80, 0x15, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x9F, 0x14, 0xE0, 0xFF, \r
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0x6D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, \r
+0xCA, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x9F, 0xD0, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, \r
+0x80, 0x1D, 0xF1, 0xF0, 0xBF, 0x01, 0x18, 0x90, 0x9F, 0x13, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x20, 0xE0, 0x0C, 0x90, 0x9F, 0x19, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, \r
+0x00, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0, \r
+0x7D, 0x04, 0x7F, 0x01, 0x91, 0x47, 0x80, 0x0F, 0x91, 0x3F, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F, \r
+0xF0, 0x90, 0x9F, 0x12, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5C, 0x90, 0x9F, 0x14, \r
+0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x91, 0x43, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, \r
+0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x91, 0x47, 0x90, 0x05, 0x27, 0xE0, 0x44, \r
+0x80, 0xF0, 0x90, 0x9F, 0x12, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5C, 0x90, 0xA2, \r
+0x0F, 0xEF, 0xF0, 0x12, 0x5D, 0x10, 0x90, 0xA2, 0x0F, 0xE0, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, \r
+0x49, 0x5C, 0x7D, 0x04, 0x7F, 0x01, 0x91, 0x47, 0x90, 0x9F, 0x12, 0x74, 0x04, 0xF0, 0x22, 0xE0, \r
+0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, \r
+0x0E, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, \r
+0xFF, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x9F, 0x1A, 0xED, 0xF0, \r
+0x80, 0x05, 0x90, 0x9F, 0x19, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE4, 0x31, \r
+0x90, 0xA2, 0x0E, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x9F, \r
+0x13, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x9F, 0x1A, 0xE0, 0x54, \r
+0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x9F, 0x19, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, \r
+0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90, 0x9F, \r
+0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x12, 0x49, 0x67, 0xBF, \r
+0x01, 0x13, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x91, 0x47, 0x90, \r
+0x9F, 0x12, 0x74, 0x0E, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, \r
+0x79, 0x13, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, \r
+0xBD, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0x16, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x1D, 0x14, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, 0x22, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x9F, \r
+0x4E, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0x2C, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xFD, 0xFF, 0x91, \r
+0x47, 0x7D, 0x0C, 0x7F, 0x02, 0x91, 0x47, 0x91, 0x43, 0x90, 0x9D, 0x98, 0xE0, 0xB4, 0x01, 0x08, \r
+0x90, 0x9F, 0x21, 0x74, 0xDD, 0xF0, 0x80, 0x12, 0x90, 0x9D, 0x98, 0xE0, 0x90, 0x9F, 0x21, 0xB4, \r
+0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x46, 0xD6, 0xEF, \r
+0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE2, 0x06, 0x90, \r
+0x9F, 0x4E, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0xB6, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, \r
+0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x9F, 0x4E, 0xE0, 0x24, 0x04, \r
+0x90, 0x9F, 0x2C, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0x90, \r
+0x01, 0x38, 0xE0, 0x90, 0x9F, 0xC2, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0x9F, 0xC3, 0xF0, 0x90, \r
+0x01, 0x3A, 0xE0, 0x90, 0x9F, 0xC4, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0x9F, 0xC5, 0xF0, 0x90, \r
+0x01, 0x30, 0xE0, 0x90, 0x9F, 0xC6, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0x9F, 0xC7, 0xF0, 0x90, \r
+0x01, 0x32, 0xE0, 0x90, 0x9F, 0xC8, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0x9F, 0xC9, 0xF0, 0x12, \r
+0x77, 0x41, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xBA, 0x12, 0x08, \r
+0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x49, 0x5C, 0xE4, 0x90, 0x9F, 0xBC, 0xF0, 0x22, 0x12, 0x5D, 0x10, 0xE4, 0xFD, \r
+0xFF, 0x12, 0x49, 0x5C, 0x91, 0x43, 0x90, 0x9F, 0x12, 0x74, 0x0C, 0xF0, 0x22, 0xAE, 0x07, 0x12, \r
+0x6B, 0xE2, 0xBF, 0x01, 0x15, 0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, \r
+0x09, 0xAF, 0x06, 0x7D, 0x01, 0x51, 0x40, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x7D, 0x2D, 0x12, \r
+0x4C, 0x04, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0xD1, 0xCE, 0x12, 0x46, 0xFD, \r
+0xE4, 0xFD, 0x7F, 0x01, 0x91, 0x47, 0xE4, 0x90, 0x9F, 0x12, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, \r
+0x2A, 0xD1, 0x3D, 0x90, 0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, \r
+0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, \r
+0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, 0x8D, 0xC9, 0x90, 0x9F, \r
+0xC7, 0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0x9F, 0xC8, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0x9F, \r
+0xC9, 0xE0, 0x90, 0x01, 0x33, 0xF0, 0x90, 0x9F, 0xC2, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0x9F, \r
+0xC5, 0xE0, 0x90, 0x01, 0x3B, 0xF0, 0xD1, 0xCA, 0x7D, 0x02, 0x7F, 0x02, 0xD1, 0xCE, 0x7F, 0x01, \r
+0x91, 0x1E, 0x81, 0xE6, 0x7D, 0x02, 0x7F, 0x02, 0xD1, 0xCE, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, \r
+0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, \r
+0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, \r
+0x90, 0x9F, 0xBD, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0x90, 0x01, 0x53, \r
+0xF0, 0x90, 0x9F, 0xBF, 0xE0, 0x60, 0x10, 0x7D, 0x10, 0x7F, 0x03, 0xF1, 0x8E, 0x90, 0x9F, 0xBF, \r
+0xE0, 0x90, 0x05, 0x73, 0xF0, 0x80, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, \r
+0x12, 0x77, 0x0C, 0x12, 0x6E, 0xCF, 0xF1, 0x6D, 0x80, 0x0F, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, \r
+0x7D, 0x10, 0xFF, 0xF1, 0x8E, 0xD1, 0xC4, 0xD1, 0x0B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, \r
+0xBD, 0xE0, 0x30, 0xE0, 0x27, 0x90, 0x9F, 0xBF, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x9F, 0xC0, \r
+0xE0, 0x60, 0x04, 0x14, 0xF0, 0x80, 0x16, 0x90, 0x9F, 0xBE, 0xE0, 0x14, 0x90, 0x9F, 0xC0, 0xF0, \r
+0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0xD1, 0xE3, 0xD1, 0xC4, 0x22, 0x7D, 0x2F, 0x12, \r
+0x46, 0xF8, 0x7D, 0x08, 0x7F, 0x01, 0x91, 0x47, 0x90, 0x9F, 0x12, 0x74, 0x08, 0xF0, 0x22, 0xEF, \r
+0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, \r
+0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, \r
+0xEE, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x2A, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x01, \r
+0x70, 0x22, 0x12, 0x7F, 0xC5, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x60, 0x0F, 0xE4, 0xFD, 0x7F, \r
+0x0C, 0x51, 0x40, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x02, 0xB5, 0x5E, 0x90, 0x9F, 0x1A, 0xE0, \r
+0x70, 0x02, 0x51, 0x3C, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, \r
+0x49, 0x5C, 0x7D, 0x0C, 0x7F, 0x01, 0x81, 0x47, 0xF1, 0xF0, 0xEF, 0x70, 0x02, 0xF1, 0xA3, 0x22, \r
+0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, \r
+0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x7F, 0xF4, 0x12, 0x46, 0xD6, 0xEF, 0x20, \r
+0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x46, 0xD6, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, \r
+0x7F, 0x03, 0x22, 0x11, 0x09, 0x90, 0x9D, 0x98, 0xEF, 0xF0, 0x11, 0x6A, 0x90, 0x01, 0x64, 0x74, \r
+0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x12, 0x46, 0xD6, 0xEF, 0x54, \r
+0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0xAC, 0x7F, 0x16, 0x12, 0x46, 0xD6, 0xEF, 0x54, \r
+0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xAC, 0x7F, 0x38, 0x12, 0x46, 0xD6, 0xEF, 0x44, \r
+0x40, 0xFD, 0x7F, 0x38, 0x12, 0x46, 0xAC, 0x02, 0x37, 0x99, 0x11, 0xB9, 0x11, 0xE9, 0x11, 0x75, \r
+0x11, 0x94, 0x02, 0x47, 0xBA, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, \r
+0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, \r
+0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, \r
+0x43, 0x20, 0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, \r
+0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, \r
+0x50, 0x12, 0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x52, 0x12, \r
+0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x46, 0xAC, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, \r
+0x7F, 0x54, 0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x56, \r
+0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0xAC, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1, \r
+0x05, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, \r
+0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, \r
+0xF5, 0xA8, 0xF5, 0xE8, 0x11, 0xB9, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, \r
+0x46, 0xAC, 0x80, 0xFE, 0x22, 0x7F, 0x81, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, \r
+0x12, 0x46, 0xAC, 0x7F, 0x80, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46, \r
+0xAC, 0xF1, 0xE0, 0x12, 0x3E, 0x11, 0x12, 0x99, 0x2E, 0x12, 0x99, 0xF2, 0x7F, 0x01, 0x12, 0x43, \r
+0xA5, 0x90, 0xA0, 0x28, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90, 0xA0, 0x28, 0xE0, 0x04, \r
+0xF0, 0x11, 0x23, 0x31, 0xFB, 0x7F, 0x80, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, \r
+0x12, 0x46, 0xAC, 0x75, 0x28, 0xFF, 0xF1, 0xAE, 0x12, 0x99, 0x6F, 0x7B, 0x01, 0x7A, 0xA0, 0x79, \r
+0xDA, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xEF, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA0, 0xDA, \r
+0xE0, 0x54, 0x07, 0xF0, 0xE0, 0xFF, 0x64, 0x07, 0x60, 0x04, 0xEF, 0xB4, 0x04, 0x15, 0xF1, 0xBE, \r
+0xBF, 0x01, 0x10, 0x7F, 0x16, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x0F, 0x44, 0x60, 0xFD, 0x7F, 0x16, \r
+0x12, 0x46, 0xAC, 0x7F, 0x81, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, \r
+0xAC, 0xF1, 0xC9, 0x12, 0xB1, 0xD9, 0xE4, 0xFF, 0x02, 0x44, 0x2E, 0xF1, 0xA8, 0x12, 0x96, 0xC8, \r
+0x12, 0x9B, 0x63, 0x12, 0xB2, 0x90, 0x12, 0x54, 0xE6, 0x12, 0xB6, 0xCE, 0x12, 0x8F, 0xC7, 0x7E, \r
+0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xFA, 0x12, 0x08, 0xAA, 0x7F, 0x80, \r
+0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0x01, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0x01, 0x12, 0x45, \r
+0x71, 0x90, 0x9F, 0xFD, 0x12, 0x08, 0x6D, 0x90, 0x9D, 0x98, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, \r
+0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0x09, 0xEE, 0xF0, \r
+0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0x0A, 0xEE, 0xF0, \r
+0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x4A, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x90, \r
+0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0x09, 0xEF, 0xF0, 0x90, \r
+0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x9D, 0x98, 0xE0, \r
+0x64, 0x03, 0x70, 0x20, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, \r
+0xA0, 0x09, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, \r
+0xA0, 0x0A, 0xEF, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0x51, 0xD8, 0x12, \r
+0x82, 0x77, 0x12, 0x82, 0xED, 0x90, 0x9F, 0xE3, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x54, \r
+0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x22, 0x90, 0x9F, 0xEF, 0xE0, 0x13, 0x13, 0x13, 0x54, \r
+0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x09, 0xF0, 0x22, 0xEF, 0xF0, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xC5, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF, \r
+0x12, 0x71, 0xC5, 0x90, 0x9F, 0xCE, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xB1, \r
+0x10, 0x90, 0x9F, 0xCE, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x3A, 0x90, 0x9F, 0xCA, 0xE0, \r
+0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x2A, 0x90, 0x9F, 0xCD, 0xE0, \r
+0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, \r
+0x09, 0x80, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x9F, 0xCD, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x04, \r
+0x7F, 0x03, 0x80, 0x02, 0x7F, 0x09, 0x51, 0xD8, 0x90, 0xA1, 0xC5, 0xE0, 0x64, 0x03, 0x60, 0x02, \r
+0x61, 0xEA, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x6F, 0x90, 0x9F, \r
+0xD4, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x42, 0xEE, 0x75, 0xF0, 0x03, \r
+0xA4, 0xFF, 0x90, 0x9F, 0xD6, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, \r
+0xFC, 0x90, 0x9F, 0xCC, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, \r
+0x08, 0xEE, 0x9F, 0x90, 0xA1, 0xC8, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xC8, 0x74, 0x03, 0xF0, 0x90, \r
+0xA1, 0xC8, 0xE0, 0xFF, 0x91, 0xFE, 0x90, 0x9F, 0xDD, 0xE0, 0x04, 0xF0, 0x80, 0x18, 0x90, 0x9F, \r
+0xD7, 0xE0, 0xFF, 0x91, 0xFE, 0x90, 0x9F, 0xD2, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDD, 0xF0, \r
+0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDF, 0xF0, 0x80, 0x0D, 0x90, 0x9F, 0xCC, \r
+0xE0, 0xFF, 0x91, 0xFE, 0x90, 0x9F, 0xDD, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x13, \r
+0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0xC7, 0xF0, 0x80, 0x06, 0x90, 0xA1, \r
+0xC7, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, \r
+0xA0, 0x09, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xC6, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xC6, 0x74, \r
+0x01, 0xF0, 0x90, 0xA1, 0xC6, 0x12, 0x87, 0xB8, 0x90, 0x9F, 0xDC, 0x74, 0x01, 0xF0, 0x90, 0x9F, \r
+0xCA, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xC5, 0xE0, 0x70, 0x42, 0xFD, \r
+0xFF, 0x12, 0x49, 0x5C, 0x80, 0x3B, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1D, \r
+0x90, 0x9F, 0xD0, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, \r
+0x1B, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x11, 0x90, 0xA1, 0xC5, \r
+0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x52, \r
+0x40, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x18, 0x90, 0xA1, 0xC5, 0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80, \r
+0x0A, 0x90, 0xA1, 0xC5, 0xE0, 0x64, 0x03, 0x70, 0x34, 0x7D, 0x0B, 0x7F, 0x6F, 0x80, 0x2B, 0x90, \r
+0xA1, 0xC5, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x21, 0x90, 0xA1, 0xC5, 0xE0, 0xB4, 0x03, 0x1D, \r
+0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, \r
+0x3F, 0x30, 0xE0, 0x03, 0x12, 0x77, 0x62, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCD, \r
+0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0xF1, 0x81, 0x90, 0x9F, \r
+0xCE, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, \r
+0xCF, 0xE0, 0x44, 0x10, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, \r
+0xA1, 0xAE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x48, 0x27, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, \r
+0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, \r
+0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x51, 0xD8, \r
+0x90, 0x9F, 0xE5, 0xE0, 0x20, 0xE0, 0x36, 0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, \r
+0x2C, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xFF, 0xF0, 0x80, 0x06, 0x90, 0xA1, \r
+0xFF, 0x74, 0x01, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA2, 0x00, 0x30, 0xE0, 0x05, 0x74, \r
+0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xFF, 0x12, 0x87, 0xB8, 0x7F, 0x02, 0x12, \r
+0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x9F, 0xE5, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0x9F, 0xEA, 0xE0, 0xFF, 0x51, \r
+0xD8, 0x90, 0x9F, 0xEB, 0x12, 0x87, 0xB8, 0xB1, 0x10, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5C, 0x90, \r
+0xA1, 0x15, 0xEF, 0xF0, 0x90, 0xA1, 0x17, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0x12, 0x71, 0xC5, 0x90, \r
+0x9F, 0xCE, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0x15, 0xE0, 0xB4, \r
+0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F, \r
+0xFF, 0x12, 0x49, 0x5C, 0x12, 0x4C, 0x08, 0xBF, 0x01, 0x03, 0x12, 0x46, 0xFD, 0x90, 0x9F, 0xCE, \r
+0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01, \r
+0x51, 0xD8, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x0C, 0x90, 0x9F, 0xCB, 0xE0, 0x24, 0x03, 0xFF, \r
+0x90, 0x9F, 0xDA, 0x91, 0xFA, 0x90, 0x9F, 0xCA, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, \r
+0xA1, 0x16, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0x16, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, \r
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x17, 0x74, \r
+0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x17, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x90, 0xA1, \r
+0x16, 0xE0, 0xFD, 0x12, 0x87, 0xBD, 0xE4, 0x90, 0x9F, 0xDC, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFF, \r
+0xB4, 0x02, 0x08, 0x90, 0x9F, 0xDD, 0xE0, 0x04, 0xF0, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4, \r
+0x90, 0x9F, 0xDD, 0xF0, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x17, 0x90, \r
+0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08, 0x80, 0x66, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x05, \r
+0x70, 0x63, 0x7D, 0x0E, 0x80, 0x5A, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x2C, \r
+0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0A, 0x90, 0x9F, 0x19, 0xE0, 0xFF, \r
+0xE4, 0xFD, 0x12, 0x52, 0x40, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x30, \r
+0x90, 0xA1, 0x15, 0xE0, 0x64, 0x05, 0x70, 0x2D, 0x7D, 0x0F, 0x80, 0x24, 0x90, 0x9F, 0x17, 0xE0, \r
+0x60, 0x23, 0x90, 0x9F, 0x19, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x52, 0x40, 0x90, 0xA1, 0x15, 0xE0, \r
+0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x10, \r
+0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCD, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, \r
+0x49, 0x5C, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0xE4, \r
+0xFF, 0xF1, 0x81, 0x90, 0x9F, 0xCE, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, \r
+0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x30, \r
+0xE0, 0x35, 0x12, 0x7F, 0xFB, 0x90, 0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1C, 0x90, \r
+0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1C, 0x90, 0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x03, \r
+0x02, 0x41, 0xEE, 0x90, 0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x04, 0x02, 0xE1, 0xED, 0x90, 0x9F, 0xDD, \r
+0xE0, 0xFF, 0xB4, 0x05, 0x02, 0xB1, 0xAF, 0x22, 0x90, 0x9F, 0xE5, 0xE0, 0x30, 0xE0, 0x05, 0x12, \r
+0x4F, 0xC8, 0x80, 0x02, 0xF1, 0x2B, 0x90, 0xA0, 0x16, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x71, 0x4E, \r
+0x22, 0x90, 0x9F, 0xFA, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x1C, 0xEF, 0xB4, 0x01, 0x05, 0x90, \r
+0xA0, 0x01, 0x80, 0x03, 0x90, 0x9F, 0xFD, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, \r
+0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0xE4, 0x90, 0x9E, 0x8D, 0xF0, 0x22, 0x75, 0xE8, \r
+0x07, 0x75, 0xA8, 0x85, 0x22, 0xB1, 0x10, 0x90, 0x9F, 0x11, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x00, \r
+0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1B, 0xF0, 0xA3, \r
+0x74, 0x01, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0x51, 0xEE, 0x22, \r
+0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0xA1, 0x15, \r
+0xEF, 0xF0, 0x7F, 0x03, 0x91, 0xFE, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x9F, 0xDD, \r
+0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xCE, 0xE0, 0xFF, \r
+0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, \r
+0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A, 0x90, 0x9F, 0xCB, 0xE0, 0xFF, 0x90, \r
+0x9F, 0xDB, 0x80, 0x21, 0x90, 0xA1, 0x15, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, 0x9F, 0xCB, 0xE0, \r
+0xFE, 0x90, 0x9F, 0xDA, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0x9F, 0xCC, \r
+0xE0, 0xFF, 0x90, 0x9F, 0xDA, 0xE0, 0xC3, 0x9F, 0x90, 0x9F, 0xE1, 0xF0, 0x90, 0x9F, 0xCA, 0xE0, \r
+0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2C, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, \r
+0xE0, 0x02, 0x21, 0x0A, 0x90, 0x9F, 0xE1, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25, \r
+0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, 0x4C, \r
+0x71, 0x80, 0x77, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x54, 0x90, 0x9F, 0xD0, \r
+0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x52, 0x40, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, \r
+0xF0, 0xE4, 0x90, 0x9F, 0xE0, 0xF0, 0x90, 0x9F, 0xDD, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFF, 0xB4, \r
+0x01, 0x08, 0x90, 0x9F, 0xD2, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, 0x9F, \r
+0xD2, 0x74, 0x07, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x07, 0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x04, \r
+0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, \r
+0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCE, 0xE0, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x1B, 0x90, 0x9F, 0xE1, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, \r
+0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4B, \r
+0xB9, 0x90, 0x9F, 0xCD, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x22, 0xE4, \r
+0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, 0xA0, 0xE6, 0xEF, 0xF0, 0x60, 0xF0, 0x90, \r
+0x9D, 0x93, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0B, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, \r
+0x6A, 0x2F, 0x12, 0xA1, 0x20, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0, 0xFF, 0x30, 0xE1, \r
+0x06, 0x54, 0xFD, 0xF0, 0x12, 0x7B, 0x26, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0, 0xFF, \r
+0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0xF1, 0x65, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0, \r
+0xFF, 0x30, 0xE6, 0x05, 0x54, 0xBF, 0xF0, 0x31, 0x9D, 0xD2, 0xAF, 0x80, 0xB2, 0xE4, 0x7B, 0x01, \r
+0x7A, 0xA0, 0x79, 0x13, 0x31, 0xC3, 0xEF, 0xB4, 0x02, 0x18, 0x90, 0xA1, 0xE9, 0xE0, 0x64, 0x04, \r
+0x60, 0x0B, 0x7F, 0x40, 0xB1, 0x9C, 0x90, 0xA1, 0xE9, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA1, \r
+0xE9, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
+0xB6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, \r
+0x64, 0x04, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0xB6, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x92, 0xBE, 0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, \r
+0x51, 0x11, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0x51, 0x11, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x71, 0xE9, 0x7F, 0x04, 0x8F, 0x71, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9D, 0x93, 0xE0, \r
+0x45, 0x71, 0xF0, 0x22, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA1, 0x24, \r
+0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0xE8, 0x90, 0xA1, 0xEB, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, \r
+0x46, 0xD6, 0x90, 0xA0, 0x05, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x46, 0xD6, 0x90, 0xA0, 0x06, 0xEF, \r
+0xF0, 0x90, 0xA1, 0xEB, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x24, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90, \r
+0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA0, 0x05, 0xE0, \r
+0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, 0xA1, 0x23, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4, \r
+0xF0, 0x80, 0x19, 0x90, 0xA0, 0x05, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, \r
+0x90, 0xA1, 0x23, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA1, 0x23, 0xE0, \r
+0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA1, 0x21, \r
+0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0xAC, 0x90, 0xA1, 0x23, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, \r
+0x90, 0xA0, 0x06, 0xE0, 0x54, 0x0F, 0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, 0xAC, 0x90, 0xA1, 0x24, \r
+0xE0, 0xB4, 0x21, 0x0B, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xD1, 0xAF, 0x7F, 0x04, 0x51, 0x15, 0x90, \r
+0xA1, 0x24, 0xE0, 0xB4, 0x23, 0x08, 0x7F, 0x01, 0x91, 0x0E, 0x7F, 0x04, 0x51, 0x15, 0x90, 0xA1, \r
+0x24, 0xE0, 0xB4, 0x27, 0x08, 0x7F, 0x02, 0x91, 0x0E, 0x7F, 0x04, 0x51, 0x15, 0x90, 0xA1, 0x24, \r
+0xE0, 0xB4, 0x30, 0x0B, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, 0x4A, 0x7F, 0x04, 0x51, 0x15, 0x90, \r
+0xA1, 0x24, 0xE0, 0x64, 0x34, 0x70, 0x71, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x4F, 0x90, 0x9F, \r
+0xEF, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x60, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
+0x01, 0xFF, 0x90, 0xA0, 0x0A, 0xE0, 0xFB, 0x90, 0xA0, 0x09, 0xE0, 0x90, 0xA1, 0xCC, 0xF0, 0x7D, \r
+0x01, 0x12, 0x8A, 0xE7, 0x90, 0xA1, 0x21, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA1, 0x79, 0x21, 0xFD, \r
+0x7F, 0x34, 0x31, 0xC7, 0x90, 0xA0, 0x10, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, \r
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x1B, 0x12, 0x8A, 0xCE, \r
+0x90, 0xA0, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE, \r
+0xF0, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x24, 0xE0, 0xFD, 0xB4, 0x35, 0x07, \r
+0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, 0x22, 0x90, 0xFD, 0x61, 0xE0, 0x90, \r
+0xA1, 0x21, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x22, 0xF0, 0x90, 0xA1, 0x24, 0xE0, 0xFF, \r
+0x90, 0xA1, 0x21, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x22, 0x31, 0xC7, 0x90, 0xA1, 0x24, \r
+0xE0, 0xB4, 0x37, 0x02, 0xD1, 0xC8, 0x90, 0xA1, 0x24, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62, \r
+0xE0, 0x30, 0xE0, 0x08, 0x90, 0x9F, 0xED, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x9F, 0xED, \r
+0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0xA1, 0x8B, 0x74, 0x15, 0xF0, 0x90, 0xA1, 0x99, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x8D, 0xEF, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x8B, 0x91, 0x94, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, \r
+0x6D, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0x7B, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x6F, 0xEF, 0xF0, 0x70, \r
+0x31, 0x90, 0x9F, 0xE3, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70, \r
+0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x70, 0x74, 0x01, 0xF0, 0x80, \r
+0x05, 0xE4, 0x90, 0xA1, 0x70, 0xF0, 0xE4, 0x90, 0xA1, 0x71, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x70, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA1, \r
+0x71, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA1, 0x72, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, \r
+0x73, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA1, 0x74, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, \r
+0x75, 0xF0, 0x90, 0xA1, 0x70, 0xE0, 0x54, 0x01, 0x90, 0x9F, 0xE3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, \r
+0x7A, 0xA1, 0x79, 0x6D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9E, 0x88, 0xE0, 0xFF, \r
+0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9E, 0x89, 0xE0, 0xB5, \r
+0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, \r
+0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0x9E, 0x89, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF2, \r
+0xF9, 0x74, 0x9D, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, \r
+0x12, 0x06, 0x63, 0x90, 0x9E, 0x89, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, \r
+0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9E, 0x89, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, \r
+0xF0, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x31, 0xC7, 0x8F, 0x51, 0xE5, 0x51, 0xB4, \r
+0x03, 0x08, 0xE4, 0xFF, 0x91, 0x0E, 0x7F, 0x04, 0xB1, 0x9C, 0x22, 0x90, 0xA1, 0x05, 0xEF, 0xF0, \r
+0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, 0x6D, 0x90, 0xA1, \r
+0x06, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, \r
+0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x74, 0x08, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x63, 0xE5, \r
+0x63, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x06, 0x91, 0x94, 0xE5, 0x65, 0x04, 0x54, \r
+0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90, \r
+0xA1, 0x05, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x41, 0x15, 0xB1, 0x9C, 0x22, 0x90, 0xA2, 0x0A, 0xEF, \r
+0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9D, 0x93, 0xE0, 0xFF, 0x90, 0xA2, 0x0A, 0xE0, 0xFE, \r
+0xEF, 0x4E, 0x90, 0x9D, 0x93, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, \r
+0x89, 0x90, 0xA0, 0xEB, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEC, 0xF0, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xED, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, \r
+0xA0, 0xEE, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0x90, 0x9F, 0xF0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA0, 0xEC, 0xE0, 0xB4, 0x0C, 0x06, \r
+0xE5, 0x70, 0x70, 0x10, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7D, 0x07, 0x7F, 0x30, \r
+0x31, 0xC7, 0x8F, 0x51, 0x90, 0xA0, 0xEC, 0xE0, 0xB4, 0x0D, 0x0E, 0xE5, 0x51, 0x64, 0x01, 0x60, \r
+0x05, 0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, \r
+0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0xEB, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0xD1, \r
+0x4A, 0x7F, 0x04, 0xB1, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x7C, 0x74, 0x0B, 0xF0, \r
+0x90, 0xA1, 0x8A, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x7E, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, \r
+0xE0, 0x90, 0xA1, 0x7F, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA1, 0x80, 0xF0, 0x90, 0xFD, 0x64, \r
+0xE0, 0x90, 0xA1, 0x81, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, 0x82, 0xF0, 0x90, 0xFD, 0x66, \r
+0xE0, 0x90, 0xA1, 0x83, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, 0x84, 0xF0, 0x80, 0x11, 0x90, \r
+0xA1, 0x7F, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
+0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x7C, 0x81, 0x94, 0x12, 0x95, 0x78, 0x7F, 0x02, 0x41, 0x15, 0x90, \r
+0xA1, 0x25, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0x33, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x27, 0xEF, 0xF0, \r
+0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x25, 0x81, 0x94, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
+0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA1, 0x25, 0x30, \r
+0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x25, 0xE0, 0xFF, 0x12, \r
+0x89, 0x67, 0x22, 0x90, 0xA0, 0xF6, 0x74, 0x12, 0xF0, 0x90, 0xA1, 0x04, 0x74, 0x05, 0xF0, 0x90, \r
+0xA0, 0xF8, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA0, 0xF4, 0xE0, 0x90, 0xA0, \r
+0xFB, 0xF0, 0x90, 0xA0, 0xF5, 0xE0, 0x90, 0xA0, 0xFC, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xF6, \r
+0x91, 0x94, 0x7F, 0x04, 0xA1, 0x9C, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA0, 0xEB, 0x12, \r
+0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x13, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, \r
+0xA0, 0x14, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x15, 0xF0, 0x90, 0x9F, 0xF0, \r
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x31, 0xC3, 0xEF, 0xB4, 0x02, 0x04, \r
+0x7F, 0x40, 0xB1, 0x9C, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x9E, \r
+0x89, 0xE0, 0xFE, 0x90, 0x9E, 0x88, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, \r
+0x00, 0xEE, 0x64, 0x01, 0x60, 0x2D, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF2, 0xF9, 0x74, 0x9D, \r
+0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x12, 0x97, 0x2C, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x9E, 0x88, \r
+0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, \r
+0x9E, 0x88, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xA1, 0x1B, 0x7D, 0x01, 0x7F, 0x17, \r
+0x21, 0xC7, 0x90, 0x9F, 0xF0, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x31, 0xC7, 0x90, \r
+0xA0, 0xEB, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF1, 0xE0, \r
+0x44, 0x01, 0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x31, 0xC7, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, \r
+0xC0, 0x07, 0x7D, 0xF3, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0xED, 0x04, \r
+0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, \r
+0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, \r
+0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
+0x07, 0x90, 0x01, 0xC4, 0x74, 0x24, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x47, 0x7A, 0xE5, 0x14, \r
+0x30, 0xE7, 0x03, 0x12, 0x47, 0xDC, 0x74, 0x24, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, \r
+0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
+0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, \r
 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, \r
-0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xCC, 0xF0, 0x74, \r
-0x70, 0xA3, 0xF0, 0x31, 0x1E, 0x53, 0x91, 0xBF, 0x74, 0xCC, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x70, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
-0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xFD, \r
-0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA3, 0x17, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x41, \r
-0xEB, 0x90, 0xA3, 0xD5, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12, 0x47, 0xD5, 0x90, 0xA1, 0xFC, 0xEF, \r
-0xF0, 0x7F, 0x2D, 0x12, 0x47, 0xD5, 0x90, 0xA1, 0xFD, 0xEF, 0xF0, 0x90, 0xA3, 0xD5, 0x74, 0x01, \r
-0xF0, 0x90, 0xA3, 0x17, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, \r
-0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA1, 0xFC, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, \r
-0x90, 0xA3, 0x16, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0xFC, \r
-0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x90, 0xA3, 0x16, 0xF0, 0xD3, 0x94, \r
-0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, \r
-0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA3, 0x14, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, \r
-0x46, 0x49, 0x90, 0xA3, 0x16, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xFD, 0xE0, 0x54, 0x0F, \r
-0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, 0x49, 0x90, 0xA3, 0x17, 0xE0, 0xB4, 0x21, 0x0D, 0x90, 0xFD, \r
-0x62, 0xE0, 0xFF, 0x12, 0x7F, 0xE8, 0x7F, 0x04, 0x12, 0x5E, 0x29, 0x90, 0xA3, 0x17, 0xE0, 0xB4, \r
-0x23, 0x09, 0x7F, 0x01, 0x51, 0xEC, 0x7F, 0x04, 0x12, 0x5E, 0x29, 0x90, 0xA3, 0x17, 0xE0, 0xB4, \r
-0x27, 0x09, 0x7F, 0x02, 0x51, 0xEC, 0x7F, 0x04, 0x12, 0x5E, 0x29, 0x90, 0xA3, 0x17, 0xE0, 0xB4, \r
-0x30, 0x0D, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x80, 0xFD, 0x7F, 0x04, 0x12, 0x5E, 0x29, 0x90, \r
-0xA3, 0x17, 0xE0, 0x64, 0x34, 0x70, 0x73, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x3E, 0x90, 0xA2, \r
-0x01, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x80, 0x0C, 0x12, 0x47, 0xC7, \r
-0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x12, 0x46, 0x49, 0x90, 0xA3, 0x14, 0x74, 0x01, 0xF0, 0xFB, \r
-0x7A, 0xA3, 0x79, 0x14, 0xFD, 0x7F, 0x34, 0x12, 0x5E, 0x3C, 0x90, 0xA2, 0x07, 0xE0, 0x44, 0x01, \r
-0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x2E, 0x90, 0xA2, 0x01, 0xE0, \r
-0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, 0x7F, 0x4E, 0x12, 0x47, 0xD5, \r
-0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x49, 0x90, 0xA2, 0x07, 0xE0, 0x54, 0xFE, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA3, 0x17, 0xE0, 0xFD, 0xB4, \r
-0x35, 0x07, 0x90, 0xA1, 0xC8, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, 0x23, 0x90, 0xFD, 0x61, \r
-0xE0, 0x90, 0xA3, 0x14, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3, 0x15, 0xF0, 0x90, 0xA3, 0x17, \r
-0xE0, 0xFF, 0x90, 0xA3, 0x14, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x15, 0x12, 0x5E, 0x3C, \r
-0x90, 0xA3, 0x17, 0xE0, 0xB4, 0x37, 0x02, 0x71, 0x75, 0x90, 0xA3, 0x17, 0xE0, 0xB4, 0x40, 0x14, \r
-0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xE4, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, \r
-0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3, 0x60, 0x74, \r
-0x09, 0xF0, 0x90, 0xA3, 0x6E, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x62, 0xEF, 0xF0, 0x70, 0x31, 0x90, \r
-0xA1, 0xDA, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70, 0xE0, 0x70, \r
-0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x63, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, \r
-0x90, 0xA3, 0x63, 0xF0, 0xE4, 0x90, 0xA3, 0x64, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x80, 0x39, \r
-0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3, 0x63, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x64, 0xF0, \r
-0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x65, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA3, 0x66, 0xF0, \r
-0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x67, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA3, 0x68, 0xF0, \r
-0x90, 0xA3, 0x63, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xDA, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, \r
-0x79, 0x60, 0x02, 0x67, 0x5E, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, \r
-0x1D, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x16, 0xE0, 0x90, 0xA3, 0x18, 0x30, 0xE1, 0x05, 0x74, \r
-0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0x18, 0xE0, 0xFF, 0x71, 0x9F, 0x22, 0x90, \r
-0xA3, 0x19, 0xEF, 0xF0, 0x90, 0xA2, 0x01, 0xE0, 0x70, 0x7D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, \r
-0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x08, 0x6D, 0xE4, 0x7F, \r
-0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, \r
-0x05, 0x90, 0xA1, 0xE2, 0x80, 0x31, 0xE4, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x45, \r
-0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, 0x0A, 0x90, 0xA1, 0xE2, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x81, \r
-0x83, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, \r
-0x00, 0x70, 0x09, 0x90, 0xA1, 0xE2, 0x04, 0xF0, 0xA3, 0xF0, 0x80, 0x77, 0xE4, 0x7F, 0x80, 0xFE, \r
-0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, 0x65, 0x90, 0xA1, \r
-0xE2, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, \r
-0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x1A, 0x12, \r
-0x45, 0x11, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08, 0x90, 0xA1, 0xE2, 0x74, 0x01, 0xF0, 0x80, 0x05, \r
-0xE4, 0x90, 0xA1, 0xE2, 0xF0, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x01, 0xFF, \r
-0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x1A, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x1A, 0x12, 0x45, 0x11, \r
-0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xE3, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xE3, \r
-0x74, 0x01, 0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11, 0x91, 0xD4, 0x90, 0x07, \r
-0x78, 0xE0, 0x90, 0xA1, 0xE1, 0xF0, 0x90, 0xA2, 0x00, 0xE0, 0xFF, 0xE4, 0xFD, 0xF1, 0xE4, 0x90, \r
-0xA3, 0x19, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, 0x90, 0xA1, 0xDC, 0xE0, \r
-0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA3, 0x19, 0xE0, 0xFD, 0xB4, 0x02, 0x0A, 0x90, 0xA1, \r
-0xDC, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, 0x90, 0xA1, 0xDC, 0xE0, \r
-0x54, 0x1F, 0xF0, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x12, 0x4C, 0x07, 0x12, 0x46, 0x3F, 0x12, 0x46, 0x33, 0x12, 0x46, 0x33, 0x90, 0x01, 0x00, 0x74, \r
-0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, \r
-0xB2, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x01, \r
-0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x36, 0x90, 0xA2, 0x00, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0xEB, \r
-0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0xB2, 0xE0, 0xC4, 0x13, \r
-0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0xEC, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xEC, 0x74, \r
-0x02, 0xF0, 0x90, 0xA3, 0xEB, 0xF1, 0xDF, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xB1, \r
-0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x08, 0xEF, 0xF0, 0x90, \r
-0xA3, 0x0A, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0xF1, 0x42, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0x13, 0x13, \r
-0x54, 0x3F, 0x30, 0xE0, 0x21, 0x90, 0xA3, 0x08, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, \r
-0x90, 0xA3, 0x08, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F, 0xFF, 0x12, 0x49, 0x5D, 0x12, 0x4C, \r
-0x07, 0xBF, 0x01, 0x02, 0x91, 0xD9, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
-0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA3, \r
-0x08, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0xA1, 0xC2, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA1, 0xD1, 0x12, \r
-0x7C, 0x02, 0x90, 0xA1, 0xC1, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x09, 0xF0, \r
-0x80, 0x06, 0x90, 0xA3, 0x09, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x54, 0x07, \r
-0x20, 0xE0, 0x13, 0x90, 0xA2, 0x00, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x0A, 0x74, 0x01, 0xF0, 0x80, \r
-0x05, 0xE4, 0x90, 0xA3, 0x0A, 0xF0, 0x90, 0xA3, 0x0A, 0xE0, 0xFF, 0x90, 0xA3, 0x09, 0xE0, 0xFD, \r
-0xF1, 0xE4, 0xE4, 0x90, 0xA1, 0xD3, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, \r
-0xA1, 0xD4, 0xE0, 0x04, 0xF0, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA1, 0xD4, 0xF0, \r
-0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x17, 0x90, 0xA3, 0x08, 0xE0, 0xB4, \r
-0x02, 0x04, 0x7D, 0x08, 0x80, 0x66, 0x90, 0xA3, 0x08, 0xE0, 0x64, 0x05, 0x70, 0x63, 0x7D, 0x0E, \r
-0x80, 0x5A, 0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0xC5, 0xE0, \r
-0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0A, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x54, \r
-0x4B, 0x90, 0xA3, 0x08, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x30, 0x90, 0xA3, 0x08, 0xE0, \r
-0x64, 0x05, 0x70, 0x2D, 0x7D, 0x0F, 0x80, 0x24, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x23, 0x90, 0xA1, \r
-0x1C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x54, 0x4B, 0x90, 0xA3, 0x08, 0xE0, 0xB4, 0x02, 0x04, 0x7D, \r
-0x0A, 0x80, 0x09, 0x90, 0xA3, 0x08, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x49, \r
-0x5D, 0x90, 0xA1, 0xC4, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0xA1, \r
-0xC4, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x79, 0xBA, \r
-0x90, 0xA1, 0xC5, 0xE0, 0xC3, 0x13, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, \r
-0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0xA1, 0xC1, 0xE0, 0x30, 0xE0, 0x37, 0x12, 0x7C, 0x8F, 0x90, \r
-0xA1, 0xD4, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1D, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0xB4, 0x02, \r
-0x02, 0x80, 0x1E, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0xB4, 0x03, 0x03, 0x02, 0x79, 0xE1, 0x90, 0xA1, \r
-0xD4, 0xE0, 0xFF, 0xB4, 0x04, 0x03, 0x02, 0x83, 0xAD, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0xB4, 0x05, \r
-0x02, 0xB1, 0x5A, 0x22, 0x90, 0xA1, 0xDC, 0xE0, 0x30, 0xE0, 0x04, 0xF1, 0x2C, 0x80, 0x02, 0xD1, \r
-0xD5, 0x90, 0xA2, 0x0D, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x82, 0x61, 0x22, 0x7D, 0x12, 0x7F, 0xFF, \r
-0x12, 0x49, 0x5D, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x00, 0xE0, 0xFF, 0xE4, 0xFD, \r
-0xE1, 0xE4, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0xC4, \r
-0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, \r
-0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, \r
-0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, \r
-0x30, 0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, \r
-0xCC, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x91, 0xD9, 0x90, 0xA1, 0x14, 0x74, 0x02, \r
-0xF0, 0x22, 0x7D, 0x20, 0x91, 0xD4, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0xF1, 0xB1, 0x80, \r
-0xF1, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xF1, 0xB1, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x49, \r
-0x5D, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0xF1, \r
-0xB1, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0xE0, \r
-0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, \r
-0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x03, 0x02, 0x79, 0x84, 0x90, 0xA2, \r
-0x01, 0xE0, 0x60, 0x02, 0x01, 0xA4, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x46, 0x7F, 0x48, 0x7E, 0x09, \r
-0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x8D, 0x12, 0x08, 0x6D, \r
-0xE5, 0x26, 0x90, 0xA3, 0x8D, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x11, 0x80, 0x0C, 0x12, 0x45, 0x11, \r
-0xEF, 0x44, 0x80, 0xFF, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x8D, 0x12, 0x08, 0x6D, 0x90, \r
-0xA3, 0x8D, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, \r
-0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x21, 0x84, 0xE5, 0x27, 0x70, 0x02, 0x21, 0x84, \r
-0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, \r
-0x8D, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x00, 0xE0, 0x90, 0xA3, 0x8D, 0x60, 0x09, 0x12, 0x45, 0x11, \r
-0xEF, 0x44, 0x80, 0xFF, 0x80, 0x07, 0x12, 0x45, 0x11, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, \r
-0x8D, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x8D, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, \r
-0x7F, 0x48, 0x21, 0x7F, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x43, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, \r
-0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x8D, 0x12, 0x08, 0x6D, 0xE5, 0x26, 0x90, 0xA3, \r
-0x8D, 0xB4, 0x01, 0x08, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x11, 0xEF, \r
-0x44, 0x02, 0xFF, 0xEC, 0x90, 0xA3, 0x8D, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x8D, 0x12, 0x45, 0x11, \r
-0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, \r
-0x02, 0x70, 0x02, 0x21, 0x84, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEC, 0x90, \r
-0xA3, 0x8D, 0x12, 0x08, 0x6D, 0xE5, 0x27, 0x70, 0x13, 0x90, 0xA3, 0x8D, 0x12, 0x45, 0x11, 0xEF, \r
-0x44, 0x77, 0xFF, 0xEC, 0x90, 0xA3, 0x8D, 0x12, 0x08, 0x6D, 0x80, 0x55, 0x90, 0xA3, 0x8D, 0x12, \r
-0x45, 0x11, 0xEF, 0x44, 0x66, 0xFF, 0xEC, 0x90, 0xA3, 0x8D, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, \r
-0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x91, 0x12, 0x08, 0x6D, 0x90, \r
-0xA2, 0x00, 0xE0, 0x90, 0xA3, 0x91, 0x60, 0x08, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x02, 0x80, 0x06, \r
-0x12, 0x45, 0x11, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xA3, 0x91, 0x12, 0x08, 0x6D, 0x90, 0xA3, \r
-0x91, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, \r
-0x45, 0x90, 0xA3, 0x8D, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, \r
-0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, \r
-0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x89, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, \r
-0x79, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, \r
-0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, 0xA1, 0xF1, 0xE0, 0xFE, 0xC3, \r
-0x13, 0x30, 0xE0, 0x1C, 0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA1, 0xF8, 0x80, 0x03, 0x90, 0xA1, 0xF4, \r
-0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB3, 0xEF, 0xF0, 0xA3, 0x74, 0x02, \r
-0xF0, 0xE4, 0xFF, 0x12, 0x77, 0x42, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
-0xE0, 0x02, 0xD1, 0xFF, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, \r
-0x01, 0xF0, 0x80, 0x42, 0x90, 0xA1, 0xC1, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, \r
-0x08, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0xC4, 0xE0, 0xFE, 0xC4, 0x54, \r
-0x0F, 0x30, 0xE0, 0x0D, 0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, \r
-0x12, 0x90, 0xA1, 0xC4, 0xE0, 0xFE, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, \r
-0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA3, 0xB3, 0xE0, 0x64, 0x03, 0x60, 0x02, 0x41, 0xE5, \r
-0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x6F, 0x90, 0xA1, 0xCB, 0xE0, 0xFF, 0x90, 0xA1, \r
-0xD6, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x42, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0xA1, 0xCD, \r
-0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA1, 0xC3, 0xE0, \r
-0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xEE, 0x9F, 0x90, 0xA3, \r
-0xB6, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xB6, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0xB6, 0xE0, 0xFF, 0x91, \r
-0x06, 0x90, 0xA1, 0xD4, 0xE0, 0x04, 0xF0, 0x80, 0x18, 0x90, 0xA1, 0xCE, 0xE0, 0xFF, 0x91, 0x06, \r
-0x90, 0xA1, 0xC9, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xD4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, \r
-0xF0, 0xE4, 0x90, 0xA1, 0xD6, 0xF0, 0x80, 0x0D, 0x90, 0xA1, 0xC3, 0xE0, 0xFF, 0x91, 0x06, 0x90, \r
-0xA1, 0xD4, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, \r
-0xE0, 0x07, 0xE4, 0x90, 0xA3, 0xB5, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xB5, 0x74, 0x01, 0xF0, 0x90, \r
-0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA2, 0x00, 0xE0, 0x60, 0x07, \r
-0xE4, 0x90, 0xA3, 0xB4, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xB4, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0xB4, \r
-0x12, 0x77, 0xDF, 0x90, 0xA1, 0xD3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x13, 0x54, \r
-0x07, 0x30, 0xE0, 0x0D, 0x90, 0xA3, 0xB3, 0xE0, 0x70, 0x42, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x80, \r
-0x3B, 0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1D, 0x90, 0xA1, 0xC7, 0xE0, 0x44, \r
-0x20, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x1B, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x49, 0x5D, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x11, 0x90, 0xA3, 0xB3, 0xE0, 0xB4, 0x03, 0x0D, 0x90, \r
-0xA1, 0x1A, 0xE0, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x54, 0x4B, 0x90, 0xA1, 0xB3, 0xE0, \r
-0x60, 0x18, 0x90, 0xA3, 0xB3, 0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA3, 0xB3, 0xE0, \r
-0x64, 0x03, 0x70, 0x34, 0x7D, 0x0B, 0x7F, 0x6F, 0x80, 0x2B, 0x90, 0xA3, 0xB3, 0xE0, 0x70, 0x04, \r
-0xFD, 0xFF, 0x80, 0x21, 0x90, 0xA3, 0xB3, 0xE0, 0xB4, 0x03, 0x1D, 0x90, 0xA1, 0xC1, 0xE0, 0xFF, \r
-0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, \r
-0x6F, 0x86, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x13, 0x13, \r
-0x54, 0x01, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x31, 0xBA, 0x90, 0xA1, 0xC5, 0xE0, 0xC3, 0x13, 0x90, \r
-0x06, 0xCD, 0x30, 0xE0, 0x0D, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x44, 0x10, 0xF0, \r
-0x80, 0x0B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, \r
-0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x48, 0x28, 0xE4, 0x90, 0xA2, 0xF8, 0xF0, 0x90, 0xA1, 0xC1, \r
-0xE0, 0x30, 0xE0, 0x6A, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x1E, \r
-0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0x91, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xC9, \r
-0x74, 0x01, 0xF0, 0xE4, 0x90, 0xA1, 0xD6, 0xF0, 0x90, 0xA1, 0xD4, 0xF0, 0x80, 0x10, 0x90, 0xA2, \r
-0xF8, 0xE0, 0xFF, 0x90, 0xA1, 0xC2, 0x91, 0x02, 0x90, 0xA1, 0xD4, 0x74, 0x01, 0xF0, 0x90, 0xA1, \r
-0xD3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x49, \r
-0x5D, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0xA1, 0xC1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, \r
-0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0x86, 0x22, 0x90, \r
-0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xC1, 0xFE, 0x90, 0xA1, 0xC9, \r
-0xE0, 0x64, 0x01, 0x70, 0x38, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, \r
-0x60, 0x20, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0x90, 0xA1, \r
-0xCD, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0xFF, 0x90, 0xA1, 0xD6, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, \r
-0xC1, 0xE4, 0xE4, 0x90, 0xA1, 0xC9, 0xF0, 0x90, 0xA1, 0xD4, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xC9, \r
-0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, \r
-0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0x90, 0xA1, \r
-0xCC, 0xE0, 0xFF, 0x90, 0xA1, 0xD6, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xC1, 0xE4, 0xE4, 0x90, \r
-0xA1, 0xC9, 0xF0, 0x90, 0xA1, 0xD4, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xC9, 0xE0, 0x64, 0x06, \r
-0x60, 0x02, 0xC1, 0x45, 0x90, 0xA1, 0xD7, 0xE0, 0xFF, 0x90, 0xA1, 0xD6, 0xE0, 0x2F, 0xFF, 0xE4, \r
-0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xCD, 0xE0, 0x2F, 0xFF, 0xEC, \r
-0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA1, 0xD7, \r
-0xE0, 0x94, 0x03, 0x40, 0x11, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xD4, 0x20, \r
-0xE0, 0x02, 0xA1, 0xE8, 0xC1, 0x8D, 0x90, 0xA1, 0xC8, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
-0xE0, 0x7A, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, \r
-0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xE6, 0xE0, 0x30, 0xE0, 0x02, 0xC1, 0x73, 0x90, 0xA1, 0xD4, 0xC1, \r
-0x8D, 0x90, 0xA1, 0xD7, 0xE0, 0xFF, 0x90, 0xA1, 0xD6, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, \r
-0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xCD, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, \r
-0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0E, 0x90, 0xA1, 0xE6, 0xE0, 0x30, 0xE0, \r
-0x02, 0xC1, 0x73, 0x90, 0xA1, 0xD4, 0xC1, 0x8D, 0x90, 0xA1, 0xE6, 0xE0, 0x30, 0xE0, 0x16, 0x90, \r
-0xA1, 0xC9, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xD6, 0xF0, \r
-0x90, 0xA3, 0xD4, 0xC1, 0x99, 0x90, 0xA1, 0xD4, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x49, 0x68, 0x90, \r
-0xA1, 0xD7, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x91, 0x06, 0x90, 0xA1, 0xD7, 0xE0, 0xFF, 0x90, 0xA1, \r
-0xD6, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, \r
-0xCD, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, \r
-0x50, 0x0A, 0x90, 0xA1, 0xD7, 0xE0, 0x94, 0x03, 0x50, 0x02, 0xC1, 0xFE, 0x90, 0x07, 0x78, 0x74, \r
-0x03, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x49, 0x5D, 0x90, 0x04, \r
-0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xC9, 0xE0, 0x64, 0x07, 0x70, 0x4F, 0x90, 0xA1, 0xD7, \r
-0xE0, 0xB4, 0x04, 0x05, 0x90, 0xA1, 0xD4, 0x80, 0x34, 0x90, 0xA1, 0xC8, 0xE0, 0xFF, 0x13, 0x13, \r
-0x54, 0x3F, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xE6, 0xE0, \r
-0x30, 0xE0, 0x17, 0x90, 0xA1, 0xC9, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, \r
-0x90, 0xA1, 0xD6, 0xF0, 0x90, 0xA3, 0xD4, 0x04, 0x80, 0x0F, 0x90, 0xA1, 0xD4, 0x74, 0x05, 0xF0, \r
-0x22, 0x12, 0x49, 0x68, 0x90, 0xA1, 0xD7, 0xE0, 0x04, 0xF0, 0x80, 0x48, 0x90, 0xA1, 0xC9, 0xE0, \r
-0x64, 0x09, 0x70, 0x5A, 0x90, 0xA1, 0xC8, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xD4, 0x74, 0x05, \r
-0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x28, \r
-0x74, 0x04, 0xF0, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA3, 0xD4, \r
-0xE0, 0x90, 0xA1, 0xD4, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, \r
-0xA1, 0xC9, 0xF0, 0x22, 0x7F, 0x03, 0x81, 0x06, 0x90, 0xA3, 0xD4, 0xE0, 0x90, 0xA1, 0xD4, 0x60, \r
-0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xC9, 0xF0, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, \r
-0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x90, \r
-0xA1, 0xB2, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, \r
-0x03, 0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0x20, 0xE0, 0x35, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0x90, \r
-0xA2, 0x00, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, 0xE9, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xE9, 0x74, \r
-0x01, 0xF0, 0x90, 0xA1, 0xB2, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0xEA, 0x30, 0xE0, 0x05, \r
-0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0xE9, 0x12, 0x77, 0xDF, 0x7F, 0x02, \r
-0x12, 0x47, 0xD5, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0x49, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xD1, 0xFF, 0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0xD1, 0xFF, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x49, 0x5D, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xF1, 0x8A, 0x90, 0x05, 0x27, 0xE0, 0x54, \r
-0xBF, 0xF0, 0xE4, 0x90, 0xA1, 0x14, 0xF0, 0x22, 0xF1, 0xBD, 0x80, 0xEF, 0xF1, 0xB0, 0x80, 0xEB, \r
-0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x49, 0x5D, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, \r
-0x22, 0xD1, 0xFF, 0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x49, 0x5D, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, \r
-0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA3, 0x18, 0x74, 0x08, 0xF0, 0x90, 0xA3, \r
-0x26, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x1A, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x18, 0x02, \r
-0x67, 0x5E, 0x90, 0xA2, 0xDE, 0x74, 0x0A, 0xF0, 0x90, 0xA2, 0xEC, 0x74, 0x06, 0xF0, 0x12, 0x06, \r
-0x89, 0x90, 0xA2, 0xE0, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xE1, 0xF0, 0x90, \r
-0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xE2, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, \r
-0xA2, 0xE3, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xE4, 0xF0, 0x90, 0x00, 0x05, \r
-0x12, 0x06, 0xA2, 0x90, 0xA2, 0xE5, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x02, 0x67, 0x5E, \r
-0x12, 0x06, 0x89, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, \r
-0x12, 0x06, 0xA2, 0xF5, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, \r
-0x12, 0x06, 0xA2, 0xF5, 0x57, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, \r
-0x12, 0x06, 0xA2, 0xF5, 0x59, 0xE5, 0x51, 0x12, 0x45, 0x67, 0x80, 0xA3, 0x00, 0x80, 0xAB, 0x01, \r
-0x80, 0xB3, 0x02, 0x80, 0xBB, 0x03, 0x80, 0xC3, 0x04, 0x80, 0xCB, 0x05, 0x80, 0xD3, 0x06, 0x00, \r
-0x00, 0x80, 0xEA, 0x75, 0x52, 0x02, 0x75, 0x53, 0x29, 0x80, 0x45, 0x75, 0x52, 0x06, 0x75, 0x53, \r
-0x2A, 0x80, 0x3D, 0x75, 0x52, 0x01, 0x75, 0x53, 0x31, 0x80, 0x35, 0x75, 0x52, 0x01, 0x75, 0x53, \r
-0x32, 0x80, 0x2D, 0x75, 0x52, 0x06, 0x75, 0x53, 0x33, 0x80, 0x25, 0x7B, 0x00, 0x7A, 0x00, 0x79, \r
-0x54, 0x01, 0x02, 0x90, 0xA2, 0x02, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, \r
-0xF0, 0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, \r
-0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x5E, 0x3C, 0x90, 0xA3, 0x6F, \r
-0x74, 0x0B, 0xF0, 0x90, 0xA3, 0x7D, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x71, 0xEF, 0xF0, 0x60, 0x32, \r
-0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x72, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA3, 0x73, 0xF0, \r
-0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x74, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA3, 0x75, 0xF0, \r
-0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x76, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA3, 0x77, 0xF0, \r
-0x80, 0x11, 0x90, 0xA3, 0x72, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x6F, 0x02, 0x67, 0x5E, 0x90, 0xA1, 0xB2, 0xE0, \r
-0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, \r
-0xA1, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, \r
-0x90, 0xA1, 0xB2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, \r
-0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0x41, \r
-0x39, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x39, 0x90, 0xA1, 0x18, 0xE0, 0xFF, \r
-0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0xA1, 0x21, 0xE0, \r
-0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x23, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, \r
-0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, \r
-0x12, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x12, 0x58, 0xBD, 0xEF, 0x70, \r
-0x02, 0xF5, 0x63, 0xE5, 0x63, 0x60, 0x42, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, \r
-0x23, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0x90, 0xA1, 0x23, 0xE0, \r
-0x80, 0x0F, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, \r
-0xFE, 0xFF, 0x90, 0xA1, 0x22, 0xE0, 0x2F, 0x90, 0xA3, 0xA2, 0x12, 0x48, 0x20, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x20, 0xE2, 0x03, 0x12, 0x54, 0x47, 0x31, 0x5C, 0x22, 0x90, 0xA2, 0x19, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, \r
-0x36, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x14, 0xE0, 0xB4, 0x01, 0x02, 0x80, \r
-0x4A, 0x90, 0xA2, 0x14, 0xE0, 0xB4, 0x02, 0x11, 0x51, 0x3A, 0x7F, 0x01, 0x12, 0x77, 0x42, 0x51, \r
-0xDA, 0x90, 0xA2, 0x14, 0x74, 0x03, 0xF0, 0x80, 0x4C, 0x90, 0xA2, 0x14, 0xE0, 0x64, 0x03, 0x70, \r
-0x23, 0x90, 0xA2, 0x17, 0x51, 0x3D, 0xE4, 0xFF, 0x12, 0x77, 0x42, 0x51, 0xDA, 0x90, 0xA2, 0x0D, \r
-0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0xE4, 0xFB, 0xFD, 0x12, 0x4C, 0xA8, 0x90, 0xA2, 0x14, 0x74, \r
-0x04, 0xF0, 0x80, 0x21, 0x90, 0xA2, 0x14, 0xE0, 0xB4, 0x04, 0x1A, 0x90, 0xA2, 0x0D, 0xE0, 0xC3, \r
-0x13, 0x54, 0x03, 0xFF, 0x7B, 0x01, 0x7D, 0x01, 0x12, 0x4C, 0xA8, 0x90, 0xA2, 0x14, 0x74, 0x02, \r
-0xF0, 0x90, 0xA2, 0x12, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x70, 0x1C, 0x90, 0xA2, 0x0E, \r
-0xE0, 0x54, 0x03, 0xFE, 0x70, 0x02, 0x80, 0x1B, 0xBE, 0x01, 0x02, 0x80, 0x20, 0xBE, 0x02, 0x02, \r
-0x80, 0x26, 0xEE, 0x64, 0x03, 0x70, 0x32, 0x80, 0x2A, 0x90, 0xA2, 0x0E, 0xE0, 0xC4, 0x54, 0x03, \r
-0xFE, 0x70, 0x07, 0x90, 0x07, 0x78, 0x04, 0xF0, 0x80, 0x1F, 0xBE, 0x01, 0x08, 0x90, 0x07, 0x78, \r
-0x74, 0x03, 0xF0, 0x80, 0x14, 0xBE, 0x02, 0x08, 0x90, 0x07, 0x78, 0x74, 0x09, 0xF0, 0x80, 0x09, \r
-0xBE, 0x03, 0x06, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0xFE, 0xC4, 0x13, \r
-0x54, 0x07, 0x30, 0xE0, 0x45, 0xEF, 0x70, 0x1F, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x07, 0xE4, 0x90, 0xA3, 0x08, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x08, 0x74, 0x01, 0xF0, 0x90, 0xA3, \r
-0x08, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x20, 0x90, 0xA2, 0x0E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
-0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x08, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x08, 0x74, 0x01, 0xF0, \r
-0x90, 0xA3, 0x08, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x77, 0xE4, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA2, 0x0D, 0xE0, 0x30, 0xE0, 0x1F, 0x90, 0xA2, 0x12, 0xE0, 0xB4, 0x01, 0x0C, \r
-0xA3, 0xE0, 0xB4, 0x01, 0x13, 0x74, 0x02, 0xF0, 0x51, 0x3A, 0x80, 0x0C, 0x90, 0xA2, 0x12, 0xE0, \r
-0xB4, 0x02, 0x05, 0x74, 0x03, 0xF0, 0x51, 0x61, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x08, \r
-0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x7C, 0x06, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, \r
-0xD4, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, \r
-0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
-0x3C, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A, 0x90, 0xA1, 0xC2, 0xE0, 0xFF, \r
-0x90, 0xA1, 0xD2, 0x80, 0x21, 0x90, 0xA3, 0x08, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, 0xA1, 0xC2, \r
-0xE0, 0xFE, 0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0xA1, \r
-0xC3, 0xE0, 0xFF, 0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0xD8, 0xF0, 0x90, 0xA1, 0xC1, \r
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x54, 0x07, \r
-0x20, 0xE0, 0x02, 0x81, 0xCB, 0x90, 0xA1, 0xD8, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, \r
-0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, \r
-0x4C, 0x70, 0x80, 0x77, 0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x54, 0x90, 0xA1, \r
-0xC7, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x54, 0x4B, 0x90, 0xA1, 0xC5, 0xE0, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0xA1, 0xC8, 0xE0, 0x44, 0x02, 0xF0, 0x54, \r
-0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xD7, 0xF0, 0x90, 0xA1, 0xD4, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xFF, \r
-0xB4, 0x01, 0x08, 0x90, 0xA1, 0xC9, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, \r
-0xA1, 0xC9, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x60, 0x07, 0x90, 0xA1, 0xC8, 0xE0, 0x44, \r
-0x04, 0xF0, 0x90, 0xA3, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, 0x90, 0xA3, 0x08, \r
-0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x5D, 0x90, 0xA1, 0xC5, 0xE0, 0x13, \r
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x1B, 0x90, 0xA1, 0xD8, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, \r
-0x0A, 0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, \r
-0x4B, 0xBA, 0x90, 0xA1, 0xC4, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x22, \r
-0x90, 0xA1, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, \r
-0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, \r
-0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, \r
-0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, \r
-0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, \r
-0x7F, 0xF0, 0x90, 0xA1, 0xE6, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0xA1, 0xC7, 0xE0, 0x54, 0xDF, \r
-0xF0, 0xE4, 0x90, 0xA1, 0xC6, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, \r
-0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xCF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0x54, \r
-0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0xA1, 0xE7, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, \r
-0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA1, 0xDC, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, \r
-0xF0, 0x90, 0xA1, 0xE1, 0xE0, 0x90, 0x07, 0x78, 0xF0, 0x90, 0xA1, 0xE2, 0x12, 0x77, 0xDF, 0x12, \r
-0x7E, 0xFF, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5D, 0x12, 0x77, 0x2C, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, \r
-0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x02, 0x80, 0xC7, \r
-0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, \r
-0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90, 0xA3, 0xF5, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, \r
-0x57, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA3, 0xF5, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x98, \r
-0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x9F, 0x9D, \r
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9E, 0xF0, 0x90, 0x00, 0x02, \r
-0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, \r
-0x51, 0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA1, \r
-0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0x8B, 0x51, \r
-0x8A, 0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, \r
-0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, \r
-0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, \r
-0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, \r
-0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, \r
-0xE0, 0xAF, 0x54, 0x70, 0x04, 0xD1, 0xFC, 0x80, 0x02, 0xD1, 0xEB, 0x05, 0x54, 0x80, 0xC6, 0xF1, \r
-0x0D, 0x90, 0xA0, 0x90, 0xE0, 0x70, 0x13, 0x12, 0x7E, 0xFF, 0x12, 0x57, 0x66, 0x90, 0xA1, 0x16, \r
-0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, \r
-0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, \r
-0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x74, \r
-0x32, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xEF, \r
-0xE4, 0x90, 0xA1, 0x2D, 0xF0, 0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x22, 0xE4, 0x90, \r
-0xA2, 0xF8, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, \r
-0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x43, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x41, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, \r
-0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x22, 0x90, 0xA1, 0x41, 0xA3, 0xEB, 0x9F, 0xFD, 0xC3, 0x94, \r
-0x0F, 0x50, 0x13, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, \r
-0x90, 0xA1, 0x2D, 0xE0, 0x04, 0xF0, 0x12, 0x94, 0xF6, 0x90, 0xA1, 0x2D, 0xE0, 0xD3, 0x94, 0x64, \r
-0x40, 0x4B, 0xE4, 0x90, 0xA2, 0xF9, 0xF0, 0x90, 0xA2, 0xF8, 0xF0, 0x90, 0xA2, 0xF8, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x0F, 0x50, 0x2A, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, \r
-0xFF, 0x90, 0xA2, 0xF9, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x0A, 0x90, 0xA2, 0xF8, \r
-0xE0, 0x90, 0xA1, 0x2C, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0xF8, 0xE0, 0x04, 0xF0, 0x80, 0xCC, 0x90, \r
-0xA1, 0x2C, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x12, 0x94, 0xA3, 0xF1, 0x0D, 0x22, 0x90, 0x04, \r
-0x24, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA2, 0x2F, 0xF0, 0x90, 0x00, 0x01, \r
-0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, 0x3C, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, \r
-0x51, 0x90, 0xA2, 0x49, 0xF0, 0x22, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xFF, \r
-0x54, 0x7F, 0x90, 0xA1, 0x1A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, 0x18, 0xE0, \r
+0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x7C, 0xF0, 0x74, \r
+0x68, 0xA3, 0xF0, 0x12, 0x9A, 0x00, 0xE5, 0x19, 0x30, 0xE1, 0x03, 0x12, 0x67, 0xB8, 0xE5, 0x19, \r
+0x30, 0xE4, 0x03, 0x12, 0x66, 0xA8, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x59, 0x1A, 0xE5, 0x19, \r
+0x30, 0xE6, 0x03, 0x12, 0x9A, 0x2D, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x71, 0x88, 0xE5, 0x1B, 0x30, \r
+0xE1, 0x03, 0x12, 0x86, 0xD2, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0xD1, 0xF1, 0xE5, 0x1B, 0x30, 0xE3, \r
+0x03, 0x12, 0x9A, 0x3A, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9A, 0x63, 0xE5, 0x1B, 0x30, 0xE5, \r
+0x02, 0x71, 0xA4, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9A, 0x92, 0xE5, 0x1C, 0x30, 0xE1, 0x02, \r
+0x71, 0xC2, 0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0x2D, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0x36, \r
+0x74, 0x7C, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, \r
+0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, \r
+0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x63, 0x74, 0x8D, 0x25, 0x63, 0xF5, 0x82, 0xE4, \r
+0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x21, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, \r
+0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, \r
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x21, 0x75, 0xF0, 0x10, 0xE5, 0x63, \r
+0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, \r
+0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, \r
+0x44, 0x20, 0xF0, 0x80, 0x7C, 0xEF, 0x30, 0xE6, 0x21, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, \r
+0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45, \r
+0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, 0x52, 0x74, 0x92, 0x25, 0x63, 0xF5, 0x82, \r
+0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, \r
+0x9C, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, 0xAF, 0x63, 0x12, 0x9F, 0x24, 0x74, 0x92, \r
+0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x24, 0x75, 0xF0, 0x10, \r
+0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, \r
+0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, 0x63, 0x12, 0x7D, \r
+0x73, 0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x39, 0x22, 0xE4, 0xFF, 0x90, \r
+0xA0, 0x58, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, \r
+0x48, 0x74, 0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, \r
+0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA0, 0x59, 0x30, 0xE7, 0x0E, 0xE0, 0x24, \r
+0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x15, 0xE0, 0xFF, 0x12, 0xAD, \r
+0x81, 0x90, 0xA0, 0x59, 0xE0, 0x24, 0x5A, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0x74, 0x01, \r
+0xF0, 0x90, 0xA0, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAE, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, \r
+0xE4, 0x90, 0xA0, 0x59, 0xF0, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61, \r
+0x87, 0x74, 0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x61, 0x7F, \r
+0x90, 0xA0, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0xA9, 0xE0, 0xFD, \r
+0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x07, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA0, \r
+0x59, 0xE0, 0xFC, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, \r
+0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA0, 0x59, \r
+0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, \r
+0x01, 0x90, 0xA0, 0x59, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE5, \r
+0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, \r
+0x8D, 0x01, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xED, \r
+0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xCB, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, \r
+0x09, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, \r
+0xEE, 0xF0, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0x90, 0xA0, 0x58, 0xE0, 0xFD, 0x12, 0xA8, 0xDA, 0x90, \r
+0xA0, 0x59, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, \r
+0xA0, 0x59, 0xE0, 0x04, 0xF0, 0x41, 0x95, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x10, 0xA3, \r
+0x74, 0x01, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x71, 0xEE, 0x91, \r
+0x13, 0x02, 0x5F, 0xD4, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0x9F, 0x17, 0xE0, 0x60, \r
+0x10, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x03, 0x02, 0x77, 0x62, 0x12, 0x4F, \r
+0x9B, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x12, 0x90, \r
+0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x08, 0x71, 0xE2, 0xBF, 0x01, 0x06, 0x02, 0x77, 0x24, 0x12, 0x57, \r
+0xA3, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0B, \r
+0x71, 0xE2, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB2, 0xCB, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x02, 0x81, 0xDA, 0x90, 0x9E, \r
+0x8D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xDA, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x1D, 0x90, \r
+0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, \r
+0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x9F, 0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0x15, 0xE0, \r
+0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x9F, 0x1E, \r
+0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x9F, 0x20, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, \r
+0x90, 0x9F, 0x1D, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0x9F, 0x0E, 0xE0, 0x30, \r
+0xE0, 0x11, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x71, 0xE2, 0xEF, 0x70, \r
+0x02, 0xF5, 0x63, 0xE5, 0x63, 0x60, 0x43, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F, \r
+0x20, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0x20, 0xE0, \r
+0x80, 0x0F, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0x20, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, \r
+0xFE, 0xFF, 0x90, 0x9F, 0x1F, 0xE0, 0x2F, 0x90, 0xA1, 0xAF, 0x12, 0x48, 0x1F, 0x90, 0x9F, 0x1A, \r
+0xE0, 0x20, 0xE2, 0x03, 0x12, 0x52, 0x3C, 0x12, 0x7F, 0xC5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x54, 0x12, 0x06, \r
+0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0x0E, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, \r
+0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, \r
+0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0x0E, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, \r
+0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x9F, \r
+0x0E, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, \r
+0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x9F, 0x0E, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, \r
+0x02, 0xA1, 0xFF, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0xE6, 0x75, 0x54, 0x21, 0x13, 0x13, 0x54, 0x3F, \r
+0x30, 0xE0, 0x11, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x56, 0xCE, 0x43, \r
+0x54, 0x08, 0x80, 0x0C, 0xE4, 0x90, 0x9F, 0x0F, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xD1, 0xD9, \r
+0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x12, \r
+0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13, \r
+0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
+0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0x9F, 0x11, \r
+0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0xB2, 0xCB, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x21, 0x71, 0xE2, 0xEF, 0x60, 0x04, 0x7F, 0x01, \r
+0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, \r
+0x9F, 0x11, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xC1, 0xCA, 0xFF, 0x12, 0xB2, 0xCB, 0xC1, 0xCA, 0x90, \r
+0x9F, 0x0E, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0xC1, 0x96, 0x43, 0x54, 0x31, 0x13, 0x13, 0x54, 0x3F, \r
+0x30, 0xE0, 0x11, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x56, 0xCE, 0x43, \r
+0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xD1, 0xD9, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x13, \r
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, \r
+0x03, 0x43, 0x54, 0x04, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, 0x6B, 0xE4, \r
+0xFD, 0x7F, 0x02, 0x80, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9F, 0x12, 0xE0, \r
+0xB4, 0x02, 0x19, 0x12, 0xB6, 0x69, 0x71, 0xE2, 0xBF, 0x01, 0x09, 0x90, 0x9F, 0x19, 0xE0, 0xFF, \r
+0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0x40, 0x80, 0x3E, 0x90, 0x9F, 0x1A, 0xE0, \r
+0x90, 0x9F, 0x12, 0xF0, 0x80, 0x34, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, \r
+0x9F, 0x12, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x9F, 0x12, 0xE0, \r
+0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x52, 0x40, 0x12, 0x57, 0xE8, 0x90, 0x9F, 0x19, \r
+0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x52, 0x40, 0x12, 0xB2, 0x90, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, \r
+0x02, 0x7F, 0x02, 0xD1, 0xD9, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, \r
+0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, \r
+0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, \r
+0x36, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x9F, 0x1A, 0xE0, 0x64, \r
+0x02, 0x60, 0x24, 0x12, 0x75, 0xD7, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, \r
+0xE0, 0x15, 0x90, 0x9F, 0x1D, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0B, 0x12, 0x57, 0x7F, 0xD1, \r
+0xCF, 0x90, 0x9F, 0x1E, 0xE0, 0x14, 0xF0, 0x22, 0xEF, 0x70, 0x4F, 0x7D, 0x78, 0x7F, 0x02, 0xD1, \r
+0xD9, 0x7D, 0x02, 0x7F, 0x03, 0xD1, 0xD9, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x77, 0x0C, 0x90, 0x01, \r
+0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9E, 0x8D, 0xE0, 0x70, 0x15, 0x12, \r
+0x5D, 0x10, 0x12, 0x57, 0xD5, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, \r
+0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x52, 0x40, 0x90, 0x9F, 0x13, 0xE0, 0x54, \r
+0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, \r
+0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x56, 0xCE, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x56, \r
+0xCE, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58, \r
+0xF0, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFB, 0xF0, 0x90, \r
+0x9F, 0x1A, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x52, 0x40, 0x90, 0x9F, 0x14, \r
+0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xBD, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0, \r
+0x30, 0xE4, 0x0A, 0xD1, 0xCF, 0x90, 0x9F, 0xBF, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0xC0, 0xE0, \r
+0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, \r
+0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xEE, \r
+0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xF1, 0x8D, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0xB6, 0xE5, 0x21, \r
+0x30, 0xE2, 0x02, 0x11, 0xDA, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0x11, 0xA4, 0xE5, 0x22, 0x30, 0xE0, \r
+0x02, 0x51, 0xC1, 0xE5, 0x23, 0x30, 0xE1, 0x02, 0x71, 0xBD, 0xE5, 0x23, 0x30, 0xE0, 0x02, 0x71, \r
+0x4F, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0x07, 0xE5, 0x23, 0x30, 0xE2, 0x09, 0x11, 0xF5, 0x90, \r
+0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x62, 0x15, \r
+0xE5, 0x24, 0x30, 0xE4, 0x02, 0x11, 0xC2, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x9A, 0xAE, 0xE5, \r
+0x24, 0x30, 0xE6, 0x02, 0x91, 0x6A, 0xE5, 0x24, 0x30, 0xE7, 0x03, 0x12, 0x5F, 0x68, 0x74, 0xEE, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, \r
+0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, \r
+0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA0, 0x29, 0xE0, 0x30, 0xE0, 0x0A, 0xF1, 0x08, 0xE4, 0x90, 0xA0, \r
+0x2B, 0xF0, 0x12, 0x47, 0xF8, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x03, 0x12, 0xB6, 0x84, 0x02, \r
+0x48, 0x59, 0x91, 0x06, 0x90, 0x9F, 0x1D, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, \r
+0x02, 0x12, 0x56, 0xCE, 0x12, 0x5F, 0xD4, 0x02, 0x57, 0x3E, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x14, \r
+0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0xB5, 0x5E, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xF7, \r
+0xF0, 0x12, 0x52, 0x28, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x16, 0xE0, \r
+0x30, 0xE0, 0x1F, 0x90, 0xA0, 0x1B, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x13, 0x74, \r
+0x02, 0xF0, 0x31, 0x27, 0x80, 0x0C, 0x90, 0xA0, 0x1B, 0xE0, 0xB4, 0x02, 0x05, 0x74, 0x03, 0xF0, \r
+0x31, 0x4E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, \r
+0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD, \r
+0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x1D, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x48, 0x90, 0xA0, \r
+0x1D, 0xE0, 0xB4, 0x02, 0x10, 0x31, 0x27, 0x7F, 0x01, 0x31, 0xC5, 0x51, 0x1C, 0x90, 0xA0, 0x1D, \r
+0x74, 0x03, 0xF0, 0x80, 0x4B, 0x90, 0xA0, 0x1D, 0xE0, 0x64, 0x03, 0x70, 0x22, 0x90, 0xA0, 0x20, \r
+0x31, 0x2A, 0xE4, 0xFF, 0x31, 0xC5, 0x51, 0x1C, 0x90, 0xA0, 0x16, 0xE0, 0xC3, 0x13, 0x54, 0x03, \r
+0xFF, 0xE4, 0xFB, 0xFD, 0x12, 0x4C, 0xA9, 0x90, 0xA0, 0x1D, 0x74, 0x04, 0xF0, 0x80, 0x21, 0x90, \r
+0xA0, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, 0x90, 0xA0, 0x16, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0x7B, \r
+0x01, 0x7D, 0x01, 0x12, 0x4C, 0xA9, 0x90, 0xA0, 0x1D, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0x1B, 0xF0, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, \r
+0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, \r
+0xF0, 0x80, 0x34, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, \r
+0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x30, 0xE0, 0x17, \r
+0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, \r
+0x03, 0x90, 0x06, 0xCC, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xED, 0x70, \r
+0x23, 0x90, 0xA0, 0x17, 0xE0, 0x54, 0x03, 0xFC, 0x70, 0x02, 0x80, 0x22, 0xBC, 0x01, 0x02, 0x80, \r
+0x24, 0x90, 0xA0, 0x17, 0xE0, 0x54, 0x03, 0xFC, 0xBC, 0x02, 0x02, 0x80, 0x27, 0xEC, 0x64, 0x03, \r
+0x70, 0x2E, 0x80, 0x27, 0x90, 0xA0, 0x17, 0xE0, 0xC4, 0x54, 0x03, 0xFC, 0x70, 0x04, 0x7F, 0x01, \r
+0x80, 0x1B, 0xBC, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x14, 0x90, 0xA0, 0x17, 0xE0, 0xC4, 0x54, 0x03, \r
+0xFC, 0xBC, 0x02, 0x04, 0x7F, 0x09, 0x80, 0x05, 0xBC, 0x03, 0x05, 0x7F, 0x0D, 0x12, 0x5A, 0xD8, \r
+0x90, 0xA0, 0x16, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x45, 0xED, 0x70, 0x1F, 0xA3, 0xE0, \r
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA1, \r
+0x15, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x20, 0x90, 0xA0, 0x17, \r
+0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x06, \r
+0x90, 0xA1, 0x15, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x87, 0xBD, \r
+0x22, 0x12, 0x9B, 0x18, 0x90, 0xA1, 0x15, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, \r
+0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x54, 0x47, 0x90, 0xA1, 0x15, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, \r
+0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, \r
+0x9F, 0x28, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x9F, 0x2D, 0xE0, 0xFB, 0xAC, 0x07, 0x90, 0x9F, \r
+0x13, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x9F, 0x29, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0x9F, \r
+0x1F, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0x9F, 0x1F, 0xF0, 0x7D, 0x03, 0x90, \r
+0x9F, 0x4E, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0x9F, 0x2C, 0xF0, 0x90, 0x9F, 0x22, \r
+0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0x9F, 0x22, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, \r
+0x90, 0x9F, 0x1F, 0xEB, 0xF0, 0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, \r
+0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90, 0x9F, 0x12, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, \r
+0x7E, 0x01, 0x90, 0x9F, 0x11, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, \r
+0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x6B, 0xEE, 0x71, 0x96, 0x90, 0x9F, 0x12, 0xE0, \r
+0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x9F, 0x12, 0xE0, 0x70, 0x06, 0xFD, \r
+0x7F, 0x04, 0x12, 0x52, 0x40, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
+0x30, 0xE0, 0x0F, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, \r
+0x52, 0x40, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xF1, 0x24, 0x22, 0x90, 0x9F, 0x0E, \r
+0xE0, 0xFF, 0x30, 0xE0, 0x40, 0x90, 0x9F, 0x12, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, \r
+0x90, 0x9F, 0x11, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF, \r
+0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x6B, 0xEE, 0x12, 0xB4, 0x75, 0x90, 0x9F, 0x12, 0xE0, 0xB4, \r
+0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x04, 0x06, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x52, 0x40, 0x22, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x90, 0x9F, 0x17, 0xE0, 0x60, \r
+0x58, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x50, 0x90, 0xA1, 0x15, 0x04, 0xF0, 0xE4, 0x90, \r
+0x9F, 0x1E, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x02, \r
+0x05, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x12, 0x6B, 0xE2, 0xEF, 0x70, 0x04, 0x90, 0xA1, 0x15, 0xF0, \r
+0x90, 0xA1, 0x15, 0xE0, 0x60, 0x23, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, 0xA1, \r
+0xAE, 0xF0, 0x90, 0x9F, 0x1F, 0xE0, 0x90, 0xA1, 0xAF, 0x12, 0x48, 0x1F, 0x90, 0x9F, 0x1A, 0xE0, \r
+0x20, 0xE2, 0x03, 0x12, 0x52, 0x3C, 0x12, 0x7F, 0xC5, 0x22, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0xC4, \r
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, \r
+0x90, 0x9F, 0x14, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x90, 0x9F, 0x17, 0xE0, 0x60, 0x03, 0x12, 0x52, 0x28, 0x90, 0x9F, 0xCE, 0xE0, 0xFF, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90, 0x9F, 0xD1, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, \r
+0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x9F, 0xD1, 0x30, 0xE1, 0x06, 0xE0, 0x44, \r
+0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x03, 0x12, \r
+0xB1, 0x9C, 0x22, 0xE4, 0x90, 0xA1, 0x05, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, \r
+0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, \r
+0x90, 0x9F, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x9F, \r
+0x4A, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF, 0x90, \r
+0x9F, 0x2C, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13, 0x74, \r
+0x2F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0x2A, 0xE0, \r
+0x04, 0xF0, 0xB1, 0xA5, 0x90, 0x9F, 0x2A, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x67, 0xE4, 0x90, 0xA1, \r
+0x06, 0xF0, 0x90, 0xA1, 0x05, 0xF0, 0x90, 0xA1, 0x05, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, 0x47, \r
+0x74, 0x2F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA1, 0x06, 0xE0, \r
+0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0xA1, 0x05, 0xE0, 0xFF, 0x94, 0x0A, 0x40, \r
+0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x9F, 0x29, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0x9F, 0x29, 0xF0, \r
+0x90, 0xA1, 0x05, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x9F, 0x28, 0xF0, 0x80, 0x08, 0x90, \r
+0xA1, 0x05, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x9F, 0x29, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, \r
+0x51, 0xFC, 0xF1, 0x41, 0x22, 0x90, 0x9F, 0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20, 0xE0, 0xD3, 0x9F, \r
+0x40, 0x24, 0x90, 0x9F, 0x2E, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0x9F, \r
+0x28, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x9F, 0x2D, 0xF0, 0xFB, 0x90, 0x9F, 0x28, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0xFD, 0x51, 0xFC, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, \r
+0x86, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x02, 0xC1, 0x86, 0x90, 0x9F, 0x15, 0xE0, 0xFF, 0xC4, 0x54, \r
+0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9F, 0x1E, 0xF0, 0x90, 0x06, 0xAA, \r
+0xE0, 0x04, 0x90, 0x9F, 0x1D, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x9F, 0x1D, 0xE0, 0xFE, \r
+0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x9F, 0x1E, 0xEF, 0xF0, 0x90, 0x9F, 0x13, 0xE0, 0x30, \r
+0xE0, 0x02, 0x91, 0xD3, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0x20, 0xF0, \r
+0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, \r
+0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x9F, \r
+0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0E, 0x90, 0x9F, 0x0E, 0xE0, \r
+0x30, 0xE0, 0x05, 0x12, 0xB4, 0xC4, 0x80, 0x02, 0xD1, 0x97, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0x90, 0x9F, 0x1D, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x06, \r
+0x12, 0x57, 0x7F, 0x12, 0x6E, 0xD5, 0x90, 0x9F, 0x0E, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x07, 0x90, \r
+0x9F, 0x14, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, \r
+0x54, 0xC0, 0x70, 0x0D, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x52, \r
+0x28, 0xE5, 0x63, 0x30, 0xE6, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0x9F, \r
+0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xF1, \r
+0x62, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, \r
+0x63, 0x90, 0x9F, 0x1B, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, \r
+0x90, 0x9F, 0xB7, 0xE0, 0x90, 0xA1, 0xAF, 0x12, 0x48, 0x1F, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x04, \r
+0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8, \r
+0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, \r
+0x83, 0xEE, 0xF0, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x02, 0x60, 0x14, 0x90, 0x9F, 0x15, 0xE0, \r
+0x54, 0x0F, 0x60, 0x0C, 0x12, 0x57, 0xF0, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x52, 0x40, \r
+0x22, 0xE4, 0xFF, 0x74, 0x2F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, \r
+0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90, 0x9F, 0x2A, 0xF0, 0x90, 0x9F, 0x2E, 0xF0, 0x90, 0x9F, 0x28, \r
+0xF0, 0x22, 0x90, 0x9F, 0xBB, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x20, 0x90, 0x04, 0x1D, 0xE0, \r
+0x70, 0x1A, 0x90, 0x9D, 0x9A, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4A, 0xB0, 0x90, 0xA2, \r
+0x07, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x3C, \r
+0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, \r
+0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, \r
+0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0xC0, 0xE0, 0xC0, \r
+0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
+0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xBD, 0xF0, \r
+0x74, 0x77, 0xA3, 0xF0, 0x12, 0x62, 0x24, 0x53, 0x91, 0xBF, 0x74, 0xBD, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0x74, 0x77, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, \r
+0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, \r
+0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, \r
+0x10, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x78, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, \r
+0x32, 0x90, 0xA0, 0xEB, 0x74, 0x0A, 0xF0, 0x90, 0xA0, 0xF9, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, \r
+0x90, 0xA0, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEE, 0xF0, 0x90, 0x00, \r
+0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA0, \r
+0xF0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xF1, 0xF0, 0x90, 0x00, 0x05, 0x12, \r
+0x06, 0xA2, 0x90, 0xA0, 0xF2, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x02, 0x64, 0x94, 0x12, \r
+0x06, 0x89, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, 0x12, \r
+0x06, 0xA2, 0xF5, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, 0x12, \r
+0x06, 0xA2, 0xF5, 0x57, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, 0x12, \r
+0x06, 0xA2, 0xF5, 0x59, 0xE5, 0x51, 0x12, 0x45, 0xC7, 0x78, 0xE2, 0x00, 0x78, 0xEA, 0x01, 0x78, \r
+0xF2, 0x02, 0x78, 0xFA, 0x03, 0x79, 0x02, 0x04, 0x79, 0x0A, 0x05, 0x79, 0x12, 0x06, 0x00, 0x00, \r
+0x79, 0x29, 0x75, 0x52, 0x02, 0x75, 0x53, 0x29, 0x80, 0x45, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, \r
+0x80, 0x3D, 0x75, 0x52, 0x01, 0x75, 0x53, 0x31, 0x80, 0x35, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, \r
+0x80, 0x2D, 0x75, 0x52, 0x06, 0x75, 0x53, 0x33, 0x80, 0x25, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, \r
+0x01, 0x41, 0x90, 0xA0, 0x0B, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, 0xF0, \r
+0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, \r
+0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x61, 0xC7, 0x90, 0xA0, 0xE8, 0x12, \r
+0x45, 0xBE, 0x90, 0xA0, 0xE7, 0xEF, 0xF0, 0x12, 0x45, 0xC7, 0x79, 0xAB, 0x00, 0x79, 0xB4, 0x01, \r
+0x79, 0xBC, 0x02, 0x79, 0xC4, 0x10, 0x79, 0xCC, 0x11, 0x79, 0xD5, 0x12, 0x79, 0xDD, 0x14, 0x79, \r
+0xE5, 0x20, 0x79, 0xEE, 0x21, 0x79, 0xF7, 0x23, 0x79, 0xFF, 0x24, 0x7A, 0x08, 0x25, 0x7A, 0x11, \r
+0x27, 0x7A, 0x1A, 0x28, 0x7A, 0x23, 0x40, 0x7A, 0x2C, 0x42, 0x7A, 0x34, 0x60, 0x7A, 0x3D, 0x61, \r
+0x7A, 0x46, 0x62, 0x7A, 0x4F, 0x63, 0x7A, 0x58, 0x64, 0x7A, 0x61, 0x65, 0x7A, 0x69, 0x66, 0x7A, \r
+0x72, 0x67, 0x7A, 0x7B, 0x68, 0x7A, 0x84, 0x69, 0x7A, 0x8C, 0x6B, 0x7A, 0x95, 0x6C, 0x7A, 0x9E, \r
+0x6D, 0x7A, 0xA7, 0x6E, 0x7A, 0xB0, 0x6F, 0x00, 0x00, 0x7A, 0xB8, 0x90, 0xA0, 0xE8, 0x12, 0x45, \r
+0xB5, 0x02, 0x8E, 0x45, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x61, 0x8A, 0x90, 0xA0, 0xE8, 0x12, \r
+0x45, 0xB5, 0x41, 0xDC, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x9D, 0x90, 0xA0, 0xE8, 0x12, \r
+0x45, 0xB5, 0x02, 0x8E, 0x9D, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x41, 0xC8, 0x90, 0xA0, 0xE8, \r
+0x12, 0x45, 0xB5, 0xE1, 0x34, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x8F, 0xD6, 0x90, 0xA0, \r
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x91, 0xD0, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x2C, 0x90, \r
+0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x6C, 0xDB, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x92, \r
+0x16, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x92, 0x55, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, \r
+0x02, 0x92, 0x94, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0xAC, 0x17, 0x90, 0xA0, 0xE8, 0x12, \r
+0x45, 0xB5, 0x81, 0x0C, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x83, 0x03, 0x90, 0xA0, 0xE8, \r
+0x12, 0x45, 0xB5, 0x02, 0x64, 0xFE, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x67, 0xBC, 0x90, \r
+0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x67, 0xC2, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x93, \r
+0x35, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x65, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, \r
+0x67, 0x26, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x65, 0xB7, 0x90, 0xA0, 0xE8, 0x12, 0x45, \r
+0xB5, 0x02, 0x67, 0xD5, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x01, 0x8F, 0x90, 0xA0, 0xE8, 0x12, \r
+0x45, 0xB5, 0x02, 0x93, 0x97, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xBB, 0x90, 0xA0, \r
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xE5, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x95, 0x47, \r
+0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x77, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
+0xA0, 0xE7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9E, 0x8C, 0xF0, \r
+0xBF, 0x01, 0x08, 0x12, 0x98, 0x73, 0xE4, 0x90, 0x9E, 0x8C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9F, 0x0D, \r
+0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x23, 0x80, 0x1E, \r
+0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x11, \r
+0x90, 0x9F, 0x0E, 0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0xB2, 0xCB, 0x80, 0x03, 0x12, 0x6B, \r
+0xEE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xF1, \r
+0xE0, 0xFF, 0x90, 0x9D, 0xF0, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
+0x70, 0x43, 0x90, 0x9D, 0xF0, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA0, 0x12, 0x45, 0xA9, \r
+0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA1, 0xF9, 0x74, 0x9D, 0x35, 0xF0, 0xFA, 0x7B, \r
+0x01, 0xAF, 0x05, 0x31, 0x3C, 0x90, 0x9D, 0xF0, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9D, 0xF0, 0xF0, 0x12, 0x95, 0x78, 0x90, 0x9D, \r
+0x93, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, \r
+0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, \r
+0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, \r
+0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, \r
+0x89, 0x54, 0x01, 0xFF, 0x74, 0x8D, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x74, 0x8D, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70, \r
+0x04, 0xF1, 0x54, 0x80, 0x02, 0xF1, 0x43, 0x05, 0x54, 0x80, 0xC6, 0x12, 0x77, 0x41, 0xE5, 0x55, \r
+0x70, 0x19, 0x90, 0x9E, 0x8D, 0xE0, 0x70, 0x13, 0x12, 0x5D, 0x10, 0x12, 0x57, 0xD5, 0x90, 0x9F, \r
+0x13, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x12, \r
+0x45, 0xBE, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, \r
+0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, \r
+0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, \r
+0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, \r
+0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, \r
+0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, \r
+0x83, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, \r
+0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, \r
+0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
+0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, \r
+0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, \r
+0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x92, \r
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4, \r
+0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x91, 0xF0, 0x74, 0x12, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5, 0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51, \r
+0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x74, 0x92, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x51, 0xB1, 0x1E, 0x22, 0x8F, 0x52, \r
+0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0xFF, \r
+0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, \r
+0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA0, 0xEE, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, \r
+0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94, 0x19, 0x40, 0x05, 0x90, 0xA0, 0xEE, 0x80, 0x0B, 0x75, \r
+0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, \r
+0xFB, 0xAF, 0x52, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, \r
+0xE4, 0x90, 0xA1, 0xA7, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA1, 0xA2, 0xF0, \r
+0xE5, 0x67, 0x54, 0x07, 0x90, 0xA1, 0xA4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, \r
+0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xA5, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x12, 0x45, \r
+0xA9, 0xE0, 0x54, 0x7F, 0x90, 0xA1, 0xA8, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x90, 0x96, 0x13, \r
+0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xA9, 0xF0, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA1, 0xA3, 0xF0, \r
+0xE5, 0x69, 0x70, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, \r
+0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0, \r
+0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x99, 0x12, 0x45, 0x39, 0x78, \r
+0x01, 0x12, 0x08, 0x47, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
+0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xA8, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0xFE, \r
+0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, \r
+0xA1, 0xA9, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x68, 0xE5, 0x68, 0x54, 0x7F, 0x90, \r
+0xA1, 0xA3, 0xF0, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA1, 0xA6, 0xF0, 0xE5, 0x69, 0x70, 0x33, 0x90, \r
+0xA1, 0xA2, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, \r
+0xE0, 0xFF, 0x90, 0xA1, 0xA4, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, \r
+0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA1, 0xA5, 0xE0, 0x54, 0x7F, 0xF0, \r
+0x80, 0x52, 0x90, 0xA1, 0xA2, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, \r
+0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xA4, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, \r
+0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, \r
+0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA1, 0xA5, 0xF0, 0x90, 0xA1, \r
+0xA3, 0xE0, 0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA1, 0xA5, \r
+0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5, \r
+0x68, 0xF0, 0xE5, 0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA1, 0xA5, 0xE0, \r
+0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, \r
+0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, \r
+0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xEF, 0xF0, \r
+0x7D, 0x01, 0xAF, 0x67, 0x12, 0xA8, 0xDA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x90, \r
+0x9F, 0x21, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x57, 0xE0, 0x54, 0xFE, \r
+0x4F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, \r
+0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, \r
+0xE0, 0x44, 0x04, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x09, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
+0x06, 0xA2, 0x90, 0xA0, 0x0A, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x33, 0x33, 0x33, 0x54, \r
+0xF8, 0xFF, 0x90, 0x9F, 0xEF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x90, 0x07, 0x65, 0x30, 0xE0, 0x04, 0x74, 0x18, 0xF0, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x04, 0x24, \r
+0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA0, 0x38, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
+0x06, 0xA2, 0x25, 0x51, 0x90, 0xA0, 0x46, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, \r
+0x90, 0xA0, 0x54, 0xF0, 0x22, 0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2B, 0xEF, \r
+0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x22, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, \r
+0xE0, 0x04, 0x7F, 0x03, 0x80, 0x11, 0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
+0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x5A, 0xD8, 0x22, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x41, 0x76, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x01, 0x70, \r
+0x38, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06, \r
+0x92, 0x74, 0x04, 0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xD6, 0xE0, 0x75, 0xF0, \r
+0x03, 0x84, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x41, 0x5B, 0xE4, 0x90, \r
+0x9F, 0xD2, 0xF0, 0x90, 0x9F, 0xDD, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x04, 0x70, \r
+0x35, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, \r
+0x92, 0x74, 0x04, 0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xD5, 0xE0, 0xFF, 0x90, \r
+0x9F, 0xDF, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x41, 0x5B, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x90, \r
+0x9F, 0xDD, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x21, 0xB9, \r
+0x90, 0x9F, 0xE0, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, \r
+0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0x9F, 0xD6, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, \r
+0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0x9F, 0xE0, 0xE0, 0x94, 0x03, 0x40, \r
+0x1F, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x9F, 0xDD, 0x30, 0xE0, 0x05, 0x74, 0x05, \r
+0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x90, 0x9F, 0xE0, 0xF0, 0x22, \r
+0x90, 0x9F, 0xD1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x74, 0xEF, 0x54, 0xFB, 0xF0, \r
+0xE4, 0xA3, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B, 0x90, 0x9F, 0xEF, \r
+0xE0, 0x20, 0xE0, 0x02, 0x41, 0x01, 0x21, 0xEA, 0x90, 0x9F, 0xE0, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, \r
+0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0x9F, 0xD6, \r
+0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, \r
+0x0B, 0x90, 0x9F, 0xEF, 0xE0, 0x30, 0xE0, 0x02, 0x21, 0xEA, 0x41, 0x01, 0x90, 0x9F, 0xEF, 0xE0, \r
+0x30, 0xE0, 0x16, 0x90, 0x9F, 0xD2, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, \r
+0x90, 0x9F, 0xDF, 0xF0, 0x90, 0xA1, 0xEA, 0x41, 0x10, 0x90, 0x9F, 0xDD, 0x74, 0x02, 0xF0, 0x22, \r
+0x12, 0x49, 0x67, 0x90, 0x9F, 0xE0, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x12, 0x5C, 0xFE, 0x90, 0x9F, \r
+0xE0, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, \r
+0x12, 0x07, 0x03, 0x90, 0x9F, 0xD6, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, \r
+0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0x9F, 0xE0, 0xE0, 0x94, 0x03, 0x50, 0x02, 0x41, \r
+0x76, 0x7F, 0x03, 0x12, 0x5A, 0xD8, 0x90, 0x05, 0x22, 0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, \r
+0x49, 0x5C, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x07, 0x70, \r
+0x52, 0x90, 0x9F, 0xE0, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0x41, 0x55, \r
+0x90, 0x9F, 0xD1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0xFB, 0xF0, \r
+0xE4, 0xA3, 0xF0, 0x90, 0x9F, 0xEF, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xD2, 0x74, 0x09, 0xF0, \r
+0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDF, 0xF0, 0x90, 0xA1, 0xEA, 0x04, 0x80, \r
+0x0F, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x49, 0x67, 0x90, 0x9F, 0xE0, 0xE0, 0x04, \r
+0xF0, 0x80, 0x48, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90, 0x9F, 0xD1, 0xE0, 0x30, \r
+0xE0, 0x0E, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0x90, 0x9F, 0xD1, 0xE0, 0x54, 0xFE, 0xF0, 0x22, \r
+0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0x04, 0xF0, \r
+0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA1, 0xEA, 0xE0, 0x90, 0x9F, 0xDD, 0x60, 0x05, 0x74, 0x05, 0xF0, \r
+0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x22, 0x7F, 0x03, 0x02, 0x5C, 0xFE, \r
+0x90, 0xA1, 0xEA, 0xE0, 0x90, 0x9F, 0xDD, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, \r
+0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x30, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
+0x9F, 0x79, 0xCA, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xCB, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, \r
+0x90, 0x9D, 0x98, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x1D, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, \r
+0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x90, 0x9F, 0xCD, \r
+0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01, 0x70, 0x0D, 0x90, 0xFD, 0x70, 0xE0, 0x7F, \r
+0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x13, 0x90, 0x9D, 0x98, 0xE0, 0x64, 0x03, 0x70, 0x1C, \r
+0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x54, 0x01, 0xC4, 0x33, \r
+0x33, 0x54, 0xC0, 0xFF, 0x90, 0x9F, 0xCD, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x22, 0x7E, 0x00, 0x7F, \r
+0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xF0, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xDE, 0x74, \r
+0x02, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, \r
+0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xCA, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, \r
+0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, \r
+0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xCA, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, \r
+0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, \r
+0x90, 0x9F, 0xCA, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, \r
+0x89, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0x9F, 0xCA, 0xF0, 0x90, 0x00, 0x03, 0x12, \r
+0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xCD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, \r
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, \r
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xCD, 0xF0, 0xEE, 0x54, 0x10, 0xFE, \r
+0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, \r
+0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x9F, 0xCD, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, \r
+0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, \r
+0x90, 0x9F, 0xCD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x9F, \r
+0xCE, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF, \r
+0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, \r
+0x90, 0x9F, 0xCE, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xFF, 0xF0, 0x90, 0x00, \r
+0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xCE, \r
+0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, \r
+0xA2, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x9F, 0xCE, 0xF0, 0xEE, 0x54, \r
+0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x09, \r
+0x12, 0x5D, 0x10, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x12, \r
+0x06, 0x89, 0x20, 0xE0, 0x02, 0xA1, 0xE0, 0x90, 0x05, 0x54, 0xE0, 0x90, 0x9F, 0xDB, 0xF0, 0xE0, \r
+0xC3, 0x13, 0x90, 0x9F, 0xDA, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, \r
+0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xCB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
+0x90, 0x9F, 0xCC, 0xF0, 0x80, 0x48, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, \r
+0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x9F, 0xCB, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, \r
+0xEF, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xCB, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
+0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x9F, 0xCC, 0x50, 0x05, 0x74, \r
+0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xCC, 0x74, 0x2A, 0xF0, 0x90, 0x9F, \r
+0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, 0x90, 0x9F, 0xCB, 0xE0, 0x75, 0xF0, \r
+0x03, 0x84, 0x90, 0x9F, 0xD3, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x9F, 0xCC, 0xE0, 0x75, \r
+0xF0, 0x03, 0x84, 0x90, 0x9F, 0xD5, 0xF0, 0x90, 0x9F, 0xCB, 0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xD6, \r
+0xF0, 0x90, 0x9F, 0xCC, 0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xD7, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, \r
+0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x57, 0x8E, 0xE4, 0x90, 0xA0, 0x07, 0xF0, 0x90, 0xA0, 0xEB, 0x12, \r
+0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x3B, \r
+0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0A, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
+0x01, 0x30, 0xE0, 0x27, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, \r
+0xA0, 0x09, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x05, 0x75, 0x51, 0x01, \r
+0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0xF1, 0xBD, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, \r
+0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, \r
+0x7D, 0x04, 0x7F, 0x02, 0x12, 0x54, 0x47, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, \r
+0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0xD2, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, \r
+0x9F, 0xDD, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0x9F, 0xDD, 0x74, 0x04, \r
+0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0x9F, 0xDD, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, \r
+0xB4, 0x07, 0x06, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x80, 0x6A, \r
+0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14, 0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x51, 0xED, \r
+0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0xAC, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, \r
+0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, \r
+0x01, 0x12, 0x5A, 0xD8, 0xAD, 0x52, 0x7F, 0x02, 0xF1, 0xBD, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, \r
+0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x9F, 0xD0, 0xE0, 0x54, 0xDF, \r
+0xF0, 0xE4, 0x90, 0x9F, 0xDC, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
+0x30, 0xE0, 0x09, 0x90, 0x9F, 0xFA, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x5F, \r
+0x81, 0x90, 0x9F, 0xFA, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x71, 0xC5, 0x90, 0x9F, 0xCA, \r
+0xE0, 0x20, 0xE0, 0x07, 0x90, 0x9F, 0xCE, 0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0xE4, 0xFF, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x38, 0xA3, 0x12, 0x5C, 0xFA, 0x90, 0x9F, 0xDD, \r
+0x74, 0x01, 0xF0, 0x90, 0x9F, 0xDC, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, \r
+0x6F, 0x02, 0x49, 0x5C, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC4, \r
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x77, \r
+0x62, 0x22, 0x90, 0x9F, 0xE5, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x8A, 0x9E, 0x80, 0x02, 0xD1, 0x90, \r
+0x90, 0xA0, 0x10, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x11, 0xE0, 0x64, \r
+0x08, 0x70, 0x1B, 0x90, 0xA0, 0x10, 0xE0, 0x30, 0xE0, 0x0F, 0x12, 0x8A, 0xCE, 0x90, 0xA0, 0x10, \r
+0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0x11, 0xF0, 0x90, 0x9F, \r
+0xCE, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x13, 0x90, 0xA0, 0x12, 0xE0, 0x04, \r
+0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, 0x9C, 0xE4, 0xF0, 0x90, 0xA0, 0x12, 0xF0, 0x90, 0x9F, \r
+0x0E, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x9F, 0x10, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0x17, 0xE0, 0x60, \r
+0x6F, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x9F, 0x2B, 0xE0, 0x04, 0xF0, 0x90, 0x05, \r
+0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
+0xD8, 0xF9, 0xFF, 0x90, 0x9F, 0x48, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0x14, 0xE0, 0x13, \r
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x6E, \r
+0xCF, 0x90, 0x9F, 0x1D, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, 0xFD, 0xE4, 0x75, 0xF0, \r
+0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0xA1, 0xFE, 0xE0, 0x94, 0x80, 0x90, 0xA1, 0xFD, 0xE0, 0x64, \r
+0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, \r
+0x7F, 0x01, 0x12, 0x62, 0x15, 0x02, 0x6F, 0xD5, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
+0x03, 0x30, 0xE0, 0x03, 0x02, 0x89, 0x62, 0x90, 0xA0, 0x0A, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x82, \r
+0xE5, 0x26, 0x64, 0x02, 0x60, 0x4A, 0xE5, 0x27, 0x70, 0x46, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, \r
+0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0xE5, 0x26, \r
+0x90, 0xA1, 0x9A, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x71, 0x80, 0x0C, 0x12, 0x45, 0x71, 0xEF, 0x44, \r
+0x80, 0xFF, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x9A, \r
+0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, \r
+0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x21, 0x62, 0xE5, 0x27, 0x70, 0x02, 0x21, 0x62, 0x7F, 0x48, \r
+0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12, \r
+0x08, 0x6D, 0x90, 0xA0, 0x09, 0xE0, 0x90, 0xA1, 0x9A, 0x60, 0x09, 0x12, 0x45, 0x71, 0xEF, 0x44, \r
+0x80, 0xFF, 0x80, 0x07, 0x12, 0x45, 0x71, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12, \r
+0x08, 0x6D, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, \r
+0x21, 0x5D, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x43, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, \r
+0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0xE5, 0x26, 0x90, 0xA1, 0x9A, 0xB4, \r
+0x01, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, \r
+0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, \r
+0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70, \r
+0x02, 0x21, 0x62, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEC, 0x90, 0xA1, 0x9A, \r
+0x12, 0x08, 0x6D, 0xE5, 0x27, 0x70, 0x13, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x77, \r
+0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x80, 0x55, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, \r
+0xEF, 0x44, 0x66, 0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
+0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA1, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0x09, \r
+0xE0, 0x90, 0xA1, 0x9E, 0x60, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45, \r
+0x71, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xA1, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x9E, 0x12, \r
+0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x90, \r
+0xA1, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, \r
+0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x26, 0xEF, 0xF0, 0x90, 0xA0, 0x0A, 0xE0, \r
+0x70, 0x7D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, \r
+0x90, 0xA1, 0x27, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA1, 0x27, \r
+0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x05, 0x90, 0x9F, 0xEB, 0x80, 0x31, 0xE4, 0xFF, \r
+0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x0A, 0x90, \r
+0x9F, 0xEB, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x41, 0x4B, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90, \r
+0xA1, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x09, 0x90, 0x9F, 0xEB, 0x04, 0xF0, \r
+0xA3, 0xF0, 0x80, 0x77, 0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x8D, \r
+0xC3, 0x12, 0x45, 0x60, 0x70, 0x65, 0x90, 0x9F, 0xEB, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F, \r
+0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, \r
+0x27, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08, \r
+0x90, 0x9F, 0xEB, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x9F, 0xEB, 0xF0, 0x7F, 0x30, 0x7E, \r
+0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x27, 0x12, \r
+0x08, 0x6D, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90, \r
+0x9F, 0xEC, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xEC, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0xE5, 0xE0, 0x44, \r
+0x01, 0xF0, 0x7D, 0x11, 0x12, 0x46, 0xF8, 0x90, 0x07, 0x78, 0xE0, 0x90, 0x9F, 0xEA, 0xF0, 0x90, \r
+0xA0, 0x09, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x87, 0xBD, 0x90, 0xA1, 0x26, 0xE0, 0xFD, 0x70, 0x02, \r
+0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, 0x90, 0x9F, 0xE5, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, \r
+0x90, 0xA1, 0x26, 0xE0, 0xFD, 0xB4, 0x02, 0x0A, 0x90, 0x9F, 0xE5, 0xE0, 0x54, 0x1F, 0x44, 0x60, \r
+0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, 0x90, 0x9F, 0xE5, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x12, 0x4F, \r
+0xC8, 0x90, 0x9F, 0xE5, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, \r
+0xC3, 0x9E, 0x40, 0x03, 0x02, 0x5D, 0x90, 0x90, 0x9F, 0xE5, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, \r
+0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90, 0x9F, \r
+0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x0A, 0xE0, 0xFB, 0x90, 0xA0, 0x09, \r
+0xE0, 0x90, 0xA1, 0xCC, 0xF0, 0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
+0xC9, 0xEF, 0xF0, 0x90, 0xA1, 0xCB, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x61, 0xFE, 0x90, 0x07, 0x6E, \r
+0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0xA1, 0xCB, 0xE0, 0x70, \r
+0x6D, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, \r
+0xA1, 0xC9, 0xE0, 0x70, 0x4F, 0x90, 0xA1, 0xCC, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x20, 0x12, \r
+0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, \r
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0x80, 0x1F, 0x12, \r
+0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, \r
+0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, \r
+0x64, 0x12, 0x46, 0xAC, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0x81, 0x70, 0x7F, 0x67, \r
+0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA1, 0xC9, 0xE0, \r
+0x70, 0x18, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, \r
+0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, \r
+0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01, \r
+0xFD, 0x7F, 0x4F, 0x12, 0x46, 0xAC, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66, \r
+0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, \r
+0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, \r
+0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x81, 0x84, 0x90, 0x07, \r
+0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0xA1, 0xC9, 0xE0, \r
+0x70, 0x56, 0x90, 0xA1, 0xCB, 0xE0, 0x60, 0x19, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, \r
+0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x80, \r
+0x28, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, \r
+0xA1, 0xCC, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, \r
+0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, \r
+0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x7F, \r
+0xFD, 0x7F, 0x4E, 0x12, 0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, \r
+0x4F, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0xE2, 0x7F, 0x08, 0x12, 0x46, 0xD6, \r
+0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xAC, 0xE4, 0xFF, 0xB1, 0x61, 0x51, 0xCE, 0x90, \r
+0x9F, 0x13, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xB1, 0xC9, 0x90, 0x9F, 0x14, 0xE0, \r
+0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x91, 0xC4, 0x91, 0x89, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x0A, 0xE0, 0xFB, 0x90, 0xA0, 0x09, 0xE0, 0x90, 0xA1, \r
+0xCC, 0xF0, 0x7D, 0x01, 0x51, 0xE7, 0x90, 0x9F, 0x21, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0xAC, \r
+0x90, 0x9F, 0x18, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, \r
+0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x10, \r
+0xFD, 0x7F, 0x08, 0x12, 0x46, 0xAC, 0x7F, 0x01, 0xB1, 0x61, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF, \r
+0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xAC, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, \r
+0x9F, 0x1A, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0xD1, 0x01, 0xBF, 0x01, 0x02, 0x91, 0xB4, \r
+0x22, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, \r
+0xC3, 0x13, 0x30, 0xE0, 0x07, 0xB1, 0xBC, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xB1, 0x2F, \r
+0x22, 0x90, 0xA1, 0xF8, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, \r
+0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA1, 0xF8, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0xA1, \r
+0xFA, 0xE0, 0x94, 0x88, 0x90, 0xA1, 0xF9, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, \r
+0x44, 0x10, 0xF0, 0x22, 0x90, 0xA1, 0xF9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, \r
+0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA1, 0xFA, 0xE0, 0x94, 0x32, 0x90, 0xA1, 0xF9, 0xE0, \r
+0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x90, 0x9F, 0x11, 0xE0, \r
+0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xC6, 0xE0, 0x90, 0x01, 0x30, \r
+0xF0, 0x90, 0x9F, 0xC3, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0x9F, 0xC4, 0xE0, 0x90, 0x01, 0x3A, \r
+0xF0, 0x22, 0x90, 0x01, 0xC4, 0x74, 0xE2, 0xF0, 0x74, 0x8D, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x46, \r
+0xD6, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0xE2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8D, 0xA3, 0xF0, \r
+0x22, 0x90, 0x9F, 0xBD, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x13, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, \r
+0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA0, 0x10, \r
+0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA2, 0x0B, 0xEF, 0xF0, 0x7F, \r
+0x02, 0x12, 0x44, 0xB7, 0x90, 0x9D, 0x94, 0xE0, 0xFF, 0x90, 0xA2, 0x0B, 0xE0, 0xFE, 0xEF, 0x4E, \r
+0x90, 0x9D, 0x94, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, \r
+0x90, 0x9D, 0x99, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9A, 0xF0, \r
+0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9B, 0xF0, 0x90, 0x00, 0x03, 0x12, \r
+0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, \r
+0x90, 0x9D, 0x9D, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9E, 0xF0, \r
+0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9F, 0xF0, 0x22, 0x8B, 0x51, 0x8A, \r
+0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x1B, 0x90, 0xA0, 0x29, \r
+0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x77, 0x08, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, \r
+0x54, 0x0F, 0xFF, 0x12, 0x4D, 0x1B, 0xE1, 0xC7, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, \r
+0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90, \r
+0xA0, 0x2C, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x03, 0xFF, \r
+0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0, 0x0E, 0x90, \r
+0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
+0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, \r
+0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0xE4, \r
+0xFB, 0x12, 0xB1, 0x09, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, \r
+0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x12, 0xB1, 0x09, 0xAB, 0x51, 0xAA, 0x52, \r
+0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x12, 0x06, \r
+0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x35, 0x12, 0x45, 0xA9, 0xEF, 0xF0, \r
+0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x90, \r
+0xA0, 0x36, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x26, \r
+0x90, 0xA0, 0x2A, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4, 0x54, 0xF0, \r
+0xFF, 0x90, 0xA0, 0x29, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0, 0x7D, \r
+0x20, 0xE4, 0xFF, 0x12, 0x57, 0x8E, 0x22, 0x7E, 0x00, 0x7F, 0x2D, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
+0xA0, 0x79, 0x29, 0x02, 0x08, 0xAA, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xFF, \r
+0x54, 0x7F, 0x90, 0x9F, 0x17, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, \r
+0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x9F, 0x15, 0xE0, \r
 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, \r
-0xA1, 0x16, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1\r
-0x18, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x19, 0xF0, \r
+0x9F, 0x13, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x9F\r
+0x15, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0x16, 0xF0, \r
 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, \r
-0x04, 0x90, 0xA1, 0x2C, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xDE\r
-0x12, 0x45, 0x55, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, \r
+0x04, 0x90, 0x9F, 0x29, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA0, 0xEB\r
+0x12, 0x45, 0xB5, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, \r
 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, \r
-0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, \r
-0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x22, 0x50, 0x05, \r
-0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x04, \r
-0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x53, 0xAD, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, \r
-0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xB2, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, \r
+0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x9F, 0x1F, 0x50, 0x05, \r
+0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x04, \r
+0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x54, 0x47, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, \r
+0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xBB, 0xE0, 0x54, 0xFE, 0x4E, \r
 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, \r
-0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xB2, 0xF0, 0xEE, \r
+0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xBB, 0xF0, 0xEE, \r
 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, \r
-0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0xB2, 0xF0, 0xEE, 0x54, 0x20, 0xFE, \r
+0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x9F, 0xBB, 0xF0, 0xEE, 0x54, 0x20, 0xFE, \r
 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, \r
-0x54, 0xBF, 0x4E, 0x90, 0xA1, 0xB2, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, \r
-0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA2, 0x00, 0xE0, 0x60, 0x0B, \r
-0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA2, 0x00, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, \r
-0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x77, 0xE4, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, \r
-0x90, 0xA2, 0xE1, 0x12, 0x45, 0x5E, 0x31, 0xAF, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x12, 0x57, 0x79, \r
-0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x18, 0x90, 0xA2, 0xE1, 0x12, 0x45, 0x55, 0x90, 0x00, 0x01, 0x12, \r
-0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x31, 0xC0, 0x22, 0x90, \r
-0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x1E, 0xF0, 0x22, \r
-0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0xA1, 0x20, 0x74, 0x02, 0xF0, 0x80, 0x16, \r
-0xED, 0x70, 0x0A, 0x90, 0xA1, 0xB0, 0xE0, 0x90, 0xA1, 0x20, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x20, \r
-0xED, 0xF0, 0x90, 0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x08, 0xF0, 0x22, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xAD, \r
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xAE, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, \r
-0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xB0, 0xF0, 0x22, \r
-0x90, 0xA1, 0xAD, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, \r
-0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xB3, 0xF0, 0x60, 0x37, 0x90, \r
-0xA1, 0xC1, 0xE0, 0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x54, 0x4B, 0x90, 0xA1, 0xB2, \r
-0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x16, \r
-0x90, 0xA1, 0xB2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x0D, \r
-0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x90, 0x01, 0xE7, 0xF0, 0x22, 0x12, \r
-0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xB8, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x54, \r
-0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xEF, 0x4F, 0xF0, 0x90, \r
-0xA1, 0xB8, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x56, 0x94, 0x90, 0xA3, 0xD6, 0x12, 0x45, 0x5E, 0xE4, \r
-0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, \r
-0x50, 0x1E, 0x90, 0xA3, 0xD6, 0x12, 0x45, 0x55, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, \r
-0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, \r
-0xEE, 0xC3, 0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, 0xD6, 0x12, 0x45, \r
-0x55, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, \r
-0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xC1, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, \r
-0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, \r
-0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xC1, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, \r
-0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0xC1, \r
-0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x80, \r
-0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0xC1, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, \r
-0x54, 0x01, 0xFE, 0x90, 0xA1, 0xC4, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, \r
-0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, \r
-0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xC4, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, \r
-0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, \r
-0x4D, 0xFF, 0x90, 0xA1, 0xC4, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, \r
-0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0xC4, \r
-0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0xA1, 0xC5, 0xE0, 0x54, \r
-0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, 0x00, \r
-0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA1, 0xC5, \r
-0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, \r
-0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xC5, 0xF0, 0xEE, 0x54, \r
-0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, \r
-0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0xC5, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, \r
-0x54, 0xF7, 0x4E, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xC4, 0x54, 0xF0, \r
-0xFF, 0x90, 0x04, 0x8F, 0xE0, 0x4F, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, \r
-0x20, 0xE0, 0x09, 0x12, 0x7E, 0xFF, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0xA1, 0xC5, 0xE0, \r
-0xC3, 0x13, 0x20, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, \r
-0x54, 0xEF, 0xF0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0xC1, \r
-0x17, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA1, 0xD2, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xD1, 0xF0, \r
-0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0x90, 0xA1, 0xC2, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xC3, 0xF0, 0x80, 0x48, \r
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, \r
-0x90, 0xA1, 0xC2, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, \r
-0xC2, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, \r
-0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0xC3, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, \r
-0x80, 0x06, 0x90, 0xA1, 0xC3, 0x74, 0x2A, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x3D, 0x90, 0xA1, 0xC2, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0xCA, 0xF0, \r
-0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA1, 0xC3, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0xCC, \r
-0xF0, 0x90, 0xA1, 0xC2, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0xA1, 0xC3, 0xE0, 0xC3, \r
-0x13, 0x90, 0xA1, 0xCE, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x5F, \r
-0xFD, 0xE4, 0x90, 0xA1, 0xFE, 0xF0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, \r
-0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA2, 0x00, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA2, 0x00, \r
-0xE0, 0x60, 0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, \r
-0x77, 0xE4, 0x90, 0xA1, 0xC1, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0xC5, 0xE0, \r
-0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, 0x12, 0x53, 0xAD, 0x90, 0x05, \r
-0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, \r
-0xC9, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xD4, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, \r
-0x04, 0x08, 0x90, 0xA1, 0xD4, 0x74, 0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, \r
-0xD4, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA1, 0xD4, 0x74, 0x05, 0xF0, \r
-0xE4, 0x90, 0xA1, 0xC9, 0xF0, 0x80, 0x6E, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, \r
-0x12, 0x06, 0xA2, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, \r
-0x14, 0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, \r
-0x80, 0x03, 0xE4, 0xF5, 0x52, 0x12, 0x85, 0x5A, 0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0x49, 0x90, \r
-0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xAD, 0x52, \r
-0x7F, 0x02, 0x12, 0x77, 0xE4, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0x05, 0x00, 0x74, 0x1C, \r
-0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0xA1, 0xC7, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0xD3, \r
-0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, \r
-0xF1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x79, 0xBA, 0x90, 0xA1, 0xF1, 0xE0, \r
-0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x77, 0x42, 0x90, 0xA1, 0xC1, 0xE0, 0x20, 0xE0, 0x07, 0x90, \r
-0xA1, 0xC5, 0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xDE, 0x12, 0x45, \r
-0x5E, 0x90, 0xA3, 0xD9, 0xE0, 0x70, 0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1, \r
-0xF8, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0xD9, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, \r
-0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA1, 0xF8, \r
-0x12, 0x45, 0x11, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, \r
-0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, \r
-0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA1, 0xF4, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, \r
-0x90, 0xA2, 0x00, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x90, 0xA2, 0x01, 0xF0, 0x90, \r
-0x04, 0x8F, 0xE0, 0x4F, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE8, \r
-0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x12, 0x5E, 0x3C, 0x90, 0xA2, 0xDE, 0xEF, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA2, 0x0D, 0xE0, \r
-0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, \r
-0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA2, 0x0D, 0xF0, 0xEE, \r
-0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x20, 0xFE, 0xEF, \r
-0x54, 0xDF, 0x4E, 0x90, 0xA2, 0x0D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, \r
-0xFE, 0x90, 0xA2, 0x0E, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, \r
-0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30, 0xFD, 0xEF, 0x54, \r
-0xCF, 0x4D, 0xFF, 0x90, 0xA2, 0x0E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x0F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
-0x90, 0xA2, 0x10, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x11, 0xF0, 0x90, 0xA2, \r
-0x0F, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, 0x05, 0xCE, \r
-0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x17, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0xA2, 0x10, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, 0x05, \r
-0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x19, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0xA2, 0x11, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0x90, 0xA2, \r
-0x1B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA2, 0x12, \r
-0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, \r
-0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x12, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x5E, 0x90, \r
-0xA2, 0xDE, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x1D, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
-0x06, 0xA2, 0x90, 0xA2, 0x1E, 0xF0, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x7D, 0x02, 0x7F, 0x38, \r
-0x02, 0x5E, 0x3C, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0xE5, 0xF0, 0x90, 0xA3, 0xE5, \r
-0xE0, 0xFD, 0x70, 0x02, 0x41, 0x02, 0x90, 0x9F, 0xF3, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, \r
-0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, \r
-0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3, \r
-0xDA, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, \r
-0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0xDF, 0xE4, 0x90, 0xA3, 0xE6, 0xF0, 0x90, \r
-0xA3, 0xE6, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA3, 0xDA, 0xE0, 0x75, 0xF0, 0x04, \r
-0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, 0xF5, \r
-0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90, \r
-0x9F, 0xA3, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x90, 0xA3, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, \r
-0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, \r
-0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
-0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xE6, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0xA3, 0xE5, 0xE0, \r
-0xFF, 0x90, 0xA3, 0xDA, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, \r
-0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xE5, 0xF0, 0x90, 0xA3, 0xDA, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, \r
-0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3, 0xDA, 0xE0, 0x04, \r
-0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, \r
-0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x01, 0xBD, 0xE4, 0x90, 0x9F, 0xF4, 0xF0, 0x01, 0xBD, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA3, 0xDA, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, \r
-0x90, 0xA3, 0xDA, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x49, 0xE0, 0x90, 0x01, \r
-0xC3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0, \r
-0x22, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
-0x06, 0x90, 0xA2, 0xDE, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x7F, 0xF6, 0x7E, \r
-0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xDE, 0xE0, 0x90, 0xA2, 0xE0, 0xF0, 0x7B, \r
-0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, \r
-0xA2, 0xDE, 0xE0, 0x90, 0xA2, 0xE1, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x7F, 0xF3, 0x7E, \r
-0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xDE, 0xE0, 0x90, 0xA2, 0xE2, 0xF0, 0x7B, \r
-0x01, 0x7A, 0xA2, 0x79, 0xDE, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, \r
-0xA2, 0xDE, 0xE0, 0x90, 0xA2, 0xE3, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, \r
-0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA2, 0xE7, 0xF0, 0x90, 0xA2, 0xE3, 0xE0, 0x90, 0xA2, 0xE8, 0xF0, \r
-0x02, 0x65, 0xCD, 0x90, 0xA3, 0xDC, 0x12, 0x45, 0x5E, 0xE4, 0xFF, 0x90, 0xA3, 0xDC, 0x12, 0x45, \r
-0x55, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x01, 0x94, 0xE0, \r
-0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, \r
-0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, \r
-0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, \r
-0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, \r
-0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA2, 0xCE, 0xF0, 0xA3, \r
-0xF0, 0x51, 0xFC, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA2, 0xCF, 0xE0, 0x94, 0x88, 0x90, \r
-0xA2, 0xCE, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, \r
-0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0xCE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, \r
-0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA2, 0xCF, 0xE0, 0x94, 0x32, 0x90, 0xA2, \r
-0xCE, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, \r
-0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x74, 0xF0, 0x74, 0x93, 0xA3, 0xF0, \r
-0x90, 0xA2, 0x1F, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, \r
-0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x9F, \r
-0x97, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x13, \r
-0xF0, 0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, \r
-0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, \r
-0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, \r
-0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA1, 0x1A, \r
-0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, \r
-0x16, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, \r
-0x12, 0x58, 0x6E, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x02, 0x91, 0x1F, 0x02, 0x48, 0x5A, 0x90, \r
-0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, \r
-0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0xA1, 0x23, 0xE0, \r
-0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xAD, 0xE0, 0xFF, 0x90, 0xA1, \r
-0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0x17, \r
-0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x58, 0x6E, 0x22, 0xB1, 0x28, 0x90, 0xA3, 0x08, 0xEF, 0xF0, \r
-0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x53, 0xAD, 0x90, 0xA3, \r
-0x08, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, \r
-0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, \r
-0x30, 0xE0, 0xFB, 0xAC, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0xA1, 0x2C, 0xE0, \r
-0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, \r
-0x90, 0xA1, 0x22, 0xF0, 0x7D, 0x03, 0x90, 0xA1, 0x45, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, \r
-0x90, 0xA1, 0x2F, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0xA1, \r
-0x25, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x90, 0xA1, 0x25, 0xA3, \r
-0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0xA1, 0xAD, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, \r
-0x9F, 0x40, 0x24, 0x90, 0xA1, 0x31, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, \r
-0xA1, 0x2B, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0xA1, 0x30, 0xF0, 0xFB, 0x90, 0xA1, 0x2B, \r
-0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x91, 0xA3, 0x22, 0xE4, 0x90, 0xA3, 0x09, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x7F, 0x83, 0x12, 0x47, 0xD5, 0x90, 0xA3, 0x09, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x47, 0xD5, \r
-0xAE, 0x07, 0x90, 0xA3, 0x09, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA3, 0x0B, 0xE0, \r
-0x94, 0x64, 0x90, 0xA3, 0x0A, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, \r
-0xF0, 0x90, 0xA3, 0x09, 0xE0, 0xFF, 0x22, 0x90, 0xA3, 0x0A, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, \r
-0xD6, 0x80, 0xBE, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2E, \r
-0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE0, 0x06, 0xE0, 0x44, \r
-0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0xC7, 0xE0, 0xFF, 0xC4, 0x13, 0x54, \r
-0x07, 0x30, 0xE0, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x02, 0x54, 0x4B, 0x12, 0x58, 0x6E, 0x22, 0x90, \r
-0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x21, 0xEF, 0x54, 0x7F, \r
-0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, \r
-0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x03, 0x12, 0x58, 0x6E, 0x90, 0xA1, \r
-0xC5, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0xC8, 0xE0, 0xFF, \r
-0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xC8, \r
-0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, \r
-0xE0, 0x30, 0xE1, 0x02, 0xD1, 0x17, 0x22, 0x90, 0xA2, 0x20, 0xE0, 0x30, 0xE0, 0x35, 0xC3, 0x13, \r
-0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x2B, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x30, 0xE0, \r
-0x22, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x2B, 0x12, 0x45, 0x49, 0xEE, 0x54, 0xFE, 0xF0, 0x90, \r
-0xA2, 0x22, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0x20, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x7F, 0x01, \r
-0x12, 0x4D, 0x67, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, \r
-0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, \r
-0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x90, 0xA3, 0xE2, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, \r
-0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA3, 0xE2, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, \r
-0xA3, 0xE4, 0xE0, 0x94, 0x88, 0x90, 0xA3, 0xE3, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, \r
-0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, 0xE3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, \r
-0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA3, 0xE4, 0xE0, 0x94, 0x32, 0x90, 0xA3, 0xE3, \r
-0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xF1, 0x35, 0x7F, \r
-0x08, 0x12, 0x47, 0xD5, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x49, 0xE4, 0xFF, 0xD1, \r
-0x82, 0x90, 0xA2, 0x01, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, \r
-0x7F, 0x4E, 0x12, 0x47, 0xD5, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x49, 0x90, 0xA1, \r
-0x16, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xF1, 0x1C, 0x22, 0x90, 0xA1, 0xBD, 0xE0, \r
-0x90, 0x01, 0x30, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0xA1, 0xBB, 0xE0, \r
-0x90, 0x01, 0x3A, 0xF0, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x35, 0xF0, 0x74, 0x97, 0xA3, 0xF0, 0x7F, \r
-0x90, 0x12, 0x47, 0xD5, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x35, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x97, 0xA3, 0xF0, 0x22, 0x90, 0xA2, 0x01, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, \r
-0xF0, 0x80, 0x0C, 0x12, 0x47, 0xC7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x12, 0x46, 0x49, 0x90, \r
-0xA1, 0x24, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0x49, 0x90, 0xA1, 0x1B, 0xE0, 0x60, 0x12, 0x90, \r
-0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, \r
-0xF0, 0x7F, 0x08, 0x12, 0x47, 0xD5, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x49, 0x7F, \r
-0x01, 0xD1, 0x82, 0x7F, 0x90, 0x12, 0x47, 0xD5, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, \r
-0x49, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x16, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
-0x00, 0xBE, 0x03, 0x12, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
-0x83, 0x74, 0x80, 0xF0, 0x80, 0x0F, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, \r
-0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, \r
-0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, \r
-0xBF, 0x80, 0xA7, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x00, 0x00, 0xE4, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, \r
-0x75, 0xF0, 0x02, 0xEE, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0x74, \r
-0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x96, 0x2F, 0xF5, \r
+0x54, 0xBF, 0x4E, 0x90, 0x9F, 0xBB, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, \r
+0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x0B, \r
+0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, \r
+0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x87, 0xBD, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, \r
+0x90, 0xA0, 0xEE, 0x12, 0x45, 0xBE, 0x31, 0x7F, 0x90, 0x9F, 0x17, 0xE0, 0xFF, 0x12, 0x6F, 0x38, \r
+0x90, 0x9F, 0x17, 0xE0, 0x60, 0x18, 0x90, 0xA0, 0xEE, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x01, 0x12, \r
+0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x31, 0xA0, 0x22, 0x90, \r
+0x9F, 0x13, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x9F, 0x20, 0xF0, 0x90, 0x9F, 0x1B, 0xF0, 0x90, \r
+0x9F, 0x14, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x56, 0xCA, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x56, 0xCE, \r
+0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0x9F, 0x1D, 0x74, 0x02, 0xF0, 0x80, 0x16, \r
+0xED, 0x70, 0x0A, 0x90, 0x9F, 0xB9, 0xE0, 0x90, 0x9F, 0x1D, 0xF0, 0x80, 0x05, 0x90, 0x9F, 0x1D, \r
+0xED, 0xF0, 0x90, 0x9F, 0x1D, 0xE0, 0xA3, 0xF0, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x08, 0xF0, 0x22, \r
+0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xB6, \r
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xB7, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, \r
+0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xB9, 0xF0, 0x22, \r
+0x90, 0x9F, 0xB6, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, \r
+0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xBC, 0xF0, 0x60, 0x35, 0x90, \r
+0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x2E, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x52, 0x40, 0x90, 0x9F, 0xBB, \r
+0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1D, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x14, \r
+0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, \r
+0x09, 0x12, 0x5A, 0xD8, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xBD, 0xE0, \r
+0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, \r
+0x01, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xBE, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x9F, \r
+0xBF, 0xF0, 0x90, 0x9F, 0xBE, 0xE0, 0x90, 0x9F, 0xC0, 0xF0, 0x90, 0x9F, 0xBD, 0xE0, 0x54, 0x01, \r
+0xFF, 0x02, 0x56, 0xE3, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xC1, 0xE0, 0x54, \r
+0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0x9F, 0x13, 0xE0, \r
+0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x9F, 0xC1, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x56, 0x5C, 0x90, 0xA1, \r
+0xEC, 0x12, 0x45, 0xBE, 0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, \r
+0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA1, 0xEC, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, \r
+0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, \r
+0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, \r
+0x90, 0xA1, 0xEC, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, \r
+0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, \r
+0x58, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA1, 0xEF, 0xE0, 0x70, \r
+0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0x01, 0x12, 0x08, 0x6D, 0x90, 0xA1, \r
+0xEF, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F, \r
+0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA0, 0x01, 0x12, 0x45, 0x71, 0xEC, 0x54, 0xC1, \r
+0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC, \r
+0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, \r
+0x53, 0x90, 0x9F, 0xFD, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA0, \r
+0x16, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, \r
+0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA0, 0x16, \r
+0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x20, \r
+0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x90, 0xA0, 0x16, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, \r
+0x54, 0x03, 0xFE, 0x90, 0xA0, 0x17, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, \r
+0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30, 0xFD, \r
+0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA0, 0x17, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, \r
+0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x18, 0xF0, 0x90, 0x00, 0x03, 0x12, \r
+0x06, 0xA2, 0x90, 0xA0, 0x19, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x1A, 0xF0, \r
+0x90, 0xA0, 0x18, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, \r
+0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0x20, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0xA0, 0x19, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, \r
+0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0x22, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0xA0, 0x1A, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, \r
+0x90, 0xA0, 0x24, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x30, 0xE0, 0x17, 0x90, \r
+0xA0, 0x1B, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, \r
+0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x1B, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x12, 0x45, \r
+0xBE, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x26, 0xF0, 0x90, 0x00, \r
+0x01, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x27, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x7D, 0x02, \r
+0x7F, 0x38, 0x02, 0x61, 0xC7, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0xFF, 0x90, 0x9F, 0xEF, \r
+0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, 0xA3, \r
+0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x37, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64, 0x04, \r
+0x70, 0x25, 0x90, 0xA0, 0x10, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x24, 0x90, 0xFD, 0x62, 0xE0, 0xB4, \r
+0xAD, 0x13, 0xA3, 0xE0, 0xB4, 0x35, 0x0E, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, \r
+0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, \r
+0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0x25, 0xE0, \r
+0xFF, 0x90, 0x9F, 0xEF, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
+0x08, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x22, 0x90, 0xA0, 0x10, 0xE0, 0x20, 0xE0, 0x07, \r
+0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA1, \r
+0xFB, 0xF0, 0x90, 0xA1, 0xFB, 0xE0, 0xFD, 0x70, 0x02, 0xC1, 0xC7, 0x90, 0x9D, 0xF0, 0xE0, 0xFF, \r
+0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9D, 0xF1, 0xE0, 0xB5, \r
+0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, \r
+0x01, 0xF0, 0x22, 0x90, 0xA1, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, \r
+0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0xA4, 0xE4, \r
+0x90, 0xA1, 0xFC, 0xF0, 0x90, 0xA1, 0xFC, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA1, \r
+0xF0, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, \r
+0xFE, 0x74, 0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9D, 0xF1, \r
+0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA0, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, \r
+0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, \r
+0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x90, 0x9D, 0xF1, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA4, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, \r
+0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0xFC, 0xE0, 0x04, 0xF0, 0x80, \r
+0x83, 0x90, 0xA1, 0xFB, 0xE0, 0xFF, 0x90, 0xA1, 0xF0, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA1, 0xFB, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, \r
+0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, \r
+0x90, 0xA1, 0xF0, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9D, 0xF1, 0xE0, 0x04, 0xF0, \r
+0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0xA1, 0x82, 0xE4, 0x90, 0x9D, \r
+0xF1, 0xF0, 0xA1, 0x82, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x44, \r
+0x80, 0x90, 0x00, 0x8A, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, \r
+0x45, 0xA9, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xE4, 0x90, 0x9E, 0x88, 0xF0, 0xA3, 0xF0, 0x90, \r
+0x9D, 0xF0, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xCD, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA1, 0xD0, 0xE0, 0x94, 0xE8, 0x90, \r
+0xA1, 0xCF, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, \r
+0x80, 0x15, 0x90, 0xA1, 0xCF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, \r
+0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xD5, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, 0x02, 0xD1, 0xD6, 0xEF, \r
+0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, \r
+0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA1, 0xD8, 0xEF, 0xF0, 0xEE, \r
+0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA1, 0xD8, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0xA1, 0xD5, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, \r
+0xE4, 0x33, 0xFE, 0xF1, 0x9F, 0x90, 0xA1, 0xD8, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA1, 0xD5, 0x12, \r
+0x45, 0xB5, 0xF1, 0xFA, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, \r
+0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, \r
+0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, \r
+0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, \r
+0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA1, 0xD1, 0xEF, 0xF0, 0xA3, \r
+0x12, 0x45, 0xBE, 0x90, 0xA1, 0xF1, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, \r
+0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, \r
+0x01, 0x90, 0xA1, 0xD2, 0x12, 0x45, 0xB5, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, \r
+0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA1, 0xD1, 0xE0, 0x24, 0x02, 0xF9, \r
+0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5, \r
+0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA1, 0xD2, 0x12, \r
+0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
+0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, \r
+0xBF, 0x01, 0x06, 0x90, 0xA0, 0xEB, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, \r
+0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xED, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
+0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xEE, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, \r
+0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xEF, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
+0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xF0, 0xF0, 0x90, 0xA0, 0xEC, 0xE0, 0xFF, 0xA3, 0xE0, \r
+0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA0, 0xF4, 0xF0, 0x90, 0xA0, 0xF0, 0xE0, 0x90, 0xA0, \r
+0xF5, 0xF0, 0x02, 0x66, 0xF3, 0x90, 0xA1, 0xF2, 0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA1, 0xF2, \r
+0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x01, \r
+0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, \r
+0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, \r
+0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, \r
+0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, \r
+0x90, 0xA0, 0xDB, 0xF0, 0xA3, 0xF0, 0x31, 0x51, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA0, \r
+0xDC, 0xE0, 0x94, 0x88, 0x90, 0xA0, 0xDB, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, \r
+0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA0, 0xDB, 0xE4, 0x75, \r
+0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA0, 0xDC, \r
+0xE0, 0x94, 0x32, 0x90, 0xA0, 0xDB, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, \r
+0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xC9, \r
+0xF0, 0x74, 0x99, 0xA3, 0xF0, 0x90, 0xA0, 0x28, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, \r
+0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, \r
+0x01, 0x22, 0xE4, 0x90, 0x9D, 0x93, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, \r
+0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, \r
+0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, \r
+0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x9F, 0x0E, \r
+0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, \r
+0x70, 0x20, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, \r
+0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0xB7, 0xE0, 0x90, 0xA1, 0xAF, 0x12, \r
+0x48, 0x1F, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x9F, 0x17, 0xE0, 0x60, \r
+0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x13, 0xE0, \r
+0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, \r
+0x28, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0E, 0x90, \r
+0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x28, 0x22, 0x90, 0x9F, \r
+0x13, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2E, 0xEF, 0x54, 0xBF, 0xF0, 0x90, \r
+0x04, 0xE0, 0xE0, 0x90, 0x9F, 0x14, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x90, 0x9F, 0xD0, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, \r
+0x01, 0x7F, 0x0C, 0x02, 0x52, 0x40, 0x12, 0x52, 0x28, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, \r
+0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, \r
+0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA1, 0x16, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0x90, 0xA1, 0x16, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, \r
+0xAE, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA1, 0x18, 0xE0, \r
+0x94, 0x64, 0x90, 0xA1, 0x17, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, \r
+0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x22, 0x90, 0xA1, 0x17, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, \r
+0xD6, 0x80, 0xBE, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, \r
+0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12, 0x12, \r
+0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, \r
+0x0F, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, \r
+0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, \r
+0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4, 0x90, \r
+0xAD, 0xE2, 0xF0, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, \r
+0x75, 0xF0, 0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0x74, \r
+0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x92, 0x2F, 0xF5, \r
 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, \r
-0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, \r
-0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, \r
-0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, \r
-0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0x74, 0x13, 0xF0, 0x75, 0xF0, \r
-0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
-0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
-0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, \r
-0x45, 0x49, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, \r
-0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, 0xF0, \r
-0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0xF0, 0x75, 0xF0, \r
-0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
-0x00, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x01, 0x24, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA3, 0x29, 0xEB, 0xF0, 0x70, 0x6C, 0x90, \r
-0xA3, 0x29, 0xE0, 0xFE, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, \r
-0xA3, 0x2A, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA3, 0x2E, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, \r
-0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9F, 0x96, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, \r
-0x4F, 0x90, 0xA3, 0x30, 0xF0, 0x90, 0xA3, 0x2B, 0xE0, 0x90, 0xA3, 0x32, 0xF0, 0x90, 0xA3, 0x2C, \r
-0x74, 0x0C, 0xF0, 0x90, 0xA3, 0x3A, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x2C, 0x12, \r
-0x67, 0x5E, 0x7F, 0x04, 0x12, 0x64, 0xAB, 0x90, 0xA3, 0x2A, 0xE0, 0xFF, 0x90, 0xA3, 0x29, 0xE0, \r
-0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0x74, \r
-0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, \r
+0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, \r
+0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0x74, 0x13, 0xF0, 0x75, 0xF0, \r
+0x04, 0xEF, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
+0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
+0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, \r
+0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, \r
+0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, \r
+0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, \r
+0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x7F, 0xF0, 0x75, 0xF0, \r
+0x04, 0xEF, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
+0x00, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, \r
+0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x61, 0xC4, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA1, 0x36, 0xEB, 0xF0, 0x70, 0x6C, 0x90, \r
+0xA1, 0x36, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, \r
+0xA1, 0x37, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA1, 0x3B, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, \r
+0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9D, 0x92, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, \r
+0x4F, 0x90, 0xA1, 0x3D, 0xF0, 0x90, 0xA1, 0x38, 0xE0, 0x90, 0xA1, 0x3F, 0xF0, 0x90, 0xA1, 0x39, \r
+0x74, 0x0C, 0xF0, 0x90, 0xA1, 0x47, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x39, 0x12, \r
+0x64, 0x94, 0x7F, 0x04, 0x12, 0x65, 0x9C, 0x90, 0xA1, 0x37, 0xE0, 0xFF, 0x90, 0xA1, 0x36, 0xE0, \r
+0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0x74, \r
+0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, \r
 0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, 0xEE, 0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x1D, \r
-0x80, 0x13, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED, \r
+0x80, 0x13, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED, \r
 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA3, \r
-0x9A, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA3, 0x95, 0xF0, 0xE5, 0x67, 0x54, \r
-0x07, 0x90, 0xA3, 0x97, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, \r
-0x90, 0xA3, 0x98, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0x7F, 0x90, 0xA3, 0x9B, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, \r
-0xE0, 0x90, 0xA3, 0x9C, 0xF0, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA3, 0x96, 0xF0, 0xE5, 0x69, 0x70, \r
-0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, \r
-0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, \r
-0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x39, 0x12, 0x44, 0xD9, 0x78, 0x01, 0x12, 0x08, \r
-0x47, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x9B, 0xE0, 0xFF, 0x90, 0xA3, 0x96, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, \r
-0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA3, 0x9C, 0xE0, \r
-0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x68, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA3, 0x96, 0xF0, \r
-0xE5, 0x68, 0x54, 0x80, 0x90, 0xA3, 0x99, 0xF0, 0xE5, 0x69, 0x70, 0x33, 0x90, 0xA3, 0x95, 0xE0, \r
-0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, \r
-0xA3, 0x97, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA3, 0x98, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x52, 0x90, \r
-0xA3, 0x95, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, \r
-0xE0, 0xFF, 0x90, 0xA3, 0x97, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, \r
-0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, \r
-0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA3, 0x98, 0xF0, 0x90, 0xA3, 0x96, 0xE0, 0x90, \r
-0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA3, 0x98, 0xF0, 0x44, 0x80, \r
-0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x68, 0xF0, 0xE5, \r
-0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA3, 0x98, 0xE0, 0xFF, 0x75, 0xF0, \r
-0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, \r
-0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, 0x03, 0x4F, 0xFF, \r
-0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x7D, 0x01, 0xAF, \r
-0x67, 0x12, 0x6C, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, \r
-0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x52, \r
-0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, \r
-0x13, 0x90, 0xA2, 0xE1, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x02, 0x80, 0x19, 0xE5, 0x53, \r
-0xD3, 0x94, 0x19, 0x40, 0x05, 0x90, 0xA2, 0xE1, 0x80, 0x0B, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, \r
-0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x41, 0x10, \r
-0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xFE, 0x75, 0xF0, \r
-0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x2F, 0x75, 0xF0, 0x04, 0xEF, \r
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xF9, 0x54, 0x03, 0xFB, 0xEE, 0xD3, 0x9B, 0x50, 0x1B, \r
-0xEE, 0x60, 0x18, 0x1E, 0xEE, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0xEF, \r
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE9, 0x54, 0xF3, 0x4B, 0xF0, 0xED, 0xD3, 0x9C, 0x40, 0x02, \r
-0xAD, 0x04, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, \r
-0x05, 0x8E, 0x6A, 0xE4, 0xFB, 0x41, 0x10, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, \r
-0xF5, 0x51, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, \r
-0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, \r
-0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, \r
-0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, \r
-0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, \r
-0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, \r
-0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, \r
-0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, \r
-0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, \r
-0xA2, 0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, \r
-0x50, 0x16, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
-0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, \r
-0x12, 0x06, 0xA2, 0x90, 0x95, 0x95, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0xE0, 0x30, 0xE5, 0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, \r
-0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x51, 0x71, 0xC9, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, 0x07, 0xAB, \r
-0x05, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, \r
-0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA2, 0xEE, \r
-0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x10, \r
-0xEA, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, \r
-0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, \r
-0xEA, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, \r
-0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xC4, 0x54, 0x03, \r
-0x90, 0xA2, 0xEC, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, \r
-0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, \r
-0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0xE1, 0x25, 0xAF, 0x03, 0x8F, \r
-0x61, 0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, 0xE1, \r
-0x25, 0xE5, 0x60, 0x64, 0x2C, 0x70, 0x2A, 0xE5, 0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, \r
-0xD3, 0x94, 0x02, 0x50, 0x1C, 0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, \r
-0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, \r
-0x61, 0xE5, 0x61, 0x70, 0x02, 0xE1, 0x25, 0x90, 0xA2, 0xEE, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, \r
-0x40, 0x7D, 0xE4, 0x90, 0xA2, 0xED, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, \r
-0x90, 0xA2, 0xEE, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0xFF, 0x75, 0xF0, 0x08, 0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, \r
-0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, \r
-0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, \r
-0x02, 0x7D, 0x0C, 0x90, 0xA2, 0xED, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, \r
-0xFF, 0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, \r
-0xA2, 0xEE, 0xE0, 0xF5, 0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x41, 0x10, \r
-0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5E, 0xE4, \r
+0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0xE4, \r
 0xF5, 0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, \r
-0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19\r
-0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, \r
-0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95\r
+0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x15\r
+0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, \r
+0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x91\r
 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, \r
-0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, \r
-0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x16, 0x2B, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x34, 0x75, 0xF0, 0x04, \r
-0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, \r
-0x50, 0x1F, 0x05, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, \r
-0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0x02, 0xA0, \r
-0xB9, 0xE9, 0xC3, 0x95, 0x60, 0x50, 0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, \r
-0x01, 0xB9, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, \r
-0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, \r
-0x75, 0x83, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, \r
-0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, \r
-0x60, 0x1D, 0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, \r
-0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, \r
-0x80, 0x98, 0xE9, 0x65, 0x60, 0x70, 0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x18, 0x12, 0x45, \r
-0x49, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, \r
-0x44, 0x80, 0xF5, 0x5E, 0x80, 0x33, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, \r
-0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, \r
-0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, \r
-0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, \r
-0xAD, 0x5E, 0x02, 0x9A, 0x10, 0xE4, 0xF5, 0x51, 0x74, 0x90, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
-0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xA8, 0xD0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, \r
-0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, \r
-0xA8, 0xD0, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0xA8, 0xD0, 0xE5, 0x51, \r
-0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA2, \r
-0xDD, 0x12, 0x45, 0x5E, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, \r
-0x83, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
-0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xE0, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, \r
-0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, \r
-0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, \r
-0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, \r
-0x35, 0xF0, 0xFE, 0x90, 0xA2, 0xE2, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, \r
-0x9D, 0xFF, 0xEE, 0x95, 0xF0, 0x90, 0xA2, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, \r
-0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x52, 0x54, 0x7F, 0xF5, 0x53, 0x75, 0xF0, \r
-0x04, 0xE5, 0x51, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA2, 0xE6, 0xF0, 0x75, 0xF0, \r
-0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, \r
-0xA2, 0xE7, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, \r
-0x94, 0x05, 0x40, 0x02, 0x81, 0xC9, 0x90, 0xA2, 0xE6, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, \r
-0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xFF, 0x74, \r
-0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xC3, 0x9F, 0xE5, 0x53, 0x40, \r
-0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, 0x93, 0xF5, 0x58, 0x90, 0xA2, 0x02, 0xE0, \r
-0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA2, 0x04, \r
-0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA2, 0x05, \r
-0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x09, 0x05, 0x90, 0xA2, 0x06, \r
-0x80, 0x03, 0x90, 0xA2, 0x03, 0xE0, 0xF5, 0x5C, 0xE5, 0x5C, 0xC3, 0x94, 0x80, 0x50, 0x28, 0xE5, \r
-0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, 0x58, 0x25, 0x5C, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, \r
-0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x05, 0x75, 0x58, 0x1B, 0x80, 0x20, 0xE5, \r
-0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, 0xE4, 0x95, 0x5C, 0xF5, 0x5C, 0xE5, 0x58, 0xD3, \r
-0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, 0xF5, 0x58, 0x80, 0x03, 0xE4, 0xF5, 0x58, 0xE5, \r
-0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, \r
-0xA2, 0xDA, 0x12, 0x45, 0x5E, 0xE5, 0x52, 0x90, 0x42, 0x0B, 0x93, 0xFF, 0xD3, 0x90, 0xA2, 0xE1, \r
-0xE0, 0x9F, 0x90, 0xA2, 0xE0, 0xE0, 0x94, 0x00, 0x40, 0x05, 0x12, 0x9D, 0xA9, 0xE1, 0xD2, 0xC3, \r
-0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x5E, 0x90, 0xA2, 0xDD, 0x12, 0x45, 0x55, \r
-0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, \r
-0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, \r
-0x9F, 0xEC, 0x9E, 0x40, 0x02, 0x81, 0x9E, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, \r
-0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, \r
-0xFF, 0xEE, 0x3C, 0xFE, 0x90, 0xA2, 0xDD, 0x12, 0x45, 0x55, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, \r
-0xF0, 0x9E, 0x50, 0x02, 0x81, 0xA1, 0x81, 0x7E, 0xE5, 0x51, 0x70, 0x50, 0x90, 0xA2, 0xDD, 0x12, \r
-0x45, 0x55, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, \r
-0xE5, 0x57, 0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9F, 0x96, 0x74, 0x01, \r
-0xF0, 0x80, 0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
-0xFB, 0xAA, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, \r
-0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9F, 0x96, 0xF0, 0xD3, 0xE5, 0x57, 0x94, \r
+0x74, 0x12, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, \r
+0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x12, 0x2B, 0xF5, 0x82, \r
+0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04, \r
+0xEB, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, \r
+0x50, 0x1E, 0x05, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, \r
+0xEB, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xE1, 0x18, \r
+0xE9, 0xC3, 0x95, 0x60, 0x50, 0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0xE1, \r
+0x18, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12, \r
+0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, \r
+0x83, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, \r
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, \r
+0x1D, 0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x12, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
+0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80, \r
+0x98, 0xE9, 0x65, 0x60, 0x70, 0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, \r
+0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, \r
+0x80, 0xF5, 0x5E, 0x80, 0x33, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, \r
+0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x12, 0x2B, 0xF5, 0x82, 0xE4, 0x34, \r
+0x9D, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, \r
+0x5E, 0x02, 0x7D, 0x73, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, \r
+0x03, 0xFE, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x74, 0x12, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x2F, \r
+0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xF9, 0x54, 0x03, 0xFB, 0xEE, \r
+0xD3, 0x9B, 0x50, 0x1B, 0xEE, 0x60, 0x18, 0x1E, 0xEE, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFB, \r
+0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE9, 0x54, 0xF3, 0x4B, 0xF0, 0xED, \r
+0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
+0xE0, 0x54, 0x80, 0x42, 0x05, 0x8E, 0x6A, 0xE4, 0xFB, 0x02, 0x7D, 0x73, 0xAA, 0x07, 0xAB, 0x05, \r
+0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, \r
+0x60, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA0, 0xFD, 0xF0, \r
+0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA, \r
+0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24, \r
+0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, \r
+0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, \r
+0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, \r
+0xA0, 0xFB, 0xF0, 0x74, 0x12, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x60, 0xF0, \r
+0x74, 0x12, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3, \r
+0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0x21, 0x14, 0xAF, 0x03, 0x8F, 0x61, \r
+0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, 0x21, 0x14, \r
+0xE5, 0x60, 0x64, 0x2C, 0x70, 0x2A, 0xE5, 0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3, \r
+0x94, 0x02, 0x50, 0x1C, 0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, \r
+0xF0, 0x04, 0xEA, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, \r
+0xE5, 0x61, 0x70, 0x02, 0x21, 0x14, 0x90, 0xA0, 0xFD, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40, \r
+0x7D, 0xE4, 0x90, 0xA0, 0xFC, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, \r
+0xA0, 0xFD, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, \r
+0x75, 0xF0, 0x08, 0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01, \r
+0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, \r
+0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, \r
+0x7D, 0x0C, 0x90, 0xA0, 0xFC, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, \r
+0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA0, \r
+0xFD, 0xE0, 0xF5, 0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x7D, 0x73, \r
+0xE4, 0xF5, 0x51, 0x74, 0x8D, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x70, \r
+0x03, 0x02, 0xA8, 0xCD, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, \r
+0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xA8, 0xCD, 0xE5, 0x51, 0x25, \r
+0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, \r
+0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0xA8, 0xCD, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24, \r
+0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xBE, 0xE5, \r
+0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3, \r
+0xE0, 0xF5, 0x57, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x90, 0xA0, 0xED, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, \r
+0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, \r
+0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, \r
+0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA0, 0xEF, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFF, 0xC3, 0x90, 0xA0, 0xF0, 0xE0, 0x9F, 0xFE, 0x90, \r
+0xA0, 0xEF, 0xE0, 0x95, 0xF0, 0x90, 0xA0, 0xF1, 0xF0, 0xA3, 0xCE, 0xF0, 0x90, 0x00, 0x06, 0x12, \r
+0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, 0xFE, 0xEF, 0x2D, 0xFD, 0xEE, 0x3C, \r
+0xFC, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x25, 0xE0, 0xFF, 0xE5, 0xF0, 0x33, 0xFE, 0x90, 0x00, \r
+0x02, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xCF, 0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0x90, \r
+0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0x78, 0x02, 0xC3, \r
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, 0xFF, 0xEC, 0x3E, 0x90, 0xA0, 0xF3, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x52, 0x54, \r
+0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0x90, \r
+0xA0, 0xF5, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFF, \r
+0x13, 0x13, 0x54, 0x03, 0x90, 0xA0, 0xF6, 0xF0, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
+0x9B, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xA1, 0xBB, 0x90, 0xA0, 0xF5, 0xE0, 0xFF, \r
+0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, \r
+0x41, 0x5F, 0x93, 0xFF, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, \r
+0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, 0x93, 0xF5, \r
+0x58, 0x90, 0xA0, 0x0B, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, 0xE5, 0x53, 0xB4, \r
+0x0B, 0x05, 0x90, 0xA0, 0x0D, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, 0xE5, 0x53, 0xB4, \r
+0x0A, 0x05, 0x90, 0xA0, 0x0E, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, 0xE5, 0x53, 0xB4, \r
+0x09, 0x05, 0x90, 0xA0, 0x0F, 0x80, 0x03, 0x90, 0xA0, 0x0C, 0xE0, 0xF5, 0x5C, 0xE5, 0x5C, 0xC3, \r
+0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, 0x58, 0x25, 0x5C, \r
+0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x05, 0x75, \r
+0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, 0xE4, 0x95, 0x5C, \r
+0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, 0xF5, 0x58, 0x80, \r
+0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, 0x40, 0x35, \r
+0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA0, 0xE7, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, \r
+0x56, 0x94, 0x00, 0x40, 0x02, 0x81, 0x25, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x06, \r
+0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0, \r
+0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, \r
+0x40, 0x02, 0xA1, 0x8B, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, \r
+0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE, 0x3C, \r
+0xFE, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, \r
+0x02, 0xA1, 0x92, 0xE5, 0x53, 0xD3, 0x94, 0x38, 0x50, 0x13, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x0F, 0x50, 0x02, 0xA1, 0x92, 0xE5, 0x53, 0xD3, \r
+0x94, 0x3A, 0x50, 0x13, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, \r
+0xC3, 0x94, 0x14, 0x50, 0x02, 0xA1, 0x92, 0xE5, 0x53, 0xD3, 0x94, 0x3C, 0x40, 0x02, 0xA1, 0x6B, \r
+0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x19, 0x50, \r
+0x02, 0xA1, 0x92, 0xA1, 0x6B, 0xE5, 0x51, 0x70, 0x50, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x90, \r
+0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, \r
+0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9D, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x29, \r
+0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, \r
+0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, \r
+0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9D, 0x92, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, \r
+0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, \r
+0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, 0xE0, \r
+0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, \r
+0xE4, 0xF5, 0x5D, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4, 0xF5, \r
+0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, \r
+0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xE7, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, 0x75, \r
+0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, \r
+0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA0, 0xE7, 0x12, \r
+0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, 0xA8, \r
+0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, \r
+0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E, \r
+0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x91, 0xF5, \r
+0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, 0xFF, \r
+0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, \r
+0xF5, 0x83, 0x12, 0x45, 0x99, 0xC3, 0x12, 0x45, 0x60, 0x50, 0x07, 0xAF, 0x51, 0x12, 0x9D, 0x90, \r
+0x80, 0x20, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xD3, \r
+0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x07, 0x7D, 0x01, 0xAF, 0x51, 0x12, \r
+0x9F, 0x9C, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, \r
+0xE0, 0x90, 0xA1, 0x38, 0xF0, 0x90, 0xA1, 0x37, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, \r
+0x12, 0x9C, 0xD8, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x02, 0xA8, 0x9B, 0x74, 0x92, 0x25, 0x51, 0xF5, \r
+0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xE1, 0x30, 0xAD, 0x53, \r
+0xAF, 0x51, 0x12, 0x9D, 0x4C, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, \r
+0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, \r
+0xF5, 0x5B, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, \r
+0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, \r
+0xF5, 0x83, 0xE4, 0xC1, 0xB3, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, \r
+0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0xDC, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, \r
+0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01, \r
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, \r
+0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x92, 0x25, \r
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, \r
+0x80, 0x98, 0x50, 0x10, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, \r
+0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, \r
+0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74, \r
+0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, \r
+0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE5, 0x53, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, \r
+0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x02, 0xA8, \r
+0x78, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0xF5, 0x5B, \r
+0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x02, 0xA8, 0x78, \r
+0xEC, 0x64, 0x06, 0x60, 0x03, 0x02, 0xA8, 0x9B, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0xF0, 0x10, 0xE5, \r
+0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3, 0xE5, 0x57, 0x94, \r
 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, \r
-0xC8, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, \r
-0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, \r
-0xE0, 0xF5, 0x55, 0xE4, 0xF5, 0x5D, 0x90, 0xA2, 0xDD, 0x12, 0x45, 0x55, 0x75, 0xF0, 0x02, 0xE5, \r
-0x5D, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, \r
-0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0xDA, 0x12, 0x45, 0x55, 0x85, \r
-0x5D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, \r
-0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, \r
-0xA2, 0xDA, 0x12, 0x45, 0x55, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, \r
-0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, \r
-0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, \r
-0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, \r
-0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, \r
-0xAE, 0x54, 0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, \r
-0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x39, 0xC3, 0x12, 0x45, 0x00, 0x50, 0x07, 0xAF, 0x51, \r
-0x12, 0x9F, 0x30, 0x80, 0x1C, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, \r
-0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x03, 0x12, 0x9D, \r
-0xA9, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, 0xE0, \r
-0x90, 0xA3, 0x2B, 0xF0, 0x90, 0xA3, 0x2A, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x99, 0x58, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE1, 0xA6, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
-0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xC1, 0x3C, 0xAD, 0x53, 0xAF, 0x51, \r
-0x12, 0x99, 0xCC, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, \r
-0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xF5, 0x5B, \r
-0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, 0x94, 0x30, \r
-0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
-0xE4, 0xA1, 0xC1, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, \r
-0x01, 0x60, 0x02, 0xA1, 0xEA, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, \r
-0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01, 0x25, 0x51, \r
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, \r
-0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x96, 0x25, 0x51, 0xF5, \r
-0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, \r
-0x50, 0x10, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x65, 0x53, \r
-0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, \r
-0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
-0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, \r
-0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74, 0x96, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x53, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, \r
-0x12, 0x45, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xE1, 0x83, 0x74, 0x96, \r
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0xF5, 0x5B, 0x74, 0x96, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0xE1, 0x83, 0xEC, 0x64, 0x06, 0x60, \r
-0x02, 0xE1, 0xA6, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, \r
-0x45, 0x49, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, \r
-0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, 0x94, 0x00, \r
-0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, \r
-0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24, 0xE4, 0x93, \r
-0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2, 0xE9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, \r
-0x5A, 0x90, 0xA2, 0xDD, 0x12, 0x45, 0x55, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5, 0x82, 0x85, \r
-0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, \r
-0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, \r
-0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0xC3, 0x90, 0xA2, 0xEA, 0xE0, 0x95, \r
-0x55, 0x90, 0xA2, 0xE9, 0xE0, 0x95, 0x54, 0x40, 0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xB1, \r
-0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, \r
-0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, \r
-0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, \r
-0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
-0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, \r
-0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, \r
-0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC4, \r
-0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, \r
-0x5B, 0xD3, 0x90, 0xA2, 0xE1, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0xE0, 0xE0, 0x94, 0x00, 0x40, 0x03, \r
-0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0xF8, 0x90, 0xA2, 0xEB, 0xF0, 0x45, 0x5B, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, \r
-0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, \r
-0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x96, 0x50, 0x0E, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, \r
-0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x74, 0x81, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0x64, 0x01, \r
-0x60, 0x03, 0x02, 0xA8, 0xC9, 0x90, 0xA2, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, \r
-0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, \r
-0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, \r
-0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, \r
-0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, \r
-0xA3, 0xF0, 0x90, 0xA2, 0xE2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, \r
-0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, \r
-0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, \r
-0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, \r
-0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, \r
-0xA2, 0xE4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3, 0x74, 0xFF, 0x9B, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, \r
-0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0xFC, 0x90, 0x94, 0x91, 0x12, 0x45, 0x2D, \r
-0xD3, 0x12, 0x45, 0x00, 0x90, 0x94, 0x91, 0x50, 0x19, 0x12, 0x45, 0x2D, 0x90, 0xA2, 0xE4, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x44, 0xD9, 0x90, 0x94, 0x91, 0x12, 0x08, 0x6D, \r
-0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xFD, 0xAF, 0x51, 0x12, 0x6C, 0x35, \r
-0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xA0, 0xC8, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC3, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x18, 0x12, \r
-0x45, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50, 0x02, 0x21, 0x7F, 0xE4, 0xF5, 0x6B, 0x90, \r
-0xA3, 0xC3, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, \r
-0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, \r
-0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, \r
-0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA3, 0xC6, 0xF0, 0x75, 0xF0, 0x04, 0xED, \r
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, \r
-0x07, 0x90, 0xA3, 0xC6, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA3, 0xC6, 0xE0, 0xFF, 0x90, 0xA3, 0xC3, \r
-0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, 0x80, 0x90, \r
-0xA3, 0xC3, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x54, \r
-0x03, 0xFD, 0xE4, 0x90, 0xA3, 0xC4, 0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, \r
-0x90, 0xA3, 0xC3, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xC3, 0xE0, \r
-0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, \r
-0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xC5, 0xF0, 0x90, 0xA3, 0xC5, 0xE0, 0x60, 0x41, 0x75, \r
-0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, \r
-0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xC5, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x1B, 0xE5, 0x6C, 0x75, 0xF0, \r
-0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA3, 0xC4, 0xF0, 0xED, 0x60, 0x24, 0xE0, 0xD3, 0x94, 0x0B, 0x40, \r
-0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x18, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xC2, \r
-0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x21, 0x9A, 0xE4, \r
-0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA3, 0xC3, 0xE0, 0x75, 0xF0, 0x08, \r
-0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, \r
-0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xC3, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, \r
-0x45, 0x49, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, \r
-0xC5, 0xF0, 0x90, 0xA3, 0xC5, 0xE0, 0x60, 0x3C, 0xE4, 0xF5, 0x6B, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
-0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xC5, 0xE0, \r
-0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0xFC, 0xED, 0x60, \r
-0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x17, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05, 0x6B, 0xE5, \r
-0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, 0xE5, 0x6C, 0x64, 0x07, 0x60, 0x02, 0x41, 0x33, 0x90, 0xA3, \r
-0xC4, 0xE0, 0xFF, 0x90, 0xA3, 0xC3, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x16, 0x12, 0x45, \r
-0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0x75, \r
-0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, \r
-0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, 0x90, 0xA3, 0xC4, 0xE0, 0x4E, 0xF5, 0x6D, \r
-0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA3, \r
-0xC3, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, \r
-0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, \r
-0x90, 0xA3, 0xC3, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D, 0x12, 0x9A, 0x10, 0x90, 0xA3, 0xC3, 0xE0, \r
-0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x90, 0xA3, 0xC4, 0xE0, \r
-0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, \r
-0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, 0xC3, 0x94, 0x04, 0x90, 0xA3, 0xC3, 0xE0, 0x40, 0x0E, 0x24, \r
-0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x24, 0x96, 0xF5, \r
-0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, \r
-0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, \r
-0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x52, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
-0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x90, 0x00, 0x02, \r
-0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, \r
-0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, \r
-0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, \r
-0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x75, 0xF0, 0x04, 0xE5, \r
-0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, \r
-0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, \r
-0x49, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60, 0x02, 0x81, 0xF6, 0xE5, 0x53, 0x54, 0x1F, \r
-0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE0, 0x4F, \r
-0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, \r
-0x49, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, \r
-0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, \r
-0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, \r
-0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, \r
-0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x16, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x16, 0x25, 0x51, \r
-0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, \r
-0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, \r
-0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, \r
-0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, \r
-0x04, 0xD4, 0xAF, 0x51, 0x11, 0xDD, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, \r
-0xEF, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x47, 0xD5, 0xEF, 0x30, 0xE6, 0x4D, 0x7F, 0x8D, 0x12, 0x47, \r
-0xD5, 0xEF, 0x64, 0x01, 0x70, 0x43, 0x90, 0xA3, 0xF0, 0xF0, 0x90, 0xA3, 0xF0, 0xE0, 0xFD, 0x90, \r
-0xA3, 0xEF, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x47, 0x9F, 0x90, 0xA3, 0xF0, \r
-0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD1, 0x7F, 0x8F, 0x12, 0x47, 0xD5, 0xEF, 0x30, \r
-0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46, 0x49, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x84, \r
-0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x4E, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA3, 0x58, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x50, 0x12, 0x45, 0x11, \r
-0x12, 0x08, 0x3A, 0x90, 0xA3, 0x58, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, \r
-0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x50, 0x12, 0x45, 0x11, 0x90, 0xA3, 0x54, 0x12, 0x45, 0x2D, \r
-0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA3, \r
-0x5C, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x5C, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, \r
-0x90, 0xA3, 0x4E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, \r
-0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xF6, 0xED, 0xF0, 0xEF, 0x14, 0x60, \r
-0x02, 0xC1, 0xEC, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA3, 0xF6, 0xE0, 0xC4, 0x33, \r
-0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA3, 0x50, 0x12, \r
-0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x54, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, \r
-0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x62, 0x90, 0xA3, 0x50, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, \r
-0x90, 0xA3, 0x54, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0xB1, 0x62, \r
-0x90, 0xA3, 0x50, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA3, 0xF6, 0xE0, 0xFF, 0xE4, \r
-0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, \r
-0x08, 0x5A, 0x90, 0xA3, 0x54, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0xB1, 0x62, 0x90, 0xA3, \r
-0x50, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0xF6, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
-0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x54, 0x12, 0x08, \r
-0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0xB1, 0x62, 0x90, 0xA3, 0x50, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, \r
-0x00, 0x90, 0xA3, 0xF6, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, \r
-0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x54, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0xB1, 0x62, \r
-0x90, 0xA3, 0x50, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x54, 0x12, 0x08, 0x79, \r
-0x00, 0x00, 0x00, 0x00, 0xB1, 0x5E, 0x90, 0xA3, 0x3E, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, \r
-0x90, 0xA3, 0x42, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x65, 0x90, 0x06, 0x03, 0xE0, \r
-0x44, 0x04, 0xF0, 0x90, 0xA3, 0x50, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x54, \r
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x62, 0x90, 0xA3, 0x50, \r
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x54, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
-0x00, 0x7F, 0x00, 0x7E, 0x09, 0xB1, 0x62, 0x90, 0xA3, 0x50, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, \r
-0x00, 0x90, 0xA3, 0x54, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xB1, 0x5E, 0x90, 0xA3, 0x3E, \r
-0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x42, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, \r
-0x00, 0xF1, 0x62, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x42, 0x12, \r
-0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA3, 0x3C, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA3, 0x3B, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, \r
-0x12, 0x3E, 0x02, 0x90, 0xA3, 0x46, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x3E, 0x12, 0x45, 0x11, 0x12, \r
-0x08, 0x3A, 0x90, 0xA3, 0x46, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, \r
-0x06, 0xC0, 0x07, 0x90, 0xA3, 0x3E, 0x12, 0x45, 0x11, 0x90, 0xA3, 0x42, 0x12, 0x45, 0x2D, 0x12, \r
-0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA3, 0x4A, \r
-0x12, 0x08, 0x6D, 0x90, 0xA3, 0x3C, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x4A, 0x12, 0x45, \r
-0x11, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x3B, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, \r
-0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC7, \r
-0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x30, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x71, \r
-0x80, 0x08, 0x90, 0xA3, 0xC7, 0xE0, 0x24, 0xFE, 0xF5, 0x71, 0x90, 0xA3, 0x3E, 0x12, 0x08, 0x79, \r
-0x00, 0x00, 0x00, 0xFF, 0xAF, 0x71, 0x12, 0xAF, 0x58, 0x90, 0xA3, 0x3E, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0xFF, 0xAF, 0x71, 0x80, 0x21, 0x90, 0xA3, 0x3E, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
-0xFF, 0x90, 0xA3, 0xC7, 0xE0, 0xFF, 0x12, 0xAF, 0x58, 0x90, 0xA3, 0x3E, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0xFF, 0x90, 0xA3, 0xC7, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x42, 0x12, \r
-0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0xAF, 0x68, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x90, 0xA2, 0x20, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xF1, 0xF0, 0x54, 0x0F, 0xF0, 0xE4, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xFF, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, \r
-0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x23, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, \r
-0xEF, 0x90, 0xA2, 0x2C, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x2D, \r
-0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, 0xE0, \r
-0x54, 0xE3, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x24, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, \r
-0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x2F, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, \r
-0xEF, 0x90, 0xA2, 0x2B, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, \r
-0xA2, 0x2E, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x03, 0x70, 0x86, 0x22, 0x7B, 0x01, \r
-0x7A, 0xA2, 0x79, 0xCE, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0xA2, \r
-0xCE, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0xA2, 0x4A, 0x74, 0x01, 0xF0, 0x22, 0xE4, \r
-0x90, 0xA2, 0x4A, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, \r
-0x12, 0x37, 0x4E, 0x90, 0xA2, 0xD1, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, \r
-0x90, 0xA2, 0xD5, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xD1, 0x12, 0x45, 0x11, 0xEF, 0x54, 0x01, 0xFF, \r
-0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xD1, 0x12, 0x45, 0x11, 0xEF, 0x54, 0xFE, \r
-0xFF, 0xEC, 0x90, 0xA2, 0xD1, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xD1, 0x12, 0x45, 0x11, 0x90, 0xAA, \r
-0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA2, 0xD5, 0x12, 0x45, \r
-0x11, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xD5, 0x12, \r
-0x45, 0x11, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xD5, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xD5, \r
-0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA0, 0x90, 0xF0, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0x54, \r
-0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, \r
-0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, \r
-0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5D, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, \r
-0x14, 0x74, 0x03, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x14, 0xE0, \r
-0x90, 0xA3, 0xF7, 0xF0, 0x6F, 0x70, 0x02, 0x41, 0xFC, 0xEF, 0x14, 0x60, 0x46, 0x14, 0x60, 0x74, \r
-0x14, 0x70, 0x02, 0x41, 0xA2, 0x14, 0x70, 0x02, 0x41, 0xD0, 0x24, 0x04, 0x60, 0x02, 0x41, 0xFC, \r
-0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x7F, 0xA8, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, \r
-0xB4, 0x02, 0x05, 0x12, 0x7F, 0x99, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x03, 0x05, 0x12, \r
-0x7F, 0xAC, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0xFC, 0x12, 0x7F, \r
-0x9B, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x7F, 0xBD, 0x41, 0xFC, 0x90, \r
-0xA3, 0xF7, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x7F, 0x8A, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, \r
-0x03, 0x05, 0x12, 0x7F, 0xB0, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, 0x60, 0x02, 0x41, 0xFC, 0x12, \r
-0x77, 0xB1, 0x41, 0xFC, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x04, 0x04, 0x71, 0x01, 0x80, 0x7D, 0x90, \r
-0xA3, 0xF7, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0x77, 0xA2, 0x80, 0x71, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, \r
-0x03, 0x05, 0x12, 0x77, 0x99, 0x80, 0x65, 0x90, 0xA3, 0xF7, 0xE0, 0x70, 0x5F, 0x12, 0x77, 0xAD, \r
-0x80, 0x5A, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x04, 0x04, 0x31, 0xD0, 0x80, 0x4F, 0x90, 0xA3, 0xF7, \r
-0xE0, 0xB4, 0x01, 0x05, 0x12, 0x77, 0xD1, 0x80, 0x43, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x02, 0x05, \r
-0x12, 0x7F, 0x81, 0x80, 0x37, 0x90, 0xA3, 0xF7, 0xE0, 0x70, 0x31, 0x12, 0x77, 0xCF, 0x80, 0x2C, \r
-0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x03, 0x04, 0x71, 0x14, 0x80, 0x21, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, \r
-0x01, 0x05, 0x12, 0x77, 0xBA, 0x80, 0x15, 0x90, 0xA3, 0xF7, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x7F, \r
-0xD1, 0x80, 0x09, 0x90, 0xA3, 0xF7, 0xE0, 0x70, 0x03, 0x12, 0x77, 0xB8, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x74, 0xD4, 0x90, 0xA1, 0x14, \r
-0x74, 0x02, 0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x49, 0x5D, 0x90, 0x05, 0x27, 0xE0, 0x54, \r
-0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x02, 0x7F, \r
-0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x71, 0x3F, 0xEF, 0x70, 0x03, 0x12, 0x57, 0x34, 0x22, 0x90, \r
-0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, \r
-0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0xC1, 0xE0, 0x30, 0xE0, 0x17, 0x90, \r
-0xA1, 0xD3, 0xE0, 0x70, 0x5F, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x56, 0x90, 0xA1, \r
-0xB3, 0xE0, 0x60, 0x4D, 0x80, 0x4E, 0x71, 0x3F, 0xEF, 0x64, 0x01, 0x70, 0x47, 0x90, 0xA1, 0x1E, \r
-0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0xA1, 0x1C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, \r
-0xEF, 0x20, 0xE2, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0xA1, 0x17, 0xE0, 0x13, \r
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA1, 0xB3, 0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, \r
-0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, \r
-0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, \r
-0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, \r
-0x0C, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x23, \r
-0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xAD, 0xE0, 0xFF, 0x90, \r
-0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, \r
-0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA2, 0xF8, 0xF0, 0xE0, 0xFD, \r
-0x54, 0xC0, 0x70, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7F, 0xED, 0x30, 0xE6, \r
-0x4E, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC3, 0x13, \r
-0x20, 0xE0, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x18, 0xE0, \r
-0x54, 0x0F, 0x64, 0x01, 0x70, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, \r
-0x4B, 0x57, 0x80, 0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, \r
-0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x6F, 0x86, 0x80, 0x0C, 0x12, 0x4F, 0x9A, 0x80, 0x07, 0x90, \r
-0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0xF8, 0xE0, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, \r
-0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xA1, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x90, 0xA3, 0xA2, \r
-0x12, 0x48, 0x20, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, \r
-0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, \r
-0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA3, \r
-0xA1, 0xF0, 0x90, 0xA1, 0xAF, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA3, 0xA2, 0xF0, 0xE4, 0xFB, \r
-0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48, 0x28, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x08, 0xF0, 0x22, \r
-0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, 0x86, 0xE0, \r
-0x30, 0xE1, 0x0A, 0x90, 0xA2, 0x07, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
-0xEF, 0x60, 0x3B, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x90, 0xA1, 0x17, 0xE0, 0x54, \r
-0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x49, 0x5D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, \r
-0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x49, 0x73, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x40, \r
-0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, 0x53, 0xAD, 0x90, 0xA1, 0x15, 0x74, 0x06, 0xF0, 0x22, 0x7D, \r
-0x2E, 0x7F, 0x6F, 0x12, 0x49, 0x5D, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x53, 0xAD, 0x90, 0x05, 0x27, \r
-0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, \r
-0x5D, 0x7D, 0x04, 0x7F, 0x01, 0x12, 0x53, 0xAD, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, \r
-0xA1, 0x15, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xB4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA3, 0xB0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, \r
-0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
-0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, \r
-0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, \r
-0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, \r
-0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, \r
-0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, \r
-0x22, 0x90, 0xA3, 0xAE, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xFB, \r
-0xEF, 0xF0, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49, 0x90, 0xA1, \r
-0x1D, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA3, 0xFB, 0xE0, 0x70, 0x3B, 0x90, 0xA1, 0x16, 0xE0, \r
-0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x53, 0xA5, 0x80, 0x26, 0x90, 0xA1, 0x1D, 0xE0, 0x64, \r
-0x06, 0x70, 0x24, 0x90, 0xA3, 0xFB, 0xE0, 0x60, 0x1E, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xBF, 0xF0, \r
-0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x1D, 0x74, 0x04, \r
-0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, \r
-0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, \r
-0x7A, 0x30\r
+0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, \r
+0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, \r
+0x90, 0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA0, 0xF8, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, \r
+0x5A, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, \r
+0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0xFD, \r
+0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0xC3, \r
+0x90, 0xA0, 0xF9, 0xE0, 0x95, 0x55, 0x90, 0xA0, 0xF8, 0xE0, 0x95, 0x54, 0x40, 0x07, 0x05, 0x5A, \r
+0xE5, 0x5A, 0xB4, 0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, 0xFF, \r
+0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, 0x5A, \r
+0xFF, 0x80, 0x02, 0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, \r
+0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74, 0x01, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
+0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
+0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B, \r
+0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA0, 0xEE, 0xE0, 0x94, 0x03, 0x90, 0xA0, 0xED, \r
+0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, \r
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF8, 0x90, 0xA0, 0xFA, 0xF0, 0x45, 0x5B, 0xFF, 0xF0, 0x75, 0xF0, \r
+0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x51, 0xF5, \r
+0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x92, 0x50, 0x0E, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xE4, 0xFD, 0xAF, 0x51, 0x11, 0xDA, 0x05, 0x51, 0xE5, \r
+0x51, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xA1, 0x23, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xE4, 0xF0, \r
+0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, \r
+0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, \r
+0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, \r
+0x90, 0x8D, 0x09, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, \r
+0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, \r
+0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, \r
+0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
+0xD9, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB, \r
+0x24, 0xF1, 0x50, 0x02, 0x41, 0x09, 0xE4, 0xF5, 0x6B, 0x90, 0xA1, 0xD9, 0xE0, 0xFD, 0x75, 0xF0, \r
+0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
+0xF5, 0x83, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, \r
+0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, \r
+0xEE, 0x5C, 0x90, 0xA1, 0xDC, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, \r
+0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA1, 0xDC, 0xE0, 0x54, \r
+0xF0, 0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, \r
+0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, 0x80, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x04, \r
+0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA1, 0xDA, \r
+0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, \r
+0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
+0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, \r
+0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, \r
+0xA1, 0xDB, 0xF0, 0x90, 0xA1, 0xDB, 0xE0, 0x60, 0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, \r
+0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xDB, \r
+0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x1B, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA1, \r
+0xDA, 0xF0, 0xED, 0x60, 0x24, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, \r
+0x18, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, \r
+0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x41, 0x24, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, \r
+0x06, 0x1D, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, \r
+0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, \r
+0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, \r
+0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA1, 0xDB, 0xF0, 0x90, 0xA1, 0xDB, 0xE0, \r
+0x60, 0x3C, 0xE4, 0xF5, 0x6B, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, \r
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xDB, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, \r
+0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0xFC, 0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, \r
+0x17, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, \r
+0xE5, 0x6C, 0x64, 0x07, 0x60, 0x02, 0x41, 0xBD, 0x90, 0xA1, 0xDA, 0xE0, 0xFF, 0x90, 0xA1, 0xD9, \r
+0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x04, \r
+0xEE, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, \r
+0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, \r
+0x9F, 0x40, 0x09, 0x90, 0xA1, 0xDA, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, \r
+0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0x24, 0x12, 0xF5, \r
+0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, \r
+0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0xE4, \r
+0xFB, 0xAD, 0x6D, 0x12, 0x7D, 0x73, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, \r
+0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, \r
+0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, \r
+0xC3, 0x94, 0x04, 0x90, 0xA1, 0xD9, 0xE0, 0x40, 0x0E, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x95, \r
+0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, \r
+0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, \r
+0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, \r
+0x54, 0x01, 0xF5, 0x52, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, \r
+0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, \r
+0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, \r
+0xF5, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, \r
+0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, \r
+0xA9, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, \r
+0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, \r
+0xE5, 0x59, 0x60, 0x02, 0xA1, 0x80, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, \r
+0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, \r
+0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, \r
+0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, \r
+0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, \r
+0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, \r
+0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, \r
+0x45, 0xA9, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
+0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, \r
+0x83, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, \r
+0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, \r
+0xE5, 0x51, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, \r
+0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x31, 0x67, \r
+0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x22, \r
+0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x5B, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0x65, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x5D, 0x12, \r
+0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x65, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, \r
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0x5D, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x61, 0x12, \r
+0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, \r
+0x90, 0xA1, 0x69, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x69, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, \r
+0x08, 0x6D, 0x90, 0xA1, 0x5B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, \r
+0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x0C, 0xED, 0xF0, 0xEF, \r
+0x14, 0x60, 0x02, 0xE1, 0x1E, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x0C, 0xE0, \r
+0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA1, \r
+0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x01, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, \r
+0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA2, 0x0C, 0xE0, \r
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, \r
+0x04, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0xB1, 0x94, \r
+0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA2, 0x0C, 0xE0, 0xFF, 0xE4, \r
+0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x61, \r
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x0C, \r
+0x00, 0x00, 0x00, 0x90, 0xA2, 0x0C, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, \r
+0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, \r
+0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x61, 0x12, \r
+0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xB1, 0x90, 0x90, 0xA1, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x0C, 0x00, 0x90, 0xA1, 0x4F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x65, 0x90, 0x06, \r
+0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, \r
+0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x94, 0x90, \r
+0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, \r
+0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, \r
+0x00, 0x0C, 0x00, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xB1, 0x90, 0x90, \r
+0xA1, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x4F, 0x12, 0x08, 0x79, 0x00, \r
+0x00, 0x0C, 0x00, 0xF1, 0x94, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1, \r
+0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0xA1, 0x49, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA1, 0x48, 0xEF, 0xF0, 0xA3, 0xA3, \r
+0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA1, 0x53, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x4B, 0x12, 0x45, \r
+0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x53, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0, \r
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0x4B, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x4F, 0x12, 0x45, \r
+0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, \r
+0xA1, 0x57, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x49, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0x57, \r
+0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x48, 0xE0, 0xFF, 0xD0, 0x05, \r
+0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0xA1, 0xDD, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x30, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, \r
+0xF5, 0x72, 0x80, 0x08, 0x90, 0xA1, 0xDD, 0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA1, 0x4B, 0x12, \r
+0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x12, 0xAF, 0x8A, 0x90, 0xA1, 0x4B, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, 0x21, 0x90, 0xA1, 0x4B, 0x12, 0x08, 0x79, 0x00, \r
+0x00, 0x00, 0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0x12, 0xAF, 0x8A, 0x90, 0xA1, 0x4B, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1, \r
+0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0xAF, 0x9A, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75, \r
+0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0x30, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA0, 0xEF, \r
+0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE5, 0x56, 0xF0, 0x80, 0x46, \r
+0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x57, 0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, \r
+0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, \r
+0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, 0x75, 0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0x30, 0x12, \r
+0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA0, 0xEF, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, \r
+0x03, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xAF, 0x57, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, \r
+0x1F, 0xC3, 0x95, 0x54, 0x40, 0x14, 0x90, 0xA0, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x11, \r
+0x92, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, \r
+0x16, 0x90, 0xA0, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x11, 0x92, 0x90, 0xA0, \r
+0xEB, 0xEF, 0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, 0xA0, \r
+0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x11, 0x92, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, \r
+0x24, 0xD0, 0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA0, 0xEF, 0xEE, 0xF0, \r
+0xAB, 0x55, 0x7D, 0x60, 0xAF, 0x54, 0x11, 0x92, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, 0x24, 0x84, 0xFD, \r
+0xE4, 0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0E, 0xE5, 0x55, 0x90, 0xA0, 0x2E, 0x12, 0x45, 0xA9, 0x75, \r
+0xF0, 0x03, 0xEE, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, 0xA0, 0x29, 0xE0, \r
+0x30, 0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x34, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0x34, 0x12, 0x45, 0xA9, \r
+0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA0, 0x2B, 0x74, 0x05, 0xF0, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, \r
+0x54, 0x07, 0xFD, 0x7F, 0x01, 0x12, 0x4D, 0x68, 0x22, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xDB, 0x7F, \r
+0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0xA0, 0xDB, 0xE0, 0x54, 0x30, 0xFF, \r
+0xBF, 0x20, 0x07, 0x90, 0xA0, 0x56, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x56, 0xF0, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, \r
+0xDE, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0xE2, 0x12, 0x08, \r
+0x6D, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, \r
+0x60, 0x24, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA0, 0xDE, \r
+0x12, 0x08, 0x6D, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, \r
+0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, \r
+0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, \r
+0xFF, 0xEC, 0x90, 0xA0, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x71, 0x90, 0xAA, \r
+0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0x0E, 0x12, 0x08, 0xAA, 0x90, \r
+0x9F, 0x0E, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C, \r
+0xF0, 0x22, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
+0x90, 0x9F, 0x11, 0x74, 0x04, 0xF0, 0x22, 0x71, 0xEB, 0x80, 0xE7, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x9F, 0x11, 0xE0, 0x90, 0xA2, 0x0D, 0xF0, 0x6F, 0x70, 0x02, 0x61, 0xD8, 0xEF, \r
+0x14, 0x60, 0x46, 0x14, 0x60, 0x72, 0x14, 0x70, 0x02, 0x61, 0x83, 0x14, 0x70, 0x02, 0x61, 0xAF, \r
+0x24, 0x04, 0x60, 0x02, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x4F, 0xEC, \r
+0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x4F, 0xDD, 0x61, 0xD8, 0x90, 0xA2, \r
+0x0D, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x4F, 0xF1, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0x64, 0x01, \r
+0x60, 0x02, 0x61, 0xD8, 0x12, 0x4F, 0xDF, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x04, \r
+0x91, 0x1F, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x4F, 0xB9, 0x61, 0xD8, \r
+0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x4F, 0xF5, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, \r
+0x60, 0x02, 0x61, 0xD8, 0x71, 0xEB, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x04, 0x91, \r
+0x0C, 0x80, 0x75, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x71, 0xDF, 0x80, 0x6A, 0x90, 0xA2, \r
+0x0D, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x02, 0x80, 0x5F, 0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x59, 0x71, \r
+0xDD, 0x80, 0x55, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0x33, 0x80, 0x4A, 0x90, 0xA2, \r
+0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x71, 0xF4, 0x80, 0x3F, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x05, \r
+0x12, 0x5F, 0xB5, 0x80, 0x33, 0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x2D, 0x71, 0xF2, 0x80, 0x29, 0x90, \r
+0xA2, 0x0D, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x48, 0x80, 0x1E, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x01, \r
+0x04, 0x51, 0xB2, 0x80, 0x13, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x04, 0x91, 0x5D, 0x80, 0x08, \r
+0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x02, 0x51, 0xC7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x71, 0xEB, 0x7D, \r
+0x20, 0x12, 0x46, 0xF8, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x9F, 0x11, 0x74, 0x01, \r
+0xF0, 0x22, 0x71, 0xEB, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0x11, 0x74, 0x03, \r
+0xF0, 0x22, 0x12, 0x46, 0xFD, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, \r
+0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x46, 0xF8, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9F, 0x11, 0x74, \r
+0x01, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, \r
+0xF0, 0x90, 0x9F, 0x11, 0x74, 0x03, 0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, \r
+0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x9F, 0x11, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x5D, 0x10, \r
+0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x9F, \r
+0x11, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, \r
+0x74, 0x02, 0xF0, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, \r
+0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F, 0x20, 0xE0, 0x04, \r
+0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x9F, 0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20, \r
+0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0x9F, 0x14, 0xE0, \r
+0x54, 0xFB, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA1, 0x05, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, \r
+0x70, 0x09, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7F, 0xED, 0x30, 0xE6, 0x4E, 0x90, \r
+0x9F, 0x17, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, \r
+0x09, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, \r
+0x64, 0x01, 0x70, 0x30, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x4B, 0x56, \r
+0x80, 0x22, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x64, \r
+0x02, 0x60, 0x05, 0x12, 0x77, 0x62, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0x9F, 0x1B, \r
+0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0x05, 0xE0, 0x90, 0x9F, 0x1B, 0x30, 0xE7, 0x1B, 0xE0, 0x44, \r
+0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0xB7, 0xE0, 0x90, 0xA1, 0xAF, 0x12, 0x48, \r
+0x1F, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F, \r
+0x13, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, \r
+0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, \r
+0x90, 0x9F, 0xB8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA1, 0xAF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, \r
+0x58, 0x7E, 0x01, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x9F, \r
+0xCA, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xDC, 0xE0, 0x70, 0x60, 0x90, 0x9F, 0x19, 0xE0, 0xD3, \r
+0x94, 0x00, 0x50, 0x57, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x4E, 0x80, 0x4F, 0x12, 0x57, 0xF0, 0xEF, \r
+0x64, 0x01, 0x70, 0x47, 0x90, 0x9F, 0x1B, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x9F, 0x19, \r
+0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x9F, 0x1B, 0xE0, 0x20, \r
+0xE4, 0x29, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x9F, 0xBC, \r
+0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, \r
+0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x60, \r
+0x3B, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFE, 0xF0, \r
+0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x49, 0x5C, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08, \r
+0xE4, 0xFF, 0x12, 0x49, 0x72, 0xBF, 0x01, 0x14, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x40, 0xF0, 0x7D, \r
+0x06, 0x7F, 0x01, 0x12, 0x54, 0x47, 0x90, 0x9F, 0x12, 0x74, 0x06, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, \r
+0x6F, 0x12, 0x49, 0x5C, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x54, 0x47, 0x90, 0x05, 0x27, 0xE0, 0x54, \r
+0xBF, 0xF0, 0x90, 0x9F, 0x12, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x7D, \r
+0x04, 0x7F, 0x01, 0x12, 0x54, 0x47, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9F, 0x12, \r
+0x74, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, \r
+0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, \r
+0x29, 0x90, 0x9F, 0x20, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x9F, \r
+0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, \r
+0x01, 0x0B, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x52, 0x28, 0x22, 0x7E, 0x00, \r
+0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xBD, 0x02, 0x08, 0xAA, 0x90, 0xA1, 0xBD, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, \r
+0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, \r
+0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0xA1, 0xBB, 0xE0, 0xFF, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x11, 0xEF, 0xF0, 0x90, 0x9D, 0x9B, 0xE0, 0xFF, 0x90, \r
+0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA2, \r
+0x11, 0xE0, 0x70, 0x3B, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x54, \r
+0x3F, 0x80, 0x26, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA2, 0x11, 0xE0, 0x60, \r
+0x1E, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, \r
+0x44, 0x80, 0xF0, 0x90, 0x9F, 0x1A, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9D, 0x9E, 0xE0, 0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x4A, 0xB0, \r
+0x90, 0xA1, 0xC2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xC0, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAB, 0x07, 0x90, 0xA2, 0x12, 0xED, 0xF0, 0xEC, 0xF9, \r
+0xE0, 0xFF, 0xAE, 0x03, 0x74, 0x2A, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, \r
+0xED, 0xF0, 0xAF, 0x06, 0x22, 0x00, 0x31, 0x18\r
 };\r
-u4Byte ArrayLength_MP_8723B_FW_NIC = 30402;\r
+u4Byte ArrayLength_MP_8723B_FW_NIC = 30808;\r
 \r
 \r
 \r
@@ -3526,16 +3552,16 @@ ODM_ReadFirmware_MP_8723B_FW_NIC(
        *pFirmwareSize = ArrayLength_MP_8723B_FW_NIC;\r
 }\r
 \r
-// v19.00 20131217 by Glayrainx <glayrainx@realtek.com>\r
+// v27.01 20140429 by Isaachsu <isaachsu@realtek.com>\r
 u1Byte Array_MP_8723B_FW_WoWLAN[] = {\r
-0x01, 0x53, 0x30, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x16, 0x18, 0x16, 0x4A, 0x53, 0x00, 0x00, \r
-0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x47, 0x06, 0x02, 0x5F, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x60, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x67, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x01, 0x53, 0x30, 0x00, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x29, 0x13, 0x46, 0x2C, 0x6C, 0x00, 0x00, \r
+0xD1, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x48, 0x94, 0x02, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x68, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x6E, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x60, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x56, 0x68, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x67, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x68, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6A, 0x02, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x6E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
@@ -3565,1306 +3591,1704 @@ u1Byte Array_MP_8723B_FW_WoWLAN[] = {
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x34, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
-0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, \r
-0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
-0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
-0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, \r
-0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, \r
-0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, \r
-0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, \r
-0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, \r
-0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, \r
-0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, \r
-0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, \r
-0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, \r
-0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, \r
-0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, \r
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x47, 0x9A, 0x74, 0x01, 0x93, \r
-0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, \r
-0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
-0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, \r
-0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, \r
-0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, \r
-0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, \r
-0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
-0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, \r
-0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
-0x04, 0x90, 0x47, 0x9A, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
-0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
-0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, \r
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0x7D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, \r
-0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
-0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, \r
-0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
-0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, \r
-0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, \r
-0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
-0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, \r
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0x7C, 0x8F, 0xF0, \r
-0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, \r
-0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, \r
-0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, \r
-0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, \r
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0x7D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
-0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, \r
-0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, \r
-0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, \r
-0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0, \r
-0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, \r
-0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3, \r
-0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, \r
-0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, \r
-0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09, \r
-0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, 0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5, \r
-0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6, \r
-0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, 0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82, \r
-0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, 0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82, \r
-0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88, \r
-0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10, \r
-0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4, \r
-0x02, 0x46, 0x8B, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, 0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80, \r
-0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, 0xA3, 0x80, 0x51, 0x80, 0x74, 0x80, \r
-0x3C, 0x02, 0x46, 0x97, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, \r
-0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, \r
-0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, 0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4, \r
-0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, 0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A, \r
-0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, 0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82, \r
-0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89, \r
-0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80, \r
-0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, \r
-0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, \r
-0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02, \r
-0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, \r
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, \r
-0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, 0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83, \r
-0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, \r
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2, \r
-0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04, \r
-0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x8E, 0x23, 0x23, 0x45, \r
-0x82, 0x23, 0x90, 0x45, 0xD3, 0x73, 0x02, 0x47, 0x44, 0x02, 0x43, 0x0D, 0xE4, 0x93, 0xA3, 0xF8, \r
-0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, \r
-0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, \r
-0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, \r
-0x10, 0x20, 0x40, 0x80, 0x90, 0x47, 0x89, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, \r
-0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, \r
-0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, \r
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, \r
-0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x92, 0x3C, 0x00, 0x41, 0x92, \r
-0x3D, 0x00, 0x41, 0x92, 0x4F, 0x00, 0x41, 0x92, 0x54, 0x00, 0x4B, 0x9C, 0x58, 0x68, 0x5A, 0xA5, \r
-0x7F, 0x02, 0x12, 0x48, 0x12, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0xF1, 0xB8, 0x7F, 0x02, 0x12, \r
-0x48, 0x12, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, \r
-0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, \r
-0xF1, 0xB8, 0xAD, 0x0E, 0x7F, 0x51, 0xF1, 0xB8, 0xAD, 0x0F, 0x7F, 0x52, 0xF1, 0xB8, 0xAD, 0x10, \r
-0x7F, 0x53, 0x80, 0xC4, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, \r
-0x12, 0x38, 0x45, 0x7F, 0x67, 0x11, 0x12, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x47, 0xB8, \r
-0x7F, 0x4E, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, \r
-0x92, 0x4A, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x92, 0x4A, 0xE0, 0xFF, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x20, 0xE0, 0xFE, \r
-0xC4, 0x13, 0x54, 0x01, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x45, 0xED, \r
-0xF0, 0x90, 0x92, 0x44, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6F, 0x7F, 0x47, 0x11, 0x12, 0x90, \r
-0x92, 0x44, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, \r
-0x5F, 0xFD, 0x7F, 0x47, 0x12, 0x47, 0xB8, 0x7F, 0x46, 0x11, 0x12, 0x90, 0x92, 0x44, 0xE0, 0xFE, \r
-0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x12, \r
-0x47, 0xB8, 0x90, 0x92, 0x45, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0x11, 0x12, 0x90, 0x92, 0x44, 0xE0, \r
-0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x16, 0x7F, \r
-0x45, 0x11, 0x12, 0x90, 0x92, 0x44, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, \r
-0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x77, 0x90, 0x92, 0x44, 0xE0, 0x24, 0xF8, \r
-0xF0, 0x7F, 0x63, 0x11, 0x12, 0x90, 0x92, 0x44, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, \r
-0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x12, 0x47, 0xB8, 0x7F, 0x62, 0x11, \r
-0x12, 0x90, 0x92, 0x44, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, \r
-0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x12, 0x47, 0xB8, 0x90, 0x92, 0x45, 0xE0, 0x60, 0x1A, 0x7F, 0x61, \r
-0x11, 0x12, 0x90, 0x92, 0x44, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, \r
-0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0x11, 0x12, 0x90, 0x92, 0x44, 0xE0, \r
-0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, \r
-0x61, 0x12, 0x47, 0xB8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x92, 0x4D, 0xEF, 0xF0, 0x90, 0x8F, 0x3A, 0xE0, 0x60, 0x02, 0x41, 0x50, 0x90, 0x92, 0x4D, \r
-0xE0, 0x60, 0x02, 0x21, 0xFF, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, \r
-0x54, 0xE7, 0xF0, 0x90, 0x8F, 0x39, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x60, 0x56, 0x12, 0x37, 0x4E, \r
-0xE4, 0xFF, 0x12, 0x47, 0xF4, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x47, 0xB8, 0x7F, 0x4F, \r
-0x11, 0x12, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x12, 0x47, 0xB8, 0x7F, 0x30, 0x7E, 0x09, 0x12, \r
-0x37, 0x4E, 0xE4, 0x74, 0x66, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, \r
-0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, \r
-0x44, 0x01, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, \r
-0x45, 0x80, 0x7D, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0x12, 0x47, 0xF4, 0xEF, 0x44, 0x80, \r
-0xFD, 0x7F, 0x4E, 0x12, 0x47, 0xB8, 0x7F, 0x4F, 0x11, 0x12, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, \r
-0x12, 0x47, 0xB8, 0x7F, 0x64, 0x11, 0x12, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x64, 0x80, 0x4E, 0x90, \r
-0x92, 0x4D, 0xE0, 0x64, 0x01, 0x70, 0x49, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, \r
-0x65, 0xE0, 0x44, 0x18, 0xF0, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, \r
-0x74, 0x02, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, \r
-0x45, 0x7F, 0x67, 0x11, 0x12, 0xEF, 0x54, 0xDF, 0x11, 0x0A, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, \r
-0x12, 0x47, 0xB8, 0x7F, 0x4F, 0x11, 0x12, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x12, 0x47, 0xB8, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0xF1, 0x8C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x7F, 0x01, 0x31, 0x49, 0x12, 0x57, 0xEA, 0x12, 0x47, 0xAD, 0x12, 0x47, 0xA0, 0x12, 0x47, 0xA0, \r
-0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, \r
-0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0x90, 0x8F, 0x22, 0xE0, 0x75, 0xF0, 0x40, \r
-0xA4, 0xFF, 0x90, 0x92, 0x2F, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x8F, \r
-0x23, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x92, 0x32, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x02, 0x61, \r
-0x57, 0x90, 0x92, 0x2F, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x92, 0x2F, 0x74, 0xFF, \r
-0x75, 0xF0, 0xD0, 0x12, 0x08, 0xD6, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x20, \r
-0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x11, 0x45, 0x11, \r
-0x34, 0x90, 0x8F, 0x23, 0xE0, 0x30, 0xE0, 0x6F, 0x90, 0x92, 0x2F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0x12, 0x3E, 0x50, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x20, 0xE0, 0xFE, 0xC4, \r
-0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x11, 0x45, 0xE4, 0x90, 0x92, 0x31, \r
-0xF0, 0x90, 0x92, 0x32, 0xE0, 0xFF, 0x90, 0x92, 0x31, 0xE0, 0xC3, 0x9F, 0x50, 0x39, 0x90, 0x92, \r
-0x2F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x11, 0x34, 0x90, 0x92, 0x2F, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x20, \r
-0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x11, 0x45, 0x90, \r
-0x92, 0x31, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22, 0x7F, 0x54, 0x11, 0x12, 0xE5, 0x0D, 0x5F, 0xF5, \r
-0x11, 0x7F, 0x55, 0x11, 0x12, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x11, 0x12, 0xE5, 0x0F, \r
-0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x11, 0x12, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11, 0x7F, 0x54, \r
-0x12, 0x47, 0xB8, 0xAD, 0x12, 0x7F, 0x55, 0x12, 0x47, 0xB8, 0xAD, 0x13, 0x7F, 0x56, 0x12, 0x47, \r
-0xB8, 0xAD, 0x14, 0x7F, 0x57, 0x12, 0x47, 0xB8, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x11, 0x12, \r
-0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x47, 0xB8, 0x7F, 0x80, 0x11, 0x12, 0xEF, 0x44, 0x80, \r
-0xFD, 0x7F, 0x80, 0x12, 0x47, 0xB8, 0x12, 0x75, 0x4A, 0x12, 0x3E, 0x11, 0xF1, 0xF8, 0x12, 0x75, \r
-0x7C, 0x7F, 0x01, 0x12, 0x43, 0x45, 0x90, 0x90, 0xDB, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0x45, \r
-0x90, 0x90, 0xDB, 0xE0, 0x04, 0xF0, 0x91, 0x09, 0x12, 0x65, 0x0E, 0x7F, 0x80, 0x11, 0x12, 0xEF, \r
-0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x47, 0xB8, 0x75, 0x28, 0xFF, 0x12, 0x5A, 0x9E, 0x12, 0x75, \r
-0x75, 0x7F, 0x81, 0x11, 0x12, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x47, 0xB8, 0x12, 0x75, \r
-0x8A, 0x12, 0x7F, 0xA1, 0xE4, 0xFF, 0x02, 0x43, 0xCE, 0xF1, 0xF9, 0x90, 0x8D, 0x06, 0xEF, 0xF0, \r
-0x12, 0x74, 0xD0, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, \r
-0x7F, 0x17, 0x11, 0x12, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x47, 0xB8, 0x7F, \r
-0x38, 0x11, 0x12, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x47, 0xB8, 0x02, 0x37, 0x99, 0xE4, \r
-0x90, 0x8E, 0x7F, 0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x54, 0x0F, 0xF0, 0xA3, 0x74, 0x02, \r
-0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, \r
-0xEF, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x85, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0x8E, 0x7B, \r
-0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x88, 0xF0, 0x90, 0x8E, \r
-0x87, 0x74, 0x08, 0xF0, 0x90, 0x8E, 0x8A, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x8E, \r
-0x83, 0xF0, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0xFF, 0xB1, 0x73, 0x7D, 0x0C, \r
-0x7F, 0x02, 0xB1, 0x73, 0xB1, 0x6F, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, \r
-0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x8E, 0x8C, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, 0x8E, 0xAA, 0xF0, 0x90, 0x8E, 0x90, 0xF0, 0x90, 0x8D, \r
-0x06, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x89, 0x74, 0xDD, 0xF0, 0x80, 0x12, 0x90, 0x8D, 0x06, \r
-0xE0, 0x90, 0x8E, 0x89, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, \r
-0x79, 0x11, 0x12, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0E, 0x7F, 0x28, 0x11, 0x12, 0xEF, 0x30, \r
-0xE2, 0x06, 0x90, 0x8E, 0xAA, 0x74, 0x02, 0xF0, 0x90, 0x8F, 0x12, 0x74, 0x05, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x8E, 0x91, 0xF0, \r
-0x90, 0x8E, 0xAA, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x94, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x12, 0x77, 0xC6, 0xE4, 0x90, 0x8E, 0x92, 0xF0, 0xA3, 0xF0, 0x90, 0x8F, 0x16, 0xF0, 0xA3, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, \r
-0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, \r
-0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0xF1, 0x8C, 0xE4, 0x90, 0x8F, 0x18, 0xF0, 0x22, 0x7D, \r
-0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x50, 0xEF, 0xF0, 0x14, \r
-0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0x7B, \r
-0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x82, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x8E, \r
-0x81, 0xED, 0xF0, 0x7F, 0x8F, 0x11, 0x12, 0xEF, 0x30, 0xE4, 0x31, 0x90, 0x92, 0x50, 0xE0, 0x14, \r
-0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0x01, 0xC4, \r
-0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, \r
-0x80, 0x07, 0x90, 0x8E, 0x81, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x47, 0xB8, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x7D, 0x2F, 0x51, 0x55, 0x7D, 0x08, 0x7F, 0x01, 0x80, 0x88, 0x7D, 0x01, 0x7F, 0x04, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x52, 0xED, 0xF0, 0x90, 0x8E, 0x7B, 0xE0, 0xFE, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xE1, 0x3C, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
-0x01, 0x30, 0xE0, 0x02, 0xE1, 0x3C, 0x90, 0x8E, 0x82, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xE1, 0x3C, \r
-0xEF, 0x70, 0x02, 0xC1, 0xB2, 0x24, 0xFE, 0x70, 0x02, 0xC1, 0xEC, 0x24, 0xFE, 0x60, 0x4A, 0x24, \r
-0xFC, 0x70, 0x02, 0xE1, 0x27, 0x24, 0xFC, 0x60, 0x02, 0xE1, 0x3C, 0xEE, 0xB4, 0x0E, 0x02, 0xF1, \r
-0x97, 0x90, 0x8E, 0x82, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xF1, 0xBA, 0x90, 0x8E, 0x82, 0xE0, 0xB4, \r
-0x06, 0x02, 0xF1, 0x62, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x92, 0x52, 0xE0, 0xFF, \r
-0x60, 0x05, 0x12, 0x90, 0xFF, 0x80, 0x03, 0x12, 0x67, 0x40, 0x90, 0x8E, 0x82, 0xE0, 0x64, 0x08, \r
-0x60, 0x02, 0xE1, 0x3C, 0x12, 0x57, 0xB3, 0xE1, 0x3C, 0x90, 0x8E, 0x82, 0xE0, 0x70, 0x04, 0x7F, \r
-0x01, 0xF1, 0xBA, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x62, 0x90, 0x8E, 0x82, 0xE0, \r
-0xB4, 0x0E, 0x07, 0xF1, 0x41, 0xBF, 0x01, 0x02, 0xF1, 0x97, 0x90, 0x8E, 0x82, 0xE0, 0x64, 0x0C, \r
-0x60, 0x02, 0xE1, 0x3C, 0xF1, 0x41, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, 0x3C, 0x12, 0x56, 0x08, \r
-0xE1, 0x3C, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0x41, 0xBF, 0x01, 0x02, 0xF1, 0x97, \r
-0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x06, 0x02, 0xF1, 0x62, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x0C, 0x08, \r
-0xF1, 0x41, 0xBF, 0x01, 0x03, 0x12, 0x56, 0x08, 0x90, 0x8E, 0x82, 0xE0, 0x64, 0x04, 0x70, 0x5C, \r
-0x12, 0x90, 0x7E, 0xEF, 0x64, 0x01, 0x70, 0x54, 0xF1, 0xD3, 0x80, 0x50, 0x90, 0x8E, 0x82, 0xE0, \r
-0xB4, 0x0E, 0x07, 0xF1, 0x41, 0xBF, 0x01, 0x02, 0xF1, 0x97, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x06, \r
-0x02, 0xF1, 0x62, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0x41, 0xBF, 0x01, 0x03, 0x12, \r
-0x56, 0x08, 0x90, 0x8E, 0x82, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0xF1, 0xBA, 0x90, 0x8E, 0x82, 0xE0, \r
-0xB4, 0x04, 0x19, 0xF1, 0xEC, 0x80, 0x15, 0x90, 0x8E, 0x82, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x8E, \r
-0x7C, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xB1, 0xE1, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x12, 0x90, 0x65, 0xBF, 0x01, 0x18, 0x90, 0x8E, 0x7B, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
-0x20, 0xE0, 0x0C, 0x90, 0x8E, 0x81, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, \r
-0x00, 0x22, 0x90, 0x8E, 0x7C, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, \r
-0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xB1, 0x73, 0xE4, 0xFD, \r
-0xFF, 0x80, 0x09, 0xE4, 0xFD, 0x7F, 0x0C, 0xB1, 0xEF, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, \r
-0xF0, 0x90, 0x8D, 0x05, 0xED, 0xF0, 0x22, 0x90, 0x8E, 0x7C, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, \r
-0x7D, 0x0C, 0x80, 0x0D, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, \r
-0x04, 0x7F, 0x01, 0xB1, 0x73, 0xE4, 0xFD, 0xFF, 0x80, 0xD2, 0x90, 0x92, 0x51, 0xEF, 0xF0, 0x12, \r
-0x65, 0x78, 0x90, 0x92, 0x51, 0xE0, 0x60, 0x05, 0xE4, 0xFD, 0xFF, 0xF1, 0x8C, 0x7D, 0x04, 0x7F, \r
-0x01, 0xA1, 0x73, 0x7D, 0x2D, 0x12, 0x57, 0xE5, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, \r
-0x03, 0x12, 0x57, 0x3D, 0x51, 0x59, 0xE4, 0xFD, 0x7F, 0x01, 0xA1, 0x73, 0x7D, 0x2E, 0x7F, 0x6F, \r
-0xF1, 0x8C, 0x7D, 0x02, 0x7F, 0x01, 0xA1, 0x73, 0x22, 0x7F, 0xF4, 0x11, 0x12, 0xEF, 0x20, 0xE5, \r
-0x0E, 0x7F, 0xF4, 0x12, 0x48, 0x12, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, \r
-0x03, 0x22, 0xF0, 0xE4, 0x90, 0x92, 0x16, 0xF0, 0x90, 0x8F, 0x13, 0xE0, 0x90, 0x92, 0x17, 0xF0, \r
-0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, \r
-0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x16, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, \r
-0x12, 0x36, 0x3E, 0x90, 0x92, 0x12, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3, \r
-0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x58, 0x90, 0x06, 0xA9, 0xE0, \r
-0xF5, 0x58, 0x54, 0xC0, 0x70, 0x0C, 0x90, 0x8E, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, \r
-0x21, 0x5D, 0xE5, 0x58, 0x30, 0xE6, 0x21, 0x90, 0x8E, 0x7F, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, \r
-0x8E, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, \r
-0x11, 0xE5, 0x80, 0x0B, 0x11, 0xB9, 0x80, 0x07, 0x90, 0x8E, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, \r
-0x58, 0x90, 0x8E, 0x83, 0x30, 0xE7, 0x0D, 0xE0, 0x44, 0x02, 0x11, 0x12, 0x90, 0x8E, 0x7B, 0xE0, \r
-0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x31, 0x05, 0x90, 0x8E, 0x82, 0xE0, 0x64, \r
-0x0C, 0x60, 0x05, 0x12, 0x4F, 0x83, 0x31, 0xDF, 0x22, 0x90, 0x8D, 0xFA, 0xE0, 0xB4, 0x01, 0x14, \r
-0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x7D, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, \r
-0x80, 0x03, 0x11, 0xB9, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x19, 0x90, 0x8D, 0x08, 0xE0, 0xFF, \r
-0x7B, 0x18, 0xE4, 0xFD, 0x51, 0x39, 0x90, 0x92, 0x48, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, \r
-0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x8E, 0x7B, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
-0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, \r
-0x04, 0xF0, 0xE4, 0x90, 0x92, 0x16, 0xF0, 0x90, 0x8F, 0x14, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, \r
-0x92, 0x17, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x11, 0x27, 0x90, 0x8E, 0x7B, 0xE0, \r
-0x44, 0x08, 0xF0, 0x22, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x12, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, \r
-0x02, 0x80, 0xB2, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xF7, 0xF0, 0x31, 0x5D, 0x22, 0x90, 0x8E, 0x81, \r
-0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x4D, 0xEF, 0x90, 0x8E, 0x7B, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x1A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x7C, 0x30, \r
-0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x31, 0x5D, 0xE4, 0xFF, \r
-0x90, 0x90, 0xE0, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x90, 0xE5, 0xE0, 0xFD, 0x60, 0x40, 0x74, 0x01, \r
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, \r
-0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x90, 0xE5, 0xF0, 0x90, 0x90, 0xE7, \r
-0x04, 0xF0, 0x22, 0x90, 0x90, 0xE2, 0xE0, 0xD3, 0x9D, 0x50, 0x0B, 0x12, 0x66, 0xC6, 0x90, 0x90, \r
-0xE0, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x31, 0xDF, 0x90, 0x90, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x7D, \r
-0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x1E, 0xEF, 0xF0, 0xA3, \r
-0xED, 0xF0, 0x90, 0x8D, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, \r
-0x22, 0xE0, 0x90, 0x92, 0x22, 0xF0, 0x7D, 0x26, 0xF1, 0xE5, 0xEF, 0x64, 0x01, 0x70, 0x02, 0x71, \r
-0x01, 0x90, 0x92, 0x22, 0xE0, 0xFF, 0x7D, 0x27, 0x12, 0x4F, 0x8C, 0x71, 0xF7, 0x80, 0x04, 0x71, \r
-0xF7, 0x71, 0x01, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x90, 0x90, 0xD0, 0xE0, 0xFF, 0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x92, 0x37, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x92, 0x36, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, \r
-0x12, 0x6C, 0x8A, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x92, 0x36, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, \r
-0x92, 0x37, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, \r
-0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x54, 0x01, 0xFE, 0x90, 0x92, 0x38, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, \r
-0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x92, 0x1F, 0xE0, 0xFB, 0x7D, 0x01, 0x51, 0x39, 0x90, \r
-0x92, 0x20, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x92, 0x1E, 0xE0, 0xFF, 0x71, 0xAC, \r
-0x90, 0x92, 0x20, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, \r
-0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, \r
-0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, \r
-0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, \r
-0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, \r
-0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, \r
-0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x92, 0x1E, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x53, 0xEF, 0xF0, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, \r
-0xE0, 0x6F, 0x70, 0x4D, 0x90, 0x8E, 0x82, 0xE0, 0x64, 0x0E, 0x70, 0x19, 0x90, 0x92, 0x53, 0xE0, \r
-0x70, 0x3F, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, \r
-0x12, 0x4D, 0x6F, 0x80, 0x26, 0x90, 0x8E, 0x82, 0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0x92, 0x53, \r
-0xE0, 0x60, 0x1E, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, \r
-0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, 0x82, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4F, \r
-0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0xDC, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
-0xE0, 0x16, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x91, 0xED, 0x12, 0x45, 0x2D, 0xE4, 0x90, \r
-0x91, 0xF0, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x02, 0x21, 0xDF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x91, 0xEA, 0x12, 0x45, 0x2D, 0x78, 0xF6, 0x7C, 0x91, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, \r
-0x40, 0x79, 0x64, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x91, \r
-0xF5, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x09, 0x7D, 0x33, 0xF1, 0xE5, 0xBF, 0x01, 0x0F, 0x80, \r
-0x00, 0x90, 0x90, 0xCE, 0x51, 0x33, 0x90, 0x91, 0xF2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, \r
-0xF2, 0x12, 0x6D, 0x36, 0x90, 0x91, 0xF4, 0xEF, 0xF0, 0x90, 0x91, 0xF2, 0xA3, 0xE0, 0x24, 0x28, \r
-0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x91, 0xF0, 0xE0, 0xFD, 0x12, 0x6D, 0x7C, 0x90, \r
-0x91, 0xF1, 0xE0, 0x60, 0x02, 0xA1, 0x7E, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x91, 0xED, 0x12, 0x45, 0x24, 0x8B, \r
-0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, \r
-0x26, 0x90, 0x91, 0xF2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x91, 0xED, 0x12, 0x45, 0x24, 0x8B, \r
-0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, \r
-0x26, 0x90, 0x91, 0xF2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, \r
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x91, 0xEA, 0x12, 0x45, 0x24, 0x8B, \r
-0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0x80, 0x69, 0x90, 0x91, \r
-0xF1, 0xE0, 0x64, 0x01, 0x70, 0x66, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, \r
-0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x3B, 0x75, 0x43, 0x06, 0xD0, \r
-0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0xF2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x45, \r
-0x75, 0x43, 0x06, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0xF2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, \r
-0x8F, 0x75, 0x42, 0x4B, 0x75, 0x43, 0x04, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x30, 0xE0, \r
-0x44, 0x10, 0xF0, 0x90, 0x91, 0xF5, 0xE0, 0xFF, 0x7D, 0x34, 0x12, 0x4F, 0x8C, 0x90, 0x04, 0x1F, \r
-0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x70, 0x25, \r
-0x90, 0x8E, 0x7C, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x4F, 0x8C, 0x7D, 0x08, \r
-0x7F, 0x01, 0x31, 0xE3, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x7B, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, \r
-0x7F, 0x01, 0x12, 0x4D, 0x73, 0x22, 0x90, 0x8E, 0x7B, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
-0x01, 0x30, 0xE0, 0x20, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x7C, 0x30, \r
-0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x7F, 0xE0, \r
-0x60, 0x02, 0x31, 0x5D, 0x7F, 0x01, 0x21, 0x90, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, \r
-0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, \r
-0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x68, 0xF0, 0x74, 0x56, 0xA3, 0xF0, 0x12, \r
-0x75, 0xC1, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0xD1, 0xEC, 0xE5, 0x21, 0x30, 0xE2, 0x02, 0x31, 0x44, \r
-0xE5, 0x22, 0x30, 0xE0, 0x03, 0x12, 0x76, 0x58, 0xE5, 0x24, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0xF1, \r
-0xC3, 0xE5, 0x24, 0x30, 0xE4, 0x02, 0xD1, 0xF6, 0xE5, 0x24, 0x30, 0xE5, 0x02, 0x31, 0x67, 0xE5, \r
-0x24, 0x30, 0xE6, 0x02, 0xD1, 0x36, 0x74, 0x68, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x56, 0xA3, \r
-0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
-0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, 0x7F, 0xE0, \r
-0x60, 0x03, 0x12, 0x91, 0x61, 0x22, 0xF1, 0x52, 0x90, 0x8E, 0x85, 0xE0, 0x14, 0x90, 0x05, 0x73, \r
-0xF0, 0xF1, 0x39, 0x90, 0x8F, 0x19, 0xE0, 0x30, 0xE0, 0x2E, 0x90, 0x8F, 0x1B, 0xE0, 0x90, 0x05, \r
-0x73, 0xF0, 0x90, 0x8F, 0x1C, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x4D, 0xE1, 0x90, 0x8F, 0x1A, \r
-0xE0, 0x14, 0x90, 0x8F, 0x1C, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0xF1, 0x83, \r
-0xF1, 0x39, 0x7D, 0x01, 0x7F, 0x02, 0xF1, 0x3D, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x15, 0x2F, \r
-0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x2A, 0x90, 0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x70, 0x22, \r
-0x90, 0x8E, 0x86, 0xF0, 0x04, 0x60, 0x1B, 0x90, 0x8E, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, \r
-0x92, 0x16, 0xF0, 0x90, 0x8E, 0x87, 0x11, 0x1B, 0x90, 0x8E, 0x82, 0xE0, 0x20, 0xE2, 0x03, 0x12, \r
-0x4D, 0xEB, 0x22, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x19, 0xE0, 0x54, 0xFE, 0x4E, \r
-0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x63, \r
-0xF2, 0x90, 0x8F, 0x1B, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, \r
-0x12, 0x68, 0x14, 0x12, 0x65, 0x78, 0xE4, 0xFD, 0xFF, 0x12, 0x4F, 0x8C, 0x7D, 0x0C, 0x7F, 0x01, \r
-0x02, 0x4D, 0x73, 0x8F, 0x59, 0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59, \r
-0xF0, 0x22, 0x12, 0x70, 0xFF, 0x7F, 0x02, 0x80, 0xEA, 0x90, 0x8F, 0x1D, 0xE0, 0x30, 0xE0, 0x04, \r
-0x7F, 0x10, 0xF1, 0xC3, 0x22, 0x7F, 0xFF, 0x12, 0x4F, 0x8C, 0xE4, 0x90, 0x92, 0x42, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, \r
-0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x92, 0x43, 0xE0, 0x94, 0xE8, 0x90, 0x92, 0x42, \r
-0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, \r
-0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x92, 0x42, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, \r
-0x80, 0xBF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0x12, 0x48, 0x12, 0xEF, 0x30, \r
-0xE6, 0x21, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, 0x8D, 0x12, 0x48, 0x12, 0x90, 0x00, 0x8E, \r
-0xE0, 0xF5, 0x27, 0x7F, 0x8F, 0x12, 0x48, 0x12, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, \r
-0x12, 0x47, 0xB8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x90, 0xEF, 0xF0, 0x90, 0x90, 0xEF, \r
-0xE0, 0x64, 0x01, 0xF0, 0x24, 0x68, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, \r
-0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x0F, 0x90, 0x8E, 0x82, \r
-0xE0, 0xFF, 0x90, 0x8E, 0x81, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x51, 0x5D, 0xC2, 0xAF, 0x31, 0xB8, \r
-0xBF, 0x01, 0x02, 0x11, 0xB7, 0xD2, 0xAF, 0x90, 0x90, 0xE8, 0xE0, 0xB4, 0x01, 0x02, 0x51, 0x0E, \r
-0x11, 0x32, 0x12, 0x42, 0x7D, 0x80, 0xB6, 0x90, 0x8E, 0x7B, 0xE0, 0x30, 0xE0, 0x02, 0x11, 0xC1, \r
-0x22, 0x90, 0x8E, 0x82, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0x31, 0xE1, 0xBF, 0x01, 0x02, \r
-0x11, 0xD3, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x31, 0x50, 0x11, 0xE3, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x31, 0x99, 0x7F, 0x08, 0x12, 0x48, 0x12, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, \r
-0x12, 0x47, 0xB8, 0xE4, 0xFF, 0x90, 0x92, 0x39, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
-0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x92, 0x39, 0xE0, 0x6F, 0x60, \r
-0x3E, 0xC3, 0x90, 0x92, 0x3B, 0xE0, 0x94, 0x88, 0x90, 0x92, 0x3A, 0xE0, 0x94, 0x13, 0x40, 0x08, \r
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x92, 0x3A, 0xE4, 0x75, 0xF0, 0x01, 0x12, \r
-0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0x92, 0x3B, 0xE0, 0x94, 0x32, \r
-0x90, 0x92, 0x3A, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, \r
-0x90, 0x8E, 0x89, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x47, 0xB8, 0x90, 0x8E, 0x80, 0xE0, 0x60, 0x12, \r
-0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, \r
-0x90, 0xF0, 0x7F, 0x08, 0x12, 0x48, 0x12, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x47, 0xB8, \r
-0x7F, 0x01, 0x11, 0xF5, 0x7F, 0x90, 0x12, 0x48, 0x12, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, \r
-0x47, 0xB8, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x01, 0xC4, 0x74, 0x99, 0xF0, 0x74, \r
-0x59, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x48, 0x12, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x99, 0x04, 0x90, \r
-0x01, 0xC4, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xB8, 0xF0, \r
-0x74, 0x59, 0xA3, 0xF0, 0x90, 0x90, 0xDB, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, \r
-0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, \r
-0x22, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8F, 0x1D, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x02, \r
-0x82, 0xE0, 0x70, 0x17, 0x90, 0x8F, 0x25, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, 0x86, 0xE0, 0x30, \r
-0xE1, 0x09, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0x90, 0xF0, 0x12, \r
-0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0x90, 0xF4, 0x12, 0x08, 0x6D, 0x90, \r
-0x90, 0xF0, 0x12, 0x45, 0x00, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, \r
-0x90, 0x90, 0xF0, 0x12, 0x45, 0x00, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0x90, 0xF0, 0x12, 0x08, \r
-0x6D, 0x90, 0x90, 0xF0, 0x12, 0x45, 0x00, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, \r
-0x08, 0x12, 0x38, 0x45, 0x90, 0x90, 0xF4, 0x12, 0x45, 0x00, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, \r
-0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0x90, 0xF4, 0x12, 0x45, 0x00, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, \r
-0x90, 0x90, 0xF4, 0x12, 0x08, 0x6D, 0x90, 0x90, 0xF4, 0x12, 0x45, 0x00, 0x90, 0xAA, 0xB9, 0x12, \r
-0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0xE8, \r
-0x03, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0x7E, 0x90, 0x90, \r
-0xF8, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xE9, 0xC2, 0xAF, 0x30, 0xE1, \r
-0x06, 0x54, 0xFD, 0xF0, 0x12, 0x6A, 0xAE, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, \r
-0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x73, 0x18, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, \r
-0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x80, 0x1F, 0xBF, 0x01, 0x02, 0x51, 0xF4, \r
-0xD2, 0xAF, 0x80, 0xC1, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x91, 0xBA, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x91, 0xC2, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0xF4, 0xF0, 0x74, 0x5A, 0xA3, 0xF0, 0x90, \r
-0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, \r
-0x91, 0xB1, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x82, 0xE0, 0x90, 0x91, 0xB9, 0xF0, 0x90, 0x8F, \r
-0x1D, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0xD5, 0xE4, 0x90, 0x91, 0xB8, 0xF0, 0x90, 0x91, 0xB9, 0xE0, \r
-0xFF, 0x90, 0x91, 0xB8, 0xE0, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0xD5, 0x90, 0x91, 0xB1, 0xE0, 0xFC, \r
-0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x91, 0xC2, 0xEF, 0xF0, 0x74, 0x01, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x90, \r
-0x91, 0xB3, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0xBE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, \r
-0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFE, 0xEF, \r
-0x24, 0x18, 0x2E, 0xFF, 0x90, 0x91, 0xC3, 0xF0, 0x90, 0x91, 0xB2, 0xE0, 0x2F, 0xFF, 0x90, 0x91, \r
-0xB1, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x91, 0xB5, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0xD1, 0x07, \r
-0xC0, 0x07, 0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x01, 0xD1, 0x07, 0xC0, 0x07, \r
-0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x04, 0xD1, 0x07, 0xAB, 0x07, 0xD0, 0x05, \r
-0xD0, 0x07, 0x12, 0x6D, 0x5C, 0x90, 0x91, 0xBA, 0xEF, 0xF0, 0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, \r
-0xE0, 0xFF, 0xE4, 0xFD, 0xD1, 0x07, 0xEF, 0x54, 0xFC, 0x90, 0x91, 0xB7, 0xF0, 0x90, 0x91, 0xC3, \r
-0xE0, 0xFF, 0x90, 0x91, 0xB3, 0xE4, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x91, 0xB3, 0x12, 0x80, \r
-0x5C, 0x90, 0x91, 0xB3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0xB1, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0x7D, 0x0F, 0xD1, 0x07, 0x90, 0x91, 0xB3, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x91, 0xB1, \r
-0xEC, 0x8D, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, \r
-0x91, 0xB2, 0xE0, 0x9D, 0x90, 0x91, 0xB1, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF8, 0xE0, 0x24, \r
-0x01, 0xFD, 0x90, 0x8D, 0xF7, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x91, 0xB2, 0xE0, 0x9D, 0xF0, \r
-0x90, 0x91, 0xB1, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, \r
-0xEF, 0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, \r
-0xC7, 0x74, 0x23, 0xF0, 0x90, 0x91, 0xB7, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x36, \r
-0x90, 0x8F, 0x20, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, 0xA1, 0x6D, \r
-0x90, 0x8F, 0x32, 0xE0, 0x04, 0xF0, 0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x83, \r
-0x01, 0xEF, 0x70, 0x02, 0xA1, 0x6D, 0x90, 0x91, 0xB7, 0xE0, 0xFF, 0x12, 0x82, 0xEA, 0x90, 0x8F, \r
-0x33, 0xE0, 0x04, 0xF0, 0xA1, 0x6D, 0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x91, \r
-0xBA, 0xE0, 0xFD, 0x90, 0x91, 0xBD, 0xE0, 0xFB, 0x90, 0x91, 0xC2, 0xE0, 0x90, 0x90, 0xFD, 0xF0, \r
-0x12, 0x8E, 0x84, 0xEF, 0x60, 0x06, 0x90, 0x91, 0xC4, 0x74, 0x01, 0xF0, 0x90, 0x8F, 0x1D, 0xE0, \r
-0xC3, 0x13, 0x30, 0xE0, 0x19, 0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x91, 0xBA, \r
-0xE0, 0xFD, 0x12, 0x83, 0x83, 0xEF, 0x60, 0x06, 0x90, 0x91, 0xC4, 0x74, 0x01, 0xF0, 0x90, 0x8F, \r
-0x1D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x10, 0x90, 0x91, 0xB5, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0x90, 0x91, 0xBA, 0xE0, 0xFD, 0x12, 0x85, 0xAD, 0x90, 0x8F, 0x1D, 0xE0, 0xFF, 0xC4, 0x13, \r
-0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x90, 0x91, 0xC4, 0xE0, 0x70, 0x10, 0x90, 0x91, 0xB5, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x91, 0xBA, 0xE0, 0xFD, 0x12, 0x8D, 0x5A, 0x12, 0x8F, 0x45, \r
-0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, 0x01, 0x12, 0x66, \r
-0xCE, 0x12, 0x82, 0xC4, 0xEF, 0x64, 0x01, 0x70, 0x3B, 0x90, 0x8F, 0x34, 0xE0, 0x04, 0xF0, 0x12, \r
-0x81, 0x71, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x24, 0x90, 0x8F, 0x25, 0xE0, 0x44, 0x01, 0xF0, \r
-0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, \r
-0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x66, 0xCE, 0x80, 0x18, 0x90, 0x91, 0xB1, \r
-0xF1, 0xD1, 0x80, 0x09, 0x90, 0x8F, 0x1D, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x91, 0xB8, \r
-0xE0, 0x04, 0xF0, 0x61, 0x4C, 0x74, 0xF4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5A, 0xA3, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0xFB, 0xE0, 0xFD, 0x90, 0x90, 0xFA, 0xE0, 0x2D, 0xFD, \r
-0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, \r
-0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, \r
-0xFA, 0xC3, 0x90, 0x8D, 0xF8, 0xE0, 0x9B, 0x90, 0x8D, 0xF7, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, \r
-0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, \r
-0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
-0xF5, 0x83, 0xE0, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x06, 0x31, 0xE0, \r
-0x54, 0xEF, 0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, 0xEF, 0x24, 0x08, \r
-0xFF, 0xEC, 0x3E, 0x90, 0x91, 0x02, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, \r
-0x7B, 0x01, 0x7A, 0x90, 0x79, 0x31, 0x12, 0x08, 0xAA, 0x90, 0x91, 0x03, 0xE0, 0x24, 0x01, 0xFF, \r
-0x90, 0x91, 0x02, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0xD1, 0x07, 0x90, 0x90, 0x32, 0xEF, 0xF0, \r
-0x90, 0x91, 0x03, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x91, 0x02, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, \r
-0xD1, 0x07, 0x90, 0x90, 0x35, 0xEF, 0xF0, 0x90, 0x91, 0x03, 0xE0, 0x24, 0x05, 0xFF, 0x90, 0x91, \r
-0x02, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0xD1, 0x07, 0x90, 0x90, 0x36, 0xEF, 0xF0, 0x90, 0x91, \r
-0x03, 0xE0, 0x24, 0x06, 0xFF, 0x90, 0x91, 0x02, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0xD1, 0x07, \r
-0x90, 0x90, 0x37, 0xEF, 0xF0, 0x90, 0x91, 0x03, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x91, 0x02, 0xE0, \r
-0x34, 0x00, 0xFE, 0xE4, 0xFD, 0xD1, 0x07, 0x90, 0x90, 0x38, 0xEF, 0xF0, 0x90, 0x91, 0x03, 0xE0, \r
-0x24, 0x08, 0xFF, 0x90, 0x91, 0x02, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0xD1, 0x07, 0x90, 0x90, \r
-0x39, 0xEF, 0xF0, 0xE4, 0x90, 0x91, 0x01, 0xF0, 0x90, 0x91, 0x01, 0xE0, 0xFF, 0xC3, 0x94, 0x08, \r
-0x50, 0x24, 0x90, 0x91, 0x03, 0xE0, 0x24, 0x09, 0xFD, 0x90, 0x91, 0x02, 0xE0, 0xB1, 0xFA, 0x90, \r
-0x91, 0x01, 0xE0, 0x24, 0x3A, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, \r
-0x01, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0xE4, 0x90, 0x91, 0x01, 0xF0, 0x90, 0x91, 0x01, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x20, 0x50, 0x24, 0x90, 0x91, 0x03, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x91, 0x02, 0xE0, \r
-0xB1, 0xFA, 0x90, 0x91, 0x01, 0xE0, 0x24, 0x94, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x90, 0x91, 0x01, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x90, 0x90, 0x36, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFD, 0xED, 0xFF, 0x90, 0x90, 0xFF, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, 0x0D, 0x7F, 0x01, \r
-0x12, 0x66, 0xCE, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x90, 0xFF, 0xA3, 0xE0, \r
-0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, \r
-0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, \r
-0xC4, 0x54, 0x0F, 0x48, 0x90, 0x90, 0xCA, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x7C, \r
-0x07, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0xA3, 0xE0, \r
-0x44, 0x01, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, \r
-0x05, 0xC0, 0x07, 0x7D, 0xE4, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x5F, 0xFF, 0xA3, 0xF0, 0xED, \r
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, \r
-0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, \r
-0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
-0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x15, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x4B, 0x58, 0xE5, \r
-0x14, 0x30, 0xE7, 0x02, 0x11, 0x6C, 0x74, 0x15, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, \r
-0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
-0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, \r
-0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x48, 0x12, 0xEF, 0x20, 0xE6, 0x0E, 0x7F, 0x05, 0x12, 0x48, \r
-0x12, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0x12, 0x47, 0xB8, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, \r
-0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, \r
-0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x8B, 0xF0, 0x74, 0x60, \r
-0xA3, 0xF0, 0x12, 0x75, 0x94, 0xE5, 0x19, 0x30, 0xE3, 0x03, 0x12, 0x57, 0xD9, 0xE5, 0x19, 0x30, \r
-0xE4, 0x03, 0x12, 0x57, 0xD2, 0xE5, 0x19, 0x30, 0xE5, 0x02, 0x91, 0x36, 0xE5, 0x1B, 0x30, 0xE0, \r
-0x02, 0x31, 0x2E, 0xE5, 0x1B, 0x30, 0xE1, 0x02, 0x51, 0x0C, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0x31, \r
-0xB9, 0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x75, 0xF1, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x76, \r
-0x0D, 0xE5, 0x1B, 0x30, 0xE5, 0x03, 0x12, 0x50, 0xC9, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x76, \r
-0x3C, 0xE5, 0x1C, 0x30, 0xE1, 0x02, 0x31, 0xAF, 0x74, 0x8B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
-0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
-0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, \r
-0x58, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x77, 0x90, 0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x70, 0x6F, 0x90, \r
-0x8E, 0x7D, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, \r
-0x8E, 0x86, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x88, 0xE0, 0x60, 0x0E, 0xEF, \r
-0x70, 0x08, 0x90, 0x8E, 0x85, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, 0xE5, 0x58, 0x60, \r
-0x3D, 0x90, 0x8E, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x60, 0x03, 0xB4, 0x01, \r
-0x0B, 0xE4, 0x90, 0x92, 0x16, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x80, 0x0F, 0xE4, 0x90, 0x92, 0x16, \r
-0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x87, 0xE0, \r
-0x2F, 0x12, 0x50, 0x1C, 0x90, 0x8E, 0x82, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x4D, 0xEB, 0x22, 0x90, \r
-0x8E, 0x7F, 0xE0, 0x60, 0x03, 0x12, 0x91, 0x41, 0x22, 0x90, 0x90, 0xE6, 0xE0, 0x04, 0xF0, 0x90, \r
-0x8E, 0x82, 0xE0, 0x64, 0x02, 0x60, 0x22, 0x71, 0x3F, 0x90, 0x8E, 0x7C, 0xE0, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x8E, 0x85, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0x71, \r
-0xE3, 0x31, 0xEA, 0x90, 0x8E, 0x86, 0xE0, 0x14, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x31, 0xF4, \r
-0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, \r
-0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x8E, 0x7F, 0xE0, \r
-0x60, 0x6F, 0x90, 0x8E, 0x7B, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x8E, 0x93, 0xE0, 0x04, 0xF0, 0x90, \r
-0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, \r
-0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0x7C, 0xE0, \r
-0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, \r
-0x31, 0xEA, 0x90, 0x8E, 0x85, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x92, 0x40, 0xE4, 0x75, \r
-0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0x92, 0x41, 0xE0, 0x94, 0x80, 0x90, 0x92, 0x40, 0xE0, \r
-0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, \r
-0xF0, 0xD1, 0x4D, 0x12, 0x7F, 0xDF, 0xE4, 0x90, 0x90, 0xDF, 0xF0, 0x90, 0x8F, 0x19, 0xE0, 0x30, \r
-0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x31, 0xEA, 0x90, 0x8F, 0x1B, 0xE0, 0x90, \r
-0x05, 0x73, 0xF0, 0x22, 0xEF, 0x70, 0x4D, 0x7D, 0x78, 0x7F, 0x02, 0x31, 0xF4, 0x7D, 0x02, 0x7F, \r
-0x03, 0x31, 0xF4, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x68, 0x14, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, \r
-0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8D, 0xFA, 0xE0, 0x70, 0x13, 0xB1, 0x78, 0xF1, 0x40, 0x90, \r
-0x8E, 0x7B, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, \r
-0x7F, 0x0C, 0x12, 0x4D, 0xEF, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, \r
-0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, \r
-0xFF, 0x12, 0x57, 0x3D, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x57, 0x3D, 0x90, 0x06, 0x0A, 0xE0, 0x44, \r
-0x07, 0xF0, 0x90, 0x8E, 0x8A, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xFA, 0xE0, 0xB4, \r
-0x01, 0x15, 0x90, 0x8E, 0x7C, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x82, 0xE0, 0x20, 0xE2, 0x0E, \r
-0x7D, 0x01, 0x7F, 0x04, 0x02, 0x4D, 0xEF, 0x90, 0x8E, 0x7C, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, \r
-0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0xE2, 0x90, 0x8E, 0x7F, 0xE0, 0x70, 0x02, 0x61, \r
-0xE2, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, \r
-0xE0, 0x90, 0x8E, 0x86, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0x8E, 0x85, 0xF0, 0xA3, 0xE0, \r
-0xFF, 0x70, 0x08, 0x90, 0x8E, 0x85, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x8E, \r
-0x86, 0xEF, 0xF0, 0x90, 0x8E, 0x7B, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x76, 0xE6, 0x90, 0x8E, 0x7C, \r
-0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x8E, 0x88, 0xF0, 0x90, 0x8E, 0x8A, 0xA3, 0xE0, 0x90, 0x05, \r
-0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x83, \r
-0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x7D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, \r
-0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0x50, 0x59, 0x90, 0x8E, 0x7C, 0xE0, 0x13, 0x13, 0x13, 0x54, \r
-0x1F, 0x30, 0xE0, 0x0E, 0x90, 0x8E, 0x85, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0x71, 0xE3, \r
-0x31, 0xF0, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, \r
-0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x91, 0x00, 0x12, 0x45, 0x2D, 0xF1, 0x2F, 0x90, \r
-0x8E, 0x7F, 0xE0, 0xFF, 0x51, 0xA4, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x19, 0x90, 0x91, 0x00, 0x12, \r
-0x45, 0x24, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, \r
-0xA2, 0xFD, 0x12, 0x90, 0xCF, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x91, 0xAB, 0xF0, 0xE0, 0xFF, \r
-0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, \r
-0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, \r
-0x12, 0x74, 0xA0, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x47, 0xB8, 0x80, \r
-0xFE, 0x22, 0xEF, 0x60, 0x53, 0x90, 0x90, 0xCD, 0xE0, 0xFF, 0x60, 0x02, 0xB1, 0x33, 0x90, 0x01, \r
-0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, \r
-0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x7D, 0x35, 0x12, 0x4A, 0x55, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0xB1, 0xFC, 0xF1, \r
-0x0A, 0xB1, 0x78, 0xE4, 0xFD, 0xFF, 0x12, 0x4F, 0x8C, 0x12, 0x90, 0x2D, 0x90, 0x01, 0x34, 0x74, \r
-0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x57, 0x3D, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0xF4, 0x90, 0x06, \r
-0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0xB1, 0x52, 0xF1, 0x0B, \r
-0x90, 0x8F, 0x1D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8F, 0x25, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0x90, \r
-0x8F, 0x32, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
-0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0xB1, 0xB0, 0xE4, 0x90, 0x8F, 0x39, 0xF0, 0x22, 0xF1, 0x0C, \r
-0xF1, 0x12, 0x12, 0x4C, 0x3F, 0xF1, 0x20, 0x91, 0xE0, 0x12, 0x7F, 0xC8, 0x12, 0x6E, 0xAC, 0x90, \r
-0x90, 0xE9, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0x22, 0x12, 0x6C, 0x8A, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, \r
-0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE7, 0x02, \r
-0x35, 0x26, 0xB1, 0xB0, 0x12, 0x83, 0x5B, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x06, \r
-0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, \r
-0x90, 0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, \r
-0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0xE4, 0xFF, 0x12, 0x49, 0x49, 0x7F, 0x02, 0x12, \r
-0x48, 0x12, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x47, 0xB8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0x20, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, \r
-0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, \r
-0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x8F, 0x24, 0xE0, 0x54, \r
-0xFE, 0xF0, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x8F, 0x24, 0xE0, 0x54, 0xFD, 0xF0, \r
-0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x47, 0xB8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x81, 0x71, 0xAD, \r
-0x07, 0x90, 0x01, 0xC4, 0x74, 0xFC, 0xF0, 0x74, 0x65, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x21, \r
-0x90, 0x8F, 0x25, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x40, \r
-0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, 0xC1, \r
-0xCE, 0x12, 0x80, 0x8A, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF7, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02, \r
-0xF0, 0x74, 0xFC, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x65, 0xA3, 0xF0, 0x22, 0x90, 0x90, 0xE0, \r
-0xE0, 0x30, 0xE0, 0x71, 0x90, 0x90, 0xE4, 0xE0, 0x04, 0xF0, 0x90, 0x90, 0xE7, 0xE0, 0x64, 0x01, \r
-0x70, 0x26, 0x90, 0x90, 0xE0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1B, 0x90, 0x90, 0xE6, \r
-0xE0, 0x70, 0x15, 0x90, 0x90, 0xE3, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x0A, 0xD1, 0xC6, \r
-0x90, 0x90, 0xE0, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x90, 0xE4, 0xE0, 0xFF, 0x90, 0x90, 0xE1, \r
-0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x90, 0xE6, 0xE0, \r
-0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x51, 0xE3, 0x90, 0x90, 0xE5, 0xE0, 0x04, 0xF0, 0x90, 0x90, \r
-0xDF, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x90, 0xE4, \r
-0xF0, 0x90, 0x90, 0xE6, 0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x90, 0x92, \r
-0x4E, 0xEF, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x1F, 0x90, 0x92, 0x4E, 0xE0, 0xFF, \r
-0x64, 0x01, 0x70, 0x25, 0x90, 0x8F, 0x21, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, \r
-0xE0, 0x14, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, \r
-0xF0, 0x90, 0x92, 0x4E, 0xE0, 0xFF, 0x12, 0x4A, 0x87, 0x22, 0x22, 0x22, 0xE4, 0x90, 0x8D, 0xFA, \r
-0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF5, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5D, 0xF0, 0xA3, 0xF0, 0x22, \r
-0x90, 0x8F, 0x19, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, \r
-0x8E, 0x7B, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x88, 0xF0, 0x90, 0x8E, 0x83, 0xF0, 0x22, \r
-0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4F, 0x8C, 0x7D, 0x0C, 0x7F, \r
-0x01, 0x02, 0x4D, 0x73, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, \r
-0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, \r
-0x50, 0x34, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0xFA, \r
-0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xFA, 0x25, 0x54, 0xF5, \r
-0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70, 0x05, 0x12, 0x74, 0x3E, 0x80, 0x02, \r
-0xF1, 0xD1, 0x05, 0x54, 0x80, 0xC5, 0x12, 0x77, 0xC6, 0x90, 0x8D, 0xFA, 0xE0, 0x70, 0x11, 0xB1, \r
-0x78, 0xF1, 0x40, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, \r
-0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x18, 0xE0, 0x54, 0xFB, \r
-0xF0, 0x22, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, \r
-0xC0, 0x07, 0x7D, 0xE3, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0xED, 0x04, \r
-0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, \r
-0x83, 0xD0, 0xE0, 0x32, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, \r
-0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x92, 0x4B, 0xEF, \r
-0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x92, 0x4B, 0xE0, 0xFE, \r
-0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0x90, 0x91, 0x08, 0x74, 0x12, 0xF0, 0x90, 0x91, 0x16, \r
-0x74, 0x05, 0xF0, 0x90, 0x91, 0x0A, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x91, \r
-0x06, 0xE0, 0x90, 0x91, 0x0D, 0xF0, 0x90, 0x91, 0x07, 0xE0, 0x90, 0x91, 0x0E, 0xF0, 0x7B, 0x01, \r
-0x7A, 0x91, 0x79, 0x08, 0x11, 0x7A, 0x7F, 0x04, 0x80, 0xB2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0x8D, 0xF5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, \r
-0xFF, 0x90, 0x8D, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, \r
-0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0x8D, 0xF6, 0xE0, \r
-0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5F, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, \r
-0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF6, 0xE0, 0x04, 0xF0, 0xE0, \r
-0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFD, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, \r
-0xC1, 0xBF, 0x01, 0x06, 0x90, 0x90, 0xFD, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFD, \r
-0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x90, 0xFD, 0xE0, 0x90, 0x90, \r
-0xFF, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFD, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, \r
-0x01, 0x08, 0x90, 0x90, 0xFD, 0xE0, 0x90, 0x91, 0x00, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFD, \r
-0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x90, 0xFD, 0xE0, 0x90, 0x91, \r
-0x01, 0xF0, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFD, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, \r
-0x01, 0x08, 0x90, 0x90, 0xFD, 0xE0, 0x90, 0x91, 0x02, 0xF0, 0x90, 0x90, 0xFE, 0xE0, 0xFF, 0xA3, \r
-0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x91, 0x06, 0xF0, 0x90, 0x91, 0x02, 0xE0, 0x90, \r
-0x91, 0x07, 0xF0, 0x01, 0x47, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8D, 0xF9, 0xF0, 0xBF, 0x01, 0x07, \r
-0x11, 0xE4, 0xE4, 0x90, 0x8D, 0xF9, 0xF0, 0x22, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x2D, 0x90, 0x90, \r
-0xF9, 0xEF, 0xF0, 0x12, 0x45, 0x36, 0x69, 0xCD, 0x00, 0x69, 0xD5, 0x01, 0x69, 0xDE, 0x02, 0x69, \r
-0xE6, 0x03, 0x69, 0xEE, 0x04, 0x69, 0xF6, 0x12, 0x69, 0xFE, 0x14, 0x6A, 0x06, 0x20, 0x6A, 0x0F, \r
-0x21, 0x6A, 0x17, 0x23, 0x6A, 0x1F, 0x25, 0x6A, 0x27, 0x27, 0x6A, 0x37, 0x80, 0x6A, 0x2F, 0x81, \r
-0x6A, 0x40, 0x82, 0x6A, 0x48, 0x83, 0x6A, 0x51, 0x84, 0x00, 0x00, 0x6A, 0x5A, 0x90, 0x90, 0xFA, \r
-0x12, 0x45, 0x24, 0xE1, 0xD7, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0x02, 0x67, 0x54, 0x90, 0x90, \r
-0xFA, 0x12, 0x45, 0x24, 0xE1, 0x35, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0xC1, 0xD5, 0x90, 0x90, \r
-0xFA, 0x12, 0x45, 0x24, 0x80, 0x74, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0x21, 0x75, 0x90, 0x90, \r
-0xFA, 0x12, 0x45, 0x24, 0xC1, 0x73, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0x02, 0x70, 0x23, 0x90, \r
-0x90, 0xFA, 0x12, 0x45, 0x24, 0xE1, 0x78, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0xC1, 0x6B, 0x90, \r
-0x90, 0xFA, 0x12, 0x45, 0x24, 0xC1, 0x82, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0xE1, 0x01, 0x90, \r
-0x90, 0xFA, 0x12, 0x45, 0x24, 0x61, 0x12, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0x02, 0x81, 0x87, \r
-0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0xC1, 0x92, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0x02, 0x8F, \r
-0x69, 0x90, 0x90, 0xFA, 0x12, 0x45, 0x24, 0x02, 0x8F, 0xCB, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, \r
-0xF0, 0x90, 0x90, 0xF9, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0xD1, 0xAC, 0x12, 0x06, 0x89, 0xFF, \r
-0x54, 0x01, 0xFE, 0x90, 0x90, 0xE0, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, \r
-0x2C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xE1, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, \r
-0xA2, 0x90, 0x90, 0xE2, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x04, 0xFF, 0x90, 0x90, 0xE0, 0xE0, 0x54, \r
-0xFB, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xE3, 0xF0, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x90, 0x8D, 0x5D, 0xE0, 0xB5, 0x07, \r
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90, 0x8D, 0x5D, 0xE0, 0xFE, 0x75, \r
-0xF0, 0x08, 0x90, 0x8D, 0x0D, 0x12, 0x45, 0x18, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, \r
-0x0E, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x31, 0x88, 0x90, 0x8D, 0x5D, \r
-0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, \r
-0x8D, 0x5D, 0xF0, 0x12, 0x70, 0xFF, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, \r
-0x90, 0x8F, 0x1D, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, \r
-0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, \r
-0x8F, 0x1D, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, \r
-0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x8F, 0x1D, 0xF0, 0xEE, 0x54, 0x20, \r
-0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, \r
-0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x1D, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFF, 0x90, 0x8F, 0x1F, 0xE0, 0x54, 0xFE, 0x4F, \r
-0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, \r
-0x3E, 0x90, 0x8D, 0xF7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x8F, 0xE0, 0x54, 0x01, 0x90, 0x8F, \r
-0x39, 0xF0, 0x90, 0x04, 0x8F, 0xE0, 0x54, 0x10, 0x90, 0x8F, 0x3A, 0xF0, 0x90, 0x8F, 0x1D, 0xE0, \r
-0xC3, 0x13, 0x54, 0x01, 0xFF, 0x71, 0xF7, 0x90, 0x8F, 0x1D, 0xE0, 0x13, 0x13, 0x54, 0x01, 0xFF, \r
-0x91, 0x02, 0x90, 0x8F, 0x1D, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x91, 0x2B, 0x90, 0x8F, \r
-0x1D, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0xD1, 0x65, 0x90, 0x8F, 0x1D, 0xE0, 0x54, 0x01, 0xFF, 0x12, \r
-0x64, 0x72, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x90, 0xCE, 0xE0, 0xFF, 0x91, \r
-0x9E, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x90, 0xD3, 0xE0, 0xFF, 0x91, 0x0D, 0x22, 0x91, 0x8A, 0x7E, \r
-0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, \r
-0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x4F, 0x02, 0x35, 0x26, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, \r
-0x58, 0x90, 0x90, 0xD1, 0xE0, 0xFF, 0x91, 0x8A, 0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x2D, 0x90, 0x90, 0xFD, 0x12, \r
-0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, 0x8F, 0x79, \r
-0xF1, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, 0x90, 0xD2, 0xE0, 0x75, \r
-0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, \r
-0x39, 0xD6, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, \r
-0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x91, 0x8A, \r
-0x90, 0x90, 0xFD, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0xFD, 0xB1, 0x36, 0x90, 0x90, 0xFF, \r
-0xEF, 0xF0, 0x90, 0x90, 0xFD, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, \r
-0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x3B, 0x12, 0x35, 0x26, \r
-0x90, 0x90, 0xFD, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0x75, \r
-0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x41, 0x12, \r
-0x35, 0x26, 0x90, 0x90, 0xFD, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, \r
-0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, 0x79, \r
-0x45, 0x12, 0x35, 0x26, 0x90, 0x90, 0xFD, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, \r
-0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, \r
-0x8F, 0x79, 0x4B, 0x02, 0x35, 0x26, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xE8, 0x8F, 0xF0, \r
+0xA4, 0xCC, 0x8B, 0xF0, 0xA4, 0x2C, 0xFC, 0xE9, 0x8E, 0xF0, 0xA4, 0x2C, 0xFC, 0x8A, 0xF0, 0xED, \r
+0xA4, 0x2C, 0xFC, 0xEA, 0x8E, 0xF0, 0xA4, 0xCD, 0xA8, 0xF0, 0x8B, 0xF0, 0xA4, 0x2D, 0xCC, 0x38, \r
+0x25, 0xF0, 0xFD, 0xE9, 0x8F, 0xF0, 0xA4, 0x2C, 0xCD, 0x35, 0xF0, 0xFC, 0xEB, 0x8E, 0xF0, 0xA4, \r
+0xFE, 0xA9, 0xF0, 0xEB, 0x8F, 0xF0, 0xA4, 0xCF, 0xC5, 0xF0, 0x2E, 0xCD, 0x39, 0xFE, 0xE4, 0x3C, \r
+0xFC, 0xEA, 0xA4, 0x2D, 0xCE, 0x35, 0xF0, 0xFD, 0xE4, 0x3C, 0xFC, 0x22, 0x75, 0xF0, 0x08, 0x75, \r
+0x82, 0x00, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xCD, 0x33, 0xCD, 0xCC, 0x33, 0xCC, 0xC5, 0x82, \r
+0x33, 0xC5, 0x82, 0x9B, 0xED, 0x9A, 0xEC, 0x99, 0xE5, 0x82, 0x98, 0x40, 0x0C, 0xF5, 0x82, 0xEE, \r
+0x9B, 0xFE, 0xED, 0x9A, 0xFD, 0xEC, 0x99, 0xFC, 0x0F, 0xD5, 0xF0, 0xD6, 0xE4, 0xCE, 0xFB, 0xE4, \r
+0xCD, 0xFA, 0xE4, 0xCC, 0xF9, 0xA8, 0x82, 0x22, 0xB8, 0x00, 0xC1, 0xB9, 0x00, 0x59, 0xBA, 0x00, \r
+0x2D, 0xEC, 0x8B, 0xF0, 0x84, 0xCF, 0xCE, 0xCD, 0xFC, 0xE5, 0xF0, 0xCB, 0xF9, 0x78, 0x18, 0xEF, \r
+0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xEB, 0x33, 0xFB, 0x10, 0xD7, \r
+0x03, 0x99, 0x40, 0x04, 0xEB, 0x99, 0xFB, 0x0F, 0xD8, 0xE5, 0xE4, 0xF9, 0xFA, 0x22, 0x78, 0x18, \r
+0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xC9, 0x33, 0xC9, 0x10, \r
+0xD7, 0x05, 0x9B, 0xE9, 0x9A, 0x40, 0x07, 0xEC, 0x9B, 0xFC, 0xE9, 0x9A, 0xF9, 0x0F, 0xD8, 0xE0, \r
+0xE4, 0xC9, 0xFA, 0xE4, 0xCC, 0xFB, 0x22, 0x75, 0xF0, 0x10, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, \r
+0xED, 0x33, 0xFD, 0xCC, 0x33, 0xCC, 0xC8, 0x33, 0xC8, 0x10, 0xD7, 0x07, 0x9B, 0xEC, 0x9A, 0xE8, \r
+0x99, 0x40, 0x0A, 0xED, 0x9B, 0xFD, 0xEC, 0x9A, 0xFC, 0xE8, 0x99, 0xF8, 0x0F, 0xD5, 0xF0, 0xDA, \r
+0xE4, 0xCD, 0xFB, 0xE4, 0xCC, 0xFA, 0xE4, 0xC8, 0xF9, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, \r
+0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, \r
+0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, \r
+0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
+0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, \r
+0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, \r
+0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, \r
+0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, \r
+0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, \r
+0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, 0xF5, \r
+0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, 0x08, \r
+0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, 0xDF, \r
+0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, 0xDF, \r
+0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x25, \r
+0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, \r
+0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, 0xA3, \r
+0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x45, 0x70, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, 0xD4, \r
+0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, 0xA3, \r
+0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x45, 0x7C, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, \r
+0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, \r
+0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, 0x70, \r
+0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, 0xF4, \r
+0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, 0xDF, \r
+0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x40, \r
+0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, \r
+0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, \r
+0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, \r
+0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0x00, \r
+0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, 0x83, \r
+0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, \r
+0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, 0x80, \r
+0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, \r
+0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, \r
+0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB, \r
+0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, \r
+0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x44, 0xB8, 0x73, 0xC2, 0xAF, 0x80, 0xFE, 0x32, \r
+0x12, 0x45, 0xEF, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24, \r
+0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6, \r
+0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78, \r
+0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2, \r
+0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F, \r
+0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C, \r
+0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08, \r
+0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6, \r
+0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6, \r
+0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60, \r
+0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80, \r
+0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10, \r
+0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C, \r
+0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06, \r
+0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF, \r
+0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x49, 0x33, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0, \r
+0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02, \r
+0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20, \r
+0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50, \r
+0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF, \r
+0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16, \r
+0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22, \r
+0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06, \r
+0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E, \r
+0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x49, 0x33, 0x93, \r
+0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, \r
+0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C, \r
+0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02, \r
+0x46, 0x38, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, \r
+0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7, \r
+0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F, \r
+0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8, \r
+0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08, \r
+0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F, \r
+0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, \r
+0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF, \r
+0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x37, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, \r
+0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6, \r
+0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, 0x08, \r
+0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, \r
+0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0x02, \r
+0x46, 0x38, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0x54, \r
+0x80, 0x4F, 0xFF, 0x22, 0x02, 0x48, 0xD2, 0x02, 0x46, 0xC8, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, \r
+0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, \r
+0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, \r
+0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, \r
+0x40, 0x80, 0x90, 0x49, 0x17, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, \r
+0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, \r
+0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, \r
+0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, \r
+0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x95, 0x7B, 0x00, 0x41, 0x95, 0x7C, 0x00, \r
+0x41, 0x95, 0x8E, 0x00, 0x41, 0x94, 0xD0, 0x00, 0x41, 0x94, 0xB2, 0x00, 0x44, 0x95, 0x6E, 0x00, \r
+0x50, 0xF2, 0x01, 0x4C, 0x9B, 0x58, 0x40, 0x5F, 0xF4, 0x7F, 0x02, 0x51, 0xE7, 0xEF, 0x44, 0x01, \r
+0xFD, 0x7F, 0x02, 0x31, 0x4F, 0x7F, 0x02, 0x51, 0xE7, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, \r
+0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x95, 0x56, 0xEF, 0xF0, 0x90, 0x95, 0x58, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x41, 0x54, 0x90, \r
+0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0x95, 0x58, \r
+0xE0, 0x70, 0x47, 0x7F, 0x67, 0x51, 0xE7, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x31, 0x4F, 0x90, \r
+0x95, 0x56, 0xE0, 0x70, 0x2C, 0x90, 0x95, 0x59, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0F, 0x12, \r
+0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0x51, 0xD7, 0xEF, 0x54, 0xFE, 0x80, 0x0E, 0x12, 0x37, \r
+0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0x51, 0xD7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x31, \r
+0x4F, 0x7F, 0x4E, 0x51, 0xE7, 0xEF, 0x44, 0x80, 0x41, 0xC1, 0x7F, 0x67, 0x51, 0xE7, 0xEF, 0x44, \r
+0x20, 0xFD, 0x7F, 0x67, 0x31, 0x4F, 0x90, 0x95, 0x56, 0xE0, 0x70, 0x18, 0x7F, 0x48, 0x7E, 0x09, \r
+0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, \r
+0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0xE7, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x31, 0x4F, \r
+0x7F, 0x4F, 0x51, 0xE7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x31, 0x4F, 0x7F, 0x30, 0x7E, 0x09, \r
+0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, \r
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, \r
+0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
+0x38, 0x45, 0x80, 0x7E, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, \r
+0x18, 0xF0, 0x90, 0x95, 0x56, 0xE0, 0x70, 0x52, 0x90, 0x95, 0x58, 0xE0, 0x60, 0x17, 0x7F, 0x67, \r
+0x51, 0xE7, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x31, 0x4F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, \r
+0x4E, 0xE4, 0xFF, 0x80, 0x26, 0x7F, 0x67, 0x51, 0xE7, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0x31, \r
+0x4F, 0x90, 0x95, 0x59, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, \r
+0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, \r
+0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0xE7, 0xEF, 0x54, \r
+0x7F, 0xFD, 0x7F, 0x4E, 0x31, 0x4F, 0x7F, 0x4F, 0x51, 0xE7, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, \r
+0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, \r
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, \r
+0x75, 0x83, 0x00, 0xE0, 0x90, 0x95, 0x89, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, \r
+0x95, 0x89, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF, \r
+0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x01, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x95, 0x84, 0xED, 0xF0, 0x90, 0x95, 0x83, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6D, \r
+0x7F, 0x47, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, \r
+0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x31, 0x4F, 0x7F, 0x46, 0x51, 0xE7, 0x90, \r
+0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, \r
+0xFD, 0x7F, 0x46, 0x31, 0x4F, 0x90, 0x95, 0x84, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0x51, 0xE7, 0x90, \r
+0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, \r
+0x80, 0x16, 0x7F, 0x45, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, \r
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90, 0x95, 0x83, \r
+0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, \r
+0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0x4F, 0x7F, \r
+0x62, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x31, 0x4F, 0x90, 0x95, 0x84, 0xE0, 0x60, 0x1A, 0x7F, \r
+0x61, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0x51, 0xE7, 0x90, 0x95, 0x83, \r
+0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, \r
+0x7F, 0x61, 0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x12, 0x52, 0xA5, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0x4B, 0xE0, 0xFF, 0x90, 0x8F, 0x4A, 0xE0, 0xFB, 0x90, \r
+0x8F, 0x4C, 0xE0, 0x90, 0x95, 0x59, 0xF0, 0x7D, 0x01, 0x31, 0x69, 0x12, 0x57, 0xF8, 0x31, 0x45, \r
+0x31, 0x39, 0x31, 0x39, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, \r
+0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x51, 0xE7, 0xE5, \r
+0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0xE7, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x51, \r
+0xE7, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0xE7, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, \r
+0x11, 0x7F, 0x54, 0x31, 0x4F, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0x4F, 0xAD, 0x13, 0x7F, 0x56, 0x31, \r
+0x4F, 0xAD, 0x14, 0x7F, 0x57, 0x31, 0x4F, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x51, 0xE7, 0xEF, \r
+0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x31, 0x4F, 0x7F, 0x80, 0x51, 0xE7, 0xEF, 0x44, 0x80, 0xFD, 0x7F, \r
+0x80, 0x31, 0x4F, 0x12, 0x7A, 0x52, 0x12, 0x3E, 0x11, 0xF1, 0xF2, 0x12, 0x7A, 0xAD, 0x7F, 0x01, \r
+0x12, 0x47, 0x00, 0x90, 0x93, 0x88, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x00, 0x90, 0x93, 0x88, \r
+0xE0, 0x04, 0xF0, 0xB1, 0x06, 0x12, 0x72, 0xE4, 0x7F, 0x80, 0x51, 0xE7, 0xEF, 0x44, 0x40, 0xFD, \r
+0x7F, 0x80, 0x31, 0x4F, 0x75, 0x28, 0xFF, 0xF1, 0xF5, 0x12, 0x7A, 0x7D, 0x12, 0x80, 0x0B, 0x7F, \r
+0x81, 0x51, 0xE7, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0x4F, 0x12, 0x7A, 0xBB, 0x12, 0x88, \r
+0xAB, 0xE4, 0xFF, 0x02, 0x47, 0x89, 0xF1, 0x1C, 0x90, 0x8D, 0x06, 0xEF, 0xF0, 0xD1, 0xB1, 0x90, \r
+0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x51, 0xE7, \r
+0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x31, 0x4F, 0x7F, 0x16, 0x51, 0xE7, 0xEF, 0x54, \r
+0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x31, 0x4F, 0x7F, 0x38, 0x51, 0xE7, 0xEF, 0x44, 0x40, 0xFD, \r
+0x7F, 0x38, 0x31, 0x4F, 0x02, 0x37, 0x99, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, \r
+0x8E, 0xE0, 0xFD, 0x7F, 0x93, 0x31, 0x4F, 0x90, 0x8E, 0x85, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, \r
+0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, \r
+0x08, 0x51, 0xE7, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x31, 0x4F, 0x7F, 0x01, 0xF1, 0xFC, 0x7F, \r
+0x90, 0x51, 0xE7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x31, 0x4F, 0x7F, 0x14, 0x7E, 0x00, 0x02, \r
+0x3E, 0x50, 0xAD, 0x07, 0x90, 0x8F, 0x33, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x95, 0x6A, \r
+0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x8F, 0x34, 0xE0, 0xC3, 0x13, 0x54, \r
+0x7F, 0x90, 0x95, 0x6D, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x62, 0x90, 0x95, 0x6A, 0xE0, \r
+0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x95, 0x6A, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08, \r
+0xD6, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, \r
+0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x71, 0x1A, 0x71, 0x09, 0x90, 0x8F, 0x34, 0xE0, \r
+0x30, 0xE0, 0x6F, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x90, 0x8F, \r
+0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, \r
+0x20, 0xE0, 0x02, 0x7D, 0x01, 0x71, 0x1A, 0xE4, 0x90, 0x95, 0x6C, 0xF0, 0x90, 0x95, 0x6D, 0xE0, \r
+0xFF, 0x90, 0x95, 0x6C, 0xE0, 0xC3, 0x9F, 0x50, 0x39, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0x12, 0x3E, 0x50, 0x71, 0x09, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, \r
+0x50, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, \r
+0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x71, 0x1A, 0x90, 0x95, 0x6C, 0xE0, 0x04, 0xF0, \r
+0x80, 0xBA, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, \r
+0x50, 0x31, 0x4F, 0xAD, 0x0E, 0x7F, 0x51, 0x31, 0x4F, 0xAD, 0x0F, 0x7F, 0x52, 0x31, 0x4F, 0xAD, \r
+0x10, 0x7F, 0x53, 0x21, 0x4F, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
+0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x31, 0x4F, 0xE4, \r
+0xFD, 0x7F, 0x51, 0x31, 0x4F, 0xE4, 0xFD, 0x7F, 0x52, 0x31, 0x4F, 0xE4, 0xFD, 0x7F, 0x53, 0x21, \r
+0x4F, 0xD1, 0x85, 0xD1, 0xBD, 0x12, 0x7A, 0x14, 0x12, 0x7A, 0x33, 0x80, 0xA6, 0x90, 0x01, 0x34, \r
+0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x31, 0x4F, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x4F, 0x7D, 0xFF, \r
+0x7F, 0x56, 0x31, 0x4F, 0x7D, 0xFF, 0x7F, 0x57, 0x21, 0x4F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x7F, 0x8F, 0x51, 0xE7, 0xEF, 0x30, 0xE6, 0x1E, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, \r
+0x8D, 0x51, 0xE7, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x27, 0x7F, 0x8F, 0x51, 0xE7, 0xEF, 0x30, 0xE0, \r
+0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xF4, 0x51, 0xE7, \r
+0xEF, 0x20, 0xE5, 0x0D, 0x7F, 0xF4, 0x51, 0xE7, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, \r
+0x22, 0x7F, 0x03, 0x22, 0xF1, 0xD4, 0x7F, 0x08, 0x51, 0xE7, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, \r
+0x31, 0x4F, 0xE4, 0xFF, 0xF1, 0xFC, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7F, 0x01, \r
+0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x51, 0xE7, 0xEF, 0x20, 0xE6, 0x0C, 0x7F, 0x05, 0x51, \r
+0xE7, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0x31, 0x4F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, \r
+0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x90, 0x8F, 0x4B, 0xE0, 0xFF, 0x90, \r
+0x8F, 0x4A, 0xE0, 0xFB, 0x90, 0x8F, 0x4C, 0xE0, 0x90, 0x95, 0x59, 0xF0, 0xE4, 0xFD, 0x31, 0x69, \r
+0x7F, 0x02, 0x51, 0xE7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xB1, 0x47, 0xF1, 0x34, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x90, 0x8E, 0x87, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0x9E, 0x3A, 0xBF, 0x01, \r
+0x02, 0xF1, 0xB1, 0x22, 0x90, 0x01, 0xC4, 0x74, 0xD4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x7F, 0x90, \r
+0x51, 0xE7, 0xEF, 0x20, 0xE0, 0xF8, 0x74, 0xD4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3, \r
+0xF0, 0x22, 0x22, 0xC1, 0xEA, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x90, 0x95, 0x78, 0xEF, \r
+0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, \r
+0x01, 0x90, 0x95, 0x78, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0x95, 0x7A, 0xE0, 0x94, 0x88, 0x90, \r
+0x95, 0x79, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, \r
+0x95, 0x79, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, \r
+0xD3, 0x90, 0x95, 0x7A, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x79, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, \r
+0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8F, 0x24, \r
+0xE0, 0x90, 0x95, 0x44, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x43, 0xE0, 0xF5, \r
+0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0x95, 0x3F, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, \r
+0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E, \r
+0x84, 0xE0, 0x60, 0x29, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0x8E, 0x8B, 0xF0, \r
+0x04, 0x60, 0x1A, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, \r
+0x8E, 0x8C, 0x11, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x02, 0x11, 0xCE, 0x22, 0x7D, 0x01, \r
+0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x91, 0xED, 0xF0, 0x90, 0x8E, \r
+0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0x19, 0xEE, 0xC4, 0x13, \r
+0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0x19, 0x90, 0x8E, 0x87, 0xE0, 0xFE, 0x6F, 0x70, \r
+0x02, 0x41, 0x19, 0xEF, 0x70, 0x02, 0x21, 0x91, 0x24, 0xFE, 0x70, 0x02, 0x21, 0xCA, 0x24, 0xFE, \r
+0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x04, 0x24, 0xFC, 0x60, 0x02, 0x41, 0x19, 0xEE, 0xB4, \r
+0x0E, 0x02, 0x51, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x83, 0x90, 0x8E, \r
+0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x3F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0x95, \r
+0x91, 0xE0, 0xFF, 0x60, 0x04, 0x91, 0x69, 0x80, 0x02, 0xD1, 0x17, 0x90, 0x8E, 0x87, 0xE0, 0x64, \r
+0x08, 0x60, 0x02, 0x41, 0x19, 0xD1, 0x09, 0x41, 0x19, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, \r
+0x01, 0x51, 0x83, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x3F, 0x90, 0x8E, 0x87, 0xE0, \r
+0xB4, 0x0E, 0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0C, \r
+0x60, 0x02, 0x41, 0x19, 0x51, 0x1E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x19, 0x51, 0xB0, 0x41, \r
+0x19, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0x60, 0x90, \r
+0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x3F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x07, 0x51, \r
+0x1E, 0xBF, 0x01, 0x02, 0x51, 0xB0, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x04, 0x70, 0x5B, 0x12, 0x9D, \r
+0xB9, 0xEF, 0x64, 0x01, 0x70, 0x53, 0x91, 0x34, 0x80, 0x4F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E, \r
+0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, \r
+0x3F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0xB0, 0x90, \r
+0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x83, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x04, 0x19, \r
+0xB1, 0xFD, 0x80, 0x15, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x8E, 0x81, 0xE0, 0xFF, \r
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xB1, 0xF2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9D, \r
+0xA0, 0xBF, 0x01, 0x18, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0C, \r
+0x90, 0x8E, 0x86, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, \r
+0x8E, 0x81, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80, \r
+0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xE8, 0xE4, 0xFD, 0xFF, 0x80, 0x45, \r
+0x90, 0x8E, 0x81, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x7D, 0x0C, 0x80, 0x0D, 0x90, 0x06, 0x04, \r
+0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x51, 0xE8, 0xE4, 0xFD, \r
+0xFF, 0x80, 0x22, 0x90, 0x95, 0x90, 0xEF, 0xF0, 0x12, 0x4F, 0x6A, 0x90, 0x95, 0x90, 0xE0, 0x60, \r
+0x05, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0x7D, 0x04, 0x7F, 0x01, 0x80, 0x4C, 0xE4, 0xFD, 0x7F, 0x0C, \r
+0x11, 0xD2, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x8D, 0x05, 0xED, 0xF0, 0x22, \r
+0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x23, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, \r
+0x2C, 0x7F, 0x6F, 0x51, 0xA5, 0x7D, 0x08, 0x7F, 0x01, 0x91, 0x9F, 0xBF, 0x01, 0x0D, 0x90, 0x8E, \r
+0x80, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x51, 0xE8, 0x22, 0x90, 0x8E, 0x86, 0xE0, \r
+0x90, 0x94, 0xCC, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x95, 0x8F, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, \r
+0x01, 0xFF, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x87, 0xED, \r
+0xF0, 0x80, 0x05, 0x90, 0x8E, 0x86, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x4A, 0xE7, 0xEF, 0x30, 0xE4, \r
+0x31, 0x90, 0x95, 0x8F, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, \r
+0x8E, 0x80, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x87, 0xE0, \r
+0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x8E, 0x86, 0xE0, 0xFD, 0x7F, 0x89, 0x12, \r
+0x49, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
+0x8E, 0x79, 0x80, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, \r
+0x79, 0x2A, 0x12, 0x08, 0xAA, 0x90, 0x8E, 0x83, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8A, 0x14, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x8E, 0x8F, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, \r
+0x8E, 0xBB, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x99, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xFD, 0xFF, \r
+0x51, 0xE8, 0x7D, 0x0C, 0x7F, 0x02, 0x51, 0xE8, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xE8, 0x90, 0x8D, \r
+0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x8E, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, \r
+0x8E, 0x8E, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, \r
+0x4A, 0xE7, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x4A, 0xE7, 0xEF, 0x30, \r
+0xE2, 0x06, 0x90, 0x8E, 0xBB, 0x74, 0x02, 0xF0, 0x90, 0x8F, 0x23, 0x74, 0x05, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0xBB, 0xE0, 0x24, \r
+0x04, 0x90, 0x8E, 0x99, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x12, 0x6C, 0x7B, 0x7E, 0x00, 0x7F, 0x02, \r
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x27, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, \r
+0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0xE4, 0x90, \r
+0x8F, 0x29, 0xF0, 0x22, 0x7D, 0x2D, 0xF1, 0xF4, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, \r
+0x03, 0xF1, 0xD6, 0x12, 0x4C, 0x1E, 0xE4, 0xFD, 0x7F, 0x01, 0x41, 0xE8, 0x90, 0x8E, 0x84, 0xE0, \r
+0x64, 0x01, 0x70, 0x14, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0x0F, 0x60, 0x04, 0x51, 0x9C, 0xC1, 0x29, \r
+0x90, 0x8E, 0x87, 0xE0, 0x70, 0x02, 0x11, 0xCE, 0x22, 0xEF, 0x60, 0x2E, 0x90, 0x8D, 0xFF, 0xE0, \r
+0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x51, \r
+0xA5, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x91, 0x9B, 0xBF, 0x01, 0x0D, 0x90, 0x8E, 0x80, \r
+0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x51, 0xE8, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x51, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D, \r
+0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, \r
+0x55, 0xF0, 0x7D, 0x26, 0xF1, 0xF4, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x9E, 0x8A, 0x90, 0x95, \r
+0x55, 0xE0, 0xFF, 0x7D, 0x27, 0x51, 0xA5, 0x91, 0xED, 0x80, 0x05, 0x91, 0xED, 0x12, 0x9E, 0x8A, \r
+0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x51, \r
+0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x93, 0xEF, 0xF0, 0x90, 0x8D, \r
+0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x4F, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0E, \r
+0x70, 0x1C, 0x90, 0x95, 0x93, 0xE0, 0x70, 0x41, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0x7F, 0xF0, 0x90, \r
+0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xE8, 0x80, 0x26, 0x90, 0x8E, \r
+0x87, 0xE0, 0x64, 0x06, 0x70, 0x23, 0x90, 0x95, 0x93, 0xE0, 0x60, 0x1D, 0x90, 0x8E, 0x80, 0xE0, \r
+0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, \r
+0x87, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x29, \r
+0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0x51, 0x9C, 0x91, 0x9B, 0x22, 0xE4, 0x90, 0x93, \r
+0xA8, 0xF0, 0x90, 0x94, 0xD0, 0x04, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, \r
+0x73, 0x12, 0x43, 0xE5, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, \r
+0xFC, 0x90, 0x93, 0x73, 0x12, 0x08, 0x6D, 0x12, 0x85, 0xBF, 0xE4, 0x90, 0x94, 0xB4, 0xF0, 0xFF, \r
+0x12, 0x86, 0xDB, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x7D, 0x01, 0x7F, 0x02, 0x11, \r
+0xD2, 0x7F, 0x05, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x51, 0xDC, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x02, \r
+0x60, 0x1C, 0x90, 0x93, 0xA8, 0xE0, 0x04, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7D, \r
+0x01, 0x7F, 0x02, 0x11, 0xD2, 0x90, 0x93, 0xA8, 0xE0, 0xD3, 0x94, 0x0A, 0x40, 0xDC, 0x90, 0x95, \r
+0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0A, 0xE4, 0x90, 0x95, 0x4A, 0xF0, 0x7F, 0x04, 0x02, \r
+0x80, 0x35, 0x7D, 0x2F, 0x12, 0x4C, 0x19, 0x7D, 0x08, 0x7F, 0x01, 0x41, 0xE8, 0x7D, 0x2E, 0x7F, \r
+0x6F, 0x51, 0xA5, 0x7D, 0x02, 0x7F, 0x01, 0x41, 0xE8, 0x12, 0x4F, 0x6A, 0xE4, 0xFD, 0xFF, 0x51, \r
+0xA5, 0x7D, 0x0C, 0x7F, 0x01, 0x41, 0xE8, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, \r
+0xFF, 0x51, 0xA5, 0x7D, 0x0C, 0x7F, 0x01, 0x41, 0xE8, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, \r
+0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8F, 0x25, 0xE0, 0xC3, \r
+0x13, 0x54, 0x7F, 0x90, 0x95, 0x44, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x11, 0x6C, \r
+0x90, 0x8E, 0x80, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0x93, 0xB8, 0xEF, 0xF0, 0x7D, 0x38, 0x7F, 0xFF, 0x51, 0xA5, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1A, \r
+0x90, 0x06, 0x32, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0xB8, 0xD1, 0xA8, 0x90, 0x93, 0xB9, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7D, 0x38, 0xE4, 0xFF, 0x51, 0xA5, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x7C, 0xE0, 0xFF, 0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x76, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x75, \r
+0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x74, 0xC7, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x95, 0x75, 0xE0, \r
+0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x76, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40, \r
+0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x95, 0x77, 0xE0, 0x25, 0xE0, 0x25, 0xE0, \r
+0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, \r
+0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, \r
+0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
+0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, \r
+0x22, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0x7D, 0x04, 0x7F, 0x01, 0x41, 0xE8, 0x7D, 0x02, 0x7F, 0x02, \r
+0xF1, 0xD6, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, \r
+0x02, 0x91, 0x4C, 0x22, 0x7F, 0xFF, 0x51, 0xA5, 0xE4, 0x90, 0x95, 0x81, 0xF0, 0xA3, 0xF0, 0x90, \r
+0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, \r
+0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x82, 0xE0, 0x94, 0xE8, 0x90, 0x95, 0x81, 0xE0, 0x94, \r
+0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, \r
+0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x81, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, \r
+0xE4, 0x90, 0x93, 0x9D, 0xF0, 0x90, 0x93, 0x9D, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x40, 0x90, 0x01, \r
+0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, \r
+0x8E, 0x84, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x87, 0xE0, 0xFF, 0x90, 0x8E, 0x86, 0xE0, 0x6F, 0x60, \r
+0x02, 0x11, 0x92, 0xC2, 0xAF, 0x12, 0x7A, 0x84, 0xBF, 0x01, 0x03, 0x12, 0x9E, 0x70, 0xD2, 0xAF, \r
+0x90, 0x93, 0x95, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x88, 0xD2, 0x12, 0x4F, 0xF3, 0x12, 0x46, 0x38, \r
+0x80, 0xB3, 0x90, 0x8E, 0x86, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x50, 0xD2, 0x90, 0x8E, 0x80, 0xE0, \r
+0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x1A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, \r
+0xE0, 0x90, 0x8E, 0x81, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, \r
+0xF0, 0x11, 0x92, 0xE4, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x93, 0x92, 0xE0, \r
+0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, \r
+0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x93, \r
+0x92, 0xF0, 0x90, 0x93, 0x94, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x8F, 0xE0, 0xD3, 0x9D, 0x50, 0x0A, \r
+0x31, 0x46, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x54, 0x9B, 0x90, 0x93, 0x92, \r
+0xE0, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, \r
+0xE0, 0x20, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x81, 0x30, 0xE1, 0x06, \r
+0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x02, \r
+0x11, 0x92, 0x7F, 0x01, 0x01, 0xC5, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x90, 0x95, \r
+0x8D, 0xEF, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x2A, 0x90, 0x95, 0x8D, 0xE0, 0xFD, \r
+0x64, 0x01, 0x70, 0x30, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8F, 0x32, 0xE0, 0xC4, \r
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, \r
+0x13, 0xAF, 0x05, 0x80, 0x0C, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x8D, 0xE0, \r
+0xFF, 0x12, 0x4D, 0x92, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x54, \r
+0xBF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF, \r
+0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, 0xEF, 0x24, 0x08, 0xFF, 0xEC, \r
+0x3E, 0x90, 0x93, 0xB0, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01, \r
+0x7A, 0x90, 0x79, 0x43, 0x12, 0x08, 0xAA, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, \r
+0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x44, 0xEF, 0xF0, 0x90, 0x93, \r
+0xB1, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, \r
+0x90, 0x90, 0x47, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x05, 0xFF, 0x90, 0x93, 0xB0, 0xE0, \r
+0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x48, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, \r
+0x24, 0x06, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, \r
+0x49, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, \r
+0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x4A, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x08, \r
+0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x4B, 0xEF, \r
+0xF0, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x24, \r
+0x90, 0x93, 0xB1, 0xE0, 0x24, 0x09, 0xFD, 0x90, 0x93, 0xB0, 0xE0, 0x71, 0x43, 0x90, 0x93, 0xAF, \r
+0xE0, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, \r
+0x04, 0xF0, 0x80, 0xD2, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94, \r
+0x20, 0x50, 0x24, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x93, 0xB0, 0xE0, 0x71, 0x43, \r
+0x90, 0x93, 0xAF, 0xE0, 0x24, 0xA6, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, \r
+0x93, 0xAF, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x90, 0x90, 0x48, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, \r
+0xFF, 0x90, 0x93, 0xAD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, 0x0C, 0x7F, 0x01, 0x31, 0x4E, \r
+0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x93, 0xAD, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, \r
+0x54, 0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C, \r
+0x70, 0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F, \r
+0x48, 0x90, 0x90, 0xDC, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x9F, 0x37, 0x90, 0x06, \r
+0x31, 0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, \r
+0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, \r
+0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD, \r
+0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF9, 0xE0, 0x9B, \r
+0x90, 0x8D, 0xF8, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF8, 0xE0, \r
+0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF, \r
+0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0x90, 0x93, \r
+0xAB, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, \r
+0x93, 0xCF, 0xF0, 0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0, \r
+0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, \r
+0xD0, 0x06, 0xE4, 0xFB, 0xFA, 0xFD, 0xD1, 0x54, 0x90, 0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x4E, 0x60, 0x52, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, \r
+0x71, 0x50, 0x90, 0x93, 0xAE, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xAE, 0xE0, \r
+0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x2B, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x02, \r
+0xFD, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, 0x71, 0x4A, 0x90, 0x93, \r
+0xAD, 0xE0, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAD, \r
+0xE0, 0x04, 0xF0, 0x80, 0xC7, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, 0xA9, 0xE0, \r
+0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0, \r
+0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, 0xD0, 0x06, 0x7B, 0x03, 0xD1, 0x50, 0x90, \r
+0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x22, 0xFF, 0x90, 0x93, \r
+0xA9, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xD0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x71, 0x50, \r
+0xEF, 0x20, 0xE4, 0x02, 0xA1, 0xBC, 0x90, 0x93, 0xCF, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0xAA, 0xE0, \r
+0x24, 0x24, 0xFF, 0x90, 0x93, 0xA9, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0, \r
+0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, \r
+0xD0, 0x06, 0x7B, 0x30, 0xD1, 0x50, 0x90, 0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x4E, 0x60, \r
+0x69, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, \r
+0x90, 0x93, 0xD3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xD3, 0xE0, 0xFF, 0x90, \r
+0x93, 0xAD, 0xE0, 0xC3, 0x9F, 0x50, 0x43, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x0D, 0xFF, 0x90, 0x93, \r
+0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x93, 0xD2, 0xEF, 0xF0, 0xBF, 0x02, \r
+0x09, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0xD2, 0xE0, 0xB4, 0x04, \r
+0x07, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x40, 0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x04, 0x12, \r
+0x08, 0xD6, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0x80, 0xB0, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x24, \r
+0xFF, 0x90, 0x93, 0xA9, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0xDC, \r
+0xFE, 0x90, 0x93, 0xAB, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, 0xD0, 0x06, \r
+0x7B, 0xDD, 0x7A, 0x00, 0x7D, 0x01, 0xD1, 0x54, 0x90, 0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x4E, 0x60, 0x6E, 0xE0, 0x24, 0x0C, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, \r
+0x71, 0x50, 0x90, 0x93, 0xD3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xD3, 0xE0, \r
+0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xC3, 0x9F, 0x50, 0x48, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x11, 0xFF, \r
+0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x93, 0xD2, 0xEF, 0xF0, \r
+0xBF, 0x02, 0x09, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0xD2, 0xE0, \r
+0xB4, 0x04, 0x07, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x04, 0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, \r
+0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0x80, 0xB0, 0xE4, 0x90, 0x93, 0xCF, \r
+0xF0, 0x90, 0x91, 0x33, 0xE0, 0x90, 0x04, 0xFD, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x91, \r
+0x33, 0xE0, 0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x73, 0x74, 0x43, 0x2E, 0xF5, \r
+0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xAE, 0xE0, 0xFE, 0x6F, 0x70, 0x57, \r
+0x90, 0x04, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x24, 0x53, 0xF5, 0x82, 0xE4, 0x34, \r
+0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0xFD, 0x4F, 0x60, 0x04, 0xED, 0x5F, 0x60, \r
+0x36, 0xEE, 0xFF, 0x7E, 0x00, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAD, 0xE0, 0x75, 0xF0, 0x20, \r
+0xA4, 0x24, 0x73, 0xF9, 0x74, 0x91, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xAF, 0x7C, 0x93, 0x7D, \r
+0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x0C, 0x90, 0x01, 0xC7, 0x74, 0x55, \r
+0xF0, 0x7F, 0x01, 0x31, 0x4E, 0xF1, 0xCD, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0xA1, 0xCE, 0x22, \r
+0x7A, 0x00, 0xE4, 0xFD, 0x90, 0x93, 0xD4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, \r
+0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0xDA, 0xE0, 0x94, 0x01, 0x90, 0x93, 0xD9, 0xE0, \r
+0x94, 0x00, 0x50, 0x02, 0xE1, 0x02, 0xE4, 0x90, 0x93, 0xDD, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0xD4, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x93, 0xD7, 0xE0, 0x70, 0x03, 0xA3, \r
+0xE0, 0x6F, 0x70, 0x24, 0x90, 0x93, 0xD5, 0xE0, 0x24, 0x02, 0xFF, 0x90, 0x93, 0xD4, 0xE0, 0x34, \r
+0x00, 0xFE, 0x90, 0x93, 0xD6, 0xE0, 0xFD, 0x12, 0xA6, 0x60, 0xBF, 0x01, 0x09, 0x90, 0x93, 0xD4, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x80, 0x00, 0x90, 0x93, 0xD5, 0xE0, 0x24, 0x01, 0xFF, 0x90, \r
+0x93, 0xD4, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x7E, 0x00, 0x90, 0x93, 0xDB, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x02, 0xFF, 0xEE, 0x33, 0xFE, 0x90, 0x93, 0xD4, 0x8F, 0xF0, 0x12, \r
+0x08, 0xD6, 0x90, 0x93, 0xDD, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD9, 0xE0, 0xFE, \r
+0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x9F, 0x90, 0x93, 0xDD, 0xE0, 0x9E, 0x50, 0x02, \r
+0xC1, 0x7D, 0xE4, 0xFE, 0xFF, 0x22, 0x90, 0x93, 0xA9, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, \r
+0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0xFD, 0x71, 0x50, 0xEF, 0x54, \r
+0x0C, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xC7, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0x24, 0x06, 0xFD, 0x71, 0x50, 0xEF, 0x64, 0x88, 0x60, 0x02, 0xE1, 0xC7, 0x90, 0x93, 0xA7, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x71, 0x50, 0xEF, 0x64, 0x8E, 0x70, \r
+0x76, 0x90, 0x93, 0xAC, 0x04, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, \r
+0xAA, 0xE0, 0xFD, 0x90, 0x93, 0xA9, 0xE0, 0x2D, 0x04, 0xFD, 0x71, 0x50, 0xEF, 0x64, 0x03, 0x70, \r
+0x56, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xAA, 0xE0, 0xFD, 0x90, 0x93, \r
+0xA9, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x71, 0x50, 0xEF, 0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74, \r
+0x01, 0x80, 0x2C, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, \r
+0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x31, 0xA3, 0x80, 0x19, 0x90, 0x8F, \r
+0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x02, 0xF0, \r
+0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x22, 0x90, 0x8F, 0x2E, \r
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0x12, 0x86, 0x94, 0x12, 0x73, 0xD5, 0x22, 0xF1, \r
+0xE3, 0x80, 0xEA, 0x90, 0x8F, 0x2E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x03, \r
+0x12, 0xA6, 0x6D, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x39, 0x90, 0x93, 0xA6, \r
+0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x05, \r
+0x54, 0xFD, 0xF0, 0x11, 0xA6, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE2, \r
+0x05, 0x54, 0xFB, 0xF0, 0x11, 0x54, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, \r
+0xE4, 0x0C, 0x54, 0xEF, 0xF0, 0x12, 0x8F, 0xE2, 0xBF, 0x01, 0x03, 0x12, 0x8A, 0xEE, 0xD2, 0xAF, \r
+0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE7, 0x06, 0x54, 0x7F, 0xF0, 0x12, 0x87, 0xA1, \r
+0xD2, 0xAF, 0x80, 0xB0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x8D, 0xF7, \r
+0xE0, 0xFE, 0x90, 0x8D, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, \r
+0xEE, 0x64, 0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, 0xF9, 0x74, 0x8D, 0x35, \r
+0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x0A, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF6, 0xE0, 0x04, \r
+0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6, \r
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5F, \r
+0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
+0x70, 0x43, 0x90, 0x8D, 0x5E, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD, \r
+0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0F, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, \r
+0x01, 0xAF, 0x05, 0x31, 0x80, 0x90, 0x8D, 0x5E, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5E, 0xF0, 0x12, 0x71, 0x86, 0x90, 0x8D, \r
+0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x95, 0x62, 0x12, 0x44, 0x12, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x77, 0xFC, 0xEF, 0x60, \r
+0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, \r
+0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x95, 0x65, 0xEF, 0xF0, 0xEE, 0xFF, \r
+0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x65, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x95, 0x62, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, \r
+0x33, 0xFE, 0x12, 0x78, 0x52, 0x90, 0x95, 0x65, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x95, 0x62, 0x12, \r
+0x44, 0x09, 0x12, 0x78, 0xAD, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x93, 0xA8, 0x12, 0x44, 0x12, 0x90, 0x93, 0xA7, 0xEF, 0xF0, 0x12, 0x44, 0x1B, 0x61, 0xCB, \r
+0x00, 0x61, 0xD4, 0x01, 0x61, 0xDD, 0x02, 0x61, 0xE6, 0x03, 0x61, 0xEF, 0x04, 0x61, 0xF8, 0x12, \r
+0x62, 0x00, 0x14, 0x62, 0x08, 0x20, 0x62, 0x11, 0x21, 0x62, 0x1A, 0x23, 0x62, 0x22, 0x25, 0x62, \r
+0x2A, 0x27, 0x62, 0x3B, 0x80, 0x62, 0x32, 0x81, 0x62, 0x44, 0x82, 0x62, 0x4C, 0x83, 0x62, 0x55, \r
+0x84, 0x62, 0x66, 0x86, 0x62, 0x5E, 0x88, 0x00, 0x00, 0x62, 0x6F, 0x90, 0x93, 0xA8, 0x12, 0x44, \r
+0x09, 0x02, 0x6F, 0xC2, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x6C, 0x9C, 0x90, 0x93, 0xA8, \r
+0x12, 0x44, 0x09, 0x02, 0x70, 0x1A, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x89, 0x79, 0x90, \r
+0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x9C, 0xB5, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x80, 0x7F, \r
+0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, 0xA2, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x70, \r
+0x5D, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x71, 0x42, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, \r
+0xE1, 0x92, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, 0x9A, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, \r
+0x80, 0x61, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x75, 0xE6, 0x90, 0x93, 0xA8, 0x12, 0x44, \r
+0x09, 0x02, 0x90, 0x7F, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, 0xD6, 0x90, 0x93, 0xA8, 0x12, \r
+0x44, 0x09, 0x02, 0x9B, 0x3F, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x9B, 0xA1, 0x90, 0x93, \r
+0xA8, 0x12, 0x44, 0x09, 0xE1, 0xB1, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x80, 0xBB, 0x90, \r
+0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, \r
+0x06, 0x89, 0xFF, 0x90, 0x8D, 0xFA, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x79, 0x26, 0xE4, 0x90, 0x8D, \r
+0xFA, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x2A, 0xE0, 0x54, 0xFE, \r
+0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
+0x06, 0xA2, 0x90, 0x8F, 0x2B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x2C, 0xF0, \r
+0x90, 0x8F, 0x2B, 0xE0, 0x90, 0x8F, 0x2D, 0xF0, 0x90, 0x8F, 0x2A, 0xE0, 0x54, 0x01, 0xFF, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x92, 0xEF, 0xF0, 0x54, 0x01, 0xFF, 0x90, 0x8F, \r
+0x2A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x30, 0xE0, 0x47, 0x90, 0x91, 0x3B, 0x12, 0x43, 0xE5, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x17, 0x90, \r
+0x93, 0x73, 0x12, 0x43, 0xF1, 0xD3, 0x12, 0x43, 0xD4, 0x40, 0x0B, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, \r
+0xFC, 0x90, 0x91, 0x3F, 0x80, 0x09, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x91, 0x37, 0x12, \r
+0x43, 0xF1, 0x12, 0x42, 0x9D, 0xC0, 0x07, 0x90, 0x8F, 0x2C, 0xE0, 0xFB, 0xE4, 0xFA, 0xF9, 0xF8, \r
+0xD0, 0x07, 0x12, 0x43, 0x28, 0x90, 0x8F, 0x2D, 0xEF, 0xF0, 0x90, 0x95, 0x92, 0xE0, 0x64, 0x01, \r
+0x70, 0x2C, 0x90, 0x01, 0x53, 0xF0, 0x90, 0x8F, 0x2C, 0xE0, 0x60, 0x10, 0x7D, 0x10, 0x7F, 0x03, \r
+0x71, 0xB5, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x80, 0x23, 0x90, 0x01, 0x53, 0x74, \r
+0x03, 0xF0, 0x7D, 0x10, 0xFF, 0xD1, 0x33, 0x71, 0x84, 0x12, 0x55, 0xF2, 0x80, 0x11, 0x90, 0x01, \r
+0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x71, 0xB5, 0x12, 0x57, 0xCC, 0x12, 0x56, 0x09, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x71, 0x8E, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, \r
+0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, \r
+0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x93, 0x93, 0xE0, 0x04, 0xF0, \r
+0x90, 0x8E, 0x87, 0xE0, 0x64, 0x02, 0x60, 0x22, 0x71, 0xFB, 0x90, 0x8E, 0x81, 0xE0, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x8E, 0x8A, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, \r
+0x71, 0xA6, 0x71, 0x84, 0x90, 0x8E, 0x8B, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0x8D, 0xFF, 0xE0, 0x64, \r
+0x01, 0x60, 0x02, 0x81, 0x9D, 0x90, 0x8E, 0x84, 0xE0, 0x70, 0x02, 0x81, 0x9D, 0x90, 0x8E, 0x82, \r
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x8B, \r
+0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0x8E, 0x8A, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, \r
+0x8E, 0x8A, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x8E, 0x8B, 0xEF, 0xF0, 0x90, \r
+0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x6B, 0x24, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x04, 0xF0, \r
+0xE4, 0x90, 0x8E, 0x8D, 0xF0, 0x90, 0x8E, 0x8F, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, \r
+0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x82, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, \r
+0x02, 0xF1, 0x2E, 0x90, 0x8E, 0x81, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0E, 0x90, \r
+0x8E, 0x8A, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0x71, 0xA6, 0x71, 0x8A, 0x22, 0xEF, 0x70, \r
+0x4E, 0x7D, 0x78, 0x7F, 0x02, 0x71, 0x8E, 0x7D, 0x02, 0x7F, 0x03, 0x71, 0x8E, 0x7D, 0xC8, 0x7F, \r
+0x02, 0xD1, 0x33, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8D, \r
+0xFF, 0xE0, 0x70, 0x15, 0x12, 0x4F, 0x6A, 0x12, 0x56, 0x17, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7, \r
+0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x50, 0xD2, \r
+0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, \r
+0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x57, 0xD6, 0x7D, \r
+0x02, 0x7F, 0x03, 0x12, 0x57, 0xD6, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x8E, 0x8F, \r
+0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x8E, 0x81, \r
+0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, \r
+0x50, 0xD2, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x6F, \r
+0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x8E, 0x98, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62, \r
+0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, \r
+0xF9, 0xFF, 0x90, 0x8E, 0xB5, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0x81, 0xE0, 0xFF, 0x13, \r
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x71, 0x84, \r
+0x90, 0x8E, 0x8A, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x95, 0x7F, 0xE4, 0x75, 0xF0, 0x01, \r
+0x12, 0x08, 0xD6, 0xC3, 0x90, 0x95, 0x80, 0xE0, 0x94, 0x80, 0x90, 0x95, 0x7F, 0xE0, 0x64, 0x80, \r
+0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, \r
+0x9D, 0x05, 0xD1, 0x7B, 0xE4, 0x90, 0x93, 0x8C, 0xF0, 0xD1, 0x1A, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x52, 0x90, 0x90, 0xDD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, \r
+0x00, 0x7D, 0x64, 0x12, 0x07, 0x15, 0x90, 0x91, 0x31, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, \r
+0x60, 0x0A, 0x90, 0x91, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0x90, 0x90, 0xE1, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xEF, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, \r
+0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x59, 0x4E, 0x12, \r
+0x7A, 0xF4, 0xE4, 0x90, 0x91, 0x31, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0x30, 0xE0, \r
+0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x71, 0x84, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05, \r
+0x73, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x93, 0xAE, 0x12, 0x44, \r
+0x12, 0x12, 0x9D, 0x7F, 0x90, 0x8E, 0x84, 0xE0, 0xFF, 0x91, 0x9E, 0x90, 0x8E, 0x84, 0xE0, 0x60, \r
+0x19, 0x90, 0x93, 0xAE, 0x12, 0x44, 0x09, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, \r
+0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x12, 0x9E, 0x0A, 0x22, 0x90, 0x93, 0x89, 0xE0, 0x30, \r
+0xE0, 0x37, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0x95, 0x8E, 0xE0, 0x04, 0xF0, \r
+0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x8E, 0xF0, 0x90, \r
+0x93, 0x8B, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0x90, 0x93, 0x8C, 0xE0, \r
+0x70, 0x07, 0xE4, 0x90, 0x93, 0x8B, 0xF0, 0xD1, 0xBA, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x13, \r
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x17, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x95, 0x0D, 0x12, \r
+0x44, 0x12, 0xE4, 0x90, 0x95, 0x10, 0xF0, 0xA3, 0x04, 0xF0, 0x02, 0x93, 0xA0, 0x02, 0x54, 0x9B, \r
+0x90, 0x8F, 0x2A, 0xE0, 0x30, 0xE0, 0x46, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, \r
+0x8F, 0x2D, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x55, 0xF2, 0x90, 0x8F, 0x2B, 0xE0, 0x14, 0x90, \r
+0x8F, 0x2D, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x51, 0xCF, 0x12, 0x57, 0xCC, \r
+0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0D, \r
+0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x12, 0x80, 0x2E, 0x22, 0xE4, 0xF5, \r
+0x58, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x58, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0x8E, 0x88, 0xE0, 0x54, \r
+0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x58, 0x92, 0xE5, 0x58, 0x30, 0xE6, 0x23, 0x90, 0x8E, 0x84, \r
+0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8E, 0x82, 0xE0, \r
+0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x6D, 0x3F, 0x80, 0x0C, 0x12, 0x55, 0x5E, 0x80, 0x07, \r
+0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, 0x58, 0x90, 0x8E, 0x88, 0x30, 0xE7, 0x0E, 0xE0, \r
+0x44, 0x02, 0x12, 0x50, 0x57, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, \r
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8F, 0x29, \r
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x9B, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, \r
+0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0xEF, 0x2E, 0x90, 0x93, 0x87, 0xF0, \r
+0x22, 0x12, 0x50, 0x9E, 0x90, 0x8E, 0x8A, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, \r
+0x02, 0x12, 0x57, 0xD6, 0xC1, 0xE0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0xAB, 0xF0, 0x12, 0x06, \r
+0x89, 0x90, 0x93, 0x77, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x78, 0xF0, 0x22, \r
+0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, \r
+0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, \r
+0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, \r
+0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, \r
+0xC4, 0x74, 0x21, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x4C, 0x5B, 0xE5, 0x14, 0x30, 0xE7, 0x03, \r
+0x12, 0x4F, 0x4E, 0x74, 0x21, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, \r
+0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, \r
+0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, \r
+0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, \r
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x79, 0xF0, 0x74, 0x68, 0xA3, 0xF0, \r
+0xB1, 0x60, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0x31, 0xD5, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0xC1, \r
+0xE5, 0x19, 0x30, 0xE5, 0x02, 0xB1, 0xEC, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x18, 0xE5, 0x1B, \r
+0x30, 0xE1, 0x03, 0x12, 0x65, 0x3A, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x63, 0xCA, 0xE5, 0x1B, \r
+0x30, 0xE3, 0x02, 0x91, 0x43, 0xE5, 0x1B, 0x30, 0xE4, 0x02, 0xB1, 0x8D, 0xE5, 0x1B, 0x30, 0xE5, \r
+0x02, 0x31, 0xE1, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0x91, 0x5F, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, \r
+0x57, 0xEB, 0x74, 0x79, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, \r
+0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, \r
+0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x58, 0x90, 0x8E, 0x84, 0xE0, 0x70, \r
+0x02, 0x21, 0xC0, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0xC0, 0x90, 0x8E, 0x80, \r
+0xE0, 0x30, 0xE0, 0x1D, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, \r
+0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB9, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x8E, 0x82, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, \r
+0x1E, 0x90, 0x8E, 0x8B, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x8D, 0xE0, 0x60, \r
+0x0E, 0xEF, 0x70, 0x08, 0x90, 0x8E, 0x8A, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, 0xE5, \r
+0x58, 0x60, 0x3D, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x60, 0x03, \r
+0xB4, 0x01, 0x0B, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x80, 0x0F, 0xE4, 0x90, \r
+0x95, 0x43, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, \r
+0x8C, 0xE0, 0x2F, 0x12, 0x50, 0x61, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x50, 0xCE, \r
+0x22, 0x12, 0x71, 0x86, 0x7F, 0x02, 0x8F, 0x59, 0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01, \r
+0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x31, 0xC6, \r
+0x22, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x0F, 0x90, 0x8E, \r
+0x82, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0xA1, 0x3F, 0x12, 0x55, 0x5E, 0x22, 0x7F, 0x80, \r
+0x80, 0xC4, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, \r
+0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, \r
+0x01, 0xC4, 0x74, 0x02, 0xF0, 0x74, 0x6A, 0xA3, 0xF0, 0xB1, 0xBC, 0xE5, 0x21, 0x30, 0xE0, 0x02, \r
+0x31, 0xFE, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x51, 0x8E, 0xE5, 0x21, 0x30, 0xE2, 0x02, 0x91, 0x28, \r
+0xE5, 0x22, 0x30, 0xE0, 0x02, 0x51, 0x97, 0xE5, 0x24, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, 0xC6, \r
+0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x67, 0xC1, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x58, 0x9C, \r
+0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x59, 0x14, 0x74, 0x02, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, \r
+0x6A, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
+0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x8E, \r
+0x84, 0xE0, 0x60, 0x02, 0xD1, 0x28, 0x22, 0xD1, 0x72, 0x90, 0x94, 0x5E, 0xEF, 0xF0, 0x30, 0xE0, \r
+0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xE8, 0x90, 0x94, 0x5E, 0xE0, \r
+0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, \r
+0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x95, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x8E, 0x9A, 0xE0, \r
+0xFB, 0xAC, 0x07, 0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x8E, 0x96, 0xE0, 0xD3, 0x94, \r
+0x03, 0x50, 0x07, 0x90, 0x8E, 0x8C, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0x8E, \r
+0x8C, 0xF0, 0x7D, 0x03, 0x90, 0x8E, 0xBB, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0x8E, \r
+0x99, 0xF0, 0x90, 0x8E, 0x8F, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0x8E, 0x8F, 0xE4, \r
+0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8C, 0xEB, 0xF0, 0x90, 0x8E, 0x8F, 0xA3, 0xE0, 0x90, \r
+0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x59, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, \r
+0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
+0xFF, 0x90, 0x8E, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, \r
+0x8E, 0xB7, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF, \r
+0x90, 0x8E, 0x99, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13, \r
+0x74, 0x9C, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x97, \r
+0xE0, 0x04, 0xF0, 0x71, 0xF6, 0x90, 0x8E, 0x97, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x67, 0xE4, 0x90, \r
+0x94, 0x5A, 0xF0, 0x90, 0x94, 0x59, 0xF0, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, \r
+0x47, 0x74, 0x9C, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x94, 0x5A, \r
+0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0x94, 0x0A, \r
+0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x96, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0x8E, 0x96, \r
+0xF0, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x8E, 0x95, 0xF0, 0x80, 0x08, \r
+0x90, 0x94, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x8E, 0x96, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, \r
+0xFF, 0x51, 0xD1, 0x91, 0x7B, 0x22, 0x90, 0x8F, 0x23, 0xE0, 0xFF, 0x90, 0x8E, 0x8D, 0xE0, 0xD3, \r
+0x9F, 0x40, 0x24, 0x90, 0x8E, 0x9B, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, \r
+0x8E, 0x95, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x9A, 0xF0, 0xFB, 0x90, 0x8E, 0x95, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x51, 0xD1, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x14, 0x90, 0x06, \r
+0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x56, 0x29, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x12, \r
+0x58, 0x92, 0x22, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x90, 0x8E, 0x84, 0xE0, 0x60, \r
+0x0D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x12, 0x50, 0x57, 0x22, 0x90, \r
+0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x88, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x92, 0x22, 0xE4, 0xFF, 0x74, 0x9C, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90, \r
+0x8E, 0x97, 0xF0, 0x90, 0x8E, 0x9B, 0xF0, 0x90, 0x8E, 0x95, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, \r
+0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, \r
+0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, \r
+0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, \r
+0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0xFF, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, \r
+0x83, 0xEF, 0xF0, 0x74, 0xFF, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xAF, \r
+0x54, 0x70, 0x04, 0xB1, 0x2E, 0x80, 0x02, 0xB1, 0x1D, 0x05, 0x54, 0x80, 0xC6, 0x91, 0x7B, 0xE5, \r
+0x55, 0x70, 0x19, 0x90, 0x8D, 0xFF, 0xE0, 0x70, 0x13, 0x12, 0x4F, 0x6A, 0x12, 0x56, 0x17, 0x90, \r
+0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, \r
+0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, \r
+0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, \r
+0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x8D, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x56, \r
+0xAE, 0x90, 0x95, 0x87, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, \r
+0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, \r
+0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, \r
+0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x8D, 0xFF, \r
+0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, \r
+0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x88, \r
+0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x92, 0x22, 0x90, 0x01, 0x3C, 0xE0, \r
+0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, \r
+0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, \r
+0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0, \r
+0x90, 0x94, 0x59, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, \r
+0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, \r
+0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x4E, 0x85, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, \r
+0x7F, 0x03, 0x12, 0x49, 0x4F, 0x80, 0xFE, 0x22, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0x13, 0x13, 0x54, \r
+0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFD, 0xF0, 0x54, \r
+0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0x8E, 0x8D, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, \r
+0xEF, 0xF0, 0x90, 0x8F, 0x23, 0xE0, 0xFF, 0x90, 0x8E, 0x8D, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, \r
+0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x58, \r
+0x92, 0x22, 0xE4, 0x90, 0x94, 0x5F, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0xE7, \r
+0x90, 0x94, 0x5F, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0xE7, 0xAE, 0x07, 0x90, 0x94, 0x5F, 0xE0, \r
+0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x94, 0x61, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x60, 0xE0, \r
+0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x94, 0x5F, 0xE0, 0xFF, \r
+0x22, 0x90, 0x94, 0x60, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x32, 0xC0, 0xE0, \r
+0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xBE, 0x90, \r
+0x01, 0xC4, 0xED, 0xF0, 0x74, 0x6E, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, \r
+0x95, 0x8A, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x95, \r
+0x8A, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0x90, 0x93, 0xB6, 0x74, 0x12, 0xF0, \r
+0x90, 0x93, 0xC4, 0x74, 0x05, 0xF0, 0x90, 0x93, 0xB8, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, \r
+0xF0, 0x90, 0x93, 0xB4, 0xE0, 0x90, 0x93, 0xBB, 0xF0, 0x90, 0x93, 0xB5, 0xE0, 0x90, 0x93, 0xBC, \r
+0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB6, 0xF1, 0x3D, 0x7F, 0x04, 0x80, 0xB2, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF6, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, \r
+0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, \r
+0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, \r
+0x8D, 0xF7, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, 0x01, \r
+0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF7, 0xE0, \r
+0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, \r
+0xF7, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x8B, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, \r
+0x12, 0x90, 0x8D, 0x02, 0xE0, 0xFF, 0x90, 0x95, 0x8B, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x02, \r
+0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x8D, 0x07, \r
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x08, 0xF0, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x09, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, \r
+0x51, 0x90, 0x8D, 0x0A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0B, \r
+0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0C, 0xF0, 0x90, 0x00, 0x06, \r
+0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E, 0x7F, 0xF0, 0xBF, \r
+0x01, 0x10, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x1C, 0x7D, 0x13, 0x7F, 0x6F, \r
+0x80, 0x13, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, \r
+0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xA5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xAB, \r
+0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x84, 0xF0, 0xEF, 0xC4, 0x13, \r
+0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, \r
+0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, \r
+0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, \r
+0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0x90, 0x8E, 0x83, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, \r
+0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x96, 0x50, 0x04, 0xEF, 0xF0, 0x80, \r
+0x2E, 0x74, 0x03, 0xF0, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, \r
+0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, \r
+0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, \r
+0x93, 0xAB, 0x12, 0x44, 0x09, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, \r
+0x94, 0x04, 0x90, 0x8E, 0x8C, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0x93, \r
+0xAB, 0x12, 0x44, 0x09, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x52, 0xE8, \r
+0x90, 0x94, 0xD0, 0xE0, 0x60, 0x03, 0x12, 0x52, 0xDC, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x09, 0x02, \r
+0x66, 0x4B, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, \r
+0x8F, 0x23, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x24, 0xF0, 0xEF, 0x54, 0xFE, \r
+0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x26, \r
+0xF0, 0x22, 0x90, 0x8F, 0x23, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, \r
+0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x95, 0x7D, 0xF0, \r
+0x90, 0x95, 0x7D, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0xD5, 0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x70, 0x06, \r
+0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0xB5, 0x07, 0x04, \r
+0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, \r
+0x22, 0x90, 0x95, 0x7B, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, \r
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0xB2, 0xE4, 0x90, 0x95, \r
+0x7E, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0x95, 0x7B, 0xE0, \r
+0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, \r
+0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0x75, \r
+0xF0, 0x08, 0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
+0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, \r
+0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, \r
+0x5F, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x12, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82, \r
+0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, \r
+0x95, 0x7D, 0xE0, 0xFF, 0x90, 0x95, 0x7B, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, \r
+0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x95, 0x7D, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0xFF, 0x74, \r
+0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x95, \r
+0x7B, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5F, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, \r
+0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x21, 0x90, 0xE4, 0x90, 0x8D, 0x5F, 0xF0, \r
+0x21, 0x90, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x44, 0x80, 0x90, \r
+0x00, 0x8A, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0xFD, \r
+0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5E, \r
+0xF0, 0xA3, 0xF0, 0x22, 0xF1, 0xBF, 0x51, 0xD6, 0x12, 0x53, 0x57, 0x12, 0x9E, 0x7B, 0x71, 0x0C, \r
+0x12, 0x89, 0x62, 0x12, 0x9C, 0x9B, 0x90, 0x93, 0x96, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, \r
+0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x98, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x1F, \r
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2E, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x90, 0xE0, 0x44, \r
+0x20, 0xF0, 0x12, 0x90, 0x1F, 0x12, 0xA6, 0x6D, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0x64, 0x02, 0x70, \r
+0x3A, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4C, 0xEE, \r
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4A, 0xEE, \r
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4B, 0xEE, \r
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x6A, 0xEF, 0x64, 0x01, 0x70, 0x2D, \r
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4C, 0xEF, 0xF0, \r
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4A, 0xEF, 0xF0, \r
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x33, 0x90, 0x8D, 0x06, \r
+0xE0, 0x64, 0x03, 0x70, 0x30, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, \r
+0x90, 0x8F, 0x4C, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, \r
+0x90, 0x8F, 0x4A, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, \r
+0x90, 0x8F, 0x4B, 0xEF, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x91, 0x33, \r
+0xF0, 0x90, 0x91, 0x3B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91, 0x3F, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91, 0x37, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, \r
+0x93, 0x73, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEF, 0x60, 0x55, 0x90, 0x93, 0x79, \r
+0xE0, 0xFF, 0x60, 0x02, 0x91, 0xA4, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, \r
+0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF8, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x12, 0x4C, 0x19, 0x90, 0x02, \r
+0x86, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x8A, 0x9E, 0x91, 0x7F, 0x12, 0x4F, 0x6A, 0xE4, 0xFD, 0xFF, \r
+0x12, 0x52, 0xA5, 0x12, 0x9C, 0x03, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, \r
+0x57, 0xD6, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x63, 0x8E, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, \r
+0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x90, 0x32, 0x12, 0x5F, 0xDF, 0x61, 0x0C, 0xF1, \r
+0xBE, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x18, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, \r
+0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0D, 0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x14, \r
+0x12, 0x80, 0x2E, 0x22, 0x91, 0xC7, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, \r
+0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x02, \r
+0x35, 0x26, 0x90, 0x8D, 0xFD, 0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, \r
+0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0x93, 0x84, 0xE0, 0xFF, \r
+0x91, 0xC7, 0x90, 0x93, 0xAB, 0xEF, 0xF0, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, \r
-0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x30, \r
-0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, 0xD1, 0x26, \r
-0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x90, 0x92, 0x1B, 0xED, \r
-0xF0, 0x90, 0x92, 0x18, 0x12, 0x45, 0x2D, 0xE4, 0x90, 0x92, 0x1C, 0xF0, 0xA3, 0xF0, 0x12, 0x06, \r
-0x89, 0xFF, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFD, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFB, \r
-0xB1, 0x5C, 0x90, 0x92, 0x1C, 0xEF, 0xF0, 0x90, 0x92, 0x18, 0x12, 0x45, 0x24, 0x90, 0x00, 0x04, \r
-0x12, 0x06, 0xA2, 0xFF, 0xD1, 0x26, 0x90, 0x92, 0x1D, 0xEF, 0xF0, 0x90, 0x8F, 0xF0, 0xE0, 0x24, \r
-0xFE, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x1A, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, 0x70, \r
-0x54, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE7, 0x90, 0x92, 0x1B, 0xE0, 0xFD, 0x12, 0x92, 0xCD, 0x80, \r
-0x16, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE7, 0x90, 0x92, 0x1B, 0xE0, 0xFD, 0x90, 0x8F, 0xF0, 0xE0, \r
-0x90, 0x92, 0x00, 0xF0, 0x12, 0x91, 0xAB, 0x90, 0x92, 0x1D, 0xE0, 0xFF, 0x90, 0x92, 0x18, 0x12, \r
-0x45, 0x24, 0x90, 0x92, 0x1C, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, \r
-0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xE7, 0xA3, 0xE0, \r
-0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x20, 0xE0, \r
-0x05, 0x90, 0x90, 0xCB, 0x80, 0x03, 0x90, 0x90, 0xCC, 0xE0, 0x90, 0x8F, 0xF0, 0xF0, 0x90, 0x8F, \r
-0xF0, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, 0x09, 0x14, \r
-0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, 0xAF, 0x06, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x90, 0xFD, 0xEF, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, \r
-0x89, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x90, 0xED, 0xE0, 0x54, 0xFE, 0x4F, \r
-0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8F, 0x18, 0xF0, 0x90, 0x8F, 0x18, 0xE0, 0x90, 0x01, 0xE7, \r
-0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x90, 0xFD, 0xF0, 0x12, 0x06, 0x89, 0x90, 0x90, 0xCB, \r
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xCC, 0xF0, 0x22, 0x90, 0x90, 0xE0, 0xE0, \r
-0x54, 0xFE, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0x90, 0x90, 0xE4, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xE0, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x90, 0xE3, 0xF0, \r
-0x90, 0x90, 0xE7, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x90, 0xDC, 0xE0, \r
-0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x12, 0x06, \r
-0x89, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x90, 0xDD, 0xF0, \r
-0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x8F, 0x19, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x1A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, \r
-0x8F, 0x1B, 0xF0, 0x90, 0x8F, 0x1A, 0xE0, 0x90, 0x8F, 0x1C, 0xF0, 0x90, 0x8F, 0x19, 0xE0, 0x54, \r
-0x01, 0xFF, 0x02, 0x57, 0x83, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, \r
-0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E, 0x7A, 0xF0, 0xBF, 0x01, 0x10, 0x90, 0x00, 0x01, \r
-0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x1C, 0x7D, 0x13, 0x7F, 0x6F, 0x80, 0x13, 0xAB, 0x51, 0xAA, \r
-0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x4F, 0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, \r
-0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0x8F, 0x12, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, \r
-0x8F, 0x13, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, \r
-0x12, 0x06, 0xA2, 0x90, 0x8F, 0x15, 0xF0, 0x22, 0x90, 0x8F, 0x12, 0x74, 0x05, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x92, 0x4C, 0xEF, \r
-0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57, 0x90, 0x8D, 0x02, 0xE0, 0xFF, 0x90, 0x92, 0x4C, 0xE0, 0xFE, \r
-0xEF, 0x4E, 0x90, 0x8D, 0x02, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, \r
-0x25, 0x51, 0x90, 0x8D, 0x07, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, \r
-0x08, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x09, 0xF0, 0x90, 0x00, \r
-0x03, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, \r
-0x25, 0x51, 0x90, 0x8D, 0x0B, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, \r
-0x0C, 0xF0, 0x22, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x2D, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, \r
-0x8E, 0x7F, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
-0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x7D, 0xE0, 0x54, 0xF0, 0x4E, \r
-0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x7B, 0xE0, \r
-0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x8E, 0x7D, 0xE0, 0x54, \r
-0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8E, 0x7E, 0xF0, 0x90, 0x00, 0x06, \r
-0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, \r
-0x91, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x24, \r
-0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, \r
-0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, \r
-0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x24, 0x90, 0x00, 0x06, 0x12, 0x06, \r
-0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x87, 0x50, 0x05, 0x74, 0x04, 0xF0, \r
-0x80, 0x02, 0xEF, 0xF0, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x24, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, \r
-0xFD, 0x7F, 0x02, 0x12, 0x4D, 0x73, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x24, 0x02, 0x64, 0x07, 0x90, \r
-0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x92, 0x3E, 0xF0, 0x90, 0x92, 0x3E, 0xE0, 0xFD, 0x70, 0x02, \r
-0x41, 0x4E, 0x90, 0x8D, 0x5D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, \r
-0x14, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
-0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x92, 0x3C, 0xE0, 0xFF, 0x74, \r
-0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, \r
-0xEF, 0x5D, 0x70, 0x02, 0x41, 0x2B, 0xE4, 0x90, 0x92, 0x3F, 0xF0, 0x90, 0x92, 0x3F, 0xE0, 0xF9, \r
-0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0x92, 0x3C, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, \r
-0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, \r
-0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x0D, 0x12, 0x45, \r
-0x18, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x92, 0x3C, \r
-0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, \r
-0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x8D, \r
-0x11, 0x12, 0x45, 0x18, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, \r
-0x90, 0x92, 0x3F, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0x92, 0x3E, 0xE0, 0xFF, 0x90, 0x92, 0x3C, \r
-0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, \r
-0x92, 0x3E, 0xF0, 0x90, 0x92, 0x3C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, \r
-0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x92, 0x3C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, \r
-0xF0, 0x90, 0x8D, 0x5E, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, \r
-0x70, 0x02, 0x21, 0x09, 0xE4, 0x90, 0x8D, 0x5E, 0xF0, 0x21, 0x09, 0x90, 0x01, 0xC0, 0xE0, 0x44, \r
-0x02, 0xF0, 0x90, 0x92, 0x3C, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x90, 0x92, 0x3C, 0xE0, \r
-0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x18, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x23, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x23, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, \r
-0x2D, 0xC3, 0x90, 0x92, 0x26, 0xE0, 0x94, 0xE8, 0x90, 0x92, 0x25, 0xE0, 0x94, 0x03, 0x40, 0x0B, \r
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x92, 0x25, 0xE4, 0x75, \r
-0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x2B, 0x12, \r
-0x45, 0x2D, 0x7F, 0x96, 0x7E, 0x02, 0x51, 0x4F, 0xEF, 0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, \r
-0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, \r
-0xE4, 0x3E, 0xFE, 0x90, 0x92, 0x2E, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x92, \r
-0x2E, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x2B, 0x12, 0x45, 0x24, \r
-0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x71, 0x6A, 0x90, 0x92, \r
-0x2E, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x92, 0x2B, 0x12, 0x45, 0x24, 0x71, 0xC5, 0x90, 0x02, 0x96, \r
-0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, \r
-0xFF, 0x90, 0x8D, 0xF6, 0xE0, 0xFE, 0x90, 0x8D, 0xF5, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, \r
-0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5F, \r
-0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x51, 0xA5, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, \r
-0x8D, 0xF5, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, \r
-0xE4, 0x90, 0x8D, 0xF5, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
-0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
-0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x92, 0x27, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0x2D, 0x90, 0x92, \r
-0x3D, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, \r
-0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x92, 0x28, 0x12, \r
-0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, \r
-0x03, 0x12, 0x35, 0x26, 0x90, 0x92, 0x27, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, \r
-0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0x24, 0xE9, 0x24, 0x02, 0xF9, 0xE4, \r
-0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x92, 0x28, 0x12, 0x45, 0x24, 0x90, 0x00, 0x0E, \r
-0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x8F, 0x57, \r
-0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x18, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xEF, \r
-0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, \r
-0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, \r
-0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0x90, 0x92, 0x33, 0x12, 0x45, 0x2D, 0xE4, 0xFF, 0x90, \r
-0x92, 0x33, 0x12, 0x45, 0x24, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, \r
-0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x47, 0xB8, 0xE4, 0xFD, 0x7F, 0x51, 0x12, \r
-0x47, 0xB8, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x47, 0xB8, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x47, 0xB8, \r
-0x91, 0xA0, 0xB1, 0x19, 0x91, 0xDB, 0x91, 0xFA, 0x02, 0x47, 0xD2, 0x75, 0x15, 0x10, 0xE4, 0xF5, \r
-0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, \r
-0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, \r
-0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, \r
-0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, \r
-0x7F, 0x54, 0x12, 0x47, 0xB8, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x47, 0xB8, 0x7D, 0xFF, 0x7F, 0x56, \r
-0x12, 0x47, 0xB8, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x47, 0xB8, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, \r
-0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, \r
-0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, \r
-0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0x01, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x13, 0xF0, \r
-0xA3, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, \r
-0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, \r
-0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, \r
-0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, \r
-0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, \r
-0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, \r
-0x22, 0x90, 0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x0D, 0x90, \r
-0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x12, 0x50, 0x12, 0x22, 0x90, 0x8D, 0xFA, \r
-0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, \r
-0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x7B, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x83, \r
-0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x5D, 0x22, 0x90, 0x8D, 0xFA, 0xE0, \r
-0xB4, 0x01, 0x14, 0x90, 0x8E, 0x7F, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x83, 0xE0, 0x54, 0xFE, 0xF0, \r
-0x54, 0x07, 0x70, 0x03, 0x12, 0x51, 0x5D, 0x22, 0x12, 0x7E, 0x6A, 0x90, 0x91, 0xAD, 0xEF, 0xF0, \r
-0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4D, 0x73, 0x90, 0x91, \r
-0xAD, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, \r
-0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x90, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x8E, \r
-0x95, 0xE0, 0xFB, 0xAC, 0x07, 0x90, 0x8E, 0x7B, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x8E, 0x91, 0xE0, \r
-0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0x8E, 0x87, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, \r
-0x90, 0x8E, 0x87, 0xF0, 0x7D, 0x03, 0x90, 0x8E, 0xAA, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, \r
-0x90, 0x8E, 0x94, 0xF0, 0x90, 0x8E, 0x8A, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0x8E, \r
-0x8A, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x87, 0xEB, 0xF0, 0x90, 0x8E, 0x8A, 0xA3, \r
-0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0x91, 0xAB, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, \r
-0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
-0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xA8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0xA6, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x21, 0x90, \r
-0x8E, 0xA6, 0xA3, 0xEB, 0x9F, 0xFD, 0xC3, 0x94, 0x0F, 0x50, 0x13, 0x74, 0x97, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x92, 0xE0, 0x04, 0xF0, 0xF1, 0x94, \r
-0x90, 0x8E, 0x92, 0xE0, 0xD3, 0x94, 0x64, 0x40, 0x4A, 0xE4, 0x90, 0x91, 0xAC, 0xF0, 0x90, 0x91, \r
-0xAB, 0xF0, 0x90, 0x91, 0xAB, 0xE0, 0xFF, 0xC3, 0x94, 0x0F, 0x50, 0x2A, 0x74, 0x97, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x91, 0xAC, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, \r
-0x94, 0x05, 0x40, 0x0A, 0x90, 0x91, 0xAB, 0xE0, 0x90, 0x8E, 0x91, 0xF0, 0x80, 0x08, 0x90, 0x91, \r
-0xAB, 0xE0, 0x04, 0xF0, 0x80, 0xCC, 0x90, 0x8E, 0x91, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0xD1, \r
-0x93, 0xF1, 0xC6, 0x22, 0x90, 0x8F, 0x12, 0xE0, 0xFF, 0x90, 0x8E, 0x88, 0xE0, 0xD3, 0x9F, 0x40, \r
-0x24, 0x90, 0x8E, 0x96, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0x8E, 0x90, \r
-0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x95, 0xF0, 0xFB, 0x90, 0x8E, 0x90, 0xE0, 0xFF, \r
-0xA3, 0xE0, 0xFD, 0xD1, 0x93, 0x22, 0xE4, 0xFF, 0x74, 0x97, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, \r
-0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, 0xEF, 0xE4, 0x90, 0x8E, 0x92, 0xF0, 0x90, 0x8E, \r
-0x96, 0xF0, 0x90, 0x8E, 0x90, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, \r
-0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, \r
-0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x91, 0x24, 0xE0, 0x2F, 0xFF, 0x90, 0x91, 0x23, 0xE0, 0x34, \r
-0x00, 0xFE, 0x90, 0x91, 0xA7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, 0xD0, 0xE0, 0xFD, 0xC3, 0xEE, \r
-0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x07, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, \r
-0xF0, 0x90, 0x91, 0x1F, 0x74, 0x18, 0xF0, 0x7E, 0x00, 0x7F, 0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
-0x91, 0x79, 0x27, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, 0x74, 0x3F, 0xF0, 0x74, 0x78, 0xA3, 0xF0, \r
-0x90, 0x90, 0xD0, 0xE0, 0xFF, 0x12, 0x6C, 0x8A, 0x90, 0x91, 0x1E, 0xEF, 0xF0, 0xF9, 0xE0, 0xFE, \r
-0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, 0xEE, 0x24, 0x28, 0xFD, \r
-0xE4, 0x33, 0xFC, 0x90, 0x91, 0x1F, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x91, 0x23, \r
-0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x91, \r
-0x09, 0xE0, 0xFD, 0x12, 0x6D, 0x7C, 0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, \r
-0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x91, 0x23, 0xE0, 0xFF, 0xA3, \r
-0xE0, 0x90, 0x91, 0x21, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0x27, 0x74, 0x01, 0xF0, 0xA3, \r
-0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, \r
-0x04, 0x12, 0x08, 0xD6, 0x90, 0x90, 0x35, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, \r
-0x90, 0x91, 0x23, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x91, 0x2B, 0xF0, \r
-0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0xCA, 0xE0, 0x90, 0x91, \r
-0x07, 0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, \r
-0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90, 0x91, 0x25, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, \r
-0x90, 0x91, 0x2C, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, \r
-0x02, 0x12, 0x08, 0xD6, 0xEF, 0x64, 0xFE, 0x70, 0x37, 0x90, 0x91, 0x23, 0xA3, 0xE0, 0x24, 0x00, \r
-0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x90, 0x75, 0x42, \r
-0x38, 0x75, 0x43, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, \r
-0x42, 0x38, 0x75, 0x43, 0x02, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x2E, 0x12, 0x35, 0x26, 0x80, 0x60, \r
-0x90, 0x90, 0xCB, 0xE0, 0xFF, 0xB4, 0x02, 0x2B, 0x90, 0x91, 0x23, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, \r
-0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, \r
-0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x91, 0x2E, 0xF0, 0xA3, 0x74, 0x20, \r
-0xF0, 0x80, 0x2D, 0xEF, 0xB4, 0x04, 0x29, 0x90, 0x91, 0x23, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, \r
-0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, \r
-0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0xF0, 0xE4, 0x90, 0x91, 0x2E, 0xF0, 0xA3, 0x74, 0x10, 0xF0, \r
-0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x91, 0x20, 0xF0, 0x90, \r
-0x91, 0x20, 0xE0, 0xFF, 0x24, 0x3A, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0x90, \r
-0x91, 0x23, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xEE, 0xF0, 0x90, 0x91, 0x20, 0xE0, 0xFF, 0x24, 0x3A, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, \r
-0xE0, 0xFE, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x91, \r
-0x20, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xB7, 0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x08, 0x12, \r
-0x08, 0xD6, 0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x91, 0x23, 0xE4, \r
-0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, \r
-0x90, 0x91, 0x23, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x91, 0xAA, 0xF0, 0xE4, \r
-0x90, 0x91, 0x20, 0xF0, 0x90, 0x91, 0x20, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x1B, 0x11, 0x15, \r
-0x90, 0x91, 0x1E, 0xEF, 0xF0, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, \r
-0xF0, 0x90, 0x91, 0x20, 0xE0, 0x04, 0xF0, 0x80, 0xDB, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3E, 0x50, \r
-0x90, 0x06, 0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x90, 0xD1, 0xE0, 0xFD, 0x75, 0xF0, 0x80, 0xA4, \r
-0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xAC, 0x7B, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, 0x90, 0xD0, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x94, 0x00, \r
-0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x91, 0x1F, 0xE0, \r
-0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0xAC, 0x7A, \r
-0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x27, \r
-0x90, 0xAC, 0xA0, 0x12, 0x45, 0x2D, 0x7A, 0x91, 0x79, 0x0A, 0x90, 0xAC, 0xA3, 0x12, 0x45, 0x2D, \r
-0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, 0x8F, 0x79, 0xF1, 0x12, 0x35, 0x86, 0x90, 0x91, 0xAA, \r
-0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x30, 0xE2, 0x0B, 0x90, 0x91, 0xAA, 0xE0, 0xC3, 0x94, \r
-0x0A, 0x50, 0x02, 0x41, 0x8F, 0x90, 0x91, 0xAA, 0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0A, 0x90, 0x06, \r
-0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, 0xF0, 0xE4, 0x90, 0x91, 0x20, 0xF0, 0x90, 0x91, 0x20, \r
-0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2D, 0x11, 0x15, 0x90, 0x91, 0x1E, 0xEF, 0xF0, 0x90, 0x91, \r
-0x20, 0xE0, 0x24, 0x0A, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x91, 0x1E, \r
-0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x20, 0xE0, \r
-0x04, 0xF0, 0x80, 0xC9, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2C, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x91, \r
-0xA9, 0xF0, 0x7D, 0x1D, 0x12, 0x57, 0xE5, 0xBF, 0x01, 0x10, 0x12, 0x52, 0x30, 0x90, 0x91, 0x1E, \r
-0xEF, 0xF0, 0x90, 0x90, 0xD0, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x91, 0xA9, 0xE0, 0xFF, 0x7D, \r
-0x1E, 0x12, 0x4F, 0x8C, 0x80, 0x10, 0x12, 0x52, 0x30, 0x90, 0x91, 0x1E, 0xEF, 0xF0, 0x90, 0x90, \r
-0xD0, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x8E, 0x82, 0xE0, \r
-0x70, 0x05, 0x7F, 0x01, 0x12, 0x4F, 0xBA, 0x74, 0x3F, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x78, \r
-0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x91, 0x06, 0xED, 0xF0, 0x90, 0x91, 0x04, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x91, 0x23, 0x90, 0x91, 0x04, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0xFD, 0x01, 0x3F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, 0xCC, 0xE0, 0xFD, 0xB4, \r
-0x02, 0x0C, 0x90, 0x91, 0x57, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, \r
-0x04, 0x0A, 0x90, 0x91, 0x57, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, \r
-0x60, 0x02, 0xA1, 0x1A, 0x90, 0x90, 0x32, 0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0xA1, 0x1A, 0xEF, \r
-0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, 0x02, 0xA1, 0x1A, 0x90, 0x90, 0x92, 0xE0, 0xFE, \r
-0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x91, 0x59, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, \r
-0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x17, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, \r
-0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x37, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, \r
-0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x20, 0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, \r
-0x01, 0x7A, 0x90, 0x79, 0x94, 0x90, 0xAC, 0x89, 0x12, 0x45, 0x2D, 0x7A, 0x91, 0x79, 0x37, 0x90, \r
-0xAC, 0x8C, 0x12, 0x45, 0x2D, 0x90, 0xAC, 0x8F, 0x74, 0x20, 0xF0, 0x7A, 0x90, 0x79, 0x01, 0x12, \r
-0x34, 0x5B, 0x75, 0x40, 0x01, 0x75, 0x41, 0x91, 0x75, 0x42, 0x3F, 0x75, 0x43, 0x18, 0x7B, 0x01, \r
-0x7A, 0x91, 0x79, 0x17, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x75, 0x41, 0x91, 0x75, 0x42, 0x1F, \r
-0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x07, 0x12, 0x35, 0x26, 0x90, 0x91, 0x1D, 0xE0, \r
-0x54, 0x03, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8F, 0xEF, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, \r
-0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x07, 0xB1, 0x1F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0x91, 0x5B, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0x2D, 0x90, 0x91, 0x5C, 0x12, 0x45, 0x24, 0x8B, 0x40, \r
-0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x5F, 0x12, 0x35, 0x26, \r
-0x90, 0x91, 0x5B, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xD1, 0x03, 0x90, 0x91, 0x5C, 0x12, \r
-0x45, 0x24, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, \r
-0x04, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x5F, 0x12, 0x35, 0x26, 0x90, 0x91, 0x5B, 0xE0, 0x75, 0xF0, \r
-0x08, 0xA4, 0x24, 0x03, 0xD1, 0x03, 0x90, 0x91, 0x5C, 0x12, 0x45, 0x24, 0xE9, 0x24, 0x08, 0xF9, \r
-0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x91, 0x79, \r
-0x5F, 0x12, 0x35, 0x26, 0x90, 0x91, 0x5B, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xD1, 0x03, \r
-0x90, 0x91, 0x5C, 0x12, 0x45, 0x24, 0xE9, 0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, \r
-0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x5F, 0x12, 0x35, 0x26, 0x90, 0x91, \r
-0x5B, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xD1, 0x03, 0x90, 0x91, 0x5B, 0xE0, 0xFE, 0x44, \r
-0x10, 0x90, 0x91, 0x5F, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, \r
-0x75, 0xF0, 0x08, 0xA4, 0xD1, 0x03, 0x90, 0x91, 0x5F, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0x90, 0x91, 0x5B, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x04, 0xD1, 0x03, 0x90, 0x06, 0x72, \r
-0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x5F, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, \r
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, \r
-0xA2, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x77, 0xF0, 0x90, \r
-0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, \r
-0x7E, 0x00, 0x02, 0x3E, 0x50, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0, 0xB5, \r
-0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80, 0x06, \r
-0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xE4, 0x90, 0x91, 0xAE, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x48, 0x12, 0x90, 0x91, 0xAE, 0xEF, 0xF0, 0x7F, 0x83, 0x12, \r
-0x48, 0x12, 0xAE, 0x07, 0x90, 0x91, 0xAE, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x91, \r
-0xB0, 0xE0, 0x94, 0x64, 0x90, 0x91, 0xAF, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, \r
-0x44, 0x40, 0xF0, 0x90, 0x91, 0xAE, 0xE0, 0xFF, 0x22, 0x90, 0x91, 0xAF, 0xE4, 0x75, 0xF0, 0x01, \r
-0x12, 0x08, 0xD6, 0x80, 0xBE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0xD8, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0x91, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0x91, 0xDA, \r
-0x12, 0x45, 0x00, 0x12, 0x08, 0x3A, 0x90, 0x91, 0xE2, 0x12, 0x45, 0x0C, 0x12, 0x44, 0xE6, 0xC0, \r
-0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x91, 0xDA, 0x12, 0x45, 0x00, 0x90, 0x91, 0xDE, \r
-0x12, 0x45, 0x0C, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, \r
-0xF3, 0x90, 0x91, 0xE6, 0x12, 0x08, 0x6D, 0x90, 0x91, 0xE6, 0x12, 0x45, 0x00, 0x90, 0xAA, 0xB9, \r
-0x12, 0x08, 0x6D, 0x90, 0x91, 0xD8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0xC6, 0xEC, 0xF0, 0xA3, \r
-0xED, 0xF0, 0x90, 0x91, 0xC5, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0x91, \r
-0xD0, 0x12, 0x08, 0x6D, 0x90, 0x91, 0xC8, 0x12, 0x45, 0x00, 0x12, 0x08, 0x3A, 0x90, 0x91, 0xD0, \r
-0x12, 0x45, 0x0C, 0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x91, \r
-0xC8, 0x12, 0x45, 0x00, 0x90, 0x91, 0xCC, 0x12, 0x45, 0x0C, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, \r
-0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0x91, 0xD4, 0x12, 0x08, 0x6D, 0x90, 0x91, \r
-0xC6, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x91, 0xD4, 0x12, 0x45, 0x00, 0x90, 0xAA, 0x96, 0x12, \r
-0x08, 0x6D, 0x90, 0x91, 0xC5, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xEE, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
-0x16, 0x90, 0x90, 0xEE, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x90, 0xE8, 0x74, 0x01, \r
-0xF0, 0x22, 0xE4, 0x90, 0x90, 0xE8, 0xF0, 0x22, 0x90, 0x90, 0xDC, 0xE0, 0x54, 0xFE, 0xF0, 0x54, \r
-0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, \r
-0x90, 0xDC, 0xE0, 0x30, 0xE0, 0x38, 0x90, 0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x70, 0x30, 0x90, 0x92, \r
-0x4F, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x90, 0xDE, 0xE0, 0x04, 0xF0, 0xE4, 0x90, \r
-0x92, 0x4F, 0xF0, 0x90, 0x90, 0xDE, 0xE0, 0xFF, 0x90, 0x90, 0xDD, 0xE0, 0xD3, 0x9F, 0x50, 0x0E, \r
-0x90, 0x90, 0xDF, 0xE0, 0x70, 0x08, 0xE4, 0x90, 0x90, 0xDE, 0xF0, 0x12, 0x54, 0x66, 0x22, 0xE4, \r
-0x90, 0x92, 0x46, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, 0xC3, 0x90, 0x92, \r
-0x47, 0xE0, 0x94, 0xD0, 0x90, 0x92, 0x46, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01, 0xC1, 0xE0, \r
-0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x92, 0x46, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, \r
-0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, \r
-0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, \r
-0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, \r
-0x01, 0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xFD, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x90, 0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8F, 0x1D, 0xE0, 0x20, 0xE0, 0x02, 0x21, 0x70, 0xEC, \r
-0xC3, 0x99, 0x40, 0x02, 0x21, 0x70, 0x90, 0x90, 0xFD, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, \r
-0xFD, 0x11, 0xF0, 0xAF, 0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
-0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, \r
-0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x90, 0xFF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, \r
-0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFB, 0xEF, \r
-0x24, 0x18, 0xFF, 0xE4, 0x33, 0xCF, 0x2B, 0xCF, 0x3A, 0x90, 0x90, 0xFF, 0x8F, 0xF0, 0x12, 0x08, \r
-0xD6, 0x90, 0x90, 0xFF, 0x11, 0x5C, 0x90, 0x90, 0xFF, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x90, \r
-0xFD, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, \r
-0x90, 0x90, 0xFE, 0xE0, 0x9F, 0x90, 0x90, 0xFD, 0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF8, 0xE0, \r
-0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, 0x90, 0xFE, 0xE0, 0x9F, \r
-0xF0, 0x90, 0x90, 0xFD, 0xE0, 0x9E, 0xF0, 0x90, 0x90, 0xFD, 0x12, 0x5F, 0xD1, 0x0C, 0x01, 0xAF, \r
-0x22, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, \r
-0x01, 0x20, 0xE1, 0x02, 0x7F, 0x02, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x90, \r
-0xFD, 0x12, 0x45, 0x2D, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x05, 0x12, 0x65, 0x52, 0x41, 0xBF, 0x90, \r
-0x8F, 0xEF, 0x74, 0x05, 0xF0, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x24, 0x12, 0x06, 0x89, 0xFF, 0x54, \r
-0x01, 0xFE, 0x90, 0x8F, 0x20, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, \r
-0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, \r
-0xFF, 0x90, 0x8F, 0x20, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, \r
-0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x8F, 0x20, 0xF0, 0xEE, \r
-0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, \r
-0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x20, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, \r
-0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFF, 0x90, 0x8F, 0x21, 0xE0, 0x54, \r
-0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, \r
-0xE0, 0x44, 0x04, 0xF0, 0x90, 0x90, 0xFD, 0x12, 0x45, 0x24, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x8D, 0x06, 0xE0, \r
-0xB4, 0x02, 0x0D, 0x90, 0x8F, 0x21, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x51, \r
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x80, 0x4F, \r
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x22, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, \r
-0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x23, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, \r
-0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x8F, 0x21, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, \r
-0x20, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x48, \r
-0x45, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x25, 0xE0, 0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, \r
-0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8F, 0x25, 0xF0, 0x90, 0x8F, 0x20, 0xE0, 0xC4, 0x54, \r
-0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, \r
-0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8F, 0x25, 0xE0, 0x44, 0x01, 0xF0, \r
-0x22, 0x90, 0x90, 0xF9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x91, 0x01, 0xF0, 0x90, 0x91, \r
-0x01, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x90, 0xFA, 0xE0, 0x24, 0x04, 0xFF, 0x90, \r
-0x90, 0xF9, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x5E, 0x07, 0x90, 0x91, 0x01, 0xE0, 0x24, 0xFB, 0xF5, \r
-0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x01, 0xE0, 0x04, 0xF0, 0x80, 0xCE, \r
-0x78, 0x26, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFB, 0x7E, 0x00, 0x7F, 0x06, \r
-0x12, 0x46, 0xE2, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0xFF, 0x74, 0xE7, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
-0x04, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xE3, 0x90, 0x8F, 0xEF, 0xE0, 0x90, 0x04, \r
-0x8C, 0xF0, 0x22, 0x90, 0x90, 0xF9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0x02, \r
-0x7C, 0x91, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x56, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, \r
-0x63, 0x78, 0x08, 0x7C, 0x91, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x5C, 0x7E, 0x00, 0x7F, \r
-0x04, 0x12, 0x06, 0x63, 0x78, 0x0C, 0x7C, 0x91, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, \r
-0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0xE4, 0x90, 0x91, 0x11, 0xF0, 0x90, 0x90, 0xFB, 0xE0, \r
-0xFF, 0x90, 0x90, 0xFA, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x06, \r
-0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x08, 0x60, 0x02, 0xA1, 0x63, \r
-0x90, 0x90, 0xFB, 0xE0, 0xFF, 0x90, 0x90, 0xFA, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0x34, \r
-0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x06, \r
-0x60, 0x02, 0xA1, 0x63, 0x90, 0x91, 0x11, 0x04, 0xF0, 0xE4, 0x90, 0x91, 0x10, 0xF0, 0x90, 0x91, \r
-0x10, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x25, 0x90, 0x90, 0xFA, 0xE0, 0x24, 0x0A, 0xFD, 0x90, \r
-0x90, 0xF9, 0xE0, 0x12, 0x5D, 0xFA, 0x90, 0x91, 0x10, 0xE0, 0x24, 0xFC, 0xF5, 0x82, 0xE4, 0x34, \r
-0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x10, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xFC, 0x7C, \r
-0x90, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2C, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x46, 0xE2, \r
-0xEF, 0x60, 0x02, 0xA1, 0x63, 0x90, 0x91, 0x10, 0xF0, 0x90, 0x91, 0x10, 0xE0, 0xFF, 0xC3, 0x94, \r
-0x04, 0x50, 0x2E, 0x90, 0x90, 0xFB, 0xE0, 0xFD, 0x90, 0x90, 0xFA, 0xE0, 0x2D, 0xFD, 0x90, 0x90, \r
-0xF9, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0x12, 0x5D, 0xF9, 0x90, 0x91, 0x10, 0xE0, 0x24, 0x0C, \r
-0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x10, 0xE0, 0x04, 0xF0, 0x80, \r
-0xC8, 0x78, 0x0C, 0x7C, 0x91, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x41, 0x7E, 0x00, 0x7F, \r
-0x04, 0x12, 0x46, 0xE2, 0xEF, 0x60, 0x02, 0xA1, 0x5A, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, 0x54, \r
-0xDF, 0xF0, 0x90, 0x8F, 0x1F, 0xE0, 0x30, 0xE0, 0x0F, 0x90, 0x01, 0xC7, 0x74, 0x09, 0xF0, 0x90, \r
-0x8F, 0x25, 0xE0, 0x44, 0x01, 0xF0, 0xA1, 0x63, 0xE4, 0x90, 0x91, 0x10, 0xF0, 0x90, 0x91, 0x10, \r
-0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x1A, 0x12, 0x5D, 0xE5, 0x90, 0x91, 0x10, 0xE0, 0x24, 0x02, \r
-0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x10, 0xE0, 0x04, 0xF0, 0x80, \r
-0xDC, 0xE4, 0x90, 0x91, 0x10, 0xF0, 0x90, 0x91, 0x10, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, \r
-0x90, 0x90, 0xFB, 0xE0, 0xFD, 0x90, 0x90, 0xFA, 0xE0, 0x2D, 0xFD, 0x90, 0x90, 0xF9, 0xE0, 0x34, \r
-0x00, 0xCD, 0x24, 0x16, 0x12, 0x5D, 0xF9, 0x90, 0x91, 0x10, 0xE0, 0x24, 0x08, 0xF5, 0x82, 0xE4, \r
-0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x10, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x7B, 0x01, \r
-0x7A, 0x91, 0x79, 0x02, 0x90, 0x91, 0xED, 0x12, 0x45, 0x2D, 0xE4, 0x90, 0x91, 0xF0, 0xF0, 0xA3, \r
-0xF0, 0x7A, 0x91, 0x79, 0x08, 0x12, 0x54, 0x8A, 0x80, 0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, \r
-0x54, 0xEF, 0xF0, 0x90, 0x91, 0x11, 0xE0, 0xFF, 0x22, 0x90, 0x91, 0x26, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0xA3, 0xED, 0xF0, 0x2F, 0xFF, 0xE4, 0x3E, 0xCF, 0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, \r
-0xFD, 0x12, 0x5E, 0x07, 0xBF, 0x86, 0x23, 0x90, 0x91, 0x28, 0xE0, 0xFF, 0x90, 0x91, 0x27, 0xE0, \r
-0x2F, 0xFF, 0x90, 0x91, 0x26, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, \r
-0xFD, 0x12, 0x5E, 0x07, 0xBF, 0xDD, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x90, 0xF9, \r
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xFC, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, \r
-0x7A, 0x40, 0x79, 0x6A, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0x02, 0x7C, 0x91, 0x7D, \r
-0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x70, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x06, 0x63, 0x78, 0x12, \r
-0x7C, 0x91, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x80, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x06, \r
-0x63, 0xE4, 0x90, 0x91, 0x25, 0xF0, 0x90, 0x90, 0xF9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0xFD, 0xB1, 0x69, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xF8, 0x90, 0x90, 0xFB, 0xE0, 0xFF, 0x90, \r
-0x90, 0xFA, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x0E, 0xCF, 0x34, \r
-0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x3A, 0x60, 0x02, 0xE1, 0xF8, 0x90, 0x90, \r
-0xFB, 0xE0, 0xFF, 0x90, 0x90, 0xFA, 0xE0, 0x2F, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xCF, \r
-0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x87, 0x60, 0x02, \r
-0xE1, 0xF8, 0x90, 0x91, 0x25, 0x04, 0xF0, 0xE4, 0x90, 0x91, 0x22, 0xF0, 0x90, 0x91, 0x22, 0xE0, \r
-0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x90, 0x90, 0xFB, 0xE0, 0xFD, 0x90, 0x90, 0xFA, 0xE0, 0x2D, \r
-0xFD, 0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x38, 0x12, 0x5D, 0xF9, 0x90, 0x91, 0x22, \r
-0xE0, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x22, 0xE0, \r
-0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x91, 0x23, 0xF0, 0x90, 0x91, 0x23, 0xE0, 0xFF, 0xC3, 0x94, \r
-0x02, 0x40, 0x02, 0xE1, 0xF8, 0x75, 0xF0, 0x38, 0xEF, 0x90, 0x8F, 0x4F, 0x12, 0x45, 0x18, 0xE0, \r
-0x20, 0xE0, 0x02, 0xE1, 0xF8, 0xE4, 0x90, 0x91, 0x24, 0xF0, 0x90, 0x91, 0x23, 0xE0, 0xFF, 0x75, \r
-0xF0, 0x38, 0x90, 0x8F, 0x50, 0x12, 0x45, 0x18, 0xE0, 0xFE, 0x90, 0x91, 0x24, 0xE0, 0xC3, 0x9E, \r
-0x40, 0x02, 0xE1, 0xF0, 0xEF, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x67, 0xF9, 0x74, 0x8F, 0x35, 0xF0, \r
-0xFA, 0x7B, 0x01, 0xE0, 0x75, 0xF0, 0x10, 0xA4, 0x29, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0x12, \r
-0x7C, 0x91, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x46, 0xE2, 0xEF, 0x60, 0x02, 0xE1, 0xE1, \r
-0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x91, 0x22, 0xF0, 0x90, 0x91, \r
-0x22, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90, 0x90, 0xFB, 0xE0, 0xFD, 0x90, 0x90, 0xFA, \r
-0xE0, 0x2D, 0xFD, 0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x4A, 0x12, 0x5D, 0xF9, 0x90, \r
-0x91, 0x22, 0xE0, 0x24, 0xFC, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, \r
-0x22, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x91, 0x22, 0xF0, 0x90, 0x91, 0x22, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x10, 0x50, 0x1A, 0x12, 0x5D, 0xE5, 0x90, 0x91, 0x22, 0xE0, 0x24, 0x02, 0xF5, 0x82, \r
-0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x22, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0x90, \r
-0x91, 0x23, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F, 0x4F, 0x12, 0x45, 0x18, 0xE0, 0xFE, 0xC3, \r
-0x13, 0x30, 0xE0, 0x21, 0xEF, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x57, 0xF9, 0x74, 0x8F, 0x35, 0xF0, \r
-0xFA, 0x7B, 0x01, 0x78, 0x02, 0x7C, 0x91, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x46, 0xE2, \r
-0xEF, 0x70, 0x45, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xFC, 0x90, 0x91, 0x29, 0x12, 0x45, \r
-0x2D, 0x7A, 0x91, 0x79, 0x12, 0x90, 0x91, 0x2C, 0x12, 0x45, 0x2D, 0x90, 0x91, 0x23, 0xE0, 0x75, \r
-0xF0, 0x38, 0xA4, 0x24, 0x51, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x90, 0x91, 0x2F, 0x12, 0x45, \r
-0x2D, 0xE4, 0x90, 0x91, 0x32, 0xF0, 0xA3, 0xF0, 0x7A, 0x91, 0x79, 0x02, 0x12, 0x88, 0x49, 0x80, \r
-0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90, 0x91, 0x24, 0xE0, 0x04, 0xF0, 0xC1, 0xBA, \r
-0x90, 0x91, 0x23, 0xE0, 0x04, 0xF0, 0xC1, 0x99, 0x90, 0x91, 0x25, 0xE0, 0xFF, 0x22, 0x90, 0x91, \r
-0x60, 0x12, 0x45, 0x2D, 0x90, 0x91, 0x63, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, \r
-0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xBF, 0x12, 0x35, 0x26, 0x90, 0x91, 0x60, 0x12, \r
-0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, \r
-0xCF, 0x12, 0x35, 0x26, 0x90, 0x91, 0x66, 0x12, 0x45, 0x00, 0x90, 0x8F, 0xDF, 0x12, 0x08, 0x6D, \r
-0x90, 0x91, 0x6A, 0xE0, 0x90, 0x8F, 0xE6, 0xF0, 0x22, 0x90, 0x91, 0x26, 0x12, 0x45, 0x2D, 0x90, \r
-0x05, 0x22, 0xE0, 0x90, 0x91, 0x37, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x39, 0x12, \r
-0x57, 0xE5, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x90, 0xCF, 0x12, 0x52, 0x33, 0x90, 0x91, 0x34, \r
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0x34, 0x12, 0x6D, 0x36, 0x90, 0x91, 0x36, 0xEF, 0xF0, \r
-0x90, 0x91, 0x34, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x91, \r
-0x32, 0xE0, 0xFD, 0x12, 0x6D, 0x7C, 0x90, 0x91, 0x33, 0xE0, 0x60, 0x02, 0x21, 0x88, 0xA3, 0xA3, \r
-0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x91, 0x29, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, \r
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x91, 0x26, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, \r
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x91, 0x2C, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, \r
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x60, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x91, 0x2C, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, \r
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x2F, 0x24, 0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, \r
-0x90, 0x91, 0x2F, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, \r
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x91, 0x2C, 0x12, 0x45, 0x24, 0x90, 0x91, \r
-0x63, 0x12, 0x45, 0x2D, 0x90, 0x91, 0x66, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x20, 0x90, 0x91, \r
-0x6A, 0x74, 0x3A, 0xF0, 0x90, 0x91, 0x26, 0x12, 0x45, 0x24, 0x12, 0x87, 0xFE, 0x90, 0x91, 0x34, \r
-0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, \r
-0x41, 0x89, 0x42, 0x75, 0x43, 0x28, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x38, 0x12, 0x35, 0x26, 0x90, \r
-0x91, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
-0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xBF, 0x75, 0x43, 0x28, 0xD0, 0x03, \r
-0x12, 0x35, 0x26, 0x90, 0x91, 0x36, 0xE0, 0xFF, 0x90, 0x91, 0x35, 0xE0, 0x2F, 0xFF, 0x90, 0x91, \r
-0x34, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xFD, 0xE4, 0x3F, 0xFC, 0x90, 0x90, 0xCF, 0xE0, 0xFB, \r
-0x7F, 0x3A, 0x51, 0x50, 0x90, 0x91, 0x34, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, \r
-0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x91, 0x75, 0x42, 0x38, \r
-0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, 0xF0, 0x90, \r
-0x91, 0x37, 0xE0, 0xFF, 0x7D, 0x3A, 0x12, 0x4F, 0x8C, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x91, 0x60, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, \r
-0xEB, 0xF0, 0xAA, 0x07, 0x90, 0x91, 0x67, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91, \r
-0x62, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEA, 0x24, 0xEF, 0x60, 0x6E, 0x24, 0xD7, 0x70, \r
-0x02, 0x81, 0x57, 0x24, 0x3A, 0x60, 0x02, 0x81, 0xE0, 0x90, 0x91, 0x60, 0xA3, 0xE0, 0xFF, 0x24, \r
-0x0A, 0xFD, 0xE4, 0x33, 0x90, 0x91, 0x6B, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82, \r
+0x90, 0x93, 0xAB, 0xE0, 0x24, 0x2C, 0xF1, 0x94, 0x90, 0x93, 0xAB, 0xE0, 0x2F, 0x24, 0x30, 0xA3, \r
+0xF0, 0xE0, 0xFD, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x05, \r
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, \r
+0x90, 0x90, 0xE7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, \r
+0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, \r
+0xE9, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xED, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x91, 0xC7, 0x90, 0x93, 0xAB, 0xEF, 0xF0, 0x90, 0x90, 0xE3, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x1C, 0x90, 0x93, 0xAB, 0xE0, 0x24, 0x00, 0xF9, 0xE4, \r
+0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x8F, 0x43, 0x7B, 0x01, 0x7A, 0x90, 0x79, \r
+0xF1, 0x12, 0x35, 0x26, 0x90, 0x93, 0x86, 0xE0, 0xFF, 0x91, 0xC7, 0x90, 0x93, 0xAB, 0xEF, 0xF0, \r
+0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x90, 0xE5, \r
+0xA3, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x11, 0x02, 0x35, 0x26, 0xEF, 0x60, 0x05, \r
+0x12, 0xA6, 0xA2, 0x91, 0xDB, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, \r
+0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, \r
+0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, \r
+0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x2E, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, \r
+0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x8F, 0x2E, \r
+0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, \r
+0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x2E, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, \r
+0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFF, 0x90, 0x8F, 0x30, \r
+0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFF, 0x90, 0x8F, \r
+0x2F, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, \r
+0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8F, 0x2E, \r
+0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0xD1, 0xD4, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x54, 0x01, \r
+0xFF, 0xF1, 0xC5, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x9C, 0x3B, \r
+0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0xF1, 0xD0, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x01, 0xFF, 0xB1, 0xDD, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0x01, 0xFF, 0x91, 0x0A, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xD1, 0xDF, 0x22, 0x91, \r
+0xC7, 0x90, 0x93, 0xAB, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xF1, 0x77, 0x90, 0x93, \r
+0xAD, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, \r
+0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x4D, 0x12, 0x35, \r
+0x26, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, \r
+0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x53, \r
+0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, \r
+0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, \r
+0x79, 0x57, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, \r
+0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, \r
+0x7A, 0x8F, 0x79, 0x5D, 0x02, 0x35, 0x26, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0xFD, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, \r
+0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x09, 0xAF, 0x03, 0x12, \r
+0x7F, 0x28, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x22, 0xE4, \r
+0x90, 0x8D, 0xFF, 0xF0, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x93, 0x7F, 0xE0, 0xFF, 0xF1, 0xDE, 0x22, \r
+0xEF, 0x60, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x80, 0xF0, 0x12, 0xA8, 0xA5, 0x22, 0x91, 0xC7, \r
+0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, \r
+0x75, 0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x61, 0x02, 0x35, 0x26, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x5A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, \r
+0x90, 0x95, 0x5A, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, \r
+0x95, 0x5D, 0xE0, 0x94, 0xE8, 0x90, 0x95, 0x5C, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, \r
+0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x95, 0x5C, 0xE4, 0x75, 0xF0, 0x01, 0x12, \r
+0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, \r
+0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
+0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, \r
+0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, \r
+0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, \r
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x95, 0x5E, \r
+0xEF, 0xF0, 0xA3, 0x12, 0x44, 0x12, 0x90, 0x95, 0x7C, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, \r
+0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, \r
+0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x5F, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, \r
+0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x5E, 0xE0, \r
+0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, \r
+0x12, 0x44, 0x09, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, \r
+0x95, 0x5F, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, \r
+0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x7F, 0xF5, 0x7E, 0x01, \r
+0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0xAB, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, \r
+0x79, 0xAB, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, \r
+0x90, 0x93, 0xAD, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, \r
+0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xAE, 0xF0, 0x7B, 0x01, 0x7A, 0x93, \r
+0x79, 0xAB, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, \r
+0x90, 0x93, 0xAF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, \r
+0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xAC, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0xB4, 0xF0, 0x90, 0x93, 0xB0, \r
+0xE0, 0x90, 0x93, 0xB5, 0xF0, 0x02, 0x6F, 0x0A, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, \r
+0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, \r
+0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, \r
+0x90, 0x95, 0x72, 0x12, 0x44, 0x12, 0xE4, 0xFF, 0x90, 0x95, 0x72, 0x12, 0x44, 0x09, 0x8F, 0x82, \r
+0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, \r
+0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, \r
+0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x02, \r
+0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, \r
+0x18, 0xF0, 0x22, 0x75, 0x1D, 0x07, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90, \r
+0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, \r
+0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, \r
+0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, \r
+0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC7, \r
+0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x84, 0xF0, 0x74, 0x7A, 0xA3, 0xF0, \r
+0x90, 0x93, 0x88, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, \r
+0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8D, \r
+0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1B, \r
+0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, \r
+0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, \r
+0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0x5C, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, \r
+0x20, 0xF0, 0x51, 0xC6, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0x8F, 0x90, 0x93, 0x84, 0xE0, 0xFF, \r
+0x7B, 0x08, 0x7D, 0x01, 0x12, 0x56, 0xAE, 0x90, 0x94, 0x59, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
+0x94, 0x59, 0x12, 0x77, 0x77, 0x90, 0x94, 0x5B, 0xEF, 0xF0, 0x90, 0x94, 0x59, 0xA3, 0xE0, 0x24, \r
+0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xE4, 0xFD, 0xD1, 0x4C, 0x90, 0x94, 0x5B, 0xE0, \r
+0xFF, 0x90, 0x94, 0x5A, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x59, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, \r
+0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x5C, 0xF0, 0xA3, 0xEF, 0xF0, 0xD1, 0xF6, 0x90, 0x94, 0x5C, \r
+0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xE4, 0xFF, 0x71, 0x90, 0x90, 0x94, \r
+0x5C, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x80, 0xE0, 0xFB, 0x7F, 0x11, 0x71, 0x90, 0x90, \r
+0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x90, 0xEF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, \r
+0xEB, 0xF0, 0xAA, 0x07, 0x90, 0x95, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x95, \r
+0x2C, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEA, 0x24, 0xEF, 0x60, 0x6E, 0x24, 0xD7, 0x70, \r
+0x02, 0xA1, 0x97, 0x24, 0x3A, 0x60, 0x02, 0xC1, 0x20, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFF, 0x24, \r
+0x0A, 0xFD, 0xE4, 0x33, 0x90, 0x95, 0x35, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82, \r
 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
 0x83, 0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x7D, 0x14, \r
-0x7C, 0x00, 0x12, 0x26, 0x4E, 0x90, 0x91, 0x67, 0x12, 0x08, 0x6D, 0x7B, 0x00, 0x7A, 0x00, 0x79, \r
-0x00, 0x90, 0xAC, 0x67, 0x12, 0x45, 0x2D, 0x90, 0x91, 0x67, 0x12, 0x45, 0x00, 0x90, 0xAC, 0x6A, \r
-0x12, 0x08, 0x6D, 0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0x81, 0x52, 0x90, 0x91, 0x60, 0xE4, 0x75, \r
-0xF0, 0x14, 0x12, 0x08, 0xD6, 0x90, 0x91, 0x60, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0xE4, \r
-0x33, 0x90, 0x91, 0x6B, 0xF0, 0xA3, 0xCC, 0xF0, 0x90, 0x91, 0x6B, 0xA3, 0xE0, 0xFE, 0x24, 0x00, \r
+0x7C, 0x00, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x7B, 0x00, 0x7A, 0x00, 0x79, \r
+0x00, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x90, 0xAC, 0x6A, \r
+0x12, 0x08, 0x6D, 0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0xA1, 0x92, 0x90, 0x95, 0x2A, 0xE4, 0x75, \r
+0xF0, 0x14, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0xE4, \r
+0x33, 0x90, 0x95, 0x35, 0xF0, 0xA3, 0xCC, 0xF0, 0x90, 0x95, 0x35, 0xA3, 0xE0, 0xFE, 0x24, 0x00, \r
 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, \r
 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
 0xFE, 0xA9, 0x03, 0x74, 0x05, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7C, 0x00, \r
-0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x91, 0x65, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x91, 0x60\r
+0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x95, 0x2F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x2A\r
 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, 0x94, 0x00, 0xEE, 0x94, 0x01, \r
-0x90, 0x91, 0x60, 0x50, 0x02, 0x61, 0xEC, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, 0x7C, 0x00, 0x24, \r
+0x90, 0x95, 0x2A, 0x50, 0x02, 0xA1, 0x2C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, 0x7C, 0x00, 0x24, \r
 0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, 0x01, 0x9E, 0xFC, \r
-0x12, 0x26, 0x4E, 0x90, 0x91, 0x67, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x62, 0xE0, 0x24, 0x01, 0xFF, \r
-0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x91, 0x67, 0x12, 0x45\r
-0x0C, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0x7B, 0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90, \r
-0x91, 0x60, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xE4, 0x9F, 0xFF, 0x74, 0x01, 0x9E, 0xFE, 0x90, \r
-0x91, 0x65, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, 0x26, 0x4E, 0xD0, \r
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x44, 0xD9, 0x90, 0x91, 0x67, 0x12, 0x08, 0x6D, \r
-0x90, 0x91, 0x62, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x80, 0x1E, 0xA3, 0xE0, 0x7E, 0x00, \r
-0x24, 0x00, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x91, 0x65, 0xE0, 0xFC, 0xA3, 0xE0, \r
-0xFD, 0x12, 0x26, 0x4E, 0x90, 0x91, 0x67, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x60, 0x74, 0xFF, 0x75, \r
-0xF0, 0xEC, 0x12, 0x08, 0xD6, 0x90, 0x91, 0x60, 0xA3, 0xE0, 0xFF, 0x7E, 0x00, 0x24, 0x0C, 0xF9, \r
+0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2C, 0xE0, 0x24, 0x01, 0xFF, \r
+0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x95, 0x31, 0x12, 0x43\r
+0xF1, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0x7B, 0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90, \r
+0x95, 0x2A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xE4, 0x9F, 0xFF, 0x74, 0x01, 0x9E, 0xFE, 0x90, \r
+0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, 0x26, 0x4E, 0xD0, \r
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, \r
+0x90, 0x95, 0x2C, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x80, 0x1E, 0xA3, 0xE0, 0x7E, 0x00, \r
+0x24, 0x00, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0, \r
+0xFD, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2A, 0x74, 0xFF, 0x75, \r
+0xF0, 0xEC, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFF, 0x7E, 0x00, 0x24, 0x0C, 0xF9, \r
 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0x74, 0x10, 0x2F, 0xF9, 0xEE, 0x34, \r
-0xFC, 0xFA, 0x90, 0xAC, 0x67, 0x12, 0x45, 0x2D, 0x90, 0x91, 0x67, 0x12, 0x45, 0x00, 0x90, 0xAC, \r
-0x6A, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x65, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD0, 0x01, 0xD0, 0x02, \r
-0x7F, 0x11, 0x12, 0x1B, 0xAC, 0x81, 0xD8, 0x90, 0x91, 0x60, 0xA3, 0xE0, 0xFF, 0x24, 0x2A, 0xFD, \r
-0xE4, 0x33, 0x90, 0x91, 0x6B, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xFA, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x90, 0xAC, \r
+0x6A, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD0, 0x01, 0xD0, 0x02, \r
+0x7F, 0x11, 0x12, 0x1B, 0xAC, 0xC1, 0x18, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFF, 0x24, 0x2A, 0xFD, \r
+0xE4, 0x33, 0x90, 0x95, 0x35, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, \r
 0xF0, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x7D, 0x48, 0x7C, 0x00, 0x12, \r
-0x26, 0x4E, 0x90, 0x91, 0x67, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x67, 0x12, 0x45, 0x00, 0x78, 0x10, \r
-0x12, 0x08, 0x47, 0x90, 0x91, 0x67, 0x12, 0x45, 0x0C, 0x12, 0x44, 0xD9, 0xE4, 0xFD, 0xFC, 0x90, \r
-0x91, 0x67, 0x12, 0x08, 0x6D, 0x90, 0x91, 0x67, 0x12, 0x45, 0x00, 0x78, 0x10, 0x12, 0x08, 0x47, \r
-0x90, 0x91, 0x67, 0x12, 0x45, 0x0C, 0x12, 0x44, 0xD9, 0x90, 0x91, 0x67, 0x12, 0x08, 0x6D, 0x90, \r
-0x91, 0x67, 0x12, 0x45, 0x00, 0x12, 0x08, 0x3A, 0x90, 0x91, 0x63, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0x91, 0x63, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0x91, 0x6B, 0xA3, 0xE0, 0xFE, \r
+0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x78, 0x10, \r
+0x12, 0x08, 0x47, 0x90, 0x95, 0x31, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x90, 0xE4, 0xFD, 0xFC, 0x90, \r
+0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x78, 0x10, 0x12, 0x08, 0x47, \r
+0x90, 0x95, 0x31, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x90, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, \r
+0x95, 0x31, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x2D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x95, 0x2D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0x95, 0x35, 0xA3, 0xE0, 0xFE, \r
 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x91, 0x09, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x09, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x06, 0x70, 0x39, 0x90, 0x91, \r
-0x09, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x14, 0x12, 0x5E, 0x07, 0xEF, 0x70, 0x29, 0x90, 0x91, \r
-0x09, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x15, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x50, 0x70, 0x17, \r
-0x90, 0x91, 0x09, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x21, 0x12, 0x5E, 0x07, 0xEF, 0x20, 0xE0, \r
-0x03, 0x30, 0xE2, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x90, 0xF9, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xFC, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, \r
-0x90, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0x03, 0x7C, 0x91, 0x7D, 0x01, 0x7B, 0xFF, \r
-0x7A, 0x40, 0x79, 0x96, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0xE4, 0x90, 0x91, 0x02, 0xF0, \r
-0x90, 0x91, 0x02, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x25, 0x90, 0x90, 0xFA, 0xE0, 0x24, 0x04, \r
-0xFD, 0x90, 0x90, 0xF9, 0xE0, 0x12, 0x5D, 0xFA, 0x90, 0x91, 0x02, 0xE0, 0x24, 0xFC, 0xF5, 0x82, \r
-0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x91, 0x02, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, \r
-0xFC, 0x7C, 0x90, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x26, 0x7E, 0x00, 0x7F, 0x06, 0x12, \r
-0x46, 0xE2, 0xEF, 0x60, 0x02, 0xC1, 0x83, 0x90, 0x90, 0xFB, 0xE0, 0xFF, 0x90, 0x90, 0xFA, 0xE0, \r
-0x2F, 0xFF, 0x90, 0x90, 0xF9, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x91, 0x07, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x24, 0x06, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x08, 0x60, 0x02, \r
-0xC1, 0x83, 0x90, 0x91, 0x08, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x91, 0x07, 0xE0, 0x34, 0x00, 0xFE, \r
-0xE4, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x70, 0x6B, 0x90, 0x91, 0x02, 0xF0, 0x90, 0x91, 0x02, 0xE0, \r
-0xFF, 0xC3, 0x94, 0x04, 0x50, 0x25, 0x90, 0x91, 0x08, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x91, 0x07, \r
-0xE0, 0x12, 0x5D, 0xFA, 0x90, 0x91, 0x02, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, \r
-0x83, 0xEF, 0xF0, 0x90, 0x91, 0x02, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0x03, 0x7C, 0x91, 0x7D, \r
-0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x41, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x46, 0xE2, 0xEF, 0x70, \r
-0x22, 0x90, 0x91, 0x08, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x91, 0x07, 0xE0, 0x34, 0x00, 0xFE, 0xB1, \r
-0x0C, 0xEF, 0x64, 0x01, 0x60, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0x90, 0x8F, 0x25, 0xE0, \r
-0x44, 0x01, 0xF0, 0x22, 0x90, 0x90, 0xFB, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x90, 0xF9, 0xEE, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x90, 0xFE, 0xF0, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x54, 0x0C, \r
-0x64, 0x08, 0x60, 0x02, 0xE1, 0x3F, 0x90, 0x90, 0xF9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, \r
-0x24, 0x06, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x88, 0x60, 0x02, 0xE1, 0x3F, 0x90, 0x90, 0xF9, \r
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, 0x8E, \r
-0x70, 0x6D, 0x90, 0x90, 0xFE, 0x04, 0xF0, 0x90, 0x90, 0xF9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, \r
-0x90, 0xFC, 0xE0, 0xFD, 0x90, 0x90, 0xFB, 0xE0, 0x2D, 0x04, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x64, \r
-0x03, 0x70, 0x4C, 0x90, 0x90, 0xF9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xFC, 0xE0, 0xFD, \r
-0x90, 0x90, 0xFB, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x12, 0x5E, 0x07, 0xEF, 0x30, 0xE3, 0x07, 0x90, \r
-0x01, 0xC7, 0x74, 0x01, 0x80, 0x21, 0x90, 0x8F, 0x1D, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, \r
-0xE0, 0x10, 0x90, 0x90, 0xF9, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x5E, 0x45, \r
-0x80, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x02, 0xF0, 0x90, 0x8F, 0x25, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
-0x90, 0xFE, 0xE0, 0xFF, 0x22, 0x90, 0x8F, 0x25, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x90, \r
-0x06, 0x90, 0xE0, 0x20, 0xE5, 0x10, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90, 0x01, 0xC7, \r
-0x74, 0x25, 0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, \r
-0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x90, 0xCD, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0xFF, 0xED, 0x2F, 0x90, 0x90, 0xCE, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, \r
-0x90, 0x90, 0xCF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x90, 0xD0, \r
-0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x90, 0xD1, 0xF0, 0x90, 0x00, \r
-0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x90, 0xD2, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, \r
-0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x90, 0xD3, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, \r
-0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x90, 0xD4, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
-0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x90, 0xD5, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, \r
-0xED, 0x2F, 0x90, 0x90, 0xD6, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, \r
-0x90, 0xD7, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x90, 0xD8, 0xF0, \r
-0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x90, 0xD9, 0xF0, 0x90, 0x00, 0x06, \r
-0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x90, 0xDA, 0xF0, 0x22, 0xE4, 0xFF, 0x74, \r
-0x18, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x2C, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, \r
-0x83, 0xE0, 0xFE, 0x74, 0x26, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, \r
-0xEF, 0xB4, 0x06, 0xCB, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, \r
-0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x11, 0x65, \r
-0xEF, 0x64, 0x01, 0x70, 0x47, 0x90, 0x8E, 0x83, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E, \r
-0x81, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x83, 0xE0, \r
-0x20, 0xE4, 0x29, 0x90, 0x8E, 0x7C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8F, \r
-0x18, 0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, \r
-0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, \r
-0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0x8E, 0x85, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, \r
-0x70, 0x0A, 0x90, 0x8F, 0x15, 0xE0, 0x90, 0x8E, 0x85, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x85, 0xED, \r
-0xF0, 0x90, 0x8E, 0x85, 0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x7C, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xEF, \r
-0x60, 0x31, 0x90, 0x8D, 0xFA, 0xE0, 0x64, 0x01, 0x70, 0x29, 0x90, 0x8E, 0x7C, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x4F, 0x8C, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x12, \r
-0x51, 0xDF, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x7B, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, \r
-0x12, 0x4D, 0x73, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x4F, 0x8C, 0x7D, 0x04, 0x7F, 0x01, 0x02, 0x4D, \r
-0x73, 0x90, 0x8E, 0x7F, 0xE0, 0x64, 0x01, 0x70, 0x17, 0x90, 0x8E, 0x7D, 0xE0, 0x54, 0x0F, 0x60, \r
-0x06, 0x12, 0x4F, 0x83, 0x02, 0x51, 0x05, 0x90, 0x8E, 0x82, 0xE0, 0x70, 0x03, 0x12, 0x4D, 0xEB, \r
-0x22, 0x90, 0x8E, 0x7B, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, \r
-0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0x8E, \r
-0x88, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x8F, 0x12, 0xE0, 0xFF, \r
-0x90, 0x8E, 0x88, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x8D, 0xFA, 0xE0, 0xB4, 0x01, 0x0B, 0x90, \r
-0x8E, 0x7C, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x51, 0x5D, 0x22, 0x90, 0x91, 0xFC, 0x12, 0x45, \r
-0x2D, 0x12, 0x06, 0x89, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x92, \r
-0x02, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x92, 0x03, 0xF0, 0x90, 0x00, 0x05, 0x12, \r
-0x06, 0xA2, 0x90, 0x92, 0x04, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x90, 0x92, 0x05, 0xF0, \r
-0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x92, 0x06, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
-0x90, 0x92, 0x09, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, \r
-0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x04, \r
-0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x92, 0x00, 0xE0, 0xFF, 0xB4, 0x04, 0x25, \r
-0xA3, 0xE0, 0xFE, 0x90, 0x91, 0xFC, 0x12, 0x45, 0x24, 0xEE, 0x12, 0x06, 0xCF, 0x90, 0x92, 0x02, \r
-0xE0, 0xFE, 0x90, 0x91, 0xFC, 0x12, 0x45, 0x24, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x90, \r
-0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x92, 0x02, 0xE0, 0xFF, 0x90, 0x91, \r
-0xFC, 0x12, 0x45, 0x24, 0xEF, 0x12, 0x06, 0xCF, 0x90, 0x92, 0x02, 0xE0, 0x44, 0x20, 0x54, 0x7F, \r
-0xFF, 0x90, 0x91, 0xFC, 0x12, 0x45, 0x24, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x90, 0x92, \r
-0x01, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0x90, 0x91, 0xFC, 0x12, 0x45, 0x24, 0xE9, 0x24, \r
-0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, 0x20, 0x12, 0x06, 0xCF, 0x90, 0x92, 0x03, \r
-0xE0, 0xFF, 0x90, 0x91, 0xFC, 0x12, 0x45, 0x24, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x06, 0xE1, 0x90, \r
-0x92, 0x04, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x92, 0x05, 0xE0, 0x90, 0x00, 0x06, \r
-0x12, 0x06, 0xE1, 0x90, 0x92, 0x06, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, 0x90, 0x92, 0x0D, \r
-0xED, 0xF0, 0x90, 0x92, 0x0A, 0x12, 0x45, 0x2D, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x92, \r
-0x11, 0xF0, 0x90, 0x92, 0x0A, 0x12, 0x45, 0x24, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, \r
-0x03, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x0E, 0x12, 0x35, 0x26, 0x90, 0x92, 0x0D, 0xE0, 0x70, 0x46, \r
-0xFF, 0x74, 0x0E, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, \r
-0x0E, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x0E, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, \r
-0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x92, 0x75, 0x42, 0x0E, 0x75, 0x43, 0x03, 0x90, 0x92, 0x0A, \r
-0x12, 0x45, 0x24, 0x12, 0x35, 0x26, 0x22, 0x00, 0x03, 0x37\r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x4E, 0xED, \r
+0xF0, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x95, 0x4F, 0xF0, 0xA3, 0xF0, 0x12, 0x06, \r
+0x89, 0xFF, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFD, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFB, \r
+0x12, 0x77, 0x9D, 0x90, 0x95, 0x4F, 0xEF, 0xF0, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x09, 0x90, 0x00, \r
+0x04, 0x12, 0x06, 0xA2, 0xFF, 0xF1, 0x28, 0x90, 0x95, 0x50, 0xEF, 0xF0, 0x90, 0x90, 0x02, 0xE0, \r
+0x24, 0xFE, 0x60, 0x1D, 0x24, 0xFE, 0x60, 0x19, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05, \r
+0x70, 0x53, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x90, 0x95, 0x4E, 0xE0, 0xFD, 0xF1, 0x67, 0x80, \r
+0x16, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x90, 0x95, 0x4E, 0xE0, 0xFD, 0x90, 0x90, 0x02, 0xE0, \r
+0x90, 0x95, 0x20, 0xF0, 0x12, 0xA5, 0x3E, 0x90, 0x95, 0x50, 0xE0, 0xFF, 0x90, 0x95, 0x4B, 0x12, \r
+0x44, 0x09, 0x90, 0x95, 0x4F, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, \r
+0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xF9, 0xA3, 0xE0, \r
+0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0xAD, 0x07, 0x90, 0x90, 0xE7, 0xE4, 0x75, 0xF0, 0x01, 0x12, \r
+0x08, 0xD6, 0x90, 0x90, 0xE7, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0xE7, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, \r
+0x20, 0xE0, 0x05, 0x90, 0x93, 0x77, 0x80, 0x03, 0x90, 0x93, 0x78, 0xE0, 0x90, 0x90, 0x02, 0xF0, \r
+0x90, 0x90, 0x02, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60, \r
+0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08, \r
+0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x3A, 0xED, 0xF0, 0x90, 0x95, 0x37, 0x12, \r
+0x44, 0x12, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x3E, 0xF0, 0x90, 0x95, 0x37, 0x12, \r
+0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, 0x95, 0x79, \r
+0x3B, 0x12, 0x35, 0x26, 0x90, 0x95, 0x3A, 0xE0, 0x70, 0x46, 0xFF, 0x74, 0x3B, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x3B, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x95, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x3B, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, \r
+0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, \r
+0x95, 0x75, 0x42, 0x3B, 0x75, 0x43, 0x03, 0x90, 0x95, 0x37, 0x12, 0x44, 0x09, 0x12, 0x35, 0x26, \r
+0x22, 0x90, 0x93, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xD1, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94, \r
+0x55, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0xFD, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, \r
+0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0xE4, 0xFF, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, \r
+0x95, 0x4A, 0xF0, 0x7F, 0x03, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x45, 0xEF, \r
+0xF0, 0xD1, 0x94, 0x90, 0x95, 0x45, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, 0xF5, 0x82, \r
+0xE4, 0x34, 0x94, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0x95, 0x4A, 0xE0, 0xFE, 0xEF, 0x75, 0xF0, \r
+0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x95, 0x45, \r
+0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x95, 0x46, 0x12, 0x43, 0xE5, 0x78, 0x10, 0x12, 0x08, 0x47, \r
+0xAB, 0x07, 0x90, 0x95, 0x46, 0x12, 0x43, 0xE5, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, 0x95, 0x43, \r
+0xEF, 0xF0, 0x90, 0x95, 0x46, 0x12, 0x43, 0xE5, 0x90, 0x95, 0x44, 0xEF, 0xF0, 0x7D, 0x01, 0x7F, \r
+0x50, 0x7E, 0x01, 0x12, 0x50, 0x6C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8D, \r
+0xFB, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, \r
+0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8D, 0xFB, \r
+0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
+0xFF, 0xED, 0x2F, 0x90, 0x8D, 0xFC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, \r
+0xED, 0x2F, 0x90, 0x8D, 0xFD, 0xF0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, \r
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x09, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0xF1, 0x16, 0x90, \r
+0x8D, 0xFB, 0xE0, 0xFF, 0x30, 0xE0, 0x3D, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06, \r
+0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0xEF, 0x13, 0x13, 0x54, \r
+0x3F, 0x30, 0xE0, 0x0D, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xCF, 0x74, 0x01, \r
+0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x57, 0xD6, 0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x27, 0x10, 0x11, 0x2E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0x94, 0xC7, 0xE0, 0xFF, 0xD1, 0xB0, 0xEF, 0x60, 0x70, 0x90, 0x94, 0xC8, 0xE0, 0xFB, 0xD3, \r
+0x94, 0x00, 0x40, 0x1C, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0F, 0xAF, 0x03, \r
+0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, 0x7F, 0x08, 0x7E, 0x0E, 0x51, 0x43, \r
+0x90, 0x94, 0xC7, 0xE0, 0xFF, 0x90, 0x06, 0x33, 0xF0, 0x90, 0x94, 0xBF, 0xE0, 0x90, 0x95, 0x69, \r
+0xF0, 0xE4, 0xFB, 0xFD, 0x91, 0xBA, 0x90, 0x8D, 0xFC, 0xE0, 0xFF, 0x12, 0x56, 0x68, 0x90, 0x94, \r
+0xC9, 0xE0, 0x90, 0x93, 0xA8, 0xF0, 0x90, 0x94, 0xB4, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0xD1, 0xDB, \r
+0x90, 0x93, 0xA8, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x95, 0x46, 0x12, 0x08, 0x6D, 0xE4, \r
+0x90, 0x95, 0x4A, 0xF0, 0x7F, 0x04, 0x11, 0x35, 0x80, 0x40, 0xE4, 0x90, 0x94, 0xB4, 0xF0, 0x90, \r
+0x94, 0xD0, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0x91, 0x30, 0x90, 0x8D, 0xFF, 0xE0, \r
+0xB4, 0x01, 0x0D, 0x90, 0x94, 0xCC, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x52, 0xE8, 0x12, 0x57, 0xC1, \r
+0x90, 0x93, 0xA9, 0x74, 0x07, 0xF0, 0x90, 0x93, 0xB7, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xA9, \r
+0x12, 0x6F, 0x3D, 0x7F, 0x04, 0x12, 0x6E, 0xEF, 0xD1, 0x3C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, \r
+0x58, 0x7E, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF8, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0x95, 0x02, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xFA, 0x12, 0x43, \r
+0xE5, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x02, 0x12, 0x43, 0xF1, 0x12, 0x43, 0xBA, 0xC0, 0x04, 0xC0, \r
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0xFA, 0x12, 0x43, 0xE5, 0x90, 0x94, 0xFE, 0x12, 0x43, \r
+0xF1, 0x12, 0x43, 0xBA, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, \r
+0x95, 0x06, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x06, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, \r
+0x6D, 0x90, 0x94, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x8C, 0xED, 0xF0, 0xEF, 0x14, 0x60, \r
+0x02, 0x61, 0xC0, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x8C, 0xE0, 0xC4, 0x33, \r
+0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0x94, 0xFA, 0x12, \r
+0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, \r
+0x7F, 0x00, 0x7E, 0x08, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, \r
+0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x51, 0x43, \r
+0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0x95, 0x8C, 0xE0, 0xFF, 0xE4, \r
+0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, \r
+0x08, 0x5A, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0x51, 0x43, 0x90, 0x94, \r
+0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x95, 0x8C, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
+0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xFE, 0x12, 0x08, \r
+0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, \r
+0x00, 0x90, 0x95, 0x8C, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, \r
+0x1A, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0x51, 0x43, \r
+0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, \r
+0x00, 0x00, 0x00, 0x00, 0x7F, 0x84, 0x7E, 0x08, 0x51, 0x43, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, \r
+0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xEC, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x69, \r
+0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0x51, \r
+0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7F, \r
+0x84, 0x7E, 0x08, 0x51, 0x43, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, \r
+0x94, 0xEC, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xB1, 0x3B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0x90, 0x02, 0x86, 0xE0, \r
+0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x94, 0xCF, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x7F, 0x90, 0x94, 0xB5, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFE, 0x12, 0x08, \r
+0x6D, 0x7F, 0x50, 0x7E, 0x0C, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x7F, 0x90, 0x94, 0xB6, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, \r
+0x51, 0x3F, 0x90, 0x94, 0xCB, 0xE0, 0x90, 0x06, 0x08, 0xF0, 0x90, 0x94, 0xCD, 0xA3, 0xE0, 0x90, \r
+0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0xB9, 0xE0, 0xFF, 0x60, 0x05, 0xA3, 0xE0, 0xFD, \r
+0x51, 0xB1, 0x90, 0x94, 0xB8, 0xE0, 0xFF, 0x60, 0x10, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x90, \r
+0x94, 0xBF, 0xE0, 0x90, 0x95, 0x69, 0xF0, 0x91, 0xBA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0x95, 0x66, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0, \r
+0x24, 0x02, 0xF5, 0x5A, 0x80, 0x08, 0x90, 0x95, 0x66, 0xE0, 0x24, 0xFE, 0xF5, 0x5A, 0x90, 0x94, \r
+0xE8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0xB1, 0x31, 0x90, 0x94, 0xE8, 0x12, \r
+0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x80, 0x20, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, \r
+0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x66, 0xE0, 0xFF, 0xB1, 0x31, 0x90, 0x94, 0xE8, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x66, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, \r
+0xEC, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0xB1, 0x41, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xEC, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, \r
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xE6, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, \r
+0x90, 0x94, 0xE5, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0x94, 0xF0, 0x12, \r
+0x08, 0x6D, 0x90, 0x94, 0xE8, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0x94, 0xF0, 0x12, 0x43, \r
+0xF1, 0x12, 0x43, 0xBA, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0xE8, 0x12, \r
+0x43, 0xE5, 0x90, 0x94, 0xEC, 0x12, 0x43, 0xF1, 0x12, 0x43, 0xBA, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
+0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0xF4, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xE6, 0xA3, \r
+0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x94, 0xF4, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, \r
+0x90, 0x94, 0xE5, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, \r
+0x50, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, 0xB5, 0xEF, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12, \r
+0x37, 0x4E, 0x90, 0x94, 0xB6, 0xEF, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x7F, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x7F, 0x50, 0x7E, 0x0C, 0x51, \r
+0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0xFE, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x17, 0x51, 0x3F, 0x90, 0x06, 0x08, 0xE0, 0x90, 0x94, 0xCB, 0xF0, 0x90, \r
+0x06, 0xA1, 0xE0, 0xFE, 0x90, 0x06, 0xA0, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, \r
+0x94, 0xCD, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0xA0, \r
+0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0xFF, 0x41, 0xB1, 0x90, 0x8D, 0xFB, 0xE0, \r
+0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90, 0x91, 0x3B, 0x12, 0x43, 0xE5, 0xEC, \r
+0x4D, 0x4E, 0x4F, 0x60, 0x18, 0x90, 0x93, 0x73, 0x12, 0x43, 0xF1, 0xD3, 0x12, 0x43, 0xD4, 0x40, \r
+0x0C, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, 0xFC, 0x90, 0x91, 0x3F, 0x80, 0x0A, 0xE4, 0x7F, 0xE8, \r
+0x7E, 0x03, 0xFD, 0xFC, 0x90, 0x91, 0x37, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, 0x90, 0x95, 0x46, \r
+0x12, 0x08, 0x6D, 0x11, 0x2E, 0x22, 0xEF, 0x24, 0xFC, 0x60, 0x06, 0x04, 0x70, 0x05, 0x02, 0x55, \r
+0x6D, 0x31, 0x79, 0x22, 0x90, 0x01, 0x53, 0xE4, 0xF0, 0xFF, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, \r
+0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xB7, 0xE0, 0xFE, 0x90, 0x94, 0xB4, 0xE0, \r
+0xC3, 0x9E, 0x40, 0x04, 0x7F, 0x00, 0x80, 0x0E, 0xEF, 0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04, \r
+0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0x93, 0xB8, 0xEF, 0xF0, 0x12, 0x74, 0xC2, 0x74, 0x10, 0x2F, 0xFF, 0x90, 0x93, \r
+0xB8, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2F, 0xFF, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, \r
+0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0xC7, 0x12, 0x35, \r
+0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x74, 0xC2, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB7, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB8, 0xF0, 0x74, 0x02, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x90, 0x94, 0xB9, 0xF0, 0x74, 0x03, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
+0xE0, 0x90, 0x94, 0xBA, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x90, 0x94, 0xBB, 0xF0, 0x74, 0x05, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, \r
+0x94, 0xBC, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, \r
+0xBD, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xBE, \r
+0xF0, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xBF, 0xF0, \r
+0x22, 0xE4, 0x90, 0x93, 0xA7, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x40, 0x03, \r
+0x02, 0x88, 0xAA, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
+0x83, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x88, 0xA1, 0x90, 0x93, 0xA7, 0xE0, 0x75, 0xF0, 0x0A, \r
+0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xE5, 0xE4, 0x7B, 0x01, \r
+0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0xD4, 0x70, 0x63, 0x90, 0x93, 0xA7, 0xE0, 0xFB, 0x75, 0xF0, \r
+0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0x60, 0x2E, 0x14, 0x60, \r
+0x02, 0x01, 0xA1, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
+0x83, 0x12, 0x43, 0xE5, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0x80, 0x1B, 0x90, 0x93, 0xA7, 0xE0, \r
+0xFB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0x12, 0x86, 0x86, 0x80, 0x55, 0x90, 0x93, 0xA7, 0xE0, \r
+0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xE5, \r
+0xE4, 0xFB, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0xD4, 0x50, 0x36, 0x90, 0x93, 0xA7, 0xE0, 0xFB, \r
+0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xE5, \r
+0xEF, 0x24, 0xFF, 0xFF, 0xEE, 0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, 0xFD, 0xEC, 0x34, 0xFF, 0xFC, \r
+0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08, \r
+0x6D, 0x90, 0x93, 0xA7, 0xE0, 0x04, 0xF0, 0x02, 0x87, 0xA6, 0x22, 0x7B, 0x01, 0x7A, 0x93, 0x79, \r
+0x9C, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0x93, 0x9C, 0xE0, 0x54, \r
+0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x95, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x95, \r
+0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, \r
+0x90, 0x93, 0x9E, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0x93, 0xA2, \r
+0x12, 0x08, 0x6D, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, \r
+0xFC, 0xEF, 0x60, 0x24, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, \r
+0x93, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08, \r
+0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5, 0xEF, 0x54, \r
+0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5, 0xEF, \r
+0x54, 0xFE, 0xFF, 0xEC, 0x90, 0x93, 0xA2, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5, \r
+0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x90, 0x93, 0x89, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, \r
+0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, \r
+0x90, 0x93, 0x89, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, \r
+0x4F, 0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
+0x90, 0x93, 0x8A, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, \r
+0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, \r
+0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0xAB, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
+0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8F, 0x2E, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x9D, 0xEC, 0xC3, 0x99, \r
+0x40, 0x02, 0x41, 0x9D, 0x90, 0x93, 0xAB, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11, \r
+0xF0, 0xAF, 0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, \r
+0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, \r
+0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x93, 0xAD, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, \r
+0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFB, 0xEF, 0x24, 0x18, \r
+0xFF, 0xE4, 0x33, 0xCF, 0x2B, 0xCF, 0x3A, 0x90, 0x93, 0xAD, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, \r
+0x93, 0xAD, 0xD1, 0xCC, 0x90, 0x93, 0xAD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xEE, \r
+0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, \r
+0xAC, 0xE0, 0x9F, 0x90, 0x93, 0xAB, 0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF9, 0xE0, 0x24, 0x01, \r
+0xFF, 0x90, 0x8D, 0xF8, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, 0x93, 0xAC, 0xE0, 0x9F, 0xF0, 0x90, \r
+0x93, 0xAB, 0xE0, 0x9E, 0xF0, 0x90, 0x93, 0xAB, 0x31, 0xA5, 0x0C, 0x21, 0xDD, 0x22, 0xD1, 0xB6, \r
+0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x9E, 0xF0, 0x74, 0x8A, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, \r
+0x22, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, \r
+0x40, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, \r
+0x02, 0x59, 0x4E, 0x31, 0xB8, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, 0xE0, 0x44, \r
+0x02, 0xF0, 0x74, 0x9E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8A, 0xA3, 0xF0, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0xDA, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, \r
+0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0xE2, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
+0x01, 0xC4, 0x74, 0xEE, 0xF0, 0x74, 0x8A, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, \r
+0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x94, 0xD1, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x02, 0x82, 0xE0, 0x90, 0x94, 0xD9, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x20, 0xE0, 0x02, 0xC1, \r
+0xA6, 0xE4, 0x90, 0x94, 0xD8, 0xF0, 0x90, 0x94, 0xD9, 0xE0, 0xFF, 0x90, 0x94, 0xD8, 0xE0, 0xC3, \r
+0x9F, 0x40, 0x02, 0xC1, 0xA6, 0x90, 0x94, 0xD1, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, \r
+0xFD, 0x11, 0xF0, 0x90, 0x94, 0xE2, 0xEF, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
+0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, \r
+0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x94, 0xD3, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0x94, 0xDE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, \r
+0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x94, \r
+0xE3, 0xF0, 0x90, 0x94, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD1, 0xE0, 0x34, 0x00, 0xFE, 0x90, \r
+0x94, 0xD5, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xC0, 0x07, 0x90, 0x94, 0xD5, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5B, 0x50, 0xC0, 0x07, 0x90, 0x94, 0xD5, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x04, 0x12, 0x5B, 0x50, 0xAB, 0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12, \r
+0x77, 0x9D, 0x90, 0x94, 0xDA, 0xEF, 0xF0, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, \r
+0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x54, 0xFC, 0x90, 0x94, 0xD7, 0xF0, 0x90, 0x94, 0xE3, 0xE0, 0xFF, \r
+0x90, 0x94, 0xD3, 0xE4, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x94, 0xD3, 0xD1, 0xCC, 0x90, 0x94, \r
+0xD3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xD1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F, \r
+0x12, 0x5B, 0x50, 0x90, 0x94, 0xD3, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x94, 0xD1, 0xEC, 0x8D, \r
+0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x94, 0xD2, \r
+0xE0, 0x9D, 0x90, 0x94, 0xD1, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF9, 0xE0, 0x24, 0x01, 0xFD, \r
+0x90, 0x8D, 0xF8, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x94, 0xD2, 0xE0, 0x9D, 0xF0, 0x90, 0x94, \r
+0xD1, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF, 0x30, \r
+0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74, \r
+0x23, 0xF0, 0x90, 0x94, 0xD0, 0xE0, 0x60, 0x4E, 0x90, 0x94, 0xD7, 0xE0, 0x24, 0xB0, 0x60, 0x1D, \r
+0x24, 0xD0, 0x60, 0x02, 0xC1, 0x41, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x22, \r
+0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, 0xC1, 0x41, 0x80, 0x15, 0x90, 0x8D, 0xFB, \r
+0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, \r
+0xC1, 0x41, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDE, 0xE0, 0xFC, 0xA3, \r
+0xE0, 0xFD, 0xF1, 0x97, 0xC1, 0x41, 0x90, 0x94, 0xD7, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, \r
+0x70, 0x2C, 0x90, 0x8F, 0x31, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02, \r
+0xC1, 0x41, 0x90, 0x8F, 0x43, 0xE0, 0x04, 0xF0, 0xD1, 0xFA, 0xEF, 0x70, 0x02, 0xC1, 0x41, 0x90, \r
+0x94, 0xD7, 0xE0, 0xFF, 0xF1, 0x5C, 0x90, 0x8F, 0x44, 0xE0, 0x04, 0xF0, 0xC1, 0x41, 0x90, 0x8F, \r
+0x2E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x7B, 0x90, 0x94, 0xDA, 0xE0, 0xFF, 0x90, \r
+0x94, 0xD6, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD5, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x08, 0xCF, 0x34, \r
+0x00, 0xFE, 0x90, 0x94, 0xE0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64, \r
+0x45, 0x70, 0x52, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xA8, 0x20, 0xEF, 0x64, \r
+0x01, 0x70, 0x42, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xA8, 0x65, 0xEF, 0x64, \r
+0x01, 0x70, 0x32, 0x90, 0x94, 0xE4, 0x04, 0xF0, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xFD, 0x12, 0xA7, 0x65, 0xEF, 0x70, 0x14, 0x90, 0x94, 0xE2, 0xE0, 0xFD, 0x90, 0xFD, \r
+0x11, 0xF0, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xA7, 0xC8, 0x90, 0x94, 0xE2, \r
+0xE0, 0x90, 0xFD, 0x11, 0xF0, 0xD1, 0xFA, 0xEF, 0x60, 0x26, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x90, 0x94, 0xDD, 0xE0, 0xFB, 0x90, 0x94, 0xE2, 0xE0, \r
+0x90, 0x93, 0xAB, 0xF0, 0x12, 0x5F, 0x06, 0xEF, 0x60, 0x06, 0x90, 0x94, 0xE4, 0x74, 0x01, 0xF0, \r
+0x90, 0x8F, 0x2E, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x19, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x91, 0xBB, 0xEF, 0x60, 0x06, 0x90, 0x94, 0xE4, 0x74, \r
+0x01, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x10, 0x90, 0x94, 0xD5, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x95, 0x64, 0x90, 0x8F, 0x2E, \r
+0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x90, 0x94, 0xE4, 0xE0, 0x70, \r
+0x10, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x9A, \r
+0x56, 0xF1, 0x73, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, \r
+0x01, 0x12, 0x59, 0x4E, 0xF1, 0xBC, 0xEF, 0x64, 0x01, 0x70, 0x3A, 0x90, 0x8F, 0x45, 0xE0, 0x04, \r
+0xF0, 0xD1, 0xB6, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x24, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, \r
+0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, \r
+0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x59, 0x4E, 0x80, 0x18, 0x90, 0x94, \r
+0xD1, 0x31, 0xA5, 0x80, 0x09, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x94, \r
+0xD8, 0xE0, 0x04, 0xF0, 0x61, 0x46, 0x74, 0xEE, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8A, 0xA3, \r
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, \r
+0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, 0x02, 0x7F, 0x02, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, \r
+0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, \r
+0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x90, 0x93, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xBF, 0xF0, 0x90, \r
+0x93, 0xBF, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x93, 0xB8, 0xE0, 0x24, 0x04, 0xFF, \r
+0x90, 0x93, 0xB7, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x5B, 0x50, 0x90, 0x93, 0xBF, 0xE0, 0x24, 0xB9, \r
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBF, 0xE0, 0x04, 0xF0, 0x80, \r
+0xCE, 0x78, 0x37, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB9, 0x7E, 0x00, 0x7F, \r
+0x06, 0x12, 0x45, 0xC7, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7, \r
+0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44, \r
+0x01, 0xF0, 0x22, 0x90, 0x8F, 0x36, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x06, 0x90, \r
+0xE0, 0x20, 0xE5, 0x10, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x25, \r
+0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
+0x94, 0xB2, 0xE0, 0x64, 0x01, 0xF0, 0xE0, 0x24, 0x97, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8F, 0xA3, \r
+0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x5B, 0x8E, 0x90, 0x8F, 0x36, 0xE0, \r
+0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8F, \r
+0x36, 0xF0, 0x90, 0x8F, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, \r
+0x01, 0x22, 0xE4, 0x90, 0x95, 0x85, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, \r
+0xC3, 0x90, 0x95, 0x86, 0xE0, 0x94, 0xD0, 0x90, 0x95, 0x85, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, \r
+0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x95, 0x85, 0xE4, 0x75, 0xF0, 0x01, \r
+0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x49, 0x4F, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x11, 0x1F, 0x11, 0x57, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x06, 0xE0, \r
+0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, \r
+0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0xF9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEE, \r
+0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xE3, 0x90, 0x90, 0x01, 0xE0, 0x90, 0x04, 0x8C, 0xF0, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0x20, \r
+0xE0, 0x04, 0x11, 0x32, 0x21, 0xB6, 0x90, 0x90, 0x01, 0x74, 0x05, 0xF0, 0x90, 0x93, 0xAB, 0x12, \r
+0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x31, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, \r
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x31, 0xF0, 0xEE, 0x54, 0x08, 0xFE, \r
+0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, \r
+0x4D, 0xFF, 0x90, 0x8F, 0x31, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, \r
+0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x31, 0xF0, \r
+0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, \r
+0x80, 0xFF, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x54, \r
+0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0xAB, 0x12, 0x44, \r
+0x09, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, \r
+0x44, 0x08, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0x8F, 0x32, 0xE0, 0xC4, 0x13, \r
+0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x7F, 0xFF, \r
+0x90, 0x8F, 0x32, 0xE0, 0x54, 0x80, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F, \r
+0x33, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x34, 0xE0, \r
+0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x8F, \r
+0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, \r
+0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x4B, 0x1A, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, \r
+0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, \r
+0x79, 0x56, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0xB6, 0x7C, 0x93, 0x7D, 0x01, 0x7B, \r
+0xFF, 0x7A, 0x40, 0x79, 0x5C, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x78, 0xBA, 0x7C, 0x93, \r
+0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0xE4, \r
+0x90, 0x93, 0xBF, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90, \r
+0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, \r
+0x50, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x61, 0x9A, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, \r
+0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, \r
+0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x61, 0x9A, 0x90, 0x93, 0xBF, 0x04, \r
+0xF0, 0xE4, 0x90, 0x93, 0xBE, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x25, \r
+0x90, 0x93, 0xA8, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x12, 0x5B, 0x43, 0x90, 0x93, \r
+0xBE, 0xE0, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBE, \r
+0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xAA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, \r
+0x3D, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x45, 0xC7, 0xEF, 0x60, 0x02, 0x61, 0x9A, 0x90, 0x93, 0xBE, \r
+0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x93, 0xA9, 0xE0, 0xFD, \r
+0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0x12, \r
+0x5B, 0x42, 0x90, 0x93, 0xBE, 0xE0, 0x24, 0xBA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x90, 0x93, 0xBE, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x78, 0xBA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, \r
+0x01, 0x7A, 0x8F, 0x79, 0x53, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x45, 0xC7, 0xEF, 0x60, 0x02, 0x61, \r
+0x91, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, 0x90, 0x8F, 0x30, 0xE0, 0x30, 0xE0, \r
+0x0F, 0x90, 0x01, 0xC7, 0x74, 0x09, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x61, 0x9A, \r
+0xE4, 0x90, 0x93, 0xBE, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x1A, 0x12, \r
+0x5B, 0x2E, 0x90, 0x93, 0xBE, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x90, 0x93, 0xBE, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0xE4, 0x90, 0x93, 0xBE, 0xF0, 0x90, 0x93, \r
+0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x93, 0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, \r
+0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x16, 0x12, 0x5B, 0x42, 0x90, \r
+0x93, 0xBE, 0xE0, 0x24, 0xB6, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, \r
+0xBE, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0x90, 0x95, 0x0D, 0x12, \r
+0x44, 0x12, 0xE4, 0x90, 0x95, 0x10, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0xB6, 0x71, 0xA0, 0x80, \r
+0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0xBF, 0xE0, 0xFF, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x0A, 0x12, 0x44, 0x12, 0x78, 0x16, 0x7C, \r
+0x95, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x64, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, \r
+0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x15, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x33, \r
+0x12, 0x57, 0xF4, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x7A, 0x12, 0x56, 0xA8, 0x90, 0x95, \r
+0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x12, 0x12, 0x77, 0x77, 0x90, 0x95, 0x14, 0xEF, \r
+0xF0, 0x90, 0x95, 0x12, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, \r
+0x95, 0x10, 0xE0, 0xFD, 0x12, 0x7E, 0x4C, 0x90, 0x95, 0x11, 0xE0, 0x60, 0x02, 0x81, 0x96, 0xA3, \r
+0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, \r
+0x01, 0x90, 0x95, 0x0D, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, \r
+0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x12, 0xA3, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, \r
+0x01, 0x90, 0x95, 0x0D, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, \r
+0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x12, 0xA3, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, \r
+0x01, 0x90, 0x95, 0x0A, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, \r
+0xD0, 0x01, 0xD0, 0x02, 0x80, 0x69, 0x90, 0x95, 0x11, 0xE0, 0x64, 0x01, 0x70, 0x66, 0xA3, 0xA3, \r
+0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, \r
+0x8F, 0x75, 0x42, 0x4D, 0x75, 0x43, 0x06, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x12, 0xA3, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, \r
+0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x57, 0x75, 0x43, 0x06, 0xD0, 0x03, 0x12, 0x35, 0x26, \r
+0x90, 0x95, 0x12, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, \r
+0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x5D, 0x75, 0x43, 0x04, 0xD0, \r
+0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x95, 0x15, 0xE0, 0xFF, \r
+0x7D, 0x34, 0x12, 0x52, 0xA5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0x93, 0xD4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x2F, 0xFF, 0xE4, 0x3E, 0xCF, \r
+0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xBF, 0x86, 0x23, 0x90, 0x93, \r
+0xD6, 0xE0, 0xFF, 0x90, 0x93, 0xD5, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xD4, 0xE0, 0x34, 0x00, 0xCF, \r
+0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xBF, 0xDD, 0x03, 0x7F, 0x01, \r
+0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, \r
+0xAA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x6A, 0x7E, 0x00, 0x7F, 0x06, 0x12, \r
+0x06, 0x63, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x70, 0x7E, 0x00, \r
+0x7F, 0x10, 0x12, 0x06, 0x63, 0x78, 0xC0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, \r
+0x80, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x06, 0x63, 0xE4, 0x90, 0x93, 0xD3, 0xF0, 0x90, 0x93, 0xA7, \r
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xB1, 0x20, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1, \r
+0xAF, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7, 0xE0, \r
+0x34, 0x00, 0xCF, 0x24, 0x0E, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64, \r
+0x3A, 0x60, 0x02, 0xE1, 0xAF, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, \r
+0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, \r
+0x5B, 0x50, 0xEF, 0x64, 0x87, 0x60, 0x02, 0xE1, 0xAF, 0x90, 0x93, 0xD3, 0x04, 0xF0, 0xE4, 0x90, \r
+0x93, 0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x90, 0x93, 0xA9, \r
+0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24, \r
+0x38, 0x12, 0x5B, 0x42, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, \r
+0x83, 0xEF, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x93, 0xD1, 0xF0, \r
+0x90, 0x93, 0xD1, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0xE1, 0xAF, 0x75, 0xF0, 0x38, 0xEF, \r
+0x90, 0x8F, 0x61, 0x12, 0x43, 0xFD, 0xE0, 0x20, 0xE0, 0x02, 0xE1, 0xAF, 0xE4, 0x90, 0x93, 0xD2, \r
+0xF0, 0x90, 0x93, 0xD1, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F, 0x62, 0x12, 0x43, 0xFD, 0xE0, \r
+0xFE, 0x90, 0x93, 0xD2, 0xE0, 0xC3, 0x9E, 0x40, 0x02, 0xE1, 0xA7, 0xEF, 0x75, 0xF0, 0x38, 0xA4, \r
+0x24, 0x79, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, 0xF0, 0x10, 0xA4, 0x29, \r
+0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0xC0, 0x7C, 0x93, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, \r
+0x45, 0xC7, 0xEF, 0x60, 0x02, 0xE1, 0x98, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, \r
+0xE4, 0x90, 0x93, 0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90, \r
+0x93, 0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, \r
+0xCD, 0x24, 0x4A, 0x12, 0x5B, 0x42, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, \r
+0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x93, \r
+0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x1A, 0x12, 0x5B, 0x2E, 0x90, \r
+0x93, 0xD0, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, \r
+0xD0, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0x90, 0x93, 0xD1, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F, \r
+0x61, 0x12, 0x43, 0xFD, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x21, 0xEF, 0x75, 0xF0, 0x38, 0xA4, \r
+0x24, 0x69, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, \r
+0x7E, 0x00, 0x7F, 0x10, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x45, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x93, \r
+0x79, 0xAA, 0x90, 0x93, 0xD7, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xC0, 0x90, 0x93, 0xDA, 0x12, \r
+0x44, 0x12, 0x90, 0x93, 0xD1, 0xE0, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x63, 0xF9, 0x74, 0x8F, 0x35, \r
+0xF0, 0xFA, 0x90, 0x93, 0xDD, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x93, 0xE0, 0xF0, 0xA3, 0xF0, 0x7A, \r
+0x93, 0x79, 0xB0, 0x12, 0x98, 0x00, 0x80, 0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90, \r
+0x93, 0xD2, 0xE0, 0x04, 0xF0, 0xC1, 0x71, 0x90, 0x93, 0xD1, 0xE0, 0x04, 0xF0, 0xC1, 0x50, 0x90, \r
+0x93, 0xD3, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0x0F, 0x12, 0x44, 0x12, 0x90, 0x94, 0x12, 0x12, 0x44, \r
+0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xD1, \r
+0x12, 0x35, 0x26, 0x90, 0x94, 0x0F, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, \r
+0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE1, 0x12, 0x35, 0x26, 0x90, 0x94, 0x15, 0x12, 0x43, \r
+0xE5, 0x90, 0x8F, 0xF1, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x19, 0xE0, 0x90, 0x8F, 0xF8, 0xF0, 0x22, \r
+0x90, 0x93, 0xD4, 0x12, 0x44, 0x12, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xE5, 0xF0, 0x90, 0x04, \r
+0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x39, 0x12, 0x57, 0xF4, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, \r
+0x7B, 0x12, 0x56, 0xA8, 0x90, 0x93, 0xE2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xE2, 0x12, \r
+0x77, 0x77, 0x90, 0x93, 0xE4, 0xEF, 0xF0, 0x90, 0x93, 0xE2, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, \r
+0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0xE0, 0xE0, 0xFD, 0x12, 0x7E, 0x4C, 0x90, 0x93, 0xE1, \r
+0xE0, 0x60, 0x02, 0x21, 0x3F, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xD7, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xD4, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x60, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDD, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, \r
+0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, \r
+0x93, 0xDA, 0x12, 0x44, 0x09, 0x90, 0x94, 0x12, 0x12, 0x44, 0x12, 0x90, 0x94, 0x15, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x20, 0x90, 0x94, 0x19, 0x74, 0x3A, 0xF0, 0x90, 0x93, 0xD4, 0x12, 0x44, \r
+0x09, 0x12, 0x97, 0xB5, 0x90, 0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, \r
+0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x28, 0x7B, 0x01, 0x7A, \r
+0x93, 0x79, 0xE7, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, \r
+0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, \r
+0x42, 0xD1, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE4, 0xE0, 0xFF, 0x90, \r
+0x93, 0xE3, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xE2, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xFD, 0xE4, \r
+0x3F, 0xFC, 0x90, 0x93, 0x7B, 0xE0, 0xFB, 0x7F, 0x3A, 0x12, 0x7B, 0x90, 0x90, 0x93, 0xE2, 0xA3, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, \r
+0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, 0x42, 0xE7, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, \r
+0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0xE5, 0xE0, 0xFF, 0x7D, 0x3A, 0x12, 0x52, \r
+0xA5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x7D, 0x09, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x06, 0x70, 0x39, 0x90, 0x93, 0xB7, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x7D, 0x14, 0x12, 0x5B, 0x50, 0xEF, 0x70, 0x29, 0x90, 0x93, 0xB7, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x7D, 0x15, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x50, 0x70, 0x17, 0x90, 0x93, 0xB7, 0xE0, \r
+0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x21, 0x12, 0x5B, 0x50, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, \r
+0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, \r
+0xF0, 0x78, 0xAA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x90, 0x7E, 0x00, 0x7F, \r
+0x06, 0x12, 0x06, 0x63, 0x78, 0xB1, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x96, \r
+0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x90, 0x93, 0xA7, 0x12, 0x8E, 0xFD, 0xEF, 0x70, 0x02, \r
+0x61, 0x3E, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7, \r
+0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xB5, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, 0x3E, \r
+0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x61, 0x3E, 0x90, 0x93, 0xB6, \r
+0xE0, 0x24, 0x07, 0xFF, 0x90, 0x93, 0xB5, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, \r
+0xEF, 0x70, 0x6B, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xB0, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, \r
+0x25, 0x90, 0x93, 0xB6, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x93, 0xB5, 0xE0, 0x12, 0x5B, 0x43, 0x90, \r
+0x93, 0xB0, 0xE0, 0x24, 0xB1, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, \r
+0xB0, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xB1, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, \r
+0x79, 0x53, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x22, 0x90, 0x93, 0xB6, 0xE0, \r
+0x24, 0x08, 0xFF, 0x90, 0x93, 0xB5, 0xE0, 0x34, 0x00, 0xFE, 0x51, 0x08, 0xEF, 0x64, 0x01, 0x60, \r
+0x0D, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, \r
+0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0x79, 0xF0, \r
+0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7A, 0xF0, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
+0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, \r
+0x90, 0x93, 0x7D, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7E, \r
+0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x7F, 0xF0, \r
+0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, \r
+0x80, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x81, 0xF0, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x82, 0xF0, 0x90, 0x00, 0x03, 0x12, \r
+0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, \r
+0xED, 0x2F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, \r
+0x93, 0x85, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, \r
+0x86, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, \r
+0xFE, 0x74, 0x3D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x37, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xCB, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, \r
+0x59, 0x90, 0x93, 0x7D, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F, \r
+0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x12, 0x90, 0x93, 0xAB, \r
+0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, 0x90, \r
+0x79, 0x03, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, 0x93, 0x7E, 0xE0, \r
+0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, \r
+0x12, 0x39, 0xD6, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0x7E, 0x00, 0x7F, 0x08, 0x7D, \r
+0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x8D, 0x12, 0x08, 0xAA, 0x90, 0x93, 0x8E, 0x74, 0x08, 0xF0, \r
+0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x12, 0x91, 0x9B, 0x90, 0x93, 0xAB, \r
+0x12, 0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, \r
+0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x93, \r
+0x8E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x8F, 0xF0, 0x12, 0x06, 0x89, 0x54, \r
+0x04, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
+0x90, 0x93, 0x90, 0xF0, 0x22, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x72, 0x90, 0x93, 0x91, 0xE0, \r
+0x04, 0xF0, 0x90, 0x93, 0x94, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90, 0x93, 0x8D, 0xE0, 0x13, 0x13, \r
+0x54, 0x3F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x93, 0xE0, 0x70, 0x16, 0x90, 0x93, 0x90, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x0B, 0x12, 0x59, 0x46, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0xF0, \r
+0x22, 0x90, 0x93, 0x91, 0xE0, 0xFF, 0x90, 0x93, 0x8E, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, \r
+0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x93, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x54, \r
+0x9F, 0x90, 0x93, 0x92, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, \r
+0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, 0x93, 0xF0, 0x22, 0x90, \r
+0x8E, 0x80, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x8D, 0xF0, 0x90, 0x8E, 0x88, 0xF0, 0x90, \r
+0x8E, 0x81, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x57, 0xD2, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x57, 0xD6, \r
+0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, \r
+0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xB1, 0xA0, 0xEF, 0x64, 0x01, 0x70, 0x47, \r
+0x90, 0x8E, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E, 0x86, 0xE0, 0xFE, 0xE4, 0xC3, \r
+0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x88, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0x8E, \r
+0x81, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8F, 0x29, 0xE0, 0x70, 0x18, 0x90, \r
+0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, \r
+0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, \r
+0x70, 0x27, 0x90, 0x8E, 0x8A, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x8F, 0x26, \r
+0xE0, 0x90, 0x8E, 0x8A, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x8A, 0xED, 0xF0, 0x90, 0x8E, 0x8A, 0xE0, \r
+0xA3, 0xF0, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0xC3, 0x13, \r
+0x20, 0xE0, 0x21, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, 0x06, \r
+0x90, 0x02, 0x82, 0xE0, 0x70, 0x17, 0x90, 0x8F, 0x36, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, 0x86, \r
+0xE0, 0x30, 0xE1, 0x09, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
+0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0xC1, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, \r
+0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2A, 0x02, 0x08, 0xAA, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, \r
+0x95, 0x52, 0xE0, 0xFB, 0x7D, 0x01, 0x12, 0x56, 0xAE, 0x90, 0x95, 0x53, 0xEE, 0xF0, 0xFC, 0xA3, \r
+0xEF, 0xF0, 0xFD, 0x90, 0x95, 0x51, 0xE0, 0xFF, 0x12, 0x57, 0x76, 0x90, 0x95, 0x53, 0xE0, 0xFE, \r
+0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, \r
+0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0x93, 0xB4, 0xED, 0xF0, 0x90, 0x93, 0xB2, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0xA3, 0x1C, 0x90, 0x93, 0xB2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, \r
+0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB5, 0xEE, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xCD, 0x74, 0x18, 0xF0, 0x7E, 0x00, 0x7F, 0x80, 0x7D, 0x00, \r
+0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD5, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, 0x74, 0x52, 0xF0, 0x74, \r
+0x9F, 0xA3, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x90, 0x93, 0xCC, 0xEF, 0xF0, \r
+0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, 0xEE, \r
+0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0xCD, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C, \r
+0x90, 0x93, 0xD1, 0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, \r
+0x01, 0x90, 0x93, 0xB7, 0xE0, 0xFD, 0x12, 0x7E, 0x4C, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, \r
+0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, \r
+0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0xCF, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xD5, 0x74, \r
+0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x93, 0xD1, \r
+0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x90, 0x47, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE, \r
+0x02, 0x7E, 0xFE, 0x90, 0x93, 0xD1, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, \r
+0x93, 0xD9, 0xF0, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0xDC, \r
+0xE0, 0x90, 0x93, 0xB5, 0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD, \r
+0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90, 0x93, 0xD3, 0xEC, 0xF0, \r
+0xA3, 0xED, 0xF0, 0x90, 0x93, 0xDA, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x93, 0xD1, \r
+0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xEF, 0x64, 0xFE, 0x70, 0x37, 0x90, 0x93, 0xD1, 0xA3, \r
+0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, \r
+0x90, 0x75, 0x42, 0x4A, 0x75, 0x43, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x75, \r
+0x41, 0x90, 0x75, 0x42, 0x4A, 0x75, 0x43, 0x02, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xDC, 0x12, 0x35, \r
+0x26, 0x80, 0x60, 0x90, 0x93, 0x77, 0xE0, 0xFF, 0xB4, 0x02, 0x2B, 0x90, 0x93, 0xD1, 0xE0, 0xFC, \r
+0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, \r
+0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x93, 0xDC, 0xF0, \r
+0xA3, 0x74, 0x20, 0xF0, 0x80, 0x2D, 0xEF, 0xB4, 0x04, 0x29, 0x90, 0x93, 0xD1, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, \r
+0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0xF0, 0xE4, 0x90, 0x93, 0xDC, 0xF0, 0xA3, \r
+0x74, 0x10, 0xF0, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, \r
+0xCE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, \r
+0xE0, 0xFE, 0x90, 0x93, 0xD1, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, \r
+0x90, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xDE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, \r
+0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xB7, 0x90, 0x93, 0xD1, 0xE4, 0x75, \r
+0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, \r
+0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, \r
+0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x94, \r
+0x58, 0xF0, 0xE4, 0x90, 0x93, 0xCE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, \r
+0x1C, 0x12, 0x7F, 0xE1, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0x80, 0xDA, 0x7F, 0x64, 0x7E, \r
+0x00, 0x12, 0x3E, 0x50, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x7D, 0xE0, 0xFD, \r
+0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, \r
+0x90, 0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x9F, \r
+0xFF, 0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, \r
+0x90, 0x93, 0xCD, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00, \r
+0xFE, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, 0x12, 0x39, 0x9C, 0x7B, 0x01, \r
+0x7A, 0x93, 0x79, 0xD5, 0x90, 0xAC, 0xA0, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xB8, 0x90, 0xAC, \r
+0xA3, 0x12, 0x44, 0x12, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, 0x90, 0x79, 0x03, 0x12, 0x35, \r
+0x86, 0x90, 0x94, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x30, 0xE2, 0x0B, 0x90, 0x94, \r
+0x58, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x02, 0x21, 0xA2, 0x90, 0x94, 0x58, 0xE0, 0xC3, 0x94, 0x0A, \r
+0x40, 0x0A, 0x90, 0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, 0xF0, 0xE4, 0x90, 0x93, 0xCE, \r
+0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x12, 0x7F, 0xE1, 0x90, 0x93, \r
+0xCC, 0xEF, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, \r
+0xE0, 0xFF, 0x90, 0x93, 0xCC, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2C, 0x90, \r
+0x05, 0x22, 0xE0, 0x90, 0x94, 0x57, 0xF0, 0x7D, 0x1D, 0x12, 0x57, 0xF4, 0xBF, 0x01, 0x10, 0x12, \r
+0x56, 0xA5, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, \r
+0x94, 0x57, 0xE0, 0xFF, 0x7D, 0x1E, 0x12, 0x52, 0xA5, 0x80, 0x10, 0x12, 0x56, 0xA5, 0x90, 0x93, \r
+0xCC, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, \r
+0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x52, 0x83, 0x74, 0x52, 0x04, 0x90, \r
+0x01, 0xC4, 0xF0, 0x74, 0x9F, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0xB4, 0x02, 0x0C, 0x90, 0x94, 0x05, 0x74, 0x80, \r
+0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, 0x04, 0x0A, 0x90, 0x94, 0x05, 0x74, 0x80, \r
+0xF0, 0xA3, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0x81, 0x13, 0x90, 0x90, 0x44, \r
+0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0x81, 0x13, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, \r
+0x60, 0x02, 0x81, 0x13, 0x90, 0x90, 0xA4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x94, \r
+0x07, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, \r
+0x79, 0xC5, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, \r
+0xE5, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, \r
+0x20, 0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xA6, 0x90, 0xAC, \r
+0x89, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xE5, 0x90, 0xAC, 0x8C, 0x12, 0x44, 0x12, 0x90, 0xAC, \r
+0x8F, 0x74, 0x20, 0xF0, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x5B, 0x75, 0x40, 0x01, 0x75, 0x41, \r
+0x93, 0x75, 0x42, 0xED, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC5, 0x12, 0x35, 0x26, \r
+0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0xCD, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x93, \r
+0x79, 0xB5, 0x12, 0x35, 0x26, 0x90, 0x93, 0xCB, 0xE0, 0x54, 0x03, 0xFF, 0xC3, 0x94, 0x04, 0x90, \r
+0x90, 0x01, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, \r
+0xB5, 0x91, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x09, 0xEF, 0xF0, 0xA3, 0x12, 0x44, \r
+0x12, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, \r
+0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, 0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08, \r
+0xA4, 0x24, 0x02, 0x91, 0xFC, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x04, 0xF9, 0xE4, \r
+0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, \r
+0x12, 0x35, 0x26, 0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0x91, 0xFC, 0x90, \r
+0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, \r
+0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, 0x90, 0x94, 0x09, \r
+0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0x91, 0xFC, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9, \r
+0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, \r
+0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, 0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, \r
+0x05, 0x91, 0xFC, 0x90, 0x94, 0x09, 0xE0, 0xFE, 0x44, 0x10, 0x90, 0x94, 0x0D, 0xF0, 0xA3, 0x74, \r
+0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x91, 0xFC, 0x90, \r
+0x94, 0x0D, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x75, \r
+0xF0, 0x08, 0xA4, 0x04, 0x91, 0xFC, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, 0x7A, \r
+0x94, 0x79, 0x0D, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
+0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00, \r
+0x03, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, \r
+0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x95, \r
+0x1C, 0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0x90, 0x95, 0x21, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, \r
+0xA2, 0x90, 0x95, 0x22, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x23, 0xF0, 0x90, \r
+0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x24, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x90, \r
+0x95, 0x25, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x26, 0xF0, 0x90, 0x00, 0x03, \r
+0x12, 0x06, 0xA2, 0x90, 0x95, 0x29, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0x21, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x95, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, \r
+0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x95, 0x20, 0xE0, 0xFF, \r
+0xB4, 0x04, 0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0xEE, 0x12, 0x06, 0xCF, \r
+0x90, 0x95, 0x22, 0xE0, 0xFE, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0x90, 0x00, 0x01, 0xEE, 0x12, \r
+0x06, 0xE1, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x95, 0x22, 0xE0, \r
+0xFF, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0xEF, 0x12, 0x06, 0xCF, 0x90, 0x95, 0x22, 0xE0, 0x44, \r
+0x20, 0x54, 0x7F, 0xFF, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, \r
+0xE1, 0x90, 0x95, 0x21, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x1C, 0x12, 0x44, \r
+0x09, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, 0x20, 0x12, 0x06, 0xCF, \r
+0x90, 0x95, 0x23, 0xE0, 0xFF, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0x90, 0x00, 0x04, 0xEF, 0x12, \r
+0x06, 0xE1, 0x90, 0x95, 0x24, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x25, 0xE0, \r
+0x90, 0x00, 0x06, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x26, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, \r
+0xED, 0x14, 0x60, 0x06, 0x04, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x8F, 0x2E, \r
+0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x83, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
+0x90, 0xDD, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xEF, 0xF0, 0xA3, 0xF0, 0x90, 0x91, 0x31, 0xF0, 0xA3, \r
+0xF0, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x7C, 0x00, 0xAD, \r
+0x07, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, \r
+0x00, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, \r
+0x3E, 0x90, 0x90, 0xDD, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, \r
+0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xDF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xE1, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, \r
+0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x06, 0x2B, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xE3, 0xF0, 0xA3, 0xEF, \r
+0xF0, 0x74, 0x09, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x08, 0x2B, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xE5, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, \r
+0x90, 0x90, 0xE3, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x3A, 0xE4, 0x90, 0x93, 0xAA, 0xF0, 0x90, \r
+0x93, 0xAA, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x2E, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, \r
+0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5B, 0x50, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0xF1, 0xF5, 0x82, \r
+0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xAA, 0xE0, \r
+0x04, 0xF0, 0x80, 0xCB, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0, 0xE4, 0x90, \r
+0x90, 0xEF, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xAA, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x28, \r
+0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5B, 0x50, 0x90, \r
+0x93, 0xAA, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, \r
+0x90, 0x93, 0xAA, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, \r
+0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01, 0x12, 0x59, 0x4E, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, \r
+0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFD, \r
+0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x93, 0xA8, 0xE0, 0x24, 0x10, 0xFF, 0x90, 0x93, 0xA7, 0xE0, \r
+0x34, 0x00, 0xFE, 0x12, 0x5B, 0x50, 0x90, 0x93, 0xA9, 0xE0, 0x24, 0xE9, 0xF5, 0x82, 0xE4, 0x34, \r
+0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA9, 0xE0, 0x04, 0xF0, \r
+0x80, 0xC9, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x16, 0xFF, \r
+0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0x90, 0x90, 0xED, 0xA3, 0xE0, 0xB5, 0x07, 0x1F, \r
+0x90, 0x93, 0xA8, 0xE0, 0x24, 0x16, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xFE, 0x7D, 0x01, \r
+0x12, 0x5B, 0x50, 0xEF, 0xFD, 0x90, 0x90, 0xED, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, \r
+0x00, 0x22, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93, 0xAB, \r
+0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x7E, 0x00, 0x90, 0x93, 0xAB, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, \r
+0x91, 0x33, 0xF0, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB, \r
+0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
+0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, \r
+0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
+0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, \r
+0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, \r
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9, \r
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x42, 0x90, 0x90, 0x91, 0x37, 0x12, \r
+0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB, 0xA3, \r
+0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, \r
+0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, \r
+0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
+0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, \r
+0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, \r
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9, \r
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x42, 0x90, 0x90, 0x91, 0x3B, 0x12, \r
+0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB, 0xA3, \r
+0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, \r
+0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, \r
+0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, \r
+0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, \r
+0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, \r
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9, \r
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x42, 0x90, 0x90, 0x91, 0x3F, 0x12, \r
+0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0xAD, \r
+0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x43, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, \r
+0xEF, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90, 0x93, 0xAB, 0xE4, \r
+0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, \r
+0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, \r
+0x74, 0x53, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAD, 0xE0, \r
+0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, \r
+0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, \r
+0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x63, 0x2E, 0xF5, 0x82, 0xE4, \r
+0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, \r
+0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x87, 0xE0, 0x04, 0x90, \r
+0x93, 0xAF, 0xF0, 0xE4, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x91, 0x33, 0xE0, 0x13, 0x13, 0x54, 0x3F, \r
+0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0xAE, 0xE0, 0xFD, 0xC3, 0x9F, 0xEE, 0x64, 0x80, \r
+0xF8, 0x74, 0x80, 0x98, 0x50, 0x78, 0xA3, 0xE0, 0x2D, 0xF0, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x90, \r
+0x93, 0xAB, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0xFD, 0xC3, \r
+0x94, 0x04, 0x50, 0x52, 0xA3, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35, \r
+0xF0, 0xFE, 0xEF, 0x78, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x73, 0xF9, 0x74, \r
+0x91, 0x3E, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, \r
+0xF9, 0xE4, 0x34, 0xFC, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0, \r
+0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x93, \r
+0xAD, 0xE0, 0x04, 0xF0, 0x80, 0xA4, 0x90, 0x93, 0xAE, 0xE0, 0x04, 0xF0, 0x61, 0x78, 0xE4, 0x90, \r
+0x93, 0xAD, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF, 0xB4, 0x20, 0xFB, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, \r
+0xE0, 0xB4, 0x10, 0xEF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x00, 0xC9, 0xBB\r
 };\r
-u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 21354;\r
+u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 27724;\r
 \r
 \r
 void\r
@@ -4884,16 +5308,15 @@ ODM_ReadFirmware_MP_8723B_FW_WoWLAN(
 }\r
 \r
 \r
-// v15.34 20131011 by Gimmy <gimmy@realtek.com>\r
 u1Byte Array_MP_8723B_FW_MP[] = {\r
-0x01, 0x53, 0x10, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x21, 0x22, 0x48, 0x22, 0x7B, 0x00, 0x00, \r
-0x4E, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x02, 0x45, 0x8D, 0x02, 0x60, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x60, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x70, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x01, 0x53, 0x10, 0x00, 0x17, 0x00, 0x03, 0x00, 0x03, 0x04, 0x13, 0x42, 0x5E, 0x7C, 0x00, 0x00, \r
+0x7D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x02, 0x45, 0xED, 0x02, 0x70, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x70, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x7F, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x60, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x67, 0xF0, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x02, 0x6F, 0xE8, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, \r
+0x00, 0x00, 0x00, 0x02, 0x70, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5F, 0x0D, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x02, 0x79, 0x56, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, \r
 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, \r
 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, \r
 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, \r
@@ -4923,7 +5346,13 @@ u1Byte Array_MP_8723B_FW_MP[] = {
 0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, \r
 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x19, \r
 0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x34, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x94, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, \r
 0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, \r
 0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, \r
 0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, \r
@@ -4938,7 +5367,7 @@ u1Byte Array_MP_8723B_FW_MP[] = {
 0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, \r
 0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, \r
 0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, \r
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x31, 0x74, 0x01, 0x93, \r
+0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x90, 0x74, 0x01, 0x93, \r
 0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, \r
 0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, \r
 0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, \r
@@ -4948,10 +5377,10 @@ u1Byte Array_MP_8723B_FW_MP[] = {
 0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, \r
 0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, \r
 0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, \r
-0x04, 0x90, 0x46, 0x31, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
+0x04, 0x90, 0x46, 0x90, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, \r
 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, \r
 0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, \r
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0x7D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, \r
+0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0xDD, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, \r
 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, \r
 0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, \r
 0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, \r
@@ -4959,12 +5388,12 @@ u1Byte Array_MP_8723B_FW_MP[] = {
 0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, \r
 0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, \r
 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, \r
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0x7C, 0x8F, 0xF0, \r
+0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0xDC, 0x8F, 0xF0, \r
 0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, \r
 0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, \r
 0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, \r
 0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, \r
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0x7D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
+0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0xDD, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, \r
 0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, \r
 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, \r
 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, \r
@@ -4976,837 +5405,1039 @@ u1Byte Array_MP_8723B_FW_MP[] = {
 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, \r
 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, \r
 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, \r
-0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x45, 0xCB, \r
-0x02, 0x43, 0x0D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, \r
+0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x46, 0x2B, \r
+0x02, 0x43, 0x6D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, \r
 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, \r
 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, \r
-0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x10, 0xE4, 0x7E, \r
+0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x70, 0xE4, 0x7E, \r
 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, \r
 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, \r
 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, \r
 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, \r
-0x00, 0x41, 0xA3, 0xB9, 0x00, 0x41, 0xA3, 0xBA, 0x00, 0x41, 0xA3, 0xBB, 0x00, 0x41, 0xA3, 0xBF, \r
-0x00, 0x41, 0xA3, 0xC0, 0x00, 0x41, 0xA3, 0xC1, 0x00, 0x41, 0xA3, 0xDD, 0x00, 0x41, 0xA3, 0xE3, \r
-0x00, 0x4D, 0xD7, 0x58, 0x34, 0x49, 0xBB, 0x7F, 0x02, 0x12, 0x4C, 0x74, 0xEF, 0x44, 0x01, 0xFD, \r
-0x7F, 0x02, 0xD1, 0x4F, 0x7F, 0x02, 0x12, 0x4C, 0x74, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, \r
-0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x7F, 0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x20, 0xE6, 0x02, 0xE1, 0x9E, 0x90, 0x00, 0x8C, 0xE0, 0xF5, \r
-0x6E, 0x7F, 0x8D, 0x12, 0x4C, 0x74, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, 0x60, \r
-0x0D, 0x24, 0x03, 0x60, 0x02, 0xE1, 0x8F, 0xAF, 0x6E, 0x12, 0xB3, 0xFF, 0xE1, 0x8F, 0x74, 0x96, \r
-0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xF1, 0xA8, \r
-0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, \r
-0x0D, 0xE4, 0xFF, 0xF1, 0xA8, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, \r
-0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xF1, 0xA8, 0x75, 0xF0, 0x04, 0xE5, \r
-0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xF1, 0xA8, \r
-0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x16, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1, \r
-0xA8, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x17, 0xF1, 0xA3, 0x75, 0xF0, 0x04, 0xE5, 0x6E, \r
-0x90, 0x96, 0x18, 0xB1, 0x49, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xF1, 0xA8, \r
-0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x18, 0xB1, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xF1, \r
-0xA8, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, \r
-0xF1, 0xA8, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x01, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, \r
-0x6E, 0x90, 0x89, 0x02, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0xF1, 0xA3, \r
-0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x04, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1, \r
-0xA8, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x05, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, 0x6E, \r
-0x90, 0x89, 0x06, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x07, 0xF1, 0xA3, 0x7F, \r
-0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0xD1, 0x4F, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0xB1, 0x49, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, \r
-0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, \r
-0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, \r
-0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0xD1, 0x4F, \r
-0xAD, 0x0E, 0x7F, 0x51, 0xD1, 0x4F, 0xAD, 0x0F, 0x7F, 0x52, 0xD1, 0x4F, 0xAD, 0x10, 0x7F, 0x53, \r
-0xC1, 0x4F, 0xD1, 0x69, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA3, 0x65, \r
-0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA3, 0x72, 0x74, 0x0F, 0xF0, \r
-0x90, 0xA3, 0x64, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0x65, 0xE0, 0x2F, 0xFE, \r
-0x74, 0x66, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F, \r
-0xE9, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x64, 0x11, 0x44, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xA5, 0x12, 0x45, \r
-0x5E, 0x7F, 0x96, 0x7E, 0x02, 0x31, 0x0A, 0xEF, 0x60, 0x59, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, \r
-0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, \r
-0x3E, 0xFE, 0x90, 0xA3, 0xA8, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA3, 0xA8, \r
-0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xA5, 0x12, 0x45, 0x55, 0x90, \r
-0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x31, 0x60, 0x90, 0xA3, 0xA8, \r
-0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA3, 0xA5, 0x12, 0x45, 0x55, 0x12, 0x97, 0x54, 0x90, 0x02, 0x96, \r
-0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, \r
-0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xFE, 0x90, 0xA0, 0x8B, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, \r
-0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, \r
-0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, 0x44, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, \r
-0xA0, 0x8B, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, \r
-0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0xA3, 0x9D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, \r
-0x9D, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0xA0, \r
-0xE0, 0x94, 0xE8, 0x90, 0xA3, 0x9F, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, \r
-0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0x9F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, \r
-0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, \r
-0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, \r
-0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, \r
-0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, \r
-0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, \r
-0x01, 0x12, 0x44, 0x7E, 0x90, 0xA2, 0xB0, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x97, 0xE0, 0x60, \r
-0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0B, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x62, 0xFC, 0x12, 0xA7, \r
-0xCE, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, \r
-0x12, 0x94, 0x36, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, \r
-0xFB, 0xF0, 0x11, 0xB8, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE6, 0x05, \r
-0x54, 0xBF, 0xF0, 0x51, 0x19, 0xD2, 0xAF, 0x80, 0xB2, 0xE4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xD7, \r
-0x51, 0x40, 0xEF, 0xB4, 0x02, 0x19, 0x90, 0xA3, 0xB9, 0xE0, 0x64, 0x04, 0x60, 0x0C, 0x7F, 0x40, \r
-0x12, 0x7D, 0x46, 0x90, 0xA3, 0xB9, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xB9, 0xF0, 0x22, \r
-0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x8F, 0xEF, 0xF0, \r
-0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x7F, 0xA3, 0x91, 0x74, 0xEF, 0x54, 0xF8, 0x44, 0x05, \r
-0xFD, 0x7F, 0xA3, 0x12, 0x46, 0x4F, 0x7F, 0xA0, 0x91, 0x74, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, \r
-0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, 0xA3, 0x8F, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, \r
-0xA3, 0x12, 0x45, 0x55, 0x12, 0x8F, 0xC5, 0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0x91, 0x96, 0x7F, \r
-0x02, 0x80, 0x06, 0x7F, 0x02, 0x91, 0x96, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD, \r
-0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA2, 0xEE, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x81, \r
-0x64, 0x90, 0xA3, 0xBB, 0xE0, 0x70, 0x18, 0x7F, 0x2E, 0x91, 0x74, 0x90, 0xA1, 0xC9, 0xEF, 0xF0, \r
-0x7F, 0x2D, 0x91, 0x74, 0x90, 0xA1, 0xCA, 0xEF, 0xF0, 0x90, 0xA3, 0xBB, 0x74, 0x01, 0xF0, 0x90, \r
-0xA2, 0xEE, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, 0xF4, \r
-0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA1, 0xC9, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, 0xA2, \r
-0xED, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0xC9, 0xE0, 0x13, \r
-0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x90, 0xA2, 0xED, 0xF0, 0xD3, 0x94, 0x3F, 0x40, \r
-0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0xED, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, \r
-0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA2, 0xEB, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0x4F, \r
-0x90, 0xA2, 0xED, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0x0F, 0x4F, 0xFD, \r
-0x7F, 0x2D, 0x12, 0x46, 0x4F, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, 0xE0, \r
-0xFF, 0x12, 0x7C, 0x94, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x23, 0x09, 0x7F, \r
-0x01, 0x12, 0x7F, 0x30, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x27, 0x09, 0x7F, \r
-0x02, 0x12, 0x7F, 0x30, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, \r
-0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x7D, 0xD3, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0x64, \r
-0x34, 0x70, 0x70, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09, \r
-0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x80, 0x0B, 0x91, 0x65, 0xEF, 0x44, 0x01, 0xFD, 0x7F, \r
-0x64, 0x12, 0x46, 0x4F, 0x90, 0xA2, 0xEB, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0xEB, 0xFD, \r
-0x7F, 0x34, 0x51, 0x44, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, \r
-0xE0, 0x44, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, \r
-0x54, 0xE7, 0xF0, 0x80, 0x0D, 0x7F, 0x4E, 0x91, 0x74, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, \r
-0x46, 0x4F, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x04, 0x9D, 0xE0, \r
-0x54, 0xFE, 0xF0, 0x90, 0xA2, 0xEE, 0xE0, 0xFD, 0xB4, 0x35, 0x07, 0x90, 0xA1, 0x95, 0xE0, 0x44, \r
-0x01, 0xF0, 0xED, 0xB4, 0x36, 0x22, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0xFD, \r
-0x62, 0xE0, 0x90, 0xA2, 0xEC, 0xF0, 0x90, 0xA2, 0xEE, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0xE0, 0xFD, \r
-0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEC, 0x51, 0x44, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x37, 0x03, 0x12, \r
-0x89, 0x2A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, \r
-0x90, 0xA1, 0xB1, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xB1, 0xF0, 0x90, 0xFD, 0x68, \r
-0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7F, 0x4E, 0x91, 0x74, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x4E, 0x12, \r
-0x46, 0x4F, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, \r
-0xE0, 0x90, 0xA3, 0xD9, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xD9, 0xE0, \r
-0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x45, 0x7F, 0x04, 0x8F, 0x70, 0x7F, 0x02, 0x12, 0x44, \r
-0x57, 0x90, 0x9F, 0x97, 0xE0, 0x45, 0x70, 0xF0, 0x22, 0x7F, 0xFF, 0xD1, 0xD8, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xFA, 0x12, 0x46, 0x44, 0x12, 0x46, 0x37, 0x12, 0x46, 0x37, 0x90, \r
-0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, \r
-0xF0, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, \r
-0x78, 0x74, 0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x37, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x08, \r
-0x90, 0xA3, 0xD1, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0xD1, 0xF0, 0x90, 0xA1, 0x7F, \r
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0xD2, 0xF0, 0x80, 0x06, 0x90, \r
-0xA3, 0xD2, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0xD1, 0x12, 0x69, 0x4E, 0x90, 0x07, 0x78, 0x74, 0x01, \r
-0xF0, 0x90, 0xA1, 0x7E, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0xAF, \r
-0x90, 0x9F, 0x9C, 0xEF, 0xF0, 0x12, 0x98, 0xB8, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, \r
-0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x79, 0x91, 0x74, 0xEF, 0x54, 0x0E, 0x70, 0x17, 0x7F, 0x28, \r
-0x91, 0x74, 0xEF, 0x20, 0xE2, 0x0F, 0x7F, 0x17, 0x91, 0x74, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, \r
-0x7F, 0x17, 0x12, 0x46, 0x4F, 0x7F, 0x38, 0x91, 0x74, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, \r
-0x46, 0x4F, 0x02, 0x37, 0x99, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x44, \r
-0x18, 0xF0, 0x80, 0x0B, 0x91, 0x65, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x12, 0x46, 0x4F, 0x90, \r
-0xA1, 0x24, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x1B, 0xE0, 0x60, 0x12, 0x90, \r
-0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, \r
-0xF0, 0x7F, 0x08, 0x91, 0x74, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x4F, 0x7F, 0x01, \r
-0x12, 0x59, 0xC4, 0x7F, 0x90, 0x91, 0x74, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0x4F, \r
-0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x7F, 0x81, 0x91, 0x74, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, \r
-0x81, 0x12, 0x46, 0x4F, 0x7F, 0x80, 0x91, 0x74, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46, \r
-0x4F, 0x12, 0x99, 0x73, 0x12, 0x3E, 0x11, 0x12, 0x99, 0x80, 0x12, 0x9A, 0x1B, 0x7F, 0x01, 0x12, \r
-0x43, 0x45, 0x90, 0xA1, 0xEC, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0x45, 0x90, 0xA1, 0xEC, 0xE0, \r
-0x04, 0xF0, 0xB1, 0x2E, 0x12, 0x94, 0xA8, 0x7F, 0x80, 0x91, 0x74, 0xEF, 0x44, 0x40, 0xFD, 0x7F, \r
-0x80, 0x12, 0x46, 0x4F, 0x75, 0x28, 0xFF, 0x12, 0x58, 0x2D, 0x12, 0x99, 0xC1, 0x7F, 0x81, 0x91, \r
-0x74, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x4F, 0x12, 0x9A, 0x29, 0x12, 0xB7, 0x01, \r
-0xE4, 0xFF, 0x02, 0x43, 0xCE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x55, 0x74, \r
-0x15, 0xF0, 0x90, 0xA3, 0x63, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x57, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, \r
-0xA3, 0x79, 0x55, 0x12, 0x7C, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x91, 0x74, 0xE5, \r
-0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x91, 0x74, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x91, \r
-0x74, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x91, 0x74, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, \r
-0x11, 0x7F, 0x54, 0x12, 0x46, 0x4F, 0xAD, 0x12, 0x7F, 0x55, 0x12, 0x46, 0x4F, 0xAD, 0x13, 0x7F, \r
-0x56, 0x12, 0x46, 0x4F, 0xAD, 0x14, 0x7F, 0x57, 0x12, 0x46, 0x4F, 0x53, 0x91, 0xEF, 0x22, 0x7F, \r
-0xF4, 0x91, 0x74, 0xEF, 0x20, 0xE5, 0x0D, 0x7F, 0xF4, 0x91, 0x74, 0xEF, 0x7F, 0x01, 0x20, 0xE4, \r
-0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x90, 0xA2, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x7E, \r
-0x00, 0xE4, 0xFD, 0xD1, 0xEF, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x9F, 0x9B, \r
-0xED, 0xF0, 0x22, 0x90, 0xA2, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x89, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, \r
-0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2F, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x8E, 0xF0, 0x7D, \r
-0x14, 0xF1, 0xF6, 0xBF, 0x01, 0x15, 0x12, 0x65, 0xFE, 0x90, 0xA3, 0x8C, 0xEE, 0xF0, 0xFC, 0xA3, \r
-0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x8B, 0xE0, 0xFF, 0x12, 0x65, 0x7E, 0x90, 0xA3, 0x8E, 0xE0, 0xFF, \r
-0x7D, 0x15, 0xD1, 0xD8, 0x80, 0x15, 0x12, 0x65, 0xFE, 0x90, 0xA3, 0x8C, 0xEE, 0xF0, 0xFC, 0xA3, \r
-0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x8B, 0xE0, 0xFF, 0x12, 0x65, 0x7E, 0x90, 0x04, 0x1F, 0x74, 0x20, \r
-0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF7, 0xE0, 0x30, 0xE0, 0x7C, 0x90, \r
-0xA1, 0xF9, 0xE0, 0x70, 0x3C, 0x7D, 0x16, 0x7F, 0x6F, 0xD1, 0xD8, 0xF1, 0xFA, 0x90, 0xA1, 0xF7, \r
-0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0D, 0xD1, 0xE3, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, \r
-0x54, 0x07, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x02, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x01, 0xF0, 0xE4, \r
-0x90, 0xA3, 0x87, 0xF0, 0xA3, 0x74, 0x03, 0x12, 0x50, 0x8A, 0x90, 0xA1, 0xF9, 0x74, 0x01, 0xF0, \r
-0x22, 0x90, 0xA1, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, \r
-0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x02, 0x12, 0x45, 0x49, 0xE0, 0x30, 0xE0, 0x19, 0x75, \r
-0xF0, 0x0D, 0xEF, 0xD1, 0xE3, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB, \r
-0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x50, 0x92, 0x12, 0xB6, 0x61, 0x22, 0x7D, 0x20, 0x91, 0xA9, \r
-0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x6E, 0x89, 0xE4, 0xFD, 0xFF, 0xD1, 0xD8, 0x90, \r
-0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x7F, 0xFF, 0xD1, 0xD8, 0xE4, 0x90, 0xA3, 0xD3, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, \r
-0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, \r
-0xE0, 0x15, 0xD3, 0x90, 0xA3, 0xD4, 0xE0, 0x94, 0x03, 0x90, 0xA3, 0xD3, 0xE0, 0x94, 0x00, 0x40, \r
-0x02, 0x80, 0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA3, 0xD4, 0xE0, 0x94, 0xE8, 0x90, 0xA3, \r
-0xD3, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, \r
-0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xD3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, \r
-0xD6, 0x80, 0x9E, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, \r
-0xA2, 0x04, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x03, 0x12, 0x45, \r
-0x49, 0xE0, 0x90, 0xA3, 0x88, 0xF0, 0x90, 0xA3, 0x87, 0xEE, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, \r
-0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x90, 0xA3, 0x87, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA3, \r
-0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF7, 0xE0, 0x30, 0xE0, 0x0A, 0x12, 0x77, 0x7E, 0xE4, 0x90, \r
-0xA1, 0xF9, 0xF0, 0x11, 0x63, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x80, 0xA7, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA3, 0x99, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF, 0x12, 0x84, 0xB1, \r
-0x90, 0xA1, 0x92, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6E, 0x89, 0x90, \r
-0xA1, 0x92, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x80, 0x42, 0x90, \r
-0xA1, 0x8E, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, \r
-0x0D, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0x91, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEE, \r
-0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, 0x90, 0xA1, 0x91, 0xE0, \r
-0xFE, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x09, \r
-0xF0, 0x90, 0xA3, 0x99, 0xE0, 0x64, 0x03, 0x60, 0x02, 0x21, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x6F, 0x90, 0xA1, 0x98, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0xFE, 0xD3, 0x9F, \r
-0x40, 0x42, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0xA1, 0x9A, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, \r
-0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA1, 0x90, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, \r
-0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xEE, 0x9F, 0x90, 0xA3, 0x9C, 0xF0, 0x80, 0x06, 0x90, \r
-0xA3, 0x9C, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0x9C, 0xE0, 0xFF, 0x11, 0xDA, 0x90, 0xA1, 0xA1, 0xE0, \r
-0x04, 0xF0, 0x80, 0x18, 0x90, 0xA1, 0x9B, 0xE0, 0xFF, 0x11, 0xDA, 0x90, 0xA1, 0x96, 0x74, 0x04, \r
-0xF0, 0xE4, 0x90, 0xA1, 0xA1, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, \r
-0xF0, 0x80, 0x0D, 0x90, 0xA1, 0x90, 0xE0, 0xFF, 0x11, 0xDA, 0x90, 0xA1, 0xA1, 0xE0, 0x04, 0xF0, \r
-0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, \r
-0x9B, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x9B, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, \r
-0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, 0x9A, 0xF0, \r
-0x80, 0x06, 0x90, 0xA3, 0x9A, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x9A, 0x12, 0x69, 0x4E, 0x90, 0xA1, \r
-0xA0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90, \r
-0xA3, 0x99, 0xE0, 0x70, 0x41, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x80, 0x3A, 0x90, 0xA1, 0x8E, 0xE0, \r
-0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1D, 0x90, 0xA1, 0x94, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0x80, \r
-0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x1B, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x01, 0x7F, \r
-0x0C, 0x80, 0x11, 0x90, 0xA3, 0x99, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x06, \r
-0xE4, 0xFD, 0x7F, 0x04, 0x71, 0x11, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x18, 0x90, 0xA3, 0x99, 0xE0, \r
-0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA3, 0x99, 0xE0, 0x64, 0x03, 0x70, 0x34, 0x7D, 0x0B, \r
-0x7F, 0x6F, 0x80, 0x2B, 0x90, 0xA3, 0x99, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x21, 0x90, 0xA3, \r
-0x99, 0xE0, 0xB4, 0x03, 0x1D, 0x90, 0xA1, 0x8E, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, \r
-0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x67, 0xA4, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x4E, 0xD8, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0x7F, \r
-0x01, 0x12, 0x77, 0xBB, 0x90, 0xA1, 0x92, 0xE0, 0xC3, 0x13, 0x90, 0x06, 0xCD, 0x30, 0xE0, 0x0D, \r
+0x00, 0x41, 0xA3, 0xE4, 0x00, 0x41, 0xA3, 0xE5, 0x00, 0x41, 0xA3, 0xE6, 0x00, 0x41, 0xA3, 0xEA, \r
+0x00, 0x01, 0x70, 0x00, 0x41, 0xA3, 0xEB, 0x00, 0x41, 0xA3, 0xEC, 0x00, 0x41, 0xA4, 0x0D, 0x00, \r
+0x53, 0x1C, 0x57, 0xFB, 0x68, 0x0E, 0x7F, 0x02, 0xD1, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, \r
+0xD1, 0xAC, 0x7F, 0x02, 0xD1, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, \r
+0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xA3, 0xD1, 0xD6, 0xEF, 0x54, 0xF8, 0x44, 0x05, 0xFD, \r
+0x7F, 0xA3, 0xD1, 0xAC, 0x7F, 0xA0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, \r
+0x83, 0x00, 0xE0, 0x90, 0xA4, 0x04, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA4, \r
+0x04, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4C, 0x08, 0xD1, 0xA2, 0xD1, 0x96, 0xD1, 0x96, 0x90, 0x01, 0x00, \r
+0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90, \r
+0xA1, 0xBE, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, \r
+0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x37, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x08, 0x90, 0xA3, \r
+0xFC, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0xFC, 0xF0, 0x90, 0xA1, 0xBE, 0xE0, 0xC4, \r
+0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0xFD, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xFD, \r
+0x74, 0x02, 0xF0, 0x90, 0xA3, 0xFC, 0x12, 0x63, 0x7A, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, \r
+0xA1, 0xBD, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0xD1, 0xD6, \r
+0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0xD6, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, \r
+0xD1, 0xD6, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, 0xD6, 0xE5, 0x10, 0x5F, 0xF5, 0x14, \r
+0xAD, 0x11, 0x7F, 0x54, 0xD1, 0xAC, 0xAD, 0x12, 0x7F, 0x55, 0xD1, 0xAC, 0xAD, 0x13, 0x7F, 0x56, \r
+0xD1, 0xAC, 0xAD, 0x14, 0x7F, 0x57, 0xD1, 0xAC, 0x53, 0x91, 0xEF, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, \r
+0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0xD1, 0xAC, 0xAD, 0x0E, 0x7F, 0x51, \r
+0xD1, 0xAC, 0xAD, 0x0F, 0x7F, 0x52, 0xD1, 0xAC, 0xAD, 0x10, 0x7F, 0x53, 0xC1, 0xAC, 0x7F, 0x01, \r
+0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0xD1, 0xD6, 0xEF, 0x20, 0xE6, 0x0C, 0x7F, 0x05, 0xD1, \r
+0xD6, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0xD1, 0xAC, 0x22, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, \r
+0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x39, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, \r
+0x0D, 0xEF, 0x90, 0xA2, 0x38, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA3, 0xAF, 0xF0, 0x90, 0xA3, 0xAE, \r
+0xEE, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0x90, 0xA3, 0xAA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xAE, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, \r
+0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA3, 0xAA, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, \r
+0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x2C, 0xE0, 0x30, \r
+0xE0, 0x79, 0x90, 0xA2, 0x2E, 0xE0, 0x70, 0x3B, 0x7D, 0x16, 0x7F, 0x6F, 0x31, 0x5E, 0x91, 0x08, \r
+0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0D, 0x11, 0xDC, 0x90, 0xA2, 0x2C, \r
+0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xE0, 0x44, \r
+0x01, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0xA3, 0x74, 0x03, 0x11, 0x21, 0x90, 0xA2, 0x2E, 0x74, \r
+0x01, 0xF0, 0x22, 0x90, 0xA2, 0x2E, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, \r
+0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xE0, 0x30, 0xE0, \r
+0x18, 0x75, 0xF0, 0x0D, 0xEF, 0x11, 0xDC, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, \r
+0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x01, 0x29, 0xD1, 0x51, 0x22, 0x90, 0xA2, 0x3B, 0x12, \r
+0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0xA3, 0xB0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2D, \r
+0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0xB5, 0xF0, 0x7D, 0x14, 0x91, 0x04, 0xBF, 0x01, 0x13, 0x51, \r
+0xA8, 0x90, 0xA3, 0xB3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xB2, 0xE0, 0xFF, \r
+0x51, 0x28, 0x90, 0xA3, 0xB5, 0xE0, 0xFF, 0x7D, 0x15, 0x31, 0x5E, 0x80, 0x13, 0x51, 0xA8, 0x90, \r
+0xA3, 0xB3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xB2, 0xE0, 0xFF, 0x51, 0x28, \r
+0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x3B, \r
+0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xE8, 0xE4, 0xFD, 0xFF, 0x90, 0x05, \r
+0x22, 0xEF, 0xF0, 0x90, 0x9F, 0x9B, 0xED, 0xF0, 0x22, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x02, 0xF0, \r
+0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xBB, 0xEF, 0xF0, \r
+0xA3, 0xED, 0xF0, 0x90, 0x9F, 0x99, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x42, 0x90, \r
+0x05, 0x22, 0xE0, 0x90, 0xA3, 0xBF, 0xF0, 0x7D, 0x26, 0x91, 0x04, 0xEF, 0x64, 0x01, 0x70, 0x0B, \r
+0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x1A, 0x80, 0x15, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x03, \r
+0x12, 0xBB, 0x50, 0x90, 0xA3, 0xBF, 0xE0, 0xFF, 0x7D, 0x27, 0x31, 0x5E, 0x12, 0xBB, 0xDC, 0x80, \r
+0x0F, 0x12, 0xBB, 0xDC, 0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xBB, 0x50, \r
+0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, \r
+0x30, 0xE0, 0x0B, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x28, 0x31, 0x5E, 0x90, 0x04, \r
+0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, \r
+0x90, 0xA3, 0xBC, 0xE0, 0xFB, 0x7D, 0x01, 0x51, 0xB2, 0x90, 0xA3, 0xBD, 0xEE, 0xF0, 0xFC, 0xA3, \r
+0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xBB, 0xE0, 0xFF, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, \r
+0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, \r
+0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA3, 0xB0, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, \r
+0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xF1, 0xED, 0xF0, 0xA3, 0xEB, \r
+0xF0, 0x90, 0xA3, 0xF0, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBC, 0x47, 0x7C, 0x00, 0xAD, 0x07, \r
+0x90, 0xA3, 0xF0, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3, 0xF1, 0xE0, 0x60, 0x0E, 0x74, 0x21, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA3, 0xF2, 0xE0, 0x25, 0xE0, \r
+0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
+0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, \r
+0xF0, 0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, \r
+0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0xA3, 0xE0, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x30, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, \r
+0xE3, 0xF0, 0x7D, 0x29, 0x91, 0x04, 0xBF, 0x01, 0x16, 0x90, 0x9F, 0xA0, 0x51, 0xAC, 0x90, 0xA3, \r
+0xE1, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xE0, 0xE0, 0xFF, 0x51, 0x28, 0x90, \r
+0xA3, 0xE3, 0xE0, 0xFF, 0x7D, 0x2A, 0x31, 0x5E, 0x80, 0x16, 0x90, 0x9F, 0xA0, 0x51, 0xAC, 0x90, \r
+0xA3, 0xE1, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0xE0, 0xE0, 0xFF, 0x51, 0x28, \r
+0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x90, 0xA3, 0x18, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1C, \r
+0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x1C, 0xF0, 0x7D, 0x36, 0x91, 0x04, 0xBF, 0x01, 0x02, 0xF1, \r
+0xB9, 0x90, 0xA3, 0x1C, 0xE0, 0xFF, 0x7D, 0x37, 0x31, 0x5E, 0x80, 0x02, 0xF1, 0xB9, 0x90, 0x05, \r
+0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x38, 0x31, 0x5E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x31, 0x5E, 0xE4, 0x90, 0xA3, 0xFE, 0xF0, 0xA3, 0xF0, 0x90, \r
+0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, \r
+0x03, 0x7F, 0x01, 0x22, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x15, \r
+0xD3, 0x90, 0xA3, 0xFF, 0xE0, 0x94, 0x03, 0x90, 0xA3, 0xFE, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, \r
+0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA3, 0xFF, 0xE0, 0x94, 0xE8, 0x90, 0xA3, 0xFE, 0xE0, \r
+0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, \r
+0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xFE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, \r
+0x9E, 0x90, 0xA3, 0x16, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, \r
+0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x1B, 0xF0, 0x7D, 0x01, 0x91, 0x04, 0xEF, 0x64, \r
+0x01, 0x70, 0x02, 0xD1, 0xEF, 0x90, 0xA3, 0x1B, 0xE0, 0xFF, 0x7D, 0x02, 0x31, 0x5E, 0x80, 0x02, \r
+0xD1, 0xEF, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA3, 0x15, 0xEF, 0xF0, 0xA3, 0xED, \r
+0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0D, \r
+0x90, 0xA3, 0x16, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x5E, 0x90, 0xA3, 0x15, \r
+0xE0, 0x70, 0x0B, 0x90, 0xA3, 0x17, 0xE0, 0xFF, 0x7D, 0x05, 0x31, 0x74, 0x80, 0x26, 0x90, 0xA3, \r
+0x15, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA3, 0x17, 0xE0, 0xFF, 0x71, 0x58, 0x80, 0x16, 0x90, 0xA3, \r
+0x15, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA2, 0x27, 0xE0, 0xFE, 0xA3, \r
+0xE0, 0xFF, 0x71, 0xBB, 0x90, 0xA2, 0x19, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0A, \r
+0x90, 0xA3, 0x16, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x5E, 0x22, 0x8F, 0x54, 0x7D, 0x17, 0x91, \r
+0x04, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x75, 0xF0, \r
+0x0D, 0xE5, 0x54, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, \r
+0x13, 0x54, 0x07, 0xFB, 0x90, 0xA2, 0x2C, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0xDB, 0xF0, \r
+0xAF, 0x04, 0x12, 0xB7, 0x01, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x12, 0xB4, 0xEB, 0x75, 0xF0, 0x0D, \r
+0xE5, 0x54, 0x31, 0x4D, 0xAD, 0x54, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
+0xA3, 0xDC, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA3, 0xDE, 0xE0, 0xFF, 0xC3, \r
+0x94, 0x02, 0x40, 0x02, 0xC1, 0x4C, 0x90, 0xA3, 0xDD, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0x90, 0xA2, \r
+0x31, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, \r
+0x82, 0x8C, 0x83, 0xE0, 0x90, 0xA3, 0xDF, 0xF0, 0x90, 0xA3, 0xDC, 0xE0, 0x60, 0x31, 0x90, 0xA3, \r
+0xDF, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA2, 0x33, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, \r
+0x82, 0x90, 0xA3, 0xDE, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0, \r
+0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x33, 0x90, \r
+0xA3, 0xDF, 0xE0, 0xFF, 0x90, 0xA3, 0xDD, 0xE0, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x33, 0x12, 0x45, \r
+0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xDE, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, \r
+0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0xF4, 0x5F, 0x90, 0xA3, 0xDF, 0xF0, 0x90, 0xA3, 0xDF, 0xE0, 0xFF, 0x90, 0xA3, 0xDD, 0xE0, 0x75, \r
+0xF0, 0x0D, 0x90, 0xA2, 0x31, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xDE, 0xE0, \r
+0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, \r
+0x8C, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xDE, 0xE0, 0x04, 0xF0, 0xA1, 0x7A, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x90, 0xA2, 0x2C, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, \r
+0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0xA2, 0x2C, 0xE0, 0xFE, 0xC3, 0x13, 0x54, \r
+0x07, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x47, 0xFA, 0xE4, 0x90, 0xA2, 0x2E, 0xF0, \r
+0x91, 0x08, 0x90, 0xA2, 0x2C, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0D, 0x90, \r
+0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xE0, 0xFA, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x30, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, 0x0F, \r
+0x90, 0xA3, 0xDB, 0xF0, 0xAF, 0x02, 0x12, 0xB7, 0x01, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, \r
+0x07, 0x75, 0xF0, 0x0D, 0x12, 0xB4, 0xEB, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, \r
+0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x3A, 0x12, 0x45, 0xA9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, \r
+0x31, 0x4D, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xA1, 0x68, 0x90, \r
+0x9F, 0xA1, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x51, 0xB2, 0x90, 0xA3, 0x19, 0xEE, 0xF0, 0xFC, \r
+0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA3, \r
+0x20, 0xF0, 0x90, 0xA3, 0x1D, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA3, 0x1D, \r
+0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x51, 0x28, 0x90, 0xA3, 0x1D, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA3, 0x1F, 0xE0, 0xFF, 0x90, 0xA3, 0x1D, 0xA3, 0xE0, 0xFE, \r
+0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0x20, 0xE0, 0xFF, \r
+0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5, \r
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x12, 0xB9, 0xC9, 0x90, 0xA1, \r
+0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x12, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0xE4, 0xFD, 0xFF, \r
+0x31, 0x5E, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0x74, 0x22, 0x90, 0x9F, 0xA2, 0xE0, 0xFF, 0xE4, 0xFB, \r
+0x7D, 0x01, 0x51, 0xB2, 0x90, 0xA3, 0x1A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x18, 0xE0, \r
+0xFC, 0xA3, 0xE0, 0xFD, 0xAB, 0x07, 0x90, 0xA3, 0x1D, 0xED, 0xF0, 0xEC, 0xF9, 0xE0, 0xFF, 0xAE, \r
+0x03, 0x74, 0x2A, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2B, 0x2E, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE6, 0x02, 0x21, 0x37, 0x90, 0x00, 0x8C, 0xE0, \r
+0xF5, 0x6E, 0x7F, 0x8D, 0x12, 0x46, 0xD6, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, \r
+0x60, 0x0C, 0x24, 0x03, 0x60, 0x02, 0x21, 0x27, 0xAF, 0x6E, 0x31, 0x6A, 0x21, 0x27, 0x74, 0x96, \r
+0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x31, 0x42, \r
+0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, \r
+0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x42, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0x12, 0x45, \r
+0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x42, 0x75, 0xF0, \r
+0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, \r
+0xFF, 0x31, 0x42, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, 0xFB, \r
+0xE4, 0xFD, 0x0F, 0x31, 0x42, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x17, 0x31, 0x3C, 0x75, \r
+0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, \r
+0x0D, 0x7F, 0x01, 0x31, 0x42, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, \r
+0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0x31, 0x42, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0x12, \r
+0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x42, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, \r
+0x01, 0x31, 0x3C, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x02, 0x31, 0x3C, 0x75, 0xF0, 0x08, \r
+0xE5, 0x6E, 0x90, 0x89, 0x03, 0x31, 0x3C, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x04, 0x12, \r
+0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x42, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, \r
+0x05, 0x31, 0x3C, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x06, 0x31, 0x3C, 0x75, 0xF0, 0x08, \r
+0xE5, 0x6E, 0x90, 0x89, 0x07, 0x31, 0x3C, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE0, 0x07, \r
+0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x45, 0xA9, 0xE0, \r
+0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, \r
+0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, \r
+0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0xA4, 0x00, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE6, 0x4C, 0x7F, \r
+0x8D, 0x12, 0x46, 0xD6, 0xEF, 0x64, 0x01, 0x70, 0x42, 0x90, 0xA4, 0x01, 0xF0, 0x90, 0xA4, 0x01, \r
+0xE0, 0xFD, 0x90, 0xA4, 0x00, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5, \r
+0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x31, 0x42, 0x90, \r
+0xA4, 0x01, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xD2, 0x7F, 0x8F, 0x12, 0x46, 0xD6, \r
+0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x7F, 0xF4, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x46, 0xD6, 0xEF, 0x7F, \r
+0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x31, 0xD0, 0x90, 0x9F, 0x9C, 0xEF, \r
+0xF0, 0x51, 0x31, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, \r
+0x7F, 0x17, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0xAC, \r
+0x7F, 0x16, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xAC, \r
+0x7F, 0x38, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x46, 0xAC, 0x02, 0x37, \r
+0x99, 0x51, 0x80, 0x51, 0xB0, 0x51, 0x3C, 0x51, 0x5B, 0x02, 0x47, 0xBC, 0x75, 0x15, 0x12, 0xE4, \r
+0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, \r
+0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, \r
+0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, 0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, \r
+0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, \r
+0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, \r
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x12, 0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x51, 0x12, \r
+0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x46, 0xAC, \r
+0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x55, \r
+0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, \r
+0xAC, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA3, 0x05, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, \r
+0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, \r
+0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x51, 0x80, 0x90, 0x00, 0x03, \r
+0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0xAC, 0x80, 0xFE, 0x22, 0x7F, 0x81, 0x12, 0x46, \r
+0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xAC, 0x7F, 0x80, 0x12, 0x46, 0xD6, 0xEF, \r
+0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0xAC, 0x12, 0x9E, 0x51, 0x12, 0x3E, 0x11, 0x12, 0x9E, \r
+0x5E, 0x12, 0x9F, 0x22, 0x7F, 0x01, 0x12, 0x43, 0xA5, 0x90, 0xA2, 0x2B, 0x74, 0x02, 0xF0, 0xFF, \r
+0x12, 0x43, 0xA5, 0x90, 0xA2, 0x2B, 0xE0, 0x04, 0xF0, 0x31, 0xEA, 0x71, 0xC5, 0x7F, 0x80, 0x12, \r
+0x46, 0xD6, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0xAC, 0x75, 0x28, 0xFF, 0xF1, 0xF4, \r
+0x12, 0x9E, 0x9F, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDA, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, \r
+0xEF, 0x64, 0x01, 0x70, 0x27, 0x90, 0xA2, 0xDA, 0xE0, 0x54, 0x07, 0xF0, 0xE0, 0xFF, 0x64, 0x07, \r
+0x60, 0x04, 0xEF, 0xB4, 0x04, 0x16, 0x12, 0x9E, 0x46, 0xBF, 0x01, 0x10, 0x7F, 0x16, 0x12, 0x46, \r
+0xD6, 0xEF, 0x54, 0x0F, 0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xAC, 0x7F, 0x81, 0x12, 0x46, \r
+0xD6, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xAC, 0x12, 0x9F, 0x30, 0x12, 0xB7, 0x78, \r
+0xE4, 0xFF, 0x02, 0x44, 0x2E, 0x12, 0xB8, 0x2F, 0x12, 0x9C, 0x53, 0x12, 0xA1, 0x7D, 0x12, 0xB8, \r
+0x35, 0x91, 0xAB, 0x12, 0xBB, 0x41, 0x12, 0x85, 0xF8, 0x7E, 0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B, \r
+0x01, 0x7A, 0xA1, 0x79, 0xFD, 0x12, 0x08, 0xAA, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, \r
+0xA2, 0x04, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x71, 0x90, 0xA2, 0x00, 0x12, 0x08, \r
+0x6D, 0x90, 0x9F, 0x9C, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, \r
+0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA2, 0x0C, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, \r
+0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0xA2, 0x0D, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, \r
+0xFB, 0xF0, 0x80, 0x4A, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, \r
+0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA2, 0x0C, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, \r
+0xE1, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x9F, 0x9C, 0xE0, 0x64, 0x03, 0x70, 0x20, 0x90, 0xFD, \r
+0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA2, 0x0C, 0xEF, 0xF0, 0x90, 0xFD, \r
+0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA2, 0x0D, 0xEF, 0xF0, 0x90, 0xFD, \r
+0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x12, 0x8F, 0x3E, 0x12, 0x86, \r
+0x07, 0x90, 0xA1, 0xE6, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x63, 0x7F, 0x90, 0xA2, \r
+0x19, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, \r
+0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x16, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0x19, 0x74, 0x02, 0xF0, \r
+0x90, 0xA1, 0x20, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0, \r
+0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x51, 0xE0, 0x24, 0x04, 0x90, 0xA1, 0x2F, 0xF0, 0xA3, 0x74, \r
+0x08, 0xF0, 0xE4, 0xFD, 0xFF, 0xB1, 0x87, 0x7D, 0x0C, 0x7F, 0x02, 0xB1, 0x87, 0xB1, 0x83, 0x90, \r
+0x9F, 0x9C, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x24, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, \r
+0x90, 0xA1, 0x24, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, \r
+0x12, 0x46, 0xD6, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x46, 0xD6, 0xEF, \r
+0x30, 0xE2, 0x06, 0x90, 0xA1, 0x51, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xB9, 0x74, 0x03, 0xF0, 0xA3, \r
+0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0xA1, \r
+0x51, 0xE0, 0x24, 0x04, 0x90, 0xA1, 0x2F, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x12, 0x92, 0xFC, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, \r
+0x79, 0xBD, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, \r
+0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0xE4, 0x90, 0xA1, 0xBF, 0xF0, 0x22, 0xE0, \r
+0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, \r
+0x09, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, \r
+0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0xA1, 0x1D, 0xED, 0xF0, \r
+0x80, 0x05, 0x90, 0xA1, 0x1C, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE4, 0x31, \r
+0x90, 0xA4, 0x09, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0xA1, \r
+0x16, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0xA1, 0x1D, 0xE0, 0x54, \r
+0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0xA1, 0x1C, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46, \r
+0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x17, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, \r
+0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x87, 0x80, 0x0F, 0xB1, 0x7F, 0x90, 0x05, \r
+0x27, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, \r
+0x5E, 0x90, 0xA1, 0x17, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0xB1, 0x83, 0x80, 0x1E, 0x90, 0x06, \r
+0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x87, 0x90, \r
+0x05, 0x27, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, \r
+0x49, 0x5E, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x0B, \r
+0xED, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xE1, \r
+0xA8, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0xE1, 0xA8, 0x90, 0xA1, 0x1D, \r
+0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xE1, 0xA8, 0xEF, 0x70, 0x02, 0xE1, 0x1B, 0x24, 0xFE, 0x70, 0x02, \r
+0xE1, 0x56, 0x24, 0xFE, 0x60, 0x4B, 0x24, 0xFC, 0x70, 0x02, 0xE1, 0x93, 0x24, 0xFC, 0x60, 0x02, \r
+0xE1, 0xA8, 0xEE, 0xB4, 0x0E, 0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, \r
+0x12, 0x6E, 0xEC, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0, \r
+0xB4, 0x04, 0x0F, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xBA, 0x79, 0x80, 0x03, 0x12, \r
+0x92, 0xE8, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xA8, 0x12, 0x60, 0x3B, 0xE1, \r
+0xA8, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x6E, 0xEC, 0x90, 0xA1, 0x1D, 0xE0, \r
+0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0xAD, 0xBF, 0x01, \r
+0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xE1, 0xA8, 0xF1, 0xAD, 0xEF, \r
+0x64, 0x01, 0x60, 0x02, 0xE1, 0xA8, 0x12, 0xBA, 0xB8, 0xE1, 0xA8, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, \r
+0x0E, 0x07, 0xF1, 0xAD, 0xBF, 0x01, 0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, \r
+0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0xBA, \r
+0xB8, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x5F, 0x12, 0xBA, 0x09, 0xEF, 0x64, 0x01, 0x70, \r
+0x57, 0x12, 0xBA, 0xE9, 0x80, 0x52, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0xAD, 0xBF, \r
+0x01, 0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D, \r
+0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0xBA, 0xB8, 0x90, 0xA1, 0x1D, 0xE0, \r
+0x70, 0x05, 0x7F, 0x01, 0x12, 0x6E, 0xEC, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0xBB, \r
+0x0A, 0x80, 0x15, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x13, \r
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0xE2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xCD, \r
+0xE0, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xD3, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x80, \r
+0x1E, 0x12, 0x73, 0xF1, 0xBF, 0x01, 0x18, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x20, 0xE0, 0x0C, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, \r
+0x00, 0x22, 0x7D, 0x2F, 0x12, 0x46, 0xF8, 0x7D, 0x08, 0x7F, 0x01, 0xB1, 0x87, 0x90, 0xA1, 0x15, \r
+0x74, 0x08, 0xF0, 0x22, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0xA2, 0xDD, 0xF0, \r
+0x90, 0xA2, 0xDD, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xFB, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x57, 0xA3, \r
+0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E, \r
+0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0x1C, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x4D, 0xC2, 0xAF, \r
+0x12, 0x9E, 0xF9, 0xBF, 0x01, 0x03, 0x12, 0x7E, 0x60, 0xD2, 0xAF, 0x90, 0xA2, 0x56, 0xE0, 0xB4, \r
+0x01, 0x03, 0x12, 0xB7, 0x9F, 0x12, 0x4F, 0xFA, 0x12, 0x42, 0xDD, 0x80, 0xB3, 0x90, 0xA1, 0x11, \r
+0xE0, 0x90, 0xA1, 0x1C, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x80, 0x21, 0xE0, 0xFF, 0x7D, 0x01, 0x02, \r
+0x56, 0x56, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x13, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, \r
+0xB9, 0xC9, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x11, 0x4D, 0x22, 0xAE, 0x07, 0x11, 0x9C, \r
+0xBF, 0x01, 0x16, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0A, 0xAF, \r
+0x06, 0x7D, 0x01, 0x12, 0x56, 0x56, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, 0xE0, \r
+0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, \r
+0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x54, 0x12, 0x06, 0x89, 0xFF, 0x54, \r
+0x01, 0xFE, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, \r
+0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, \r
+0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, \r
+0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, \r
+0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, \r
+0xEF, 0x54, 0xBF, 0x4D, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x21, 0xC2, \r
+0xE0, 0x20, 0xE0, 0x02, 0x21, 0xA9, 0x75, 0x54, 0x21, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, \r
+0x51, 0x88, 0x43, 0x54, 0x08, 0x80, 0x0C, 0xE4, 0x90, 0xA1, 0x12, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, \r
+0xFF, 0x51, 0xB0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, \r
+0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, 0xA1, 0x11, \r
+0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0xA1, 0x11, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, \r
+0x90, 0xA1, 0x14, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x75, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0xFF, \r
+0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x21, 0x11, 0x9C, 0xEF, 0x60, \r
+0x04, 0x7F, 0x01, 0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, \r
+0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x41, 0x83, 0xFF, 0x12, 0x75, 0x07, \r
+0x41, 0x83, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0x41, 0x4F, 0x43, 0x54, 0x31, 0x13, \r
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x51, 0x88, 0x43, 0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4, \r
+0xFF, 0x51, 0xB0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, \r
+0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x04, 0x90, 0x05, 0x27, \r
+0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, \r
+0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x6B, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x22, 0x90, 0x05, \r
+0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0xBB, 0x26, 0x11, \r
+0x9C, 0xBF, 0x01, 0x09, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, \r
+0x12, 0x56, 0x56, 0x80, 0x3E, 0x90, 0xA1, 0x1D, 0xE0, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x34, 0x75, \r
+0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x06, 0x7D, \r
+0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, \r
+0x12, 0x56, 0x56, 0x12, 0x73, 0xE9, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x56, 0x56, \r
+0x12, 0xB8, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, \r
+0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x51, 0xB0, 0x7D, 0x01, 0x7F, 0x02, \r
+0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA1, 0xC0, 0xE0, 0x30, 0xE0, 0x33, 0x90, \r
+0xA1, 0xC2, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, 0xC3, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, \r
+0x57, 0xE2, 0x90, 0xA1, 0xC1, 0xE0, 0x14, 0x90, 0xA1, 0xC3, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, \r
+0xF0, 0xE4, 0xFF, 0x12, 0x60, 0x0B, 0x7D, 0x02, 0x7F, 0x02, 0x51, 0x91, 0x7D, 0x01, 0x7F, 0x02, \r
+0x51, 0x91, 0x22, 0x71, 0xF8, 0x90, 0xA1, 0x20, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, \r
+0x7F, 0x02, 0x51, 0x91, 0xF1, 0xC9, 0x80, 0xB0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x08, \r
+0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x35, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x04, 0xEF, 0x30, \r
+0xE0, 0x0A, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x02, 0x60, 0x23, 0x91, 0x5B, 0x90, 0xA1, 0x17, 0xE0, \r
+0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0xA1, 0x20, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, \r
+0x70, 0x0B, 0x12, 0x7F, 0xFC, 0x51, 0xA6, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0x22, 0xEF, 0x70, \r
+0x4E, 0x7D, 0x78, 0x7F, 0x02, 0x51, 0xB0, 0x7D, 0x02, 0x7F, 0x03, 0x51, 0xB0, 0x7D, 0xC8, 0x7F, \r
+0x02, 0xF1, 0xF3, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA0, \r
+0x90, 0xE0, 0x70, 0x15, 0x12, 0x60, 0x4D, 0x12, 0x92, 0xE8, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, \r
+0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x56, 0x56, \r
+0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, \r
+0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x51, 0x91, 0x7D, 0x02, \r
+0x7F, 0x03, 0x51, 0x91, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, \r
+0x90, 0x05, 0x58, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0xA1, 0x17, 0xE0, 0x54, \r
+0xFB, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x56, 0x56, \r
+0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x90, 0xA1, 0x1A, \r
+0xE0, 0x60, 0x57, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x4F, 0x90, 0xA3, 0x15, 0x04, 0xF0, \r
+0xE4, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x15, 0x90, 0xA1, 0x15, 0xE0, \r
+0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x11, 0x9C, 0xEF, 0x70, 0x04, 0x90, 0xA3, 0x15, \r
+0xF0, 0x90, 0xA3, 0x15, 0xE0, 0x60, 0x23, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, \r
+0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0x22, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x90, 0xA1, 0x1D, \r
+0xE0, 0x20, 0xE2, 0x03, 0x12, 0x56, 0x52, 0x12, 0x8A, 0x1D, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, \r
+0x01, 0x60, 0x02, 0xA1, 0x0A, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0xA1, 0x0A, 0x90, 0xA1, 0x18, \r
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, 0x21, \r
+0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0xA1, 0x20, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, \r
+0xA1, 0x20, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0xA1, 0x21, 0xEF, 0xF0, 0x90, \r
+0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x93, 0x1D, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, \r
+0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, \r
+0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, \r
+0x0E, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xB9, 0x05, 0x80, 0x02, 0xB1, 0x1B, 0x90, \r
+0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x20, 0xE0, 0xFF, \r
+0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x12, 0x7F, 0xFC, 0x51, 0xAC, 0x90, 0xA1, 0x11, 0xE0, 0xC3, 0x13, \r
+0x20, 0xE0, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, \r
+0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, 0x70, 0x0C, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, \r
+0xFD, 0xF0, 0x01, 0x4D, 0xE5, 0x63, 0x30, 0xE6, 0x23, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x01, 0x70, \r
+0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, \r
+0x60, 0x05, 0x12, 0xB9, 0x9E, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0xA1, 0x1E, 0xE0, \r
+0x54, 0xFE, 0xF0, 0xE5, 0x63, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4, \r
+0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x90, 0xA1, \r
+0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0xE8, 0xE0, 0x30, \r
+0xE0, 0x05, 0x12, 0x91, 0x0F, 0x80, 0x03, 0x12, 0x63, 0x03, 0x90, 0xA2, 0x13, 0xE0, 0x30, 0xE0, \r
+0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x14, 0xE0, 0x64, 0x08, 0x70, 0x1B, 0x90, 0xA2, 0x13, \r
+0xE0, 0x30, 0xE0, 0x0F, 0x12, 0x7B, 0xFA, 0x90, 0xA2, 0x13, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, \r
+0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x14, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x30, 0xE0, 0x13, 0x90, 0xA2, 0x15, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, \r
+0x04, 0x9C, 0xE4, 0xF0, 0x90, 0xA2, 0x15, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x06, 0x90, \r
+0xA1, 0x13, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x6E, 0x90, 0xA1, 0x16, 0xE0, 0x30, \r
+0xE0, 0x23, 0x90, 0xA1, 0x2E, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, \r
+0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x4B, \r
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, \r
+0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x51, 0xA6, 0x90, 0xA1, 0x20, 0xE0, 0x14, 0x90, \r
+0x05, 0x73, 0xF0, 0x90, 0xA3, 0xF8, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0xA3, \r
+0xF9, 0xE0, 0x94, 0x80, 0x90, 0xA3, 0xF8, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, \r
+0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x7F, 0x01, 0xD1, 0x8A, 0x90, 0xA1, 0xC0, \r
+0xE0, 0x30, 0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x51, 0xA6, 0x90, 0xA1, 0xC2, \r
+0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0xD1, 0xE7, 0x7F, 0x04, 0x8F, 0x71, 0x7F, 0x02, 0x12, 0x44, \r
+0xB7, 0x90, 0x9F, 0x97, 0xE0, 0x45, 0x71, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0xBE, \r
+0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, \r
+0x13, 0x90, 0xA3, 0xB6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x97, 0xC7, \r
+0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0xD1, 0x86, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0xD1, 0x86, \r
+0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, \r
+0x8B, 0x74, 0x15, 0xF0, 0x90, 0xA3, 0x99, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x8D, 0xEF, 0xF0, 0x7B, \r
+0x01, 0x7A, 0xA3, 0x79, 0x8B, 0x12, 0x6F, 0xEA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, \r
+0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
+0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x0D, 0xF0, \r
+0x74, 0x5F, 0xA3, 0xF0, 0x12, 0x9F, 0x68, 0xE5, 0x21, 0x30, 0xE1, 0x03, 0x12, 0xA0, 0x19, 0xE5, \r
+0x21, 0x30, 0xE2, 0x02, 0x11, 0x62, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0xF1, 0xD7, 0xE5, 0x22, 0x30, \r
+0xE0, 0x03, 0x12, 0x94, 0x74, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x74, 0x77, 0xE5, 0x23, 0x30, \r
+0xE0, 0x03, 0x12, 0x74, 0x0A, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xD6, 0xE5, 0x23, 0x30, 0xE2, \r
+0x0A, 0x12, 0x8B, 0x46, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x04, \r
+0x7F, 0x04, 0xD1, 0x8A, 0xE5, 0x24, 0x30, 0xE4, 0x02, 0x71, 0x03, 0xE5, 0x24, 0x30, 0xE5, 0x03, \r
+0x12, 0xA0, 0x6E, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0xA0, 0xAA, 0xE5, 0x24, 0x30, 0xE7, 0x03, \r
+0x12, 0x67, 0xB1, 0x74, 0x0D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 0xD0, 0x07, \r
+0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, \r
+0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x05, \r
+0xE4, 0xFF, 0x12, 0x60, 0xCE, 0x22, 0x22, 0x90, 0xA2, 0x2C, 0xE0, 0x30, 0xE0, 0x0A, 0xF1, 0xEF, \r
+0xE4, 0x90, 0xA2, 0x2E, 0xF0, 0x12, 0x47, 0xFA, 0x22, 0x7D, 0x01, 0x7F, 0x17, 0xC1, 0x9D, 0x7D, \r
+0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xAC, 0x07, 0xEF, 0x54, 0x01, \r
+0xFE, 0x90, 0xA1, 0xC0, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12, \r
+0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x80, 0x0B, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0x05, 0x73, \r
+0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x12, 0x5F, 0xF3, 0x11, 0x4D, 0xE4, 0xFD, 0xFF, \r
+0x12, 0x49, 0x5E, 0x12, 0x55, 0x83, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, \r
+0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x90, 0xA1, 0xBE, \r
+0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, \r
+0x90, 0xA1, 0xE8, 0xE0, 0x20, 0xE0, 0x34, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2E, 0x90, 0xA2, 0x0C, \r
+0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, 0xFA, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xFA, 0x74, 0x01, 0xF0, \r
+0x90, 0xA1, 0xBE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0xFB, 0x30, 0xE0, 0x05, 0x74, 0x01, \r
+0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0xFA, 0x71, 0x7A, 0x7F, 0x02, 0x12, 0x46, 0xD6, \r
+0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC0, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF, \r
+0xD1, 0xDF, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0x11, 0x4D, \r
+0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x80, 0x42, \r
+0x90, 0xA1, 0xCD, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, \r
+0x74, 0x0D, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0xD0, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, \r
+0xEE, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, 0x90, 0xA1, 0xD0, \r
+0xE0, 0xFE, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, \r
+0x09, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x64, 0x03, 0x60, 0x02, 0x21, 0xD1, 0xEF, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x30, 0xE0, 0x6F, 0x90, 0xA1, 0xD7, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0xFE, 0xD3, \r
+0x9F, 0x40, 0x42, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0xFE, 0xC3, 0xEF, \r
+0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA1, 0xCF, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, \r
+0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xEE, 0x9F, 0x90, 0xA3, 0xC3, 0xF0, 0x80, 0x06, \r
+0x90, 0xA3, 0xC3, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0xC3, 0xE0, 0xFF, 0x51, 0xF1, 0x90, 0xA1, 0xE0, \r
+0xE0, 0x04, 0xF0, 0x80, 0x18, 0x90, 0xA1, 0xDA, 0xE0, 0xFF, 0x51, 0xF1, 0x90, 0xA1, 0xD5, 0x74, \r
+0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xE0, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, \r
+0xE2, 0xF0, 0x80, 0x0D, 0x90, 0xA1, 0xCF, 0xE0, 0xFF, 0x51, 0xF1, 0x90, 0xA1, 0xE0, 0xE0, 0x04, \r
+0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, \r
+0xA3, 0xC2, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xC2, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, \r
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, 0xC1, \r
+0xF0, 0x80, 0x06, 0x90, 0xA3, 0xC1, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0xC1, 0x71, 0x7A, 0x90, 0xA1, \r
+0xDF, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90, \r
+0xA3, 0xC0, 0xE0, 0x70, 0x42, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x80, 0x3B, 0x90, 0xA1, 0xCD, 0xE0, \r
+0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1D, 0x90, 0xA1, 0xD3, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0xBF, \r
+0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x1B, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x7D, 0x01, 0x7F, \r
+0x0C, 0x80, 0x11, 0x90, 0xA3, 0xC0, 0xE0, 0xB4, 0x03, 0x0D, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x07, \r
+0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x90, 0xA1, 0xBF, 0xE0, 0x60, 0x18, 0x90, 0xA3, 0xC0, \r
+0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA3, 0xC0, 0xE0, 0x64, 0x03, 0x70, 0x34, 0x7D, \r
+0x0B, 0x7F, 0x6F, 0x80, 0x2B, 0x90, 0xA3, 0xC0, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x21, 0x90, \r
+0xA3, 0xC0, 0xE0, 0xB4, 0x03, 0x1D, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, \r
+0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xB9, 0x9E, 0xE4, 0xFD, 0xFF, \r
+0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, \r
+0x7F, 0x01, 0xF1, 0xE7, 0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x13, 0x90, 0x06, 0xCD, 0x30, 0xE0, 0x0D, \r
 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0B, 0xE0, 0x54, 0xEF, \r
-0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x01, 0x7F, \r
-0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xE1, 0xED, 0xF0, 0x90, 0xA1, 0x16, \r
-0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x81, 0x5A, 0xEE, 0xC4, 0x13, 0x13, \r
-0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x81, 0x5A, 0x90, 0xA1, 0x1D, 0xE0, 0xFE, 0x6F, 0x70, 0x02, \r
-0x81, 0x5A, 0xEF, 0x70, 0x02, 0x61, 0xD1, 0x24, 0xFE, 0x70, 0x02, 0x81, 0x0A, 0x24, 0xFE, 0x60, \r
-0x48, 0x24, 0xFC, 0x70, 0x02, 0x81, 0x45, 0x24, 0xFC, 0x60, 0x02, 0x81, 0x5A, 0xEE, 0xB4, 0x0E, \r
-0x02, 0x91, 0xBF, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0xF0, 0x90, 0xA1, 0x1D, \r
-0xE0, 0xB4, 0x06, 0x02, 0x91, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x0E, 0x90, 0xA3, 0xE1, \r
-0xE0, 0xFF, 0x60, 0x05, 0x12, 0xB8, 0xBE, 0x80, 0x02, 0xF1, 0x9F, 0x90, 0xA1, 0x1D, 0xE0, 0x64, \r
-0x08, 0x60, 0x02, 0x81, 0x5A, 0xD1, 0xCA, 0x81, 0x5A, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, \r
-0x01, 0x91, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x94, 0x90, 0xA1, 0x1D, 0xE0, \r
-0xB4, 0x0E, 0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0x91, 0xBF, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C, \r
-0x60, 0x02, 0x81, 0x5A, 0x91, 0x5F, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x81, 0x5A, 0xB1, 0x88, 0x81, \r
-0x5A, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0x91, 0xBF, 0x90, \r
-0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x07, 0x91, \r
-0x5F, 0xBF, 0x01, 0x02, 0xB1, 0x88, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x9D, \r
-0x7B, 0xEF, 0x64, 0x01, 0x70, 0x54, 0xD1, 0xDC, 0x80, 0x50, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, \r
-0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0x91, 0xBF, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, \r
-0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0xB1, 0x88, 0x90, \r
-0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, \r
-0x12, 0xB8, 0xFD, 0x80, 0x15, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA1, 0x17, 0xE0, \r
-0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
-0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0x94, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, \r
-0x08, 0x80, 0x1E, 0x12, 0x9C, 0xEB, 0xBF, 0x01, 0x18, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x20, 0xE0, 0x0C, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, \r
-0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0x17, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, \r
-0x40, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x19, 0x80, 0x0F, 0xB1, 0x11, 0x90, 0x05, 0x27, 0xE0, \r
-0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x4E, 0xD8, 0x90, \r
-0xA1, 0x17, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0xB1, 0x15, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, \r
-0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x19, 0x90, 0x05, 0x27, \r
-0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x4E, 0xD8, \r
-0x90, 0xA3, 0xE0, 0xEF, 0xF0, 0x12, 0x6E, 0x89, 0x90, 0xA3, 0xE0, 0xE0, 0x60, 0x06, 0xE4, 0xFD, \r
-0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x19, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, \r
-0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0xA3, 0xDF, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, \r
-0x54, 0x01, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0xA1, 0x1D, \r
-0xED, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x1C, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x30, \r
-0xE4, 0x31, 0x90, 0xA3, 0xDF, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, \r
-0x90, 0xA1, 0x16, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0xA1, 0x1C, 0xE0, 0xFD, 0x7F, 0x89, \r
-0x12, 0x46, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x27, \r
-0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x12, 0x64, \r
-0xBE, 0xBF, 0x01, 0x13, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0xB1, \r
-0x19, 0x90, 0xA1, 0x15, 0x74, 0x0E, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x1A, 0xF0, 0xA3, 0xF0, 0x90, \r
-0xA1, 0x18, 0xE0, 0x54, 0x0F, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0xF0, \r
-0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, \r
-0x20, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54, \r
-0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x22, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0x25, \r
-0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x1E, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, \r
-0xDF, 0xF0, 0xE4, 0xFD, 0xFF, 0xB1, 0x19, 0x7D, 0x0C, 0x7F, 0x02, 0xB1, 0x19, 0xB1, 0x15, 0x90, \r
-0xA1, 0x16, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, \r
-0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90, \r
-0xA1, 0x2B, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x2F, 0x74, 0x04, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0x90, 0xA1, 0x85, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x77, 0x9A, 0xE4, 0x90, 0xA1, 0x2D, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0x9C, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x24, 0x74, 0xDD, 0xF0, \r
-0x80, 0x12, 0x90, 0x9F, 0x9C, 0xE0, 0x90, 0xA1, 0x24, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, \r
-0x03, 0x74, 0x40, 0xF0, 0x90, 0xA1, 0x7A, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, \r
-0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, \r
-0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, \r
-0xFF, 0x12, 0x4E, 0xD8, 0xE4, 0x90, 0xA1, 0x80, 0xF0, 0x22, 0x12, 0x6E, 0x89, 0xE4, 0xFD, 0xFF, \r
-0x12, 0x4E, 0xD8, 0xB1, 0x15, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4F, \r
-0xF6, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x5D, 0x52, 0x12, 0x4C, 0xAD, \r
-0xE4, 0xFD, 0x7F, 0x01, 0xB1, 0x19, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x22, 0x90, 0xA1, 0x8E, 0xE0, \r
-0x20, 0xE0, 0x29, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x01, 0x70, 0x21, 0xF1, 0xF3, 0x90, 0xA1, 0x18, \r
-0xE0, 0x54, 0x0F, 0x60, 0x0F, 0xE4, 0xFD, 0x7F, 0x0C, 0x71, 0x11, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, \r
-0xD8, 0x02, 0xB8, 0x7E, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x02, 0x71, 0x0D, 0x22, 0xE4, 0x90, 0xA2, \r
-0xDF, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x54, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x4C, \r
-0x90, 0xA2, 0xDF, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, \r
-0x15, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA2, 0xDF, 0xF0, 0xF1, 0xE5, 0xEF, \r
-0x70, 0x04, 0x90, 0xA2, 0xDF, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0x60, 0x20, 0x90, 0xA1, 0x1E, 0xE0, \r
-0x44, 0x10, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x22, 0xE0, 0x90, 0xA3, 0x88, 0x11, \r
-0x8A, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x02, 0x71, 0x0D, 0xF1, 0xF3, 0x22, 0x7D, 0x2F, 0x12, \r
-0x4C, 0xA9, 0x7D, 0x08, 0x7F, 0x01, 0xB1, 0x19, 0x90, 0xA1, 0x15, 0x74, 0x08, 0xF0, 0x22, 0x90, \r
-0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x0C, 0x7F, 0x01, \r
-0xA1, 0x19, 0x90, 0xA1, 0x11, 0xE0, 0x90, 0xA1, 0x1C, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x80, 0x06, \r
-0xE0, 0xFF, 0x7D, 0x01, 0x61, 0x11, 0xAE, 0x07, 0xF1, 0xE5, 0xBF, 0x01, 0x15, 0x90, 0xA1, 0x11, \r
-0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01, 0x71, 0x11, 0x7F, \r
-0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, \r
-0x22, 0x01, 0xC4, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, \r
-0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0xA1, 0x7F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, \r
-0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x75, 0xE8, 0x07, \r
-0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0xA2, 0xA7, 0xF0, 0x90, 0xA2, 0xA7, 0xE0, 0x64, 0x01, 0xF0, \r
-0x24, 0x34, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, \r
-0x12, 0x31, 0xFC, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0F, 0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, \r
-0x1C, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x57, 0xB2, 0xC2, 0xAF, 0x31, 0x53, 0xBF, 0x01, 0x02, 0x11, \r
-0x85, 0xD2, 0xAF, 0x90, 0xA2, 0x21, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0xB7, 0x28, 0x12, 0x47, 0xF2, \r
-0x12, 0x42, 0x7D, 0x80, 0xB4, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x11, 0xE0, \r
-0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x31, 0x07, 0xBF, 0x01, 0x06, 0x80, 0x02, \r
-0x80, 0x00, 0x11, 0xA5, 0x22, 0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0x31, \r
-0x33, 0xBF, 0x01, 0x02, 0x11, 0xB7, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4D, \r
-0x75, 0x11, 0xC8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0x14, 0x7F, 0x08, 0x12, 0x4C, 0x74, 0xEF, \r
-0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x4F, 0xE4, 0xFF, 0x31, 0xC4, 0x90, 0xA1, 0xCE, 0xE0, \r
-0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, 0x7F, 0x4E, 0x12, 0x4C, 0x74, \r
-0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x54, \r
-0x0F, 0x30, 0xE0, 0x02, 0x31, 0x7C, 0x22, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, \r
-0x02, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x14, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x7F, 0x90, \r
-0x12, 0x4C, 0x74, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x14, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x59, \r
-0xA3, 0xF0, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, \r
-0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA1, 0xD4, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, \r
-0x7F, 0x00, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x53, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90, \r
-0xA1, 0xEC, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, \r
-0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0x90, 0xA1, 0x86, 0xE0, \r
-0x90, 0x01, 0x38, 0xF0, 0x90, 0xA1, 0x87, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0xA1, 0x88, 0xE0, \r
-0x90, 0x01, 0x3A, 0xF0, 0x90, 0xA1, 0x89, 0xE0, 0x90, 0x01, 0x3B, 0xF0, 0x90, 0xA1, 0x8A, 0xE0, \r
-0x90, 0x01, 0x30, 0xF0, 0x90, 0xA1, 0x8B, 0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0xA1, 0x8C, 0xE0, \r
-0x90, 0x01, 0x32, 0xF0, 0x90, 0xA1, 0x8D, 0xE0, 0x90, 0x01, 0x33, 0xF0, 0x7F, 0x01, 0x12, 0x54, \r
-0xF0, 0x02, 0x55, 0xB8, 0x90, 0xA3, 0xC8, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, \r
-0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA3, 0xC8, 0xE0, 0x6F, 0x60, 0x3E, \r
-0xC3, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x88, 0x90, 0xA3, 0xC9, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, \r
-0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, 0xC9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, \r
-0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x32, 0x90, \r
-0xA3, 0xC9, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xEF, \r
-0x64, 0x01, 0x70, 0x6B, 0x12, 0x56, 0xDC, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA1, 0x86, 0xF0, 0x90, \r
-0x01, 0x39, 0xE0, 0x90, 0xA1, 0x87, 0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA1, 0x88, 0xF0, 0x90, \r
-0x01, 0x3B, 0xE0, 0x90, 0xA1, 0x89, 0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA1, 0x8A, 0xF0, 0x90, \r
-0x01, 0x31, 0xE0, 0x90, 0xA1, 0x8B, 0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA1, 0x8C, 0xF0, 0x90, \r
-0x01, 0x33, 0xE0, 0x90, 0xA1, 0x8D, 0xF0, 0x90, 0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0x90, 0x01, 0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74, \r
-0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x21, \r
-0x7C, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x85, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, \r
-0xEF, 0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xEF, 0x4F, \r
-0xF0, 0x90, 0xA1, 0x85, 0xE0, 0x54, 0x01, 0xFF, 0x41, 0x1F, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x5E, \r
-0x90, 0xA2, 0xB1, 0xEF, 0xF0, 0x12, 0x45, 0x67, 0x5B, 0x29, 0x00, 0x5B, 0x32, 0x01, 0x5B, 0x3B, \r
-0x02, 0x5B, 0x44, 0x03, 0x5B, 0x4D, 0x04, 0x5B, 0x55, 0x10, 0x5B, 0x5E, 0x11, 0x5B, 0x67, 0x12, \r
-0x5B, 0x6F, 0x14, 0x5B, 0x78, 0x20, 0x5B, 0x81, 0x21, 0x5B, 0x8A, 0x23, 0x5B, 0x93, 0x24, 0x5B, \r
-0x9B, 0x25, 0x5B, 0xA4, 0x27, 0x5B, 0xAC, 0x28, 0x5B, 0xB4, 0x40, 0x5B, 0xBD, 0x42, 0x5B, 0xC6, \r
-0x60, 0x5B, 0xCF, 0x61, 0x5B, 0xD7, 0x62, 0x5B, 0xE0, 0x63, 0x5B, 0xE9, 0x64, 0x5B, 0xF2, 0x65, \r
-0x5B, 0xFB, 0x66, 0x5C, 0x04, 0x67, 0x5C, 0x0D, 0x68, 0x5C, 0x16, 0x69, 0x5C, 0x1F, 0x6A, 0x5C, \r
-0x28, 0x6B, 0x5C, 0x31, 0x6C, 0x00, 0x00, 0x5C, 0x3A, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, \r
-0x8A, 0x11, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8A, 0x5D, 0x90, 0xA2, 0xB2, 0x12, 0x45, \r
-0x55, 0x02, 0x8A, 0xFD, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0xB7, 0xB8, 0x90, 0xA2, 0xB2, \r
-0x12, 0x45, 0x55, 0x81, 0x7E, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8D, 0x1F, 0x90, 0xA2, \r
-0xB2, 0x12, 0x45, 0x55, 0x02, 0x73, 0x12, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x81, 0x4A, 0x90, \r
-0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8D, 0x47, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8D, \r
-0x56, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8F, 0x2E, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, \r
-0x02, 0x8F, 0x74, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0xA1, 0x7E, 0x90, 0xA2, 0xB2, 0x12, 0x45, \r
-0x55, 0x02, 0x8F, 0x7C, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x81, 0xAB, 0x90, 0xA2, 0xB2, 0x12, \r
-0x45, 0x55, 0x41, 0x91, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0xB2, 0x94, 0x90, 0xA2, 0xB2, \r
-0x12, 0x45, 0x55, 0x02, 0xA3, 0xA2, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x6A, 0xF7, 0x90, \r
-0xA2, 0xB2, 0x12, 0x45, 0x55, 0x81, 0x5E, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0x3C, \r
-0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0x43, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, \r
-0x90, 0x57, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0xB9, 0x90, 0xA2, 0xB2, 0x12, 0x45, \r
-0x55, 0x02, 0x7E, 0xA3, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x7D, 0x61, 0x90, 0xA2, 0xB2, \r
-0x12, 0x45, 0x55, 0x02, 0x90, 0xCB, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0xEA, 0x90, \r
-0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x7A, 0xB3, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x91, \r
-0x98, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x92, 0xBC, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, \r
-0xF0, 0x90, 0xA2, 0xB1, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA0, \r
-0x8F, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x97, 0xCD, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, 0x22, 0x90, 0xA1, \r
-0xB4, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x4A, 0x44, 0x8F, 0x51, 0xE5, 0x51, \r
-0xB4, 0x03, 0x0A, 0xE4, 0xFF, 0x12, 0x7F, 0x30, 0x7F, 0x04, 0x12, 0x7D, 0x46, 0x22, 0x12, 0x94, \r
-0xEA, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xF1, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, \r
-0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xF2, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xF3, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, \r
-0xFF, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, \r
-0xA1, 0x82, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x83, 0xF0, 0x90, 0xA1, 0x82, \r
-0xE0, 0x90, 0xA1, 0x84, 0xF0, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, \r
-0x01, 0xFE, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, \r
-0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x70, 0x7B, 0x90, 0xA1, 0x83, 0xE0, 0x90, 0x05, \r
-0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x12, 0x77, 0x82, 0x02, 0x56, 0xCA, 0x90, \r
-0xA1, 0x81, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0xA1, 0x83, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, \r
-0x84, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x57, 0x8D, 0x90, 0xA1, 0x82, 0xE0, 0x14, 0x90, 0xA1, \r
-0x84, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x91, 0xDC, 0x7D, 0x02, 0x7F, 0x02, \r
-0xB1, 0x52, 0x7D, 0x01, 0x7F, 0x02, 0xB1, 0x52, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, \r
-0xE4, 0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x12, 0x57, 0x2D, 0x90, 0xA1, 0x20, 0xE0, 0x14, 0x90, \r
-0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xB1, 0x52, 0x12, 0x64, 0x76, 0x80, 0x91, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, 0xE0, 0xF5, \r
-0x54, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, \r
-0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, \r
-0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, \r
-0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, \r
-0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, \r
-0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0xC3, \r
-0x13, 0x20, 0xE0, 0x02, 0xC1, 0x99, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x80, 0x75, 0x54, 0x21, 0x13, \r
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xB1, 0x49, 0x43, 0x54, 0x08, 0x80, 0x0C, 0xE4, 0x90, 0xA1, \r
-0x12, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xF1, 0x6A, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, \r
-0x43, 0x54, 0x14, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, \r
-0x80, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, \r
-0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x8B, \r
-0x46, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, \r
-0x80, 0x22, 0x12, 0x57, 0xE5, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, \r
-0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x04, 0x60, \r
-0x02, 0xE1, 0x5B, 0xFF, 0x12, 0x8B, 0x46, 0xE1, 0x5B, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x20, 0xE0, \r
-0x02, 0xE1, 0x27, 0x43, 0x54, 0x31, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xB1, 0x49, 0x43, \r
-0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xF1, 0x6A, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, \r
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, \r
-0x03, 0x43, 0x54, 0x04, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, \r
-0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x6C, 0xE4, \r
-0xFD, 0x7F, 0x02, 0x80, 0x23, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0xE0, \r
-0xB4, 0x02, 0x1A, 0x12, 0xB9, 0x19, 0x12, 0x57, 0xE5, 0xBF, 0x01, 0x09, 0x90, 0xA1, 0x1C, 0xE0, \r
-0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x53, 0x11, 0x80, 0x3E, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x34, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, \r
-0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x15, \r
-0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x53, 0x11, 0x12, 0x9D, 0x04, 0x90, 0xA1, \r
-0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x53, 0x11, 0x12, 0x95, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0x7D, 0x02, 0x7F, 0x02, 0xF1, 0x6A, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, \r
-0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, \r
-0xF0, 0x22, 0xEF, 0x70, 0x4F, 0x7D, 0x78, 0x7F, 0x02, 0xF1, 0x6A, 0x7D, 0x02, 0x7F, 0x03, 0xF1, \r
-0x6A, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x77, 0x82, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, \r
-0x74, 0x02, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0x70, 0x15, 0x12, 0x6E, 0x89, 0x12, 0x57, 0x9F, 0x90, \r
-0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, \r
-0x7F, 0x0C, 0x12, 0x53, 0x11, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, \r
-0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, \r
-0xFF, 0xB1, 0x52, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x52, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, \r
-0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x15, \r
-0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, \r
-0x7F, 0x04, 0x02, 0x53, 0x11, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, \r
-0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x1D, 0x90, 0x01, \r
-0xC4, 0xED, 0xF0, 0x74, 0x60, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, \r
-0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, \r
-0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x4E, \r
-0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x4E, 0x6B, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0xA5, 0x74, \r
-0x4E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, \r
-0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, \r
-0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x4C, \r
-0x74, 0xEF, 0x20, 0xE6, 0x0E, 0x7F, 0x05, 0x12, 0x4C, 0x74, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, \r
-0x12, 0x46, 0x4F, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, \r
-0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, \r
-0x07, 0x90, 0x01, 0xC4, 0x74, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x9A, 0x34, 0xE5, 0x19, \r
-0x30, 0xE1, 0x02, 0x51, 0x74, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x91, 0x54, 0xE5, 0x19, 0x30, 0xE5, \r
-0x03, 0x12, 0x99, 0x38, 0xE5, 0x19, 0x30, 0xE6, 0x02, 0xF1, 0xD4, 0xE5, 0x1B, 0x30, 0xE0, 0x02, \r
-0x91, 0x5C, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x9A, 0x91, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, \r
-0x70, 0x90, 0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x9C, 0x3B, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, \r
-0x9C, 0x64, 0xE5, 0x1B, 0x30, 0xE5, 0x02, 0x91, 0x83, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9C, \r
-0x93, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x9C, 0xAF, 0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0xFA, \r
-0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0x7D, 0x74, 0xC4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, \r
-0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x63, \r
-0x74, 0x90, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x68, \r
-0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
-0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, \r
-0x41, 0x68, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x20, 0xE7, \r
-0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0x49, 0xE0, 0xFF, \r
-0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x7C, 0xEF, 0x30, 0xE6, 0x21, \r
-0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, \r
-0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, \r
-0x52, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, \r
-0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, \r
-0xAF, 0x63, 0x12, 0xA2, 0x9E, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x80, 0x24, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, \r
-0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, \r
-0x6A, 0x7B, 0x01, 0xAF, 0x63, 0x12, 0xA0, 0x99, 0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, \r
-0x02, 0x21, 0x80, 0x22, 0xE4, 0xFF, 0x90, 0xA2, 0xCF, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, \r
-0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, 0x70, 0x90, 0xA2, 0xD0, 0x74, 0x03, 0xF0, 0x90, \r
-0xA2, 0xDE, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, \r
-0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, \r
-0x25, 0x63, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0xD2, 0x25, 0x63, 0xF5, \r
-0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD0, 0x7B, \r
-0x01, 0x7A, 0xA2, 0x79, 0xD0, 0x12, 0x7C, 0xAB, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, \r
-0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0x7F, \r
-0x04, 0x70, 0x03, 0x02, 0x4C, 0x9A, 0x12, 0x7D, 0x46, 0x22, 0xE4, 0xFF, 0x90, 0xA2, 0x23, 0xEF, \r
-0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x24, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x47, 0x74, 0x25, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, \r
-0x03, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA2, 0x24, 0x30, 0xE7, 0x0E, 0xE0, 0x24, 0x81, 0xF5, 0x82, \r
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x14, 0xE0, 0xFF, 0xF1, 0xE1, 0x90, 0xA2, 0x24, \r
-0xE0, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x24, \r
-0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA2, 0x24, \r
-0xF0, 0x90, 0xA2, 0x24, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x81, 0x53, 0x74, 0x25, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x81, 0x4B, 0x90, 0xA2, 0x24, 0xE0, \r
-0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEF, \r
-0x90, 0x81, 0x07, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x24, 0xE0, 0xFC, 0x25, \r
-0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, \r
-0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, 0x90, \r
-0x81, 0x0B, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x24, 0xE0, 0x75, 0xF0, 0x0A, \r
-0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA2, 0x24, \r
-0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01, 0x12, 0x45, \r
-0x49, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, 0xB4, \r
-0x05, 0xCB, 0x90, 0xA2, 0x24, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45, 0x49, \r
-0xE0, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA2, \r
-0x24, 0xE0, 0xFF, 0x90, 0xA2, 0x23, 0xE0, 0xFD, 0x12, 0xA3, 0x15, 0x90, 0xA2, 0x24, 0xE0, 0x24, \r
-0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x24, 0xE0, 0x04, \r
-0xF0, 0x61, 0x61, 0x22, 0x12, 0x92, 0xE6, 0x7F, 0x02, 0x02, 0x4C, 0x9A, 0x90, 0xA1, 0x11, 0xE0, \r
-0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, \r
-0x02, 0xF1, 0x7E, 0x12, 0xB9, 0xA5, 0x90, 0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, \r
-0x50, 0xEB, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E, \r
-0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0xE1, 0xA4, 0x91, 0x9F, 0x22, 0x12, \r
-0xB8, 0x7E, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x13, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x53, \r
-0x11, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x08, 0xE4, 0xFF, 0x91, 0xC9, 0x22, 0x90, 0xA1, \r
-0x95, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0xA3, 0x94, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9F, 0x99, 0xE0, 0x04, 0xF0, 0x90, 0x04, \r
-0x1D, 0xE0, 0x60, 0x43, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x98, 0xF0, 0x7D, 0x26, 0x12, 0x4F, \r
-0xF6, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0xB1, 0x61, 0x90, 0xA1, 0xF7, 0xE0, 0x20, 0xE0, 0x1A, 0x80, \r
-0x15, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0xB1, 0x61, 0x90, \r
-0xA1, 0xF7, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xBA, 0x94, 0x90, 0xA3, 0x98, 0xE0, 0xFF, 0x7D, 0x27, \r
-0x12, 0x4E, 0xD8, 0xF1, 0x13, 0x80, 0x0E, 0xF1, 0x13, 0xB1, 0x61, 0x90, 0xA1, 0xF7, 0xE0, 0x20, \r
-0xE0, 0x03, 0x12, 0xBA, 0x94, 0x90, 0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x92, 0xE0, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, \r
-0x28, 0x12, 0x4E, 0xD8, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0xA3, 0x95, 0xE0, 0xFB, 0x7D, 0x01, 0xD1, 0x08, 0x90, \r
-0xA3, 0x96, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x94, 0xE0, 0xFF, 0x74, 0x09, \r
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, \r
-0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xC4, \r
-0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, 0xA1, 0xA5, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, \r
-0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, \r
-0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, \r
-0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA3, \r
-0x89, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA3, 0xC6, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA3, 0xC5, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, \r
-0x7C, 0x80, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA3, 0xC5, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3, \r
-0xC6, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, \r
-0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
-0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, \r
-0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, \r
-0x90, 0xA3, 0xC7, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, \r
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB5, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x32, \r
-0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0xB8, 0xF0, 0x7D, 0x29, 0x12, 0x4F, 0xF6, 0xBF, 0x01, 0x16, \r
-0x90, 0x9F, 0xA0, 0xD1, 0x02, 0x90, 0xA3, 0xB6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, \r
-0xA3, 0xB5, 0xE0, 0xFF, 0xB1, 0x7E, 0x90, 0xA3, 0xB8, 0xE0, 0xFF, 0x7D, 0x2A, 0x12, 0x4E, 0xD8, \r
-0x80, 0x16, 0x90, 0x9F, 0xA0, 0xD1, 0x02, 0x90, 0xA3, 0xB6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, \r
-0xFD, 0x90, 0xA3, 0xB5, 0xE0, 0xFF, 0xB1, 0x7E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0xA3, 0x94, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, \r
-0xA3, 0xE2, 0xEF, 0xF0, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49, \r
-0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA3, 0xE2, 0xE0, 0x70, 0x3B, 0x90, 0xA1, \r
-0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x55, 0x11, 0x80, 0x26, 0x90, 0xA1, 0x1D, \r
-0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA3, 0xE2, 0xE0, 0x60, 0x1E, 0x90, 0xA1, 0x16, 0xE0, 0x54, \r
-0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x1D, \r
-0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, \r
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0C, \r
-0x12, 0x57, 0xE5, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x8B, 0x46, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x7F, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x1F, 0x90, 0x04, \r
-0x1D, 0xE0, 0x70, 0x19, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0xD1, 0x08, 0x90, \r
-0xA3, 0xD7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x7D, 0x08, \r
-0xE4, 0xFF, 0x81, 0xC9, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, 0xF0, 0x22, \r
-0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, \r
-0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, \r
-0x74, 0xF0, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x12, 0x9A, 0x61, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, \r
-0xAC, 0xE5, 0x21, 0x30, 0xE2, 0x02, 0x11, 0xE6, 0xE5, 0x21, 0x30, 0xE5, 0x03, 0x12, 0x57, 0xF1, \r
-0xE5, 0x22, 0x30, 0xE0, 0x03, 0x12, 0x72, 0xD5, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x9D, 0xEA, \r
-0xE5, 0x23, 0x30, 0xE0, 0x03, 0x12, 0x9D, 0x34, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xDE, 0xE5, \r
-0x23, 0x30, 0xE2, 0x09, 0xF1, 0x0A, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, \r
-0xE1, 0x05, 0x7F, 0x04, 0x12, 0x4C, 0x9A, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x5D, 0x67, 0xE5, \r
-0x24, 0x30, 0xE5, 0x03, 0x12, 0x9E, 0x81, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x9F, 0x14, 0xE5, \r
-0x24, 0x30, 0xE7, 0x02, 0x11, 0xB8, 0x74, 0xF0, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3, \r
-0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, \r
-0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xA1, 0x1A, 0xE0, \r
-0x60, 0x03, 0x12, 0xBA, 0x4A, 0x02, 0x4F, 0x58, 0x90, 0xA1, 0xA9, 0xE0, 0x30, 0xE0, 0x04, 0x11, \r
-0xD0, 0x80, 0x03, 0x12, 0x81, 0xF3, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0x3C, 0x22, \r
-0x7D, 0x12, 0x7F, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xCD, \r
-0xE0, 0xFF, 0xE4, 0xFD, 0x80, 0x6D, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x14, 0x90, 0x06, 0x92, 0xE0, \r
-0x30, 0xE1, 0x03, 0x02, 0xB8, 0x7E, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x57, 0xB2, \r
-0x22, 0x11, 0xD0, 0x90, 0xA1, 0xA9, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, \r
-0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x02, 0x80, 0x17, 0x90, 0xA1, 0xA9, 0xE0, 0xFF, 0xC3, 0x13, 0x54, \r
-0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90, \r
-0xA1, 0xA9, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x90, 0x07, 0x78, \r
-0xF0, 0x90, 0xA1, 0xAF, 0x31, 0x4E, 0xD1, 0x89, 0xE4, 0xFD, 0xFF, 0x02, 0x4E, 0xD8, 0xE0, 0xFF, \r
-0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0xA1, \r
-0x91, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0xF2, 0x90, 0xA1, 0xCE, 0xE0, \r
-0x60, 0x02, 0x41, 0x12, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x46, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, \r
-0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0xE5, 0x26, \r
-0x90, 0xA3, 0x73, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x11, 0x80, 0x0C, 0x12, 0x45, 0x11, 0xEF, 0x44, \r
-0x80, 0xFF, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x73, \r
-0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, \r
-0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x41, 0xF2, 0xE5, 0x27, 0x70, 0x02, 0x41, 0xF2, 0x7F, 0x48, \r
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12, \r
-0x08, 0x6D, 0x90, 0xA1, 0xCD, 0xE0, 0x90, 0xA3, 0x73, 0x60, 0x09, 0x12, 0x45, 0x11, 0xEF, 0x44, \r
-0x80, 0xFF, 0x80, 0x07, 0x12, 0x45, 0x11, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12, \r
-0x08, 0x6D, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, \r
-0x41, 0xED, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x43, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, \r
-0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0xE5, 0x26, 0x90, 0xA3, 0x73, 0xB4, \r
-0x01, 0x08, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x02, \r
-0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, 0x90, 0xAA, \r
+0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, \r
+0xFF, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, \r
+0x02, 0x48, 0x29, 0xE4, 0x90, 0xA3, 0x05, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x6A, 0x90, \r
+0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x1E, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, \r
+0x51, 0xF1, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xD5, 0x74, 0x01, 0xF0, 0xE4, 0x90, \r
+0xA1, 0xE2, 0xF0, 0x90, 0xA1, 0xE0, 0xF0, 0x80, 0x10, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0x90, 0xA1, \r
+0xCE, 0x51, 0xED, 0x90, 0xA1, 0xE0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xDF, 0x74, 0x01, 0xF0, 0x90, \r
+0xA1, 0xBF, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x49, 0x5E, 0xE4, 0xFD, 0xFF, 0x12, \r
+0x49, 0x5E, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, \r
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xB9, 0x9E, 0x22, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xA1, 0x22, 0x90, 0xA2, 0x0D, 0xE0, 0x60, 0x02, 0x81, 0x42, \r
+0xE5, 0x26, 0x64, 0x02, 0x60, 0x4A, 0xE5, 0x27, 0x70, 0x46, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, \r
+0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x9A, 0x12, 0x08, 0x6D, 0xE5, 0x26, \r
+0x90, 0xA3, 0x9A, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x71, 0x80, 0x0C, 0x12, 0x45, 0x71, 0xEF, 0x44, \r
+0x80, 0xFF, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x9A, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x9A, \r
+0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, \r
+0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0xA1, 0x22, 0xE5, 0x27, 0x70, 0x02, 0xA1, 0x22, 0x7F, 0x48, \r
+0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x9A, 0x12, \r
+0x08, 0x6D, 0x90, 0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0x9A, 0x60, 0x09, 0x12, 0x45, 0x71, 0xEF, 0x44, \r
+0x80, 0xFF, 0x80, 0x07, 0x12, 0x45, 0x71, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x9A, 0x12, \r
+0x08, 0x6D, 0x90, 0xA3, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, \r
+0xA1, 0x1D, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x43, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, \r
+0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x9A, 0x12, 0x08, 0x6D, 0xE5, 0x26, 0x90, 0xA3, 0x9A, 0xB4, \r
+0x01, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, \r
+0xFF, 0xEC, 0x90, 0xA3, 0x9A, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, \r
 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70, \r
-0x02, 0x41, 0xF2, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEC, 0x90, 0xA3, 0x73, \r
-0x12, 0x08, 0x6D, 0xE5, 0x27, 0x70, 0x13, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x77, \r
-0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x80, 0x55, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, \r
-0xEF, 0x44, 0x66, 0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
-0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x77, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xCD, \r
-0xE0, 0x90, 0xA3, 0x77, 0x60, 0x08, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45, \r
-0x11, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xA3, 0x77, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x77, 0x12, \r
-0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x90, \r
-0xA3, 0x73, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, \r
-0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, \r
-0xB5, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x8E, 0xE0, 0x54, \r
-0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, \r
-0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0x8E, 0xF0, 0xEE, 0x54, \r
-0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, \r
-0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x8E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, \r
-0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0x8E, 0xF0, \r
-0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x91, 0xE0, 0x54, 0xFE, \r
-0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, \r
-0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0x91, 0xF0, \r
-0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
-0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x91, 0xF0, 0xEE, 0x54, 0x40, \r
-0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE, \r
-0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0x91, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, \r
-0x20, 0xFE, 0x90, 0xA1, 0x92, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, \r
-0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF, \r
-0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA1, 0x92, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, \r
-0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, \r
-0xFF, 0x90, 0xA1, 0x92, 0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90, \r
-0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, \r
-0x92, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, \r
-0x3F, 0x20, 0xE0, 0x08, 0xD1, 0x89, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x92, 0xE0, \r
-0xC3, 0x13, 0x20, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, \r
-0x54, 0xEF, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0xA1, \r
-0xD6, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA1, 0x9F, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x9E, 0xF0, \r
-0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0x90, 0xA1, 0x8F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x90, 0xF0, 0x80, 0x48, \r
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, \r
-0x90, 0xA1, 0x8F, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, \r
-0x8F, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, \r
-0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0x90, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, \r
-0x80, 0x06, 0x90, 0xA1, 0x90, 0x74, 0x2A, 0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x30, 0xE0, 0x3D, 0x90, 0xA1, 0x8F, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0x97, 0xF0, \r
-0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA1, 0x90, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0x99, \r
-0xF0, 0x90, 0xA1, 0x8F, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x9A, 0xF0, 0x90, 0xA1, 0x90, 0xE0, 0xC3, \r
-0x13, 0x90, 0xA1, 0x9B, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x70, \r
-0x7B, 0xE4, 0x90, 0xA1, 0xCB, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, \r
-0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x27, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA1, 0xCD, \r
-0xE0, 0x60, 0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x31, \r
-0x53, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0x92, 0xE0, 0xC4, \r
-0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, 0x12, 0x55, 0x19, 0x90, 0x05, 0x00, \r
-0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x96, \r
-0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xA1, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, \r
-0x08, 0x90, 0xA1, 0xA1, 0x74, 0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0xA1, \r
-0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA1, 0xA1, 0x74, 0x05, 0xF0, 0xE4, \r
-0x90, 0xA1, 0x96, 0xF0, 0x80, 0x6D, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, \r
-0x06, 0xA2, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14, \r
-0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, \r
-0x03, 0xE4, 0xF5, 0x52, 0x12, 0x78, 0xC0, 0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0x4F, 0x90, 0xA2, \r
-0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, \r
-0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xAD, 0x52, 0x7F, \r
-0x02, 0x31, 0x53, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, \r
-0x74, 0x43, 0xF0, 0x90, 0xA1, 0x94, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0xA0, 0xF0, 0x90, \r
-0xA1, 0x91, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0xBE, 0xE0, \r
-0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x77, 0xBB, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x7F, 0x03, 0x12, 0x84, 0xB1, 0x90, 0xA1, 0x8E, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0x92, \r
-0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, \r
-0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, \r
-0x20, 0xE0, 0x34, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2E, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x07, 0xE4, \r
-0x90, 0xA3, 0xCF, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xCF, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x7F, 0xE0, \r
-0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0xD0, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, \r
-0x02, 0xF0, 0x90, 0xA3, 0xCF, 0x31, 0x4E, 0x7F, 0x02, 0x12, 0x4C, 0x74, 0xEF, 0x44, 0x01, 0xFD, \r
-0x7F, 0x02, 0x12, 0x46, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x1F, 0x90, 0xA1, 0xDF, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, \r
-0xE0, 0xB4, 0x01, 0x13, 0x74, 0x02, 0xF0, 0xF1, 0xB7, 0x80, 0x0C, 0x90, 0xA1, 0xDF, 0xE0, 0xB4, \r
-0x02, 0x05, 0x74, 0x03, 0xF0, 0xF1, 0x3C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE1, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x4C, 0x90, 0xA1, 0xE1, 0xE0, \r
-0xB4, 0x02, 0x12, 0xF1, 0xB7, 0x7F, 0x01, 0x12, 0x84, 0xB1, 0x12, 0x89, 0x55, 0x90, 0xA1, 0xE1, \r
-0x74, 0x03, 0xF0, 0x80, 0x4D, 0x90, 0xA1, 0xE1, 0xE0, 0x64, 0x03, 0x70, 0x24, 0x90, 0xA1, 0xE4, \r
-0xF1, 0xBA, 0xE4, 0xFF, 0x12, 0x84, 0xB1, 0x12, 0x89, 0x55, 0x90, 0xA1, 0xDA, 0xE0, 0xC3, 0x13, \r
-0x54, 0x03, 0xFF, 0xE4, 0xFB, 0xFD, 0x12, 0x82, 0xBE, 0x90, 0xA1, 0xE1, 0x74, 0x04, 0xF0, 0x80, \r
-0x21, 0x90, 0xA1, 0xE1, 0xE0, 0xB4, 0x04, 0x1A, 0x90, 0xA1, 0xDA, 0xE0, 0xC3, 0x13, 0x54, 0x03, \r
-0xFF, 0x7B, 0x01, 0x7D, 0x01, 0x12, 0x82, 0xBE, 0x90, 0xA1, 0xE1, 0x74, 0x02, 0xF0, 0x90, 0xA1, \r
-0xDF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xE6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, \r
-0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD, \r
-0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0x22, 0xD1, \r
-0x89, 0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, \r
-0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, \r
-0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xE8, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12, \r
-0x4A, 0x9E, 0x53, 0x91, 0xBF, 0x74, 0xE8, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, \r
-0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
-0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, \r
-0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x3B, 0x90, 0x01, 0xC4, 0xED, \r
-0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, \r
+0x02, 0xA1, 0x22, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEC, 0x90, 0xA3, 0x9A, \r
+0x12, 0x08, 0x6D, 0xE5, 0x27, 0x70, 0x13, 0x90, 0xA3, 0x9A, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x77, \r
+0xFF, 0xEC, 0x90, 0xA3, 0x9A, 0x12, 0x08, 0x6D, 0x80, 0x55, 0x90, 0xA3, 0x9A, 0x12, 0x45, 0x71, \r
+0xEF, 0x44, 0x66, 0xFF, 0xEC, 0x90, 0xA3, 0x9A, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
+0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x0C, \r
+0xE0, 0x90, 0xA3, 0x9E, 0x60, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45, \r
+0x71, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xA3, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x9E, 0x12, \r
+0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x90, \r
+0xA3, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, \r
+0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA3, 0x15, 0xEF, 0xF0, 0x90, 0xA3, 0x17, 0x74, \r
+0x02, 0xF0, 0x7F, 0x01, 0xD1, 0xDF, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, \r
+0xE0, 0x22, 0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA3, 0x15, \r
+0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x12, 0x4C, 0x08, 0xBF, 0x01, \r
+0x03, 0x12, 0x46, 0xFD, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, \r
+0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x15, 0xE0, \r
+0xB4, 0x02, 0x0C, 0x90, 0xA1, 0xCE, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA1, 0xDD, 0x51, 0xED, 0x90, \r
+0xA1, 0xCD, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x16, 0xF0, 0x80, 0x06, 0x90, \r
+0xA3, 0x16, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, \r
+0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x17, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, \r
+0xA3, 0x17, 0xF0, 0x90, 0xA3, 0x17, 0xE0, 0xFF, 0x90, 0xA3, 0x16, 0xE0, 0xFD, 0x71, 0x7F, 0xE4, \r
+0x90, 0xA1, 0xDF, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0xA1, 0xE0, 0xE0, \r
+0x04, 0xF0, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA1, 0xE0, 0xF0, 0x90, 0xA1, 0xCD, \r
+0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x17, 0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, \r
+0x08, 0x80, 0x66, 0x90, 0xA3, 0x15, 0xE0, 0x64, 0x05, 0x70, 0x63, 0x7D, 0x0E, 0x80, 0x5A, 0x90, \r
+0xA1, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x54, \r
+0x07, 0x20, 0xE0, 0x0A, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x56, 0x56, 0x90, 0xA3, \r
+0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x30, 0x90, 0xA3, 0x15, 0xE0, 0x64, 0x05, 0x70, \r
+0x2D, 0x7D, 0x0F, 0x80, 0x24, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x23, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, \r
+0xE4, 0xFD, 0x12, 0x56, 0x56, 0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, \r
+0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0xA1, \r
+0xD0, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, \r
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0xF1, 0xE7, 0x90, 0xA1, 0xD1, 0xE0, \r
+0xC3, 0x13, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, \r
+0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x36, 0x12, 0x8B, 0x79, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, \r
+0xB4, 0x01, 0x02, 0x80, 0x1C, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1D, 0x90, \r
+0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x03, 0x02, 0x01, 0xCE, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x04, \r
+0x03, 0x02, 0x8D, 0xEB, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x05, 0x02, 0xB1, 0x27, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90, 0xA1, 0xD1, \r
+0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03, \r
+0x74, 0x03, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B, \r
+0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC, 0x74, 0x03, \r
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x20, \r
+0xE0, 0xB4, 0x01, 0x02, 0x80, 0x4C, 0x90, 0xA2, 0x20, 0xE0, 0xB4, 0x02, 0x12, 0x12, 0x8B, 0x1F, \r
+0x7F, 0x01, 0xD1, 0xDF, 0x12, 0x91, 0x3E, 0x90, 0xA2, 0x20, 0x74, 0x03, 0xF0, 0x80, 0x4D, 0x90, \r
+0xA2, 0x20, 0xE0, 0x64, 0x03, 0x70, 0x24, 0x90, 0xA2, 0x23, 0x12, 0x8B, 0x22, 0xE4, 0xFF, 0xD1, \r
+0xDF, 0x12, 0x91, 0x3E, 0x90, 0xA2, 0x19, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0xE4, 0xFB, 0xFD, \r
+0x12, 0x4C, 0xA9, 0x90, 0xA2, 0x20, 0x74, 0x04, 0xF0, 0x80, 0x21, 0x90, 0xA2, 0x20, 0xE0, 0xB4, \r
+0x04, 0x1A, 0x90, 0xA2, 0x19, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0x7B, 0x01, 0x7D, 0x01, 0x12, \r
+0x4C, 0xA9, 0x90, 0xA2, 0x20, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x1E, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0x90, 0xA1, 0xE8, 0xE0, 0x30, 0xE0, 0x04, 0xF1, 0xC8, 0x80, 0x02, 0xD1, 0xA1, 0x90, 0xA2, \r
+0x19, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0x36, 0x22, 0x7D, 0x12, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, \r
+0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x0C, 0xE0, 0xFF, 0xE4, 0xFD, 0x61, 0x7F, 0x11, 0x4D, \r
+0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0x90, 0xA1, 0xFD, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, \r
+0x1C, 0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA2, 0x04, 0x80, 0x03, 0x90, 0xA2, 0x00, 0x12, 0x45, 0x71, \r
+0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0xE4, 0xFB, \r
+0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, 0xA2, 0xE6, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, \r
+0x97, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0A, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x31, 0xBD, \r
+0x12, 0xA8, 0x5D, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE1, 0x05, 0x54, \r
+0xFD, 0xF0, 0x11, 0xE3, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE2, 0x05, \r
+0x54, 0xFB, 0xF0, 0x11, 0x91, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE6, \r
+0x05, 0x54, 0xBF, 0xF0, 0x11, 0x6A, 0xD2, 0xAF, 0x80, 0xB4, 0xE4, 0x7B, 0x01, 0x7A, 0xA2, 0x79, \r
+0x16, 0x12, 0x5E, 0x99, 0xEF, 0xB4, 0x02, 0x18, 0x90, 0xA3, 0xE4, 0xE0, 0x64, 0x04, 0x60, 0x0B, \r
+0x7F, 0x40, 0x91, 0xE0, 0x90, 0xA3, 0xE4, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xE4, 0xF0, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xFE, 0x90, \r
+0xA0, 0x8B, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, \r
+0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, \r
+0x01, 0x31, 0x47, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0xA0, 0x8B, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, \r
+0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF4, 0xE0, 0xFF, 0x90, \r
+0x9F, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90, \r
+0x9F, 0xF3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0xEE, \r
+0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA4, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, \r
+0x71, 0x15, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, \r
+0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x12, 0x9B, 0x03, 0x90, 0x9F, 0x97, 0xE0, 0x44, \r
+0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, \r
+0xD0, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x9C, 0x61, 0xEF, 0x60, 0x5A, 0x90, 0x01, \r
+0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, \r
+0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA3, 0xD3, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, \r
+0xF0, 0x90, 0xA3, 0xD3, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xD0, \r
+0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, \r
+0x9C, 0xB7, 0x90, 0xA3, 0xD3, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA3, 0xD0, 0x12, 0x45, 0xB5, 0x12, \r
+0x9D, 0x12, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x58, \r
+0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x47, 0x74, \r
+0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, \r
+0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA2, 0x59, 0x30, 0xE7, 0x0E, 0xE0, 0x24, 0x81, 0xF5, \r
+0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x14, 0xE0, 0xFF, 0xF1, 0x9C, 0x90, 0xA2, \r
+0x59, 0xE0, 0x24, 0x5A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, \r
+0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA2, \r
+0x59, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61, 0x14, 0x74, 0x5A, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x61, 0x0C, 0x90, 0xA2, 0x59, \r
+0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, \r
+0xEF, 0x90, 0x81, 0x07, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x59, 0xE0, 0xFC, \r
+0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, \r
+0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x59, 0xE0, 0x75, 0xF0, \r
+0x0A, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA2, \r
+0x59, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, \r
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01, 0x12, \r
+0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, \r
+0xB4, 0x05, 0xCB, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0, 0x90, \r
+0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x58, 0xE0, 0xFD, 0x12, 0x78, 0xC9, 0x90, 0xA2, 0x59, 0xE0, \r
+0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x59, 0xE0, \r
+0x04, 0xF0, 0x41, 0x22, 0x22, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xE7, 0xEF, 0xF0, \r
+0x12, 0x45, 0xC7, 0x6B, 0x87, 0x00, 0x6B, 0x90, 0x01, 0x6B, 0x99, 0x02, 0x6B, 0xA2, 0x10, 0x6B, \r
+0xAB, 0x11, 0x6B, 0xB4, 0x12, 0x6B, 0xBC, 0x14, 0x6B, 0xC4, 0x20, 0x6B, 0xCD, 0x21, 0x6B, 0xD6, \r
+0x23, 0x6B, 0xDE, 0x24, 0x6B, 0xE7, 0x25, 0x6B, 0xF0, 0x27, 0x6B, 0xF9, 0x28, 0x6C, 0x01, 0x40, \r
+0x6C, 0x0A, 0x42, 0x6C, 0x13, 0x44, 0x6C, 0x1B, 0x60, 0x6C, 0x24, 0x61, 0x6C, 0x2C, 0x62, 0x6C, \r
+0x35, 0x63, 0x6C, 0x3D, 0x64, 0x6C, 0x46, 0x65, 0x6C, 0x4E, 0x66, 0x6C, 0x56, 0x67, 0x6C, 0x5E, \r
+0x68, 0x6C, 0x67, 0x69, 0x6C, 0x70, 0x6A, 0x6C, 0x79, 0x6B, 0x6C, 0x82, 0x6C, 0x6C, 0x8B, 0x6D, \r
+0x6C, 0x94, 0x6E, 0x00, 0x00, 0x6C, 0x9D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x91, 0xFA, \r
+0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x92, 0x46, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, \r
+0x74, 0xBF, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xFB, 0x90, 0xA2, 0xE8, 0x12, 0x45, \r
+0xB5, 0x02, 0x80, 0x20, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xAD, 0x90, 0xA2, 0xE8, 0x12, \r
+0x45, 0xB5, 0xE1, 0x8D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x95, 0x23, 0x90, 0xA2, 0xE8, \r
+0x12, 0x45, 0xB5, 0x02, 0x97, 0x0D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x85, 0x90, 0xA2, \r
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x58, 0xA8, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x97, 0x53, \r
+0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x97, 0x93, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xC1, \r
+0x24, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0xB3, 0x0F, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, \r
+0x02, 0xA4, 0x2D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xA1, 0x90, 0x90, 0xA2, 0xE8, 0x12, 0x45, \r
+0xB5, 0x02, 0x82, 0x51, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xC1, 0x90, 0xA2, 0xE8, 0x12, \r
+0x45, 0xB5, 0x02, 0x5F, 0xE9, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0xBD, 0x90, 0xA2, 0xE8, \r
+0x12, 0x45, 0xB5, 0x02, 0x98, 0x3E, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0xAB, 0x90, 0xA2, \r
+0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x41, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xFB, 0x90, 0xA2, \r
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x98, 0xA0, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x89, 0x70, \r
+0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x98, 0xBF, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, \r
+0x99, 0x22, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x9A, 0x46, 0x90, 0xA2, 0xE8, 0x12, 0x45, \r
+0xB5, 0x02, 0x9A, 0x70, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x9A, 0xD2, 0x90, 0x01, 0xC0, \r
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA2, 0xE7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, \r
+0xFF, 0x90, 0xA0, 0x8F, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x9D, 0x8B, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, \r
+0x22, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x5E, 0x9D, 0x8F, \r
+0x51, 0xE5, 0x51, 0xB4, 0x03, 0x09, 0xE4, 0xFF, 0x12, 0x7B, 0x71, 0x7F, 0x04, 0x91, 0xE0, 0x22, \r
+0x90, 0xA4, 0x05, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x90, \r
+0xA4, 0x05, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x97, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
+0xC0, 0xD0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, \r
+0xA2, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xED, 0xF0, 0x90, 0x00, 0x03, \r
+0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEE, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEF, \r
+0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA2, 0xEC, \r
+0xE0, 0xB4, 0x0C, 0x06, 0xE5, 0x70, 0x70, 0x11, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, \r
+0x7D, 0x07, 0x7F, 0x30, 0x12, 0x5E, 0x9D, 0x8F, 0x51, 0x90, 0xA2, 0xEC, 0xE0, 0xB4, 0x0D, 0x0E, \r
+0xE5, 0x51, 0x64, 0x01, 0x60, 0x05, 0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51, \r
+0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA2, 0xEB, 0xE0, 0xFB, \r
+0xAD, 0x52, 0xE4, 0xFF, 0x12, 0x7F, 0x6C, 0x7F, 0x04, 0x91, 0xE0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
+0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0xE4, 0x90, 0xA2, 0xF0, 0xF0, 0xFD, 0x90, 0xA2, 0xEB, 0x12, \r
+0x45, 0xB5, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xF4, 0x60, 0x4D, 0x90, 0xA2, 0xF0, \r
+0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, \r
+0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, \r
+0x01, 0xFC, 0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x90, 0xA2, 0xF0, 0xF0, \r
+0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x74, 0xF1, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0D, 0x74, 0xF1, 0x2D, 0xF5, 0x82, 0xE4, \r
+0x34, 0xA2, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x0D, 0xED, 0xB4, 0x07, 0x90, 0x90, 0xA2, 0xEE, 0x74, \r
+0x05, 0xF0, 0x90, 0xA2, 0xFC, 0x74, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEE, 0xF1, 0xEA, \r
+0x7F, 0x04, 0x81, 0xE0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xC4, 0xE0, 0x54, \r
+0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0xA1, 0x16, 0xE0, \r
+0x54, 0xEF, 0x4F, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x54, 0x01, 0xFF, 0xEF, 0x64, 0x01, 0x70, 0x6B, \r
+0x12, 0xBA, 0xE9, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, \r
+0xA1, 0xC6, 0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA1, 0xC7, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, \r
+0xA1, 0xC8, 0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA1, 0xC9, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, \r
+0xA1, 0xCA, 0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA1, 0xCB, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, \r
+0xA1, 0xCC, 0xF0, 0x90, 0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, \r
+0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, \r
+0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0xF1, 0xD1, 0x90, 0xA1, 0xCA, \r
+0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0xA1, 0xCB, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0xA1, 0xCC, \r
+0xE0, 0x90, 0x01, 0x33, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0xA1, 0xC8, \r
+0xE0, 0x90, 0x01, 0x3B, 0xF0, 0x7F, 0x01, 0xD1, 0xEC, 0x02, 0x54, 0xAB, 0x90, 0xA4, 0x0A, 0xEF, \r
+0xF0, 0x12, 0x60, 0x4D, 0x90, 0xA4, 0x0A, 0xE0, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, \r
+0x7D, 0x04, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA2, \r
+0xF6, 0x74, 0x12, 0xF0, 0x90, 0xA3, 0x04, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0xF8, 0xEF, 0xF0, 0xA3, \r
+0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xF4, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0x90, 0xA2, 0xF5, \r
+0xE0, 0x90, 0xA2, 0xFC, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xF6, 0xF1, 0xEA, 0x7F, 0x04, 0x81, \r
+0xE0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, \r
+0x90, 0xA2, 0x16, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x17, 0xF0, 0x90, 0x00, \r
+0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x18, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
+0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x5E, 0x99, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, 0x91, 0xE0, \r
+0x22, 0xE4, 0xFF, 0x21, 0xBD, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x24, 0xF0, 0x22, 0x12, 0x06, 0x89, \r
+0x54, 0x01, 0xFF, 0x90, 0xA2, 0x57, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x75, 0xF0, 0x10, 0xEF, \r
+0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA2, \r
+0x0C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x0D, 0xF0, 0x22, 0x90, 0xA1, 0xF3, \r
+0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x5E, 0x9D, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, \r
+0x22, 0x90, 0xA1, 0xC9, 0xE0, 0x90, 0x01, 0x30, 0xF0, 0x90, 0xA1, 0xC6, 0xE0, 0x90, 0x01, 0x39, \r
+0xF0, 0x90, 0xA1, 0xC7, 0xE0, 0x90, 0x01, 0x3A, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, \r
+0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, \r
+0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0xA0, 0x8C, 0xE0, \r
+0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, \r
+0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0xA0, 0x8C, 0xE0, 0x04, 0xF0, 0xE0, \r
+0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8C, 0xF0, 0xD0, \r
+0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, \r
+0x05, 0xC0, 0x07, 0x7D, 0x54, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, \r
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, \r
+0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, \r
+0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
+0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x85, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x47, 0x7C, 0xE5, \r
+0x14, 0x30, 0xE7, 0x03, 0x12, 0x47, 0xDE, 0x74, 0x85, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, \r
+0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
+0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xC0, 0xE0, 0xC0, \r
+0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, \r
+0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xDD, 0xF0, \r
+0x74, 0x70, 0xA3, 0xF0, 0x12, 0x9F, 0x3B, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x51, 0x8C, 0xE5, 0x19, \r
+0x30, 0xE4, 0x02, 0x71, 0x12, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x52, 0xE1, 0xE5, 0x19, 0x30, \r
+0xE6, 0x03, 0x12, 0x9F, 0x98, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x71, 0x1A, 0xE5, 0x1B, 0x30, 0xE1, \r
+0x03, 0x12, 0x5D, 0x8B, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x5B, 0x18, 0xE5, 0x1B, 0x30, 0xE3, \r
+0x03, 0x12, 0x9F, 0xA5, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9F, 0xCE, 0xE5, 0x1B, 0x30, 0xE5, \r
+0x02, 0x71, 0x37, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9F, 0xFD, 0xE5, 0x1C, 0x30, 0xE1, 0x02, \r
+0x71, 0x55, 0xE5, 0x1C, 0x30, 0xE4, 0x03, 0x12, 0x6F, 0x81, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, \r
+0x97, 0x74, 0xDD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, \r
+0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, 0x82, \r
+0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0xE4, 0xF5, 0x63, 0x74, 0x90, 0x25, 0x63, 0xF5, 0x82, \r
+0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x80, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, \r
+0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
+0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, \r
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x80, 0x75, 0xF0, 0x10, 0xE5, \r
+0x63, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, \r
+0xE5, 0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, \r
+0xE0, 0x44, 0x20, 0xF0, 0x80, 0x7A, 0xEF, 0x30, 0xE6, 0x21, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, \r
+0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, \r
+0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, 0x51, 0x74, 0x96, 0x25, 0x63, 0xF5, \r
+0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, \r
+0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x13, 0xAF, 0x63, 0xD1, 0x9C, 0x74, 0x96, \r
+0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x23, 0x75, 0xF0, 0x10, \r
+0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, \r
+0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, 0x63, 0xF1, 0x11, \r
+0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x9A, 0x22, 0xE4, 0xFF, 0x90, 0xA3, \r
+0x05, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, \r
+0x70, 0x90, 0xA3, 0x06, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0x14, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, \r
+0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, \r
+0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
+0x83, 0xE0, 0xFF, 0x74, 0x08, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x06, 0x12, 0x6F, 0xEA, \r
+0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F, \r
+0xE5, 0x65, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x5E, 0x8A, 0x12, 0x6C, \r
+0xE0, 0x22, 0x12, 0x9B, 0x03, 0x7F, 0x02, 0x02, 0x5E, 0x8A, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, \r
+0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x71, \r
+0x90, 0x12, 0x8A, 0x57, 0x02, 0x5F, 0xC9, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0xA1, \r
+0x1A, 0xE0, 0x60, 0x10, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x03, 0x02, 0xB9, \r
+0x9E, 0x12, 0x4F, 0x9B, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x30, \r
+0xE0, 0x11, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x08, 0x12, 0x58, 0x9C, 0xBF, 0x01, 0x04, 0x80, \r
+0x03, 0x71, 0xB5, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA1, 0x18, 0xE0, \r
+0x54, 0x0F, 0x60, 0x0B, 0x71, 0xF1, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0x22, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, \r
+0x80, 0x0C, 0x12, 0x58, 0x9C, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0xB1, 0x07, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x20, 0xE0, 0x2C, 0x90, 0xA1, 0x1A, 0xE0, \r
+0x64, 0x01, 0x70, 0x24, 0x12, 0x8A, 0x1D, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x10, 0xE4, \r
+0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x02, 0xB9, 0xC9, 0x90, \r
+0xA1, 0x1D, 0xE0, 0x70, 0x03, 0x12, 0x56, 0x52, 0x22, 0x71, 0xF1, 0xEF, 0x70, 0x02, 0x71, 0xB5, \r
+0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, \r
+0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, \r
+0xE0, 0x3D, 0x90, 0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, \r
+0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x23, 0xEF, 0xC3, 0x13, 0x30, \r
+0xE0, 0x02, 0x61, 0x90, 0x91, 0x50, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, \r
+0x0C, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x22, \r
+0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x15, \r
+0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x56, 0x56, 0x90, 0xA1, 0x15, 0xE0, \r
+0x64, 0x02, 0x60, 0x02, 0x71, 0x74, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, \r
+0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, 0xE0, 0x7D, 0x00, \r
+0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x61, \r
+0x90, 0x12, 0xB8, 0xB6, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, \r
+0x0A, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x56, 0x56, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, \r
+0x90, 0xA1, 0x10, 0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, \r
+0x21, 0x80, 0x1D, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, \r
+0x01, 0x60, 0x0F, 0x90, 0xA1, 0x11, 0xE0, 0x20, 0xE0, 0x06, 0xE4, 0xFF, 0xB1, 0x07, 0x80, 0x02, \r
+0x71, 0x90, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, \r
+0x14, 0xE0, 0x90, 0xA4, 0x08, 0xF0, 0x6F, 0x70, 0x02, 0xC1, 0x13, 0xEF, 0x14, 0x60, 0x42, 0x14, \r
+0x60, 0x6C, 0x14, 0x70, 0x02, 0xA1, 0xBB, 0x14, 0x70, 0x02, 0xA1, 0xE8, 0x24, 0x04, 0x60, 0x02, \r
+0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x54, 0xC1, 0x13, 0x90, 0xA4, 0x08, \r
+0xE0, 0xB4, 0x02, 0x04, 0xD1, 0x63, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x04, 0xD1, \r
+0x67, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x13, 0xD1, 0x56, 0xC1, \r
+0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x88, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, \r
+0xB4, 0x02, 0x04, 0xD1, 0x78, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0x6B, \r
+0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0x60, 0x02, 0xC1, 0x13, 0xD1, 0x3D, 0xC1, 0x13, 0x90, 0xA4, \r
+0x08, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xB8, 0x6C, 0x80, 0x79, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, \r
+0x04, 0xD1, 0x31, 0x80, 0x6E, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0xB8, 0x97, 0x80, \r
+0x62, 0x90, 0xA4, 0x08, 0xE0, 0x70, 0x5C, 0xD1, 0x2F, 0x80, 0x58, 0x90, 0xA4, 0x08, 0xE0, 0xB4, \r
+0x04, 0x05, 0x12, 0xB8, 0x57, 0x80, 0x4C, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x46, \r
+0x80, 0x41, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x67, 0xDE, 0x80, 0x35, 0x90, 0xA4, \r
+0x08, 0xE0, 0x70, 0x2F, 0xD1, 0x44, 0x80, 0x2B, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x05, 0x12, \r
+0xB8, 0xA1, 0x80, 0x1F, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x1A, 0x80, 0x14, 0x90, \r
+0xA4, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xB8, 0x7F, 0x80, 0x08, 0x90, 0xA4, 0x08, 0xE0, 0x70, \r
+0x02, 0xD1, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x3D, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x49, \r
+0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0xD1, \r
+0x3D, 0x7D, 0x20, 0x12, 0x46, 0xF8, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0x14, \r
+0x74, 0x01, 0xF0, 0x22, 0xD1, 0x3D, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0x14, \r
+0x74, 0x03, 0xF0, 0x22, 0xD1, 0x88, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0xA1, \r
+0x14, 0xF0, 0x22, 0xD1, 0x78, 0x80, 0xEF, 0xD1, 0x6B, 0x80, 0xEB, 0xE4, 0xFD, 0xFF, 0x12, 0x49, \r
+0x5E, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x60, 0x4D, 0xE4, 0xFD, 0xFF, 0x12, 0x49, \r
+0x5E, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05, \r
+0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x75, 0xF0, 0x10, 0xEF, \r
+0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
+0x16, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, \r
+0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x2F, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, \r
+0x45, 0xA9, 0xE0, 0xF9, 0x54, 0x03, 0xFB, 0xEE, 0xD3, 0x9B, 0x50, 0x1B, 0xEE, 0x60, 0x18, 0x1E, \r
+0xEE, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, \r
+0x45, 0xA9, 0xE9, 0x54, 0xF3, 0x4B, 0xF0, 0xED, 0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04, 0x74, 0x16, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8E, 0x6A, 0xE4, \r
+0xFB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, \r
+0xA3, 0xA7, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA3, 0xA2, 0xF0, 0xE5, 0x67, \r
+0x54, 0x07, 0x90, 0xA3, 0xA4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, \r
+0xE0, 0x90, 0xA3, 0xA5, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, \r
+0x54, 0x7F, 0x90, 0xA3, 0xA8, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x90, 0x96, 0x17, 0x12, 0x45, \r
+0xA9, 0xE0, 0x90, 0xA3, 0xA9, 0xF0, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA3, 0xA3, 0xF0, 0xE5, 0x69, \r
+0x70, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, \r
+0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, \r
+0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x99, 0x12, 0x45, 0x39, 0x78, 0x01, 0x12, \r
+0x08, 0x47, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xA8, 0xE0, 0xFF, 0x90, 0xA3, 0xA3, 0xE0, 0xFE, 0xD3, 0x9F, \r
+0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA3, 0xA9, \r
+0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x68, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA3, 0xA3, \r
+0xF0, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA3, 0xA6, 0xF0, 0xE5, 0x69, 0x70, 0x33, 0x90, 0xA3, 0xA2, \r
+0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, \r
+0x90, 0xA3, 0xA4, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, \r
+0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA3, 0xA5, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x52, \r
+0x90, 0xA3, 0xA2, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, \r
+0x82, 0xE0, 0xFF, 0x90, 0xA3, 0xA4, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, \r
+0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, \r
+0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA3, 0xA5, 0xF0, 0x90, 0xA3, 0xA3, 0xE0, \r
+0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA3, 0xA5, 0xF0, 0x44, \r
+0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x68, 0xF0, \r
+0xE5, 0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA3, 0xA5, 0xE0, 0xFF, 0x75, \r
+0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, \r
+0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, 0x03, 0x4F, \r
+0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x7D, 0x01, \r
+0xAF, 0x67, 0x11, 0xC9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
+0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, \r
+0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, \r
+0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, \r
+0xEF, 0x90, 0x8D, 0x07, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, \r
+0x8D, 0x09, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, \r
+0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, \r
+0x98, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, \r
+0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xEE, \r
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, \r
+0x75, 0xD0, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, \r
+0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x56, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0x31, 0xA8, 0x53, \r
+0x91, 0xBF, 0x74, 0x56, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, \r
+0x06, 0xD0, 0x05, 0xD0, 0x04, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0xD0, 0xD0, 0xD0, \r
+0x82, 0xD0, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0x32, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, \r
+0xE0, 0x90, 0xA3, 0x24, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0x70, 0x90, 0xA3, 0xE6, 0xE0, 0x70, \r
+0x1A, 0x7F, 0x2E, 0x12, 0x46, 0xD6, 0x90, 0xA2, 0x08, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x46, 0xD6, \r
+0x90, 0xA2, 0x09, 0xEF, 0xF0, 0x90, 0xA3, 0xE6, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x24, 0xE0, 0x64, \r
+0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFE, \r
+0x90, 0xA2, 0x08, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, 0xA3, 0x23, 0xF0, 0xD3, 0x94, \r
+0x3F, 0x40, 0x1D, 0xE4, 0xF0, 0x80, 0x19, 0x90, 0xA2, 0x08, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, \r
+0xEF, 0x54, 0x3F, 0x2E, 0x90, 0xA3, 0x23, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, \r
+0x90, 0xA3, 0x23, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, \r
+0x4E, 0x90, 0xA3, 0x21, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0x23, 0xE0, \r
+0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA2, 0x09, 0xE0, 0x54, 0x0F, 0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, \r
+0xAC, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xF1, 0x13, 0x7F, \r
+0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x23, 0x09, 0x7F, 0x01, 0x71, 0x71, 0x7F, \r
+0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x27, 0x09, 0x7F, 0x02, 0x71, 0x71, 0x7F, \r
+0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, \r
+0xF1, 0x6C, 0x7F, 0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0x64, 0x34, 0x70, 0x70, 0x90, \r
+0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x4F, 0x90, 0xA1, 0xF2, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x5F, \r
+0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90, \r
+0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7, 0xF0, 0x7D, 0x01, 0x91, 0x13, 0x90, 0xA3, 0x21, 0x74, 0x01, \r
+0xF0, 0xFB, 0x7A, 0xA3, 0x79, 0x21, 0xFD, 0x7F, 0x34, 0x12, 0x5E, 0x9D, 0x90, 0xA2, 0x13, 0xE0, \r
+0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xE7, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x80, 0x1A, 0x71, 0xFA, 0x90, 0xA2, 0x13, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, \r
+0xF0, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x90, \r
+0xA3, 0x24, 0xE0, 0xFD, 0xB4, 0x35, 0x07, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, \r
+0x36, 0x23, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA3, 0x21, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3, \r
+0x22, 0xF0, 0x90, 0xA3, 0x24, 0xE0, 0xFF, 0x90, 0xA3, 0x21, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA3, \r
+0x79, 0x22, 0x12, 0x5E, 0x9D, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x37, 0x02, 0xD1, 0x80, 0x90, 0xA3, \r
+0x24, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xF0, 0x74, \r
+0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xF0, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, \r
+0x22, 0x90, 0xA3, 0x6D, 0x74, 0x09, 0xF0, 0x90, 0xA3, 0x7B, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x6F, \r
+0xEF, 0xF0, 0x70, 0x31, 0x90, 0xA1, 0xE6, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, \r
+0x90, 0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x70, 0x74, \r
+0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0x70, 0xF0, 0xE4, 0x90, 0xA3, 0x71, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3, 0x70, 0xF0, 0x90, 0xFD, 0x63, \r
+0xE0, 0x90, 0xA3, 0x71, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x72, 0xF0, 0x90, 0xFD, 0x65, \r
+0xE0, 0x90, 0xA3, 0x73, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x74, 0xF0, 0x90, 0xFD, 0x67, \r
+0xE0, 0x90, 0xA3, 0x75, 0xF0, 0x90, 0xA3, 0x70, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xE6, 0xF0, 0xA3, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x6D, 0x02, 0x6F, 0xEA, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90, 0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7, \r
+0xF0, 0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC4, 0xEF, 0xF0, 0x90, \r
+0xA3, 0xC6, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0xA1, 0x2A, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, \r
+0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0xA3, 0xC6, 0xE0, 0x70, 0x6D, 0x7F, 0x67, 0x12, \r
+0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0xC4, 0xE0, 0x70, \r
+0x4F, 0x90, 0xA3, 0xC7, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x20, 0x12, 0x37, 0x4E, 0xE4, 0xFF, \r
+0x74, 0x02, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, \r
+0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0x80, 0x1F, 0x12, 0x37, 0x4E, 0xE4, 0xFE, \r
+0x74, 0x80, 0xFF, 0xE4, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, \r
+0x38, 0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x12, 0x46, 0xAC, \r
+0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0xA1, 0x9C, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, \r
+0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0xC4, 0xE0, 0x70, 0x18, 0x7F, 0x48, \r
+0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, \r
+0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, \r
+0x4E, 0x12, 0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x12, \r
+0x46, 0xAC, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66, 0xFF, 0xEC, 0x90, 0xAA, \r
+0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
+0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, \r
+0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xA1, 0xB0, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, \r
+0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0xA3, 0xC4, 0xE0, 0x70, 0x56, 0x90, 0xA3, \r
+0xC6, 0xE0, 0x60, 0x19, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, \r
+0x46, 0xAC, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x80, 0x28, 0x7F, 0x67, 0x12, \r
+0x46, 0xD6, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0xC7, 0xE0, 0x7F, \r
+0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, \r
+0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, \r
+0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, \r
+0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x12, 0x46, 0xAC, \r
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x2D, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xEF, 0xFD, \r
+0x7F, 0x08, 0x12, 0x46, 0xAC, 0xE4, 0xFF, 0xD1, 0xAB, 0x71, 0xFA, 0x90, 0xA1, 0x16, 0xE0, 0xFF, \r
+0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xD1, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
+0xD0, 0xB1, 0xEA, 0xB1, 0xB5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90, 0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7, \r
+0xF0, 0x7D, 0x01, 0x91, 0x13, 0x90, 0xA1, 0x24, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0xAC, 0x90, \r
+0xA1, 0x1B, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, \r
+0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x10, 0xFD, \r
+0x7F, 0x08, 0x12, 0x46, 0xAC, 0x7F, 0x01, 0xD1, 0xAB, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF, 0x44, \r
+0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xAC, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0xA1, \r
+0x1D, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0xF1, 0x4C, 0xBF, 0x01, 0x02, 0xB1, 0xDA, 0x22, \r
+0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, \r
+0x13, 0x30, 0xE0, 0x07, 0xF1, 0x06, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xD1, 0x4E, 0x22, \r
+0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, \r
+0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA3, 0x25, 0x30, 0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, \r
+0x02, 0xF0, 0x90, 0xA3, 0x25, 0xE0, 0xFF, 0x12, 0x8F, 0xB4, 0x22, 0x90, 0xA3, 0xF3, 0xEF, 0xF0, \r
+0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, \r
+0x90, 0xA3, 0xF3, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0xA3, 0xF5, 0xE0, 0x94, 0x88, 0x90, 0xA3, \r
+0xF4, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, \r
+0xF4, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, \r
+0x90, 0xA3, 0xF5, 0xE0, 0x94, 0x32, 0x90, 0xA3, 0xF4, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, \r
+0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, \r
+0x7F, 0x00, 0x22, 0x90, 0xA3, 0x25, 0x74, 0x08, 0xF0, 0x90, 0xA3, 0x33, 0x74, 0x01, 0xF0, 0x90, \r
+0xA3, 0x27, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x25, 0x02, 0x6F, 0xEA, 0x90, 0x01, 0xC4, \r
+0x74, 0x2D, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE0, 0xF7, \r
+0x74, 0x2D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0x22, 0x90, 0x02, 0x87, 0xE0, \r
+0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, \r
+0xA2, 0x13, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA3, 0x7C, 0x74, \r
+0x0B, 0xF0, 0x90, 0xA3, 0x8A, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x7E, 0xEF, 0xF0, 0x60, 0x32, 0x90, \r
+0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x7F, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA3, 0x80, 0xF0, 0x90, \r
+0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x81, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA3, 0x82, 0xF0, 0x90, \r
+0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x83, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA3, 0x84, 0xF0, 0x80, \r
+0x11, 0x90, 0xA3, 0x7F, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x7C, 0x02, 0x6F, 0xEA, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, \r
+0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xCB, 0x90, 0x01, 0xC4, 0xED, \r
+0xF0, 0x74, 0x7F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, \r
 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xEF, 0x14, 0x90, 0x05, \r
 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, \r
 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, \r
-0x90, 0xA1, 0xF6, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0xA1, \r
-0x15, 0xE0, 0x64, 0x02, 0x60, 0x35, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0A, \r
-0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x02, 0x60, 0x23, 0x11, 0xDC, 0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0xA1, 0x20, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0B, \r
-0x11, 0x6C, 0x12, 0x5F, 0x60, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, \r
-0x64, 0x01, 0x60, 0x02, 0x21, 0x8B, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0x21, 0x8B, 0x90, 0xA1, \r
-0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, \r
-0x21, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0xA1, 0x20, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, \r
-0x90, 0xA1, 0x20, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0xA1, 0x21, 0xEF, 0xF0, \r
-0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x02, 0x31, 0x9C, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, \r
-0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, \r
-0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, \r
-0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, \r
-0x0F, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xB7, 0xE4, 0x80, 0x03, 0x12, 0xB9, 0x34, \r
-0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x20, 0xE0, \r
-0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x11, 0x6C, 0x12, 0x5F, 0x66, 0x90, 0xA1, 0x11, 0xE0, 0xC3, \r
-0x13, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xCF, \r
-0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, \r
-0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x43, 0xEE, 0xF0, 0xA3, 0xEF, \r
-0xF0, 0x90, 0xA1, 0x41, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, \r
-0x9F, 0xEA, 0x9E, 0x40, 0x21, 0x90, 0xA1, 0x41, 0xA3, 0xEB, 0x9F, 0xFD, 0xC3, 0x94, 0x0F, 0x50, \r
-0x13, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0xA1, \r
-0x2D, 0xE0, 0x04, 0xF0, 0x51, 0x4A, 0x90, 0xA1, 0x2D, 0xE0, 0xD3, 0x94, 0x32, 0x40, 0x4A, 0xE4, \r
-0x90, 0xA2, 0xD0, 0xF0, 0x90, 0xA2, 0xCF, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x0F, \r
-0x50, 0x2A, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, \r
-0xD0, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x0A, 0x40, 0x0A, 0x90, 0xA2, 0xCF, 0xE0, 0x90, 0xA1, \r
-0x2C, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xCC, 0x90, 0xA1, 0x2C, 0xE0, \r
-0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x51, 0x86, 0xF1, 0x9A, 0x22, 0x90, 0xA1, 0x31, 0xE0, 0xFD, 0x7F, \r
-0xFD, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x7A, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, \r
-0x24, 0x90, 0xA1, 0x31, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0xA1, 0x2B, \r
-0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0xA1, 0x30, 0xF0, 0xFB, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, \r
-0xA3, 0xE0, 0xFD, 0x51, 0x86, 0x22, 0xAC, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x2E, 0x90, \r
-0xA1, 0x2C, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x80, 0x0A, 0xED, \r
-0x24, 0xFD, 0x2B, 0x90, 0xA1, 0x22, 0xF0, 0x7D, 0x03, 0xC3, 0x74, 0x04, 0x9D, 0x2C, 0xFF, 0x90, \r
-0xA1, 0x2F, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0xA1, 0x25, \r
-0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, \r
-0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0xA0, 0x0A, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0x30, 0xE0, 0x05, \r
-0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x55, 0x19, 0x90, 0xA2, 0xDF, 0xE0, 0x30, \r
-0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, \r
-0x74, 0x80, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0x30, 0xE0, 0xFB, \r
-0x41, 0x86, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, \r
-0x0F, 0x1A, 0x90, 0xA1, 0xF7, 0xE0, 0x54, 0xFE, 0xF0, 0xF1, 0x7E, 0xAB, 0x51, 0xAA, 0x52, 0xA9, \r
-0x53, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0xB1, 0x42, 0x02, 0x95, 0x26, 0xAB, 0x51, 0xAA, 0x52, \r
-0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, \r
-0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFA, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, \r
-0xA2, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0xFC, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, \r
-0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00, \r
-0x02, 0x12, 0x06, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA1, 0xFB, 0x12, 0x45, \r
-0x49, 0xE0, 0x54, 0x1F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, \r
-0x54, 0x0F, 0xFD, 0xE4, 0xFB, 0x91, 0x38, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05, \r
-0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x91, 0x38, 0xAB, 0x51, \r
-0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, \r
-0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x03, 0x12, 0x45, 0x49, \r
-0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, \r
-0xED, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, \r
-0x70, 0x25, 0x90, 0xA1, 0xF8, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4, \r
-0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xF7, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, \r
-0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x11, 0x7B, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, 0x1F, \r
-0xC3, 0x95, 0x54, 0x40, 0x14, 0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x91, 0xCB, \r
-0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x16, \r
-0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x91, 0xCB, 0x90, 0xA2, 0xB5, \r
-0xEF, 0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, 0xA2, 0xB9, \r
-0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x91, 0xCB, 0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x24, \r
-0xD0, 0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xAB, \r
-0x55, 0x7D, 0x60, 0xAF, 0x54, 0x91, 0xCB, 0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x24, 0x84, 0xFD, 0xE4, \r
-0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x55, 0x90, 0xA1, 0xFC, 0x12, 0x45, 0x49, 0x75, 0xF0, \r
-0x03, 0xEE, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56, \r
-0xC3, 0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA1, 0xFE, 0x12, \r
-0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, 0xB9, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, \r
-0x03, 0x12, 0x45, 0x49, 0xE5, 0x56, 0xF0, 0x80, 0x46, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, \r
-0x75, 0x57, 0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, \r
-0x75, 0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, \r
-0xFF, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA1, 0xFE, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, \r
-0xA2, 0xB9, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0xAF, \r
-0x57, 0x22, 0x8F, 0x54, 0x7D, 0x17, 0x12, 0x4F, 0xF6, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA1, \r
-0xFA, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA1, 0xFB, 0x12, 0x45, \r
-0x49, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0xA1, 0xF7, 0xE0, \r
-0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0xB0, 0xF0, 0xAF, 0x04, 0xD1, 0x79, 0x75, 0xF0, 0x0D, 0xE5, \r
-0x54, 0x12, 0xB4, 0xD8, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x12, 0x4E, 0xC7, 0xAD, 0x54, 0xE4, 0xFF, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0x90, 0xA3, 0xB3, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0xC1, 0x74, 0x90, 0xA3, \r
-0xB2, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFC, 0x12, 0x45, 0x49, 0x75, 0xF0, 0x03, 0xEF, \r
-0x12, 0x45, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0xE0, 0x90, 0xA3, 0xB4, 0xF0, \r
-0x90, 0xA3, 0xB1, 0xE0, 0x60, 0x31, 0x90, 0xA3, 0xB4, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, \r
-0xA1, 0xFE, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xB3, 0xE0, 0xD0, 0x82, 0xD0, \r
-0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, \r
-0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x33, 0x90, 0xA3, 0xB4, 0xE0, 0xFF, 0x90, 0xA3, 0xB2, 0xE0, \r
-0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFE, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xB3, \r
-0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x74, 0x01, 0xA8, \r
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xB4, 0xF0, 0x90, 0xA3, \r
-0xB4, 0xE0, 0xFF, 0x90, 0xA3, 0xB2, 0xE0, 0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFC, 0x12, 0x45, 0x49, \r
-0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xB3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, \r
-0x45, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xB3, 0xE0, \r
-0x04, 0xF0, 0xA1, 0xA2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0xA3, 0xAD, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, \r
-0x02, 0xF5, 0x71, 0x80, 0x08, 0x90, 0xA3, 0xAD, 0xE0, 0x24, 0xFE, 0xF5, 0x71, 0x90, 0xA3, 0x15, \r
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x71, 0xD1, 0xF0, 0x90, 0xA3, 0x15, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x71, 0x80, 0x20, 0x90, 0xA3, 0x15, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x00, 0xFF, 0x90, 0xA3, 0xAD, 0xE0, 0xFF, 0xD1, 0xF0, 0x90, 0xA3, 0x15, 0x12, 0x08, 0x79, \r
-0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0xAD, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x19, \r
-0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0xF1, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x13, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, \r
-0xA3, 0x12, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA3, 0x1D, 0x12, 0x08, \r
-0x6D, 0x90, 0xA3, 0x15, 0x12, 0x45, 0x11, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x1D, 0x12, 0x45, 0x2D, \r
-0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x15, 0x12, 0x45, \r
-0x11, 0x90, 0xA3, 0x19, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, \r
-0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA3, 0x21, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x13, 0xA3, 0xE0, \r
-0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x21, 0x12, 0x45, 0x11, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, \r
-0xA3, 0x12, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x20, \r
-0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x32, 0x2F, 0xF5, \r
-0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x0A, 0xEF, 0xE4, 0x90, 0xA1, \r
-0x2D, 0xF0, 0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0xFE, \r
-0xC3, 0x13, 0x30, 0xE0, 0x1C, 0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA1, 0xC5, 0x80, 0x03, 0x90, 0xA1, \r
-0xC1, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, \r
-0x45, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54, \r
-0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1, \r
-0xC5, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xC5, 0x12, 0x45, 0x11, 0x90, 0xA1, 0xC1, 0x12, 0x08, 0x6D, \r
-0xE4, 0x90, 0xA1, 0xCB, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, \r
-0x78, 0x74, 0x01, 0xF0, 0x11, 0x66, 0x11, 0xC0, 0x90, 0xA1, 0xA7, 0x74, 0x01, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x90, 0xA1, 0xB1, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x01, 0x12, 0x69, 0x53, 0xE4, 0x90, 0xA1, \r
-0xCE, 0xF0, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, \r
-0xDA, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0xA1, 0x8E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, \r
-0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, \r
-0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, \r
-0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, \r
-0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, \r
-0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x54, 0xFE, 0xF0, 0x22, \r
-0x90, 0xA1, 0x94, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0x93, 0xF0, 0x90, 0xA1, 0x95, 0xE0, \r
-0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x9C, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA1, 0xA6, 0xF0, \r
-0x90, 0xA1, 0xB4, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, \r
-0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x22, 0x8F, 0x55, 0xE4, \r
-0x90, 0xA2, 0xBB, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x2A, 0xD3, \r
-0x90, 0xA2, 0xBC, 0xE0, 0x94, 0x14, 0x90, 0xA2, 0xBB, 0xE0, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, \r
-0xBD, 0x74, 0x01, 0xF0, 0x80, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0xA2, 0xBB, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xCF, 0x90, 0xA2, 0xBD, 0xE0, 0xB4, 0x01, 0x0C, \r
-0x7F, 0x05, 0x12, 0x4C, 0x96, 0x90, 0xFD, 0x58, 0xE0, 0x44, 0x80, 0xF0, 0xE5, 0x55, 0x75, 0xF0, \r
+0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x1B, \r
+0x90, 0xA2, 0x2C, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x5F, 0xEF, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, \r
+0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4D, 0x1B, 0xA1, 0xF8, 0xAB, 0x51, 0xAA, 0x52, 0xA9, \r
+0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, \r
+0xF0, 0x0D, 0x90, 0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
+0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, \r
+0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, \r
+0xF0, 0x0D, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, \r
+0xE0, 0x54, 0x1F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, \r
+0x0F, 0xFD, 0xE4, 0xFB, 0x31, 0x47, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05, 0x12, \r
+0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x31, 0x47, 0xAB, 0x51, 0xAA, \r
+0x52, 0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x12, \r
+0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x38, 0x12, 0x45, 0xA9, 0xEF, \r
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0xED, \r
+0x90, 0xA2, 0x39, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, \r
+0x25, 0x90, 0xA2, 0x2D, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4, 0x54, \r
+0xF0, 0xFF, 0x90, 0xA2, 0x2C, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0, \r
+0x7D, 0x20, 0xE4, 0xFF, 0x11, 0x0B, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, 0x1F, 0xC3, \r
+0x95, 0x54, 0x40, 0x14, 0x90, 0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x31, 0xDA, 0x90, \r
+0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, \r
+0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x31, 0xDA, 0x90, 0xA2, 0xEB, 0xEF, \r
+0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, 0xA2, 0xEF, 0xEE, \r
+0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x31, 0xDA, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0xD0, \r
+0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, \r
+0x7D, 0x60, 0xAF, 0x54, 0x31, 0xDA, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0x84, 0xFD, 0xE4, 0x34, \r
+0x04, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x55, 0x90, 0xA2, 0x31, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x03, \r
+0xEE, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3, \r
+0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA2, 0x33, 0x12, 0x45, \r
+0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, 0xEF, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, \r
+0x12, 0x45, 0xA9, 0xE5, 0x56, 0xF0, 0x80, 0x46, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, \r
+0x57, 0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, \r
+0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, \r
+0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA2, 0x33, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, \r
+0xEF, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xAF, 0x57, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, \r
+0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xCD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, \r
+0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, \r
+0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xCD, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, \r
+0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, \r
+0xCD, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, \r
+0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
+0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, \r
+0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, \r
+0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xD0, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, \r
+0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, \r
+0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0xD0, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, \r
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, \r
+0xD0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0xA1, 0xD1, 0xE0, \r
+0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, \r
+0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA1, \r
+0xD1, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, \r
+0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE, \r
+0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, \r
+0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE, 0x54, 0x08, 0xFE, \r
+0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x09, 0x12, 0x60, \r
+0x4D, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x0E, \r
+0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA2, \r
+0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0xA1, 0x45, 0x90, 0x05, 0x54, 0xE0, \r
+0x90, 0xA1, 0xDE, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xDD, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, \r
+0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCE, 0xF0, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCF, 0xF0, 0x80, 0x48, 0x90, 0x00, 0x01, 0x12, 0x06, \r
+0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0xCE, 0x50, 0x05, \r
+0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCE, 0x74, 0x2A, 0xF0, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, \r
+0xA1, 0xCF, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCF, \r
+0x74, 0x2A, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3C, 0x90, \r
+0xA1, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0xD6, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, \r
+0x90, 0xA1, 0xCF, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0xD8, 0xF0, 0x90, 0xA1, 0xCE, 0xE0, \r
+0xC3, 0x13, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0xA1, 0xCF, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xDA, 0xF0, \r
+0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x11, 0x0B, 0xE4, 0x90, 0xA2, 0x0A, 0xF0, \r
+0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, \r
+0x03, 0x20, 0xE0, 0x3C, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0A, 0xEF, 0xC4, \r
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, \r
+0x30, 0xE0, 0x08, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA2, 0x0C, 0xE0, 0x60, \r
+0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, 0x63, 0x7F, \r
+0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, \r
+0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, 0x12, 0x55, 0x87, 0x90, 0x05, 0x00, 0x74, \r
+0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xD5, 0xE0, \r
+0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xE0, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, \r
+0x90, 0xA1, 0xE0, 0x74, 0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0xE0, 0x74, \r
+0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0xE4, 0x90, \r
+0xA1, 0xD5, 0xF0, 0x80, 0x6D, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, \r
+0xA2, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14, 0x12, \r
+0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, \r
+0xE4, 0xF5, 0x52, 0xD1, 0x07, 0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0xAC, 0x90, 0xA2, 0xEB, 0x12, \r
+0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, \r
+0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xAD, 0x52, 0x7F, 0x02, 0x12, \r
+0x63, 0x7F, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, \r
+0x43, 0xF0, 0x90, 0xA1, 0xD3, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0xDF, 0xF0, 0x90, 0xA1, \r
+0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0xFD, 0xE0, 0x44, \r
+0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x67, 0xE7, 0x90, 0xA1, 0xFD, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x7F, 0x03, 0x12, 0x66, 0xDF, 0x90, 0xA1, 0xCD, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0xD1, 0xE0, \r
+0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0x2A, 0x7D, 0x00, 0x7B, 0x01, \r
+0x7A, 0xA2, 0x79, 0x2C, 0x02, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, \r
+0xA1, 0x79, 0xF3, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0xE1, 0x74, 0x02, 0xF0, 0x22, 0x8F, 0x55, 0xE4, \r
+0x90, 0xA2, 0xF1, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x2A, 0xD3, \r
+0x90, 0xA2, 0xF2, 0xE0, 0x94, 0x14, 0x90, 0xA2, 0xF1, 0xE0, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2, \r
+0xF3, 0x74, 0x01, 0xF0, 0x80, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0xA2, 0xF1, \r
+0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xCF, 0x90, 0xA2, 0xF3, 0xE0, 0xB4, 0x01, 0x0C, \r
+0x7F, 0x05, 0x12, 0x5E, 0x86, 0x90, 0xFD, 0x58, 0xE0, 0x44, 0x80, 0xF0, 0xE5, 0x55, 0x75, 0xF0, \r
 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0, \r
 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
 0x90, 0xFD, 0x51, 0xF0, 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, \r
@@ -5817,1051 +6448,862 @@ u1Byte Array_MP_8723B_FW_MP[] = {
 0x90, 0xFD, 0x55, 0xF0, 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, \r
 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, \r
 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xF5, 0x54, 0x90, 0xA2, 0xB8, 0xF0, 0x74, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xF5, 0x54, 0x90, 0xA2, 0xEE, 0xF0, 0x74, \r
 0x28, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0xA3, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x90, 0x01, 0xBD, 0xE0, \r
-0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0xA2, 0xBA, \r
-0xE0, 0xFF, 0x90, 0xA2, 0xB8, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x5C, 0xEE, 0x70, 0x05, 0x75, 0x54, \r
-0x05, 0x80, 0x03, 0xE4, 0xF5, 0x54, 0xE5, 0x54, 0xC3, 0x94, 0x20, 0x50, 0x08, 0xAF, 0x54, 0x31, \r
-0x1D, 0x05, 0x54, 0x80, 0xF1, 0x90, 0xA2, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x10, 0xE0, 0x04, \r
-0xF0, 0x90, 0xA2, 0xBA, 0xE0, 0xFF, 0x90, 0xA2, 0xB8, 0xE0, 0xB5, 0x07, 0xC0, 0xE4, 0xF5, 0x54, \r
-0xE5, 0x54, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0xA2, 0xB9, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74, \r
-0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x08, 0xAF, 0x54, 0x31, 0x1D, 0x05, 0x54, 0x80, 0xE1, 0x90, \r
-0xA2, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0x96, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0x3F, 0xF0, \r
-0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x7D, 0x06, 0x7F, 0x0A, 0x12, 0x4A, 0x44, 0x8F, 0x53, 0xE5, \r
-0x53, 0x64, 0x01, 0x60, 0x08, 0x90, 0x04, 0x9D, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA2, 0xB5, \r
-0x12, 0x45, 0x55, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x12, 0x06, 0x89, 0x7C, 0x00, 0x24, \r
-0x00, 0xF5, 0x52, 0xEC, 0x3E, 0xF5, 0x51, 0xAF, 0x52, 0xFE, 0x71, 0x14, 0xEF, 0x70, 0x07, 0x90, \r
-0x04, 0x9D, 0xE0, 0x44, 0x10, 0xF0, 0xAF, 0x52, 0xAE, 0x51, 0x51, 0x11, 0x90, 0x04, 0x9D, 0xE0, \r
-0x44, 0x80, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xB8, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x91, 0x80, 0xAD, \r
-0x07, 0xED, 0x24, 0x28, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0xB9, 0xE0, 0x2F, 0xFF, 0x90, 0xA2, \r
-0xB8, 0xE0, 0x3E, 0xF9, 0xC3, 0x74, 0xD8, 0x9D, 0x90, 0xA2, 0xBE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, \r
-0xFC, 0xEC, 0xC3, 0x99, 0x40, 0x02, 0x81, 0x12, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x2C, 0x90, \r
-0xFD, 0x10, 0xF0, 0xEC, 0x70, 0x67, 0xF5, 0x56, 0x90, 0xA2, 0xBE, 0xE0, 0xC3, 0x13, 0xFF, 0xE5, \r
-0x56, 0xC3, 0x9F, 0x40, 0x02, 0x81, 0x0F, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x28, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x90, 0xA2, 0xBA, 0xF0, 0xFB, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5, 0x82, \r
-0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x90, 0xA2, 0xBB, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0xA3, \r
-0xF0, 0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0x9B, 0xE4, 0xF5, 0x56, \r
-0xE5, 0x56, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2, \r
-0xBA, 0xF0, 0xFB, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x90, 0xA2, 0xBB, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0xA3, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0xE5, 0x56, 0xB4, 0x80, 0xC1, 0x0C, \r
-0x61, 0x51, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x29, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0xF5, 0x56, \r
-0x90, 0xA2, 0xBF, 0xE0, 0xC3, 0x13, 0xFF, 0xE5, 0x56, 0xC3, 0x9F, 0x50, 0x3C, 0xE5, 0x56, 0x25, \r
-0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xBA, 0xF0, 0xFD, \r
-0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2, \r
-0xBB, 0xF0, 0xFE, 0x7C, 0x00, 0xE4, 0x2D, 0xFF, 0xEC, 0x3E, 0xFE, 0xA3, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0xB7, 0xE5, 0x55, 0x90, 0x04, 0x9E, 0xF0, 0xE5, \r
-0x54, 0xA3, 0xF0, 0x45, 0x55, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, \r
-0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, \r
-0xF0, 0xAF, 0x06, 0x22, 0x90, 0xA2, 0xEF, 0x74, 0x08, 0xF0, 0x90, 0xA2, 0xFD, 0x74, 0x01, 0xF0, \r
-0x90, 0xA2, 0xF1, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, \r
-0x14, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
-0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0xA0, 0x8C, \r
-0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, \r
-0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0xA0, 0x8C, 0xE0, 0x04, 0xF0, \r
-0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8C, 0xF0, \r
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xC0, 0x74, 0x12, 0xF0, 0x90, 0xA2, 0xCE, 0x74, 0x05, \r
-0xF0, 0x90, 0xA2, 0xC2, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xBE, 0xE0, \r
-0x90, 0xA2, 0xC5, 0xF0, 0x90, 0xA2, 0xBF, 0xE0, 0x90, 0xA2, 0xC6, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, \r
-0x79, 0xC0, 0x91, 0xAB, 0x7F, 0x04, 0x90, 0xA3, 0xDA, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57, \r
-0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x90, 0xA3, 0xDA, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x97, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0xB5, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB6, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, \r
-0xA2, 0xB7, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB8, 0xF0, 0x90, 0x00, 0x04, \r
-0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB9, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, \r
-0x44, 0x40, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x7D, 0x07, 0x7F, 0x30, 0x12, 0x4A, 0x44, \r
-0x8F, 0x51, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, \r
-0xA2, 0xB5, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0xB1, 0xD3, 0x7F, 0x04, 0xB1, 0x46, 0xD0, 0xD0, \r
-0x92, 0xAF, 0x22, 0x90, 0xA3, 0x46, 0x74, 0x0B, 0xF0, 0x90, 0xA3, 0x54, 0x74, 0x07, 0xF0, 0x90, \r
-0xA3, 0x48, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x49, 0xF0, 0x90, 0xFD, \r
-0x61, 0xE0, 0x90, 0xA3, 0x4A, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x4B, 0xF0, 0x90, 0xFD, \r
-0x65, 0xE0, 0x90, 0xA3, 0x4C, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x4D, 0xF0, 0x90, 0xFD, \r
-0x67, 0xE0, 0x90, 0xA3, 0x4E, 0xF0, 0x80, 0x11, 0x90, 0xA3, 0x49, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x46, 0x81, \r
-0xAB, 0x90, 0xA3, 0x00, 0xEB, 0xF0, 0x70, 0x6A, 0x90, 0xA3, 0x00, 0xE0, 0xFE, 0x24, 0x96, 0xF5, \r
-0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA3, 0x01, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, \r
-0x51, 0x90, 0xA3, 0x05, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, \r
-0x90, 0x9F, 0x96, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3, \r
-0x02, 0xE0, 0x90, 0xA3, 0x09, 0xF0, 0x90, 0xA3, 0x03, 0x74, 0x0C, 0xF0, 0x90, 0xA3, 0x11, 0x74, \r
-0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x03, 0x91, 0xAB, 0x7F, 0x04, 0xB1, 0x46, 0x90, 0xA3, \r
-0x01, 0xE0, 0xFF, 0x90, 0xA3, 0x00, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, \r
-0xEF, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, \r
-0x06, 0x89, 0x90, 0xA1, 0xD7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xD8, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x44, 0x01, \r
-0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x4A, 0x40, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, \r
-0xB1, 0x46, 0x22, 0x90, 0xA2, 0xB5, 0x74, 0x0A, 0xF0, 0x90, 0xA2, 0xC3, 0x74, 0x06, 0xF0, 0x12, \r
-0x06, 0x89, 0x90, 0xA2, 0xB7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB8, 0xF0, \r
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB9, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
-0x90, 0xA2, 0xBA, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xBB, 0xF0, 0x90, 0x00, \r
-0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xBC, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x81, 0xAB, \r
-0x90, 0xA3, 0x37, 0x74, 0x09, 0xF0, 0x90, 0xA3, 0x45, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x39, 0xEF, \r
-0xF0, 0x70, 0x31, 0x90, 0xA1, 0xA7, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, \r
-0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x3A, 0x74, 0x01, \r
-0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0x3A, 0xF0, 0xE4, 0x90, 0xA3, 0x3B, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3, 0x3A, 0xF0, 0x90, 0xFD, 0x63, 0xE0, \r
-0x90, 0xA3, 0x3B, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x3C, 0xF0, 0x90, 0xFD, 0x65, 0xE0, \r
-0x90, 0xA3, 0x3D, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x3E, 0xF0, 0x90, 0xFD, 0x67, 0xE0, \r
-0x90, 0xA3, 0x3F, 0xF0, 0x90, 0xA3, 0x3A, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xA7, 0xF0, 0xA3, 0xF0, \r
-0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x37, 0x81, 0xAB, 0x90, 0x9F, 0xA1, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, \r
-0x01, 0x12, 0x66, 0x08, 0x90, 0xA2, 0xE3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA2, \r
-0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA2, 0xEA, 0xF0, 0x90, 0xA2, 0xE7, 0xEC, \r
-0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xE7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, \r
-0x65, 0x7E, 0x90, 0xA2, 0xE7, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, \r
-0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, \r
-0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, \r
-0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0, \r
-0x90, 0xA2, 0xE9, 0xE0, 0xFF, 0x90, 0xA2, 0xE7, 0xA3, 0xE0, 0xFE, 0x24, 0x2A, 0xF5, 0x82, 0xE4, \r
-0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0xEA, 0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0xF5, 0x82, \r
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
-0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x90, 0xA2, 0xE0, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, \r
-0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xE5, 0xF0, 0x7D, \r
-0x01, 0x12, 0x4F, 0xF6, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x7F, 0xB8, 0x90, 0xA2, 0xE5, 0xE0, \r
-0xFF, 0x7D, 0x02, 0x12, 0x4E, 0xD8, 0x80, 0x03, 0x12, 0x7F, 0xB8, 0x90, 0x04, 0x1F, 0x74, 0x20, \r
-0xF0, 0x22, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x50, 0xDA, 0x90, 0xA1, 0x91, 0xE0, \r
-0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xA1, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, \r
-0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A, \r
-0x90, 0xA1, 0x8F, 0xE0, 0xFF, 0x90, 0xA1, 0x9F, 0x80, 0x21, 0x90, 0xA2, 0xDF, 0xE0, 0xFC, 0xB4, \r
-0x01, 0x0D, 0x90, 0xA1, 0x8F, 0xE0, 0xFE, 0x90, 0xA1, 0x9E, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, \r
-0xB4, 0x04, 0x0F, 0x90, 0xA1, 0x90, 0xE0, 0xFF, 0x90, 0xA1, 0x9E, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, \r
-0xA5, 0xF0, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2B, 0x90, 0xA1, 0x92, \r
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x02, 0x21, 0xBF, 0x90, 0xA1, 0xA5, 0xE0, 0xFF, 0xC3, \r
-0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, \r
-0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0x66, 0x80, 0x77, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, \r
-0xE0, 0x54, 0x90, 0xA1, 0x94, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x11, \r
-0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0xA1, 0x95, 0xE0, \r
-0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xA4, 0xF0, 0x90, 0xA1, 0xA1, 0xF0, 0x90, \r
-0xA2, 0xDF, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x96, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, \r
-0xB4, 0x04, 0x06, 0x90, 0xA1, 0x96, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x07, 0x90, \r
-0xA1, 0x95, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, \r
-0x09, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, \r
-0xA1, 0x92, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x1A, 0x90, 0xA1, 0xA5, 0xE0, 0xFF, \r
-0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, \r
-0xFF, 0x7E, 0x7F, 0x51, 0x30, 0x90, 0xA1, 0x91, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x4E, 0xD8, 0x22, 0x90, 0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x35, 0xB1, 0x08, 0x90, 0xA1, 0xA1, 0xE0, \r
-0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1D, 0x90, 0xA1, 0xA1, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1D, \r
-0x90, 0xA1, 0xA1, 0xE0, 0xFF, 0xB4, 0x03, 0x03, 0x02, 0x50, 0xEB, 0x90, 0xA1, 0xA1, 0xE0, 0xFF, \r
-0xB4, 0x04, 0x02, 0x01, 0xA2, 0x90, 0xA1, 0xA1, 0xE0, 0xFF, 0xB4, 0x05, 0x02, 0x71, 0x34, 0x22, \r
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xE2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, \r
-0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xE6, 0xF0, 0x7D, 0x36, 0x12, \r
-0x4F, 0xF6, 0xBF, 0x01, 0x02, 0x51, 0x7C, 0x90, 0xA2, 0xE6, 0xE0, 0xFF, 0x7D, 0x37, 0x12, 0x4E, \r
-0xD8, 0x80, 0x02, 0x51, 0x7C, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x38, 0x12, 0x4E, \r
-0xD8, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0xA2, 0xE0, \r
-0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x66, 0x08, 0x90, 0xA2, 0xE4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
-0x90, 0xA2, 0xE2, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAB, 0x07, 0x90, 0xA2, 0xE7, 0xED, 0xF0, 0xEC, \r
-0xF9, 0xE0, 0xFF, 0xAE, 0x03, 0x74, 0x2A, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0x22, 0x90, 0xA2, \r
-0xDF, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x20, 0xE0, 0x0E, 0x90, 0xA2, 0xE0, 0xE0, 0xB4, 0x01, 0x07, 0x7D, 0x36, 0x7F, 0x6F, \r
-0x12, 0x4E, 0xD8, 0x90, 0xA2, 0xDF, 0xE0, 0x70, 0x0C, 0x90, 0xA2, 0xE1, 0xE0, 0xFF, 0x7D, 0x05, \r
-0x12, 0x64, 0xC9, 0x80, 0x27, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA2, 0xE1, 0xE0, \r
-0xFF, 0x12, 0x66, 0xAE, 0x80, 0x16, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, \r
-0x01, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x51, 0x30, 0x90, 0xA1, 0xDA, 0xE0, \r
-0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0B, 0x90, 0xA2, 0xE0, 0xE0, 0x70, 0x05, 0xFD, 0xFF, \r
-0x12, 0x4E, 0xD8, 0x22, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0x90, 0xA2, 0xE1, 0x74, 0x02, 0xF0, 0x7F, \r
-0x01, 0x91, 0xB1, 0x90, 0xA1, 0x92, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x22, 0x90, \r
-0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x05, \r
-0x07, 0x7D, 0x0D, 0x7F, 0xFF, 0x12, 0x4E, 0xD8, 0x12, 0x4F, 0xFA, 0xBF, 0x01, 0x03, 0x12, 0x4C, \r
-0xAD, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0, \r
-0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x0D, \r
-0x90, 0xA1, 0x8F, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA1, 0x9E, 0x12, 0x50, 0xD6, 0x90, 0xA1, 0x8E, \r
-0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0xE0, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0xE0, \r
-0x74, 0x01, 0xF0, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, \r
-0xCD, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0xE1, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0xE1, \r
-0xF0, 0x90, 0xA2, 0xE1, 0xE0, 0xFF, 0x90, 0xA2, 0xE0, 0xE0, 0xFD, 0x12, 0x69, 0x53, 0xE4, 0x90, \r
-0xA1, 0xA0, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0xA1, 0xA1, 0xE0, 0x04, \r
-0xF0, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA1, 0xA1, 0xF0, 0x90, 0xA1, 0x8E, 0xE0, \r
-0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x17, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08, \r
-0x80, 0x66, 0x90, 0xA2, 0xDF, 0xE0, 0x64, 0x05, 0x70, 0x63, 0x7D, 0x0E, 0x80, 0x5A, 0x90, 0xA1, \r
-0x8E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x54, 0x07, \r
-0x20, 0xE0, 0x0A, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x53, 0x11, 0x90, 0xA2, 0xDF, \r
-0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x30, 0x90, 0xA2, 0xDF, 0xE0, 0x64, 0x05, 0x70, 0x2D, \r
-0x7D, 0x0F, 0x80, 0x24, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x23, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0xE4, \r
-0xFD, 0x12, 0x53, 0x11, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, \r
-0xA2, 0xDF, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x91, \r
-0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, \r
-0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x77, 0xBB, 0x90, 0xA1, 0x92, 0xE0, \r
-0xC3, 0x13, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, \r
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0x91, 0xE0, \r
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90, \r
-0xA1, 0x92, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, \r
-0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30, \r
-0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC, \r
-0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x20, 0xE0, 0x02, 0xE1, 0x79, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x01, 0x70, 0x38, 0x90, 0x06, \r
-0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06, 0x92, 0x74, 0x04, \r
-0xF0, 0x90, 0xA1, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x9A, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0xFF, \r
-0x90, 0xA1, 0xA3, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xE1, 0x5E, 0xE4, 0x90, 0xA1, 0x96, 0xF0, \r
-0x90, 0xA1, 0xA1, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, \r
-0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, \r
-0xF0, 0x90, 0xA1, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x99, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, \r
-0xB5, 0x07, 0x02, 0x80, 0x02, 0xE1, 0x5E, 0xE4, 0x90, 0xA1, 0x96, 0xF0, 0x90, 0xA1, 0xA1, 0x74, \r
-0x04, 0xF0, 0x22, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0xBF, 0x90, 0xA1, 0xA4, \r
-0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, \r
-0x07, 0x03, 0x90, 0xA1, 0x9A, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, \r
-0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA1, 0xA4, 0xE0, 0x94, 0x03, 0x40, 0x11, 0x90, 0xA1, \r
-0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xA1, 0x20, 0xE0, 0x02, 0xC1, 0x61, 0xE1, 0x07, 0x90, \r
-0xA1, 0x95, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x7A, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, \r
-0xA3, 0xF0, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xB3, 0xE0, \r
-0x30, 0xE0, 0x02, 0xC1, 0xED, 0x90, 0xA1, 0xA1, 0xE1, 0x07, 0x90, 0xA1, 0xA4, 0xE0, 0xFF, 0x90, \r
-0xA1, 0xA3, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, \r
-0xA1, 0x9A, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, \r
-0x80, 0x40, 0x0E, 0x90, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x02, 0xC1, 0xED, 0x90, 0xA1, 0xA1, 0xE1, \r
-0x07, 0x90, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0x96, 0x74, 0x09, 0xF0, 0x90, 0x06, \r
-0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA3, 0xBA, 0xE1, 0x13, 0x90, 0xA1, \r
-0xA1, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x64, 0xBE, 0x90, 0xA1, 0xA4, 0xE0, 0x04, 0xF0, 0x7F, 0x03, \r
-0x12, 0x50, 0xDA, 0x90, 0xA1, 0xA4, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, \r
-0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0x9A, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, \r
-0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0xA1, 0xA4, 0xE0, \r
-0x94, 0x03, 0x50, 0x02, 0xE1, 0x79, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, 0xE0, \r
-0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x4E, 0xD8, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, \r
-0xA1, 0x96, 0xE0, 0x64, 0x07, 0x70, 0x4F, 0x90, 0xA1, 0xA4, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0xA1, \r
-0xA1, 0x80, 0x34, 0x90, 0xA1, 0x95, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C, 0xEF, \r
-0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0x96, \r
-0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA3, \r
-0xBA, 0x04, 0x80, 0x0F, 0x90, 0xA1, 0xA1, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x64, 0xBE, 0x90, 0xA1, \r
-0xA4, 0xE0, 0x04, 0xF0, 0x80, 0x48, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90, 0xA1, \r
-0x95, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xA1, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x95, 0xE0, 0x54, \r
-0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xA3, \r
-0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA3, 0xBA, 0xE0, 0x90, 0xA1, 0xA1, 0x60, 0x05, \r
-0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x96, 0xF0, 0x22, 0x7F, 0x03, \r
-0x02, 0x50, 0xDA, 0x90, 0xA3, 0xBA, 0xE0, 0x90, 0xA1, 0xA1, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, \r
-0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x96, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xCF, 0xF0, 0x90, \r
-0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x6C, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, \r
-0xE0, 0x1F, 0x90, 0xA1, 0x9A, 0xE0, 0xFF, 0x12, 0x50, 0xDA, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, \r
-0x90, 0xA1, 0x96, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA1, 0xA1, 0xF0, 0x80, \r
-0x11, 0x90, 0xA2, 0xCF, 0xE0, 0xFF, 0x90, 0xA1, 0x8F, 0x12, 0x50, 0xD6, 0x90, 0xA1, 0xA1, 0x74, \r
-0x01, 0xF0, 0x90, 0xA1, 0xA0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x07, 0x7D, 0x05, \r
-0x7F, 0x6F, 0x02, 0x4E, 0xD8, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x8E, 0xE0, 0xFF, \r
-0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, \r
-0x67, 0xA4, 0x22, 0x90, 0xA2, 0xF0, 0xEF, 0xF0, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x7D, 0x7F, 0x48, \r
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, \r
-0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x45, 0x2D, 0xC3, \r
-0x12, 0x45, 0x00, 0x70, 0x05, 0x90, 0xA1, 0xAF, 0x80, 0x31, 0xE4, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, \r
-0xA2, 0xF1, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, 0x0A, 0x90, 0xA1, 0xAF, 0x04, 0xF0, \r
-0xE4, 0xA3, 0xF0, 0x01, 0xD7, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x45, \r
-0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, 0x09, 0x90, 0xA1, 0xAF, 0x04, 0xF0, 0xA3, 0xF0, 0x80, 0x77, \r
-0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, 0x00, \r
-0x70, 0x65, 0x90, 0xA1, 0xAF, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F, 0x2C, 0x7E, 0x09, 0x12, \r
-0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x08, 0x6D, \r
-0x90, 0xA2, 0xF1, 0x12, 0x45, 0x11, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08, 0x90, 0xA1, 0xAF, 0x74, \r
-0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xAF, 0xF0, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, \r
-0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x08, 0x6D, 0x90, 0xA2, \r
-0xF1, 0x12, 0x45, 0x11, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xB0, 0xF0, 0x80, \r
-0x06, 0x90, 0xA1, 0xB0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11, \r
-0x12, 0x4C, 0xA9, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, \r
-0xE4, 0xFD, 0x12, 0x69, 0x53, 0x90, 0xA2, 0xF0, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x24, 0xED, 0xB4, \r
-0x01, 0x0A, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA2, 0xF0, 0xE0, \r
-0xFD, 0xB4, 0x02, 0x0A, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4, \r
-0x03, 0x07, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, \r
-0x13, 0x54, 0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA2, \r
-0xEF, 0x30, 0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0xEF, 0xE0, \r
-0xFF, 0x12, 0x87, 0xF3, 0x22, 0xEF, 0x70, 0x1C, 0x90, 0xA1, 0xDB, 0xE0, 0x54, 0x03, 0xFE, 0x70, \r
-0x02, 0x80, 0x1B, 0xBE, 0x01, 0x02, 0x80, 0x20, 0xBE, 0x02, 0x02, 0x80, 0x26, 0xEE, 0x64, 0x03, \r
-0x70, 0x32, 0x80, 0x2A, 0x90, 0xA1, 0xDB, 0xE0, 0xC4, 0x54, 0x03, 0xFE, 0x70, 0x07, 0x90, 0x07, \r
-0x78, 0x04, 0xF0, 0x80, 0x1F, 0xBE, 0x01, 0x08, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x80, 0x14, \r
-0xBE, 0x02, 0x08, 0x90, 0x07, 0x78, 0x74, 0x09, 0xF0, 0x80, 0x09, 0xBE, 0x03, 0x06, 0x90, 0x07, \r
-0x78, 0x74, 0x0D, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x45, \r
-0xEF, 0x70, 0x1F, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0xDF, \r
-0xF0, 0x80, 0x06, 0x90, 0xA2, 0xDF, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFD, 0xE4, 0xFF, \r
-0x80, 0x20, 0x90, 0xA1, 0xDB, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0xE4, 0x90, \r
-0xA2, 0xDF, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0xDF, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFD, \r
-0x7F, 0x01, 0x12, 0x69, 0x53, 0x22, 0x90, 0xA3, 0xDB, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57, \r
-0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA3, 0xDB, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x98, 0xF0, \r
-0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x9F, 0x9D, 0xF0, \r
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9E, 0xF0, 0x90, 0x00, 0x02, 0x12, \r
-0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, 0x51, \r
-0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA1, 0xF0, \r
-0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0x8B, 0x51, 0x8A, \r
-0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, \r
-0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, \r
-0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, \r
-0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, \r
-0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, \r
-0xAF, 0x54, 0x70, 0x04, 0x51, 0xEC, 0x80, 0x02, 0x51, 0xDB, 0x05, 0x54, 0x80, 0xC6, 0x12, 0x77, \r
-0x9A, 0x90, 0xA0, 0x90, 0xE0, 0x70, 0x13, 0x12, 0x6E, 0x89, 0x12, 0x57, 0x9F, 0x90, 0xA1, 0x16, \r
-0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, \r
-0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, \r
-0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, \r
-0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA1, \r
-0x10, 0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x22, 0x80, \r
-0x1D, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, \r
-0x10, 0x90, 0xA1, 0x11, 0xE0, 0x20, 0xE0, 0x06, 0xE4, 0xFF, 0x71, 0x46, 0x80, 0x03, 0x12, 0x67, \r
-0x7E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x14, \r
-0xE0, 0x90, 0xA3, 0xDE, 0xF0, 0x6F, 0x70, 0x02, 0x81, 0x4F, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, \r
-0x6D, 0x14, 0x70, 0x02, 0x61, 0xFA, 0x14, 0x70, 0x02, 0x81, 0x26, 0x24, 0x04, 0x60, 0x02, 0x81, \r
-0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0x87, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, \r
-0xB4, 0x02, 0x04, 0x91, 0x9A, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x96, \r
-0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x4F, 0x91, 0x89, 0x81, 0x4F, \r
-0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0xAC, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, \r
-0x02, 0x05, 0x12, 0x4F, 0xE7, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x9F, \r
-0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0x60, 0x02, 0x81, 0x4F, 0x91, 0x70, 0x81, 0x4F, 0x90, 0xA3, \r
-0xDE, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0xCA, 0x80, 0x76, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x01, 0x05, \r
-0x12, 0x4F, 0xDC, 0x80, 0x6A, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0xC0, 0x80, 0x5F, \r
-0x90, 0xA3, 0xDE, 0xE0, 0x70, 0x59, 0x91, 0x6B, 0x80, 0x55, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x04, \r
-0x04, 0x91, 0xDD, 0x80, 0x4A, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0x79, 0x80, 0x3F, \r
-0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x6F, 0xDF, 0x80, 0x33, 0x90, 0xA3, 0xDE, 0xE0, \r
-0x70, 0x2D, 0x91, 0x77, 0x80, 0x29, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0xF2, 0x80, \r
-0x1E, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0x56, 0x80, 0x13, 0x90, 0xA3, 0xDE, 0xE0, \r
-0xB4, 0x02, 0x04, 0xB1, 0x07, 0x80, 0x08, 0x90, 0xA3, 0xDE, 0xE0, 0x70, 0x02, 0x91, 0x54, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x91, 0x70, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x27, \r
-0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x91, 0x70, 0x02, 0x4F, 0xDC, \r
-0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x91, 0x70, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x4E, 0xD8, \r
-0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0x91, 0xAC, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
-0xE4, 0x90, 0xA1, 0x14, 0xF0, 0x22, 0x91, 0x9F, 0x80, 0xEF, 0x12, 0x4F, 0xE7, 0x80, 0xEA, 0xE4, \r
-0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, \r
-0x4E, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, \r
-0x12, 0x4C, 0xAD, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, \r
-0xF0, 0x7D, 0x23, 0x12, 0x4C, 0xA9, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x7D, 0x22, 0x7F, \r
-0xFF, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x03, \r
-0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
-0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x6E, 0x89, 0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x4E, \r
-0xD8, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90, \r
-0x04, 0x24, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA2, 0x06, 0xF0, 0x90, 0x00, \r
-0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, 0x13, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
-0x25, 0x51, 0x90, 0xA2, 0x20, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x22, \r
-0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xFF, \r
-0x54, 0x7F, 0x90, 0xA1, 0x1A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, 0x18, 0xE0, \r
-0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, \r
-0xA1, 0x16, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, \r
-0x18, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x19, 0xF0, \r
-0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, \r
-0x04, 0x90, 0xA1, 0x2C, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xB5, \r
-0x12, 0x45, 0x55, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, \r
-0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, \r
-0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, \r
-0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x22, 0x50, 0x05, \r
-0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x04, \r
-0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x55, 0x19, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, \r
-0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0xA1, 0x7F, 0xE0, 0x54, 0xFD, 0x4E, \r
-0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, \r
-0x06, 0xA2, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA1, 0x7F, 0xF0, 0xEE, \r
-0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, \r
-0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x7F, 0xF0, 0xEE, 0x54, 0x40, 0xFE, \r
-0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x29, 0xEF, \r
-0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x0B, 0x80, 0x0E, \r
-0xE4, 0xF5, 0x52, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, \r
-0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x69, 0x53, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0xA2, \r
-0xB8, 0x12, 0x45, 0x5E, 0xD1, 0xED, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x12, 0x5F, 0x82, 0x90, 0xA1, \r
-0x1A, 0xE0, 0x60, 0x18, 0x90, 0xA2, 0xB8, 0x12, 0x45, 0x55, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0xD1, 0xFE, 0x22, 0x90, 0xA1, 0x16, \r
-0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x1E, 0xF0, 0x22, 0xEF, 0x24, \r
-0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0xA1, 0x20, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, \r
-0x0A, 0x90, 0xA1, 0x7D, 0xE0, 0x90, 0xA1, 0x20, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x20, 0xED, 0xF0, \r
-0x90, 0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, \r
-0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x7A, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x7B, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, \r
-0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x7D, 0xF0, 0x22, 0x90, 0xA1, \r
-0x7A, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, \r
-0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x24, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, \r
-0xA1, 0x80, 0xF0, 0x60, 0x37, 0x90, 0xA1, 0x8E, 0xE0, 0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04, \r
-0x12, 0x53, 0x11, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13, \r
-0x13, 0x54, 0x1F, 0x20, 0xE0, 0x16, 0x90, 0xA1, 0x7F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, \r
-0x78, 0x30, 0xE0, 0x05, 0x74, 0x0D, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0x80, 0xE0, \r
-0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0xA3, 0xBC, 0x12, 0x45, 0x5E, 0xE4, 0xFE, 0x90, 0xFD, 0x50, \r
-0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA3, \r
-0xBC, 0x12, 0x45, 0x55, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E, \r
-0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06, \r
-0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, \r
-0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, 0xBC, 0x12, 0x45, 0x55, 0x8E, 0x82, 0x75, \r
-0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, \r
-0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x17, \r
-0x02, 0x4A, 0x44, 0x90, 0xA1, 0xB4, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x4A, \r
-0x44, 0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x90, 0xA3, 0xBF, \r
-0xE0, 0x70, 0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0xC5, 0x12, 0x08, 0x6D, \r
-0x90, 0xA3, 0xBF, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0xFF, \r
-0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA1, 0xC5, 0x12, 0x45, 0x11, 0xEC, \r
-0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD, \r
-0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, \r
-0x12, 0x44, 0xF3, 0x90, 0xA1, 0xC1, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xCD, 0xF0, \r
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, \r
-0xC0, 0xD0, 0x90, 0xA1, 0xB5, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x12, 0x4A, 0x44, \r
-0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x55, 0x90, \r
-0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xF5, 0x57, 0x90, \r
-0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xF5, 0x59, 0xE5, \r
-0x51, 0x12, 0x45, 0x67, 0x91, 0x3D, 0x00, 0x91, 0x45, 0x01, 0x91, 0x4D, 0x02, 0x91, 0x55, 0x03, \r
-0x91, 0x5D, 0x04, 0x91, 0x65, 0x05, 0x91, 0x6E, 0x06, 0x00, 0x00, 0x91, 0x85, 0x75, 0x52, 0x02, \r
-0x75, 0x53, 0x29, 0x80, 0x46, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, 0x80, 0x3E, 0x75, 0x52, 0x01, \r
-0x75, 0x53, 0x31, 0x80, 0x36, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, 0x80, 0x2E, 0x75, 0x52, 0x06, \r
-0x75, 0x53, 0x33, 0x80, 0x26, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x02, 0x7E, 0xE3, 0x90, 0xA1, \r
-0xCF, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, 0xE5, 0x57, 0xF0, \r
-0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, 0x7A, 0x00, 0x79, \r
-0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x4A, 0x44, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, \r
-0xA1, 0xDA, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, \r
-0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA1, \r
-0xDA, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, \r
-0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x90, 0xA1, 0xDA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
-0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA1, 0xDB, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, \r
-0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30, \r
-0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA1, 0xDB, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, \r
-0xBF, 0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xDC, 0xF0, 0x90, 0x00, 0x03, \r
-0x12, 0x06, 0xA2, 0x90, 0xA1, 0xDD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xDE, \r
-0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, \r
-0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xE4, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, \r
-0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xE6, 0xEE, 0xF0, \r
-0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xDE, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, \r
-0x03, 0x90, 0xA1, 0xE8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x17, \r
-0x90, 0xA1, 0xDF, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, \r
-0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0xDF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, \r
-0x45, 0x5E, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xEA, 0xF0, 0x90, \r
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xEB, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x7D, \r
-0x02, 0x7F, 0x38, 0x02, 0x4A, 0x44, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0xCB, 0xF0, \r
-0x90, 0xA3, 0xCB, 0xE0, 0xFD, 0x70, 0x02, 0x81, 0x35, 0x90, 0x9F, 0xF3, 0xE0, 0xFF, 0x70, 0x06, \r
-0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0xB5, 0x07, 0x04, \r
-0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, \r
-0x22, 0x90, 0xA3, 0xC0, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, \r
-0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x81, 0x12, 0xE4, 0x90, 0xA3, \r
-0xCC, 0xF0, 0x90, 0xA3, 0xCC, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA3, 0xC0, 0xE0, \r
-0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, \r
-0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, \r
-0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
-0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, \r
-0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, \r
-0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xCC, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, \r
-0xA3, 0xCB, 0xE0, 0xFF, 0x90, 0xA3, 0xC0, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, \r
-0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xCB, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0xFF, 0x74, \r
-0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3, \r
-0xC0, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, \r
-0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x41, 0xF0, 0xE4, 0x90, 0x9F, 0xF4, 0xF0, \r
-0x41, 0xF0, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x44, 0x80, 0x90, \r
-0x00, 0x8A, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x49, \r
-0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF4, \r
-0xE0, 0xFF, 0x90, 0x9F, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, \r
-0x70, 0x43, 0x90, 0x9F, 0xF3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0x49, \r
-0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA4, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, \r
-0x01, 0xAF, 0x05, 0x12, 0x5A, 0xBA, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, \r
-0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x51, 0xE6, 0x90, 0x9F, \r
-0x97, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xA3, \r
-0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0, 0x22, 0x91, 0xBE, 0x91, 0x9A, 0xB1, 0xB4, 0xB1, 0x01, \r
-0x12, 0x55, 0xB8, 0x91, 0xC4, 0x91, 0xD3, 0x91, 0xEA, 0xB1, 0x26, 0x02, 0x77, 0xE2, 0xE4, 0x90, \r
-0xA0, 0x90, 0xF0, 0x22, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xED, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, \r
-0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xF1, 0xE0, 0x54, 0xFE, \r
-0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, \r
-0x22, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, \r
-0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0xA1, 0xF7, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xF1, 0xF0, \r
-0x54, 0x0F, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xFF, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA1, 0xFB, \r
-0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA1, 0xFA, 0x12, 0x45, \r
-0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, \r
-0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, \r
-0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE3, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA1, 0xFB, \r
-0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x06, 0x12, 0x45, \r
-0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x02, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFE, \r
-0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x05, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, \r
-0x03, 0x70, 0x86, 0x22, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
-0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12, \r
-0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, \r
-0x80, 0x0F, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, \r
-0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, \r
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4, \r
-0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF, \r
-0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0x75, 0xF0, 0x02, 0xEE, \r
-0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0x74, 0x16, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, \r
-0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, \r
-0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, \r
-0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, \r
-0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, \r
-0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, \r
-0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
-0x17, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, \r
-0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, \r
-0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x20, 0xF0, \r
-0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xCF, 0xF0, 0x75, 0xF0, \r
-0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, \r
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
-0x17, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, \r
-0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, \r
-0x64, 0x80, 0x60, 0x02, 0xC1, 0x20, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, \r
-0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA3, 0xA1, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x90, 0xA3, 0xC1, \r
-0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, \r
-0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA3, 0xA2, 0x12, 0x45, \r
-0x55, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, \r
-0x12, 0x35, 0x26, 0x90, 0xA3, 0xA1, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, \r
-0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0x55, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, \r
-0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA3, 0xA2, 0x12, 0x45, 0x55, 0x90, 0x00, 0x0E, 0x12, \r
-0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, \r
-0xA2, 0x79, 0xB5, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA2, 0xB5, \r
-0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, \r
-0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90, 0xA2, 0xB7, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, \r
-0xB5, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90, \r
-0xA2, 0xB8, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, \r
-0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90, 0xA2, 0xB9, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, \r
-0xB5, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90, \r
-0xA2, 0xBA, 0xF0, 0x90, 0xA2, 0xB6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, \r
-0x90, 0xA2, 0xBE, 0xF0, 0x90, 0xA2, 0xBA, 0xE0, 0x90, 0xA2, 0xBF, 0xF0, 0x02, 0x7D, 0x15, 0x90, \r
-0xA3, 0xC2, 0x12, 0x45, 0x5E, 0xE4, 0xFF, 0x90, 0xA3, 0xC2, 0x12, 0x45, 0x55, 0x8F, 0x82, 0x75, \r
-0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, \r
-0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, \r
-0x12, 0x46, 0x4F, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0x4F, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46, \r
-0x4F, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x46, 0x4F, 0x11, 0x88, 0x31, 0x07, 0x11, 0xC3, 0x11, 0xE2, \r
-0x02, 0x47, 0xD0, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90, \r
-0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18, \r
-0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20, \r
-0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, \r
-0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, \r
-0x12, 0x46, 0x4F, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x46, 0x4F, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46, \r
-0x4F, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0x4F, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA2, 0xCF, 0xF0, \r
-0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22, \r
-0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, \r
-0xF5, 0xE8, 0x11, 0x88, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0x4F, \r
-0x80, 0xFE, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, \r
-0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, \r
-0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, \r
-0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, \r
-0x12, 0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, \r
-0x22, 0xE4, 0x90, 0xA2, 0xA5, 0xF0, 0xA3, 0xF0, 0x31, 0xA3, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, \r
-0x90, 0xA2, 0xA6, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xA5, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, \r
-0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0xA5, \r
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, \r
-0xA2, 0xA6, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0xA5, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, \r
-0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0x9F, 0x97, 0xF0, \r
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x12, 0xF0, 0xA3, \r
-0x74, 0x02, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, \r
-0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, \r
-0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, \r
-0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, \r
-0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, \r
-0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, \r
-0x22, 0x90, 0xA1, 0xA9, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x69, 0x01, 0x80, 0x03, 0x12, 0x87, 0x7A, \r
-0x90, 0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD5, 0xE0, 0x64, \r
-0x08, 0x70, 0x35, 0x90, 0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x29, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09, \r
-0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, 0x7F, 0x4E, 0x12, 0x4C, 0x74, 0xEF, 0x54, \r
-0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, \r
-0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xFF, 0xC4, 0x13, 0x13, \r
-0x54, 0x03, 0x30, 0xE0, 0x13, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, \r
-0x04, 0x9C, 0xE4, 0xF0, 0x90, 0xA1, 0xD6, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x06, 0x90, \r
-0xA1, 0x13, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x70, 0x90, 0xA1, 0x16, 0xE0, 0x30, \r
-0xE0, 0x23, 0x90, 0xA1, 0x2E, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, \r
-0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x41, \r
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, \r
-0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x5F, 0x60, 0x90, 0xA1, 0x20, 0xE0, \r
-0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA3, 0xCD, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3, \r
-0x90, 0xA3, 0xCE, 0xE0, 0x94, 0x80, 0x90, 0xA3, 0xCD, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, \r
-0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x71, 0xF3, 0x71, 0xB3, 0xE4, \r
-0x90, 0xA1, 0xF0, 0xF0, 0x7F, 0x01, 0x12, 0x4C, 0x9A, 0x90, 0xA1, 0x81, 0xE0, 0x30, 0xE0, 0x12, \r
-0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, 0x5F, 0x60, 0x90, 0xA1, 0x83, 0xE0, 0x90, 0x05, \r
-0x73, 0xF0, 0x22, 0x90, 0xA1, 0xED, 0xE0, 0x30, 0xE0, 0x38, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, \r
-0x70, 0x30, 0x90, 0xA3, 0xDD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0xA1, 0xEF, 0xE0, \r
-0x04, 0xF0, 0xE4, 0x90, 0xA3, 0xDD, 0xF0, 0x90, 0xA1, 0xEF, 0xE0, 0xFF, 0x90, 0xA1, 0xEE, 0xE0, \r
-0xD3, 0x9F, 0x50, 0x0E, 0x90, 0xA1, 0xF0, 0xE0, 0x70, 0x08, 0xE4, 0x90, 0xA1, 0xEF, 0xF0, 0x12, \r
-0x67, 0xCE, 0x22, 0x90, 0xA1, 0xF1, 0xE0, 0x30, 0xE0, 0x40, 0x90, 0xA1, 0xF4, 0xE0, 0x04, 0xF0, \r
-0xE0, 0xFF, 0x90, 0xA1, 0xF2, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, \r
-0x1A, 0x90, 0xA1, 0xF6, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x64, 0xC9, 0x90, 0xA1, 0xF5, \r
-0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, \r
-0xF0, 0xE4, 0x90, 0xA1, 0xF4, 0xF0, 0x90, 0xA1, 0xF6, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, \r
-0x01, 0x70, 0x20, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, \r
-0x3C, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x7B, 0xE0, 0x90, 0xA3, 0x88, \r
-0x12, 0x50, 0x8A, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA1, 0x1A, 0xE0, \r
-0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, \r
-0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, \r
-0x57, 0xB2, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E, \r
-0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x57, 0xB2, 0x22, 0x90, \r
-0xA1, 0x1A, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, 0x11, 0xE0, \r
-0x30, 0xE0, 0x08, 0x12, 0x57, 0xE5, 0xBF, 0x01, 0x05, 0x80, 0x04, 0x12, 0x56, 0xFC, 0x22, 0x90, \r
-0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x0B, 0x91, \r
-0xEB, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x53, 0x11, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, \r
-0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, \r
-0x02, 0x7F, 0x00, 0x22, 0x91, 0xEB, 0xEF, 0x70, 0x03, 0x12, 0x56, 0xFC, 0x22, 0x90, 0xA1, 0x11, \r
-0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, \r
-0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x53, 0x11, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, \r
-0x02, 0x91, 0xCF, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90, 0xA1, 0x15, 0xE0, \r
-0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, \r
-0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x67, 0x7E, 0xB1, \r
-0x0D, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0xA1, \r
-0x15, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x11, 0x22, 0x90, 0xA1, 0x8E, 0xE0, 0x30, \r
-0xE0, 0x17, 0x90, 0xA1, 0xA0, 0xE0, 0x70, 0x5F, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x00, 0x50, \r
-0x56, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x4D, 0x80, 0x4E, 0x91, 0xEB, 0xEF, 0x64, 0x01, 0x70, 0x47, \r
-0x90, 0xA1, 0x1E, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0xA1, 0x1C, 0xE0, 0xFE, 0xE4, 0xC3, \r
-0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0xA1, \r
-0x17, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA1, 0x80, 0xE0, 0x70, 0x18, 0x90, \r
-0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, \r
-0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, \r
-0xE0, 0x3F, 0x90, 0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, \r
-0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, \r
-0xE0, 0x03, 0x02, 0x67, 0x7E, 0xD1, 0x32, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, \r
-0x7F, 0x08, 0x80, 0x0A, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x53, \r
-0x11, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, \r
-0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0, \r
-0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1, \r
-0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x7A, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, \r
-0x40, 0x0E, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, \r
-0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x30, 0xEF, 0x54, \r
-0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, \r
-0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0x94, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, \r
-0xE0, 0x09, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x53, 0x11, 0x80, 0x03, 0x12, 0x57, 0xB2, 0xE4, 0xFF, \r
-0x90, 0xA1, 0xF1, 0xE0, 0x30, 0xE0, 0x4C, 0x90, 0xA1, 0xF5, 0xE0, 0xFD, 0x60, 0x45, 0x74, 0x01, \r
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, \r
-0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA1, 0xF5, 0xF0, 0x22, 0x90, 0xA1, \r
-0xF3, 0xE0, 0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xF1, 0x7F, 0x90, 0xA1, \r
-0xF1, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x64, 0xC9, 0x90, 0xA1, 0xF5, \r
-0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, \r
-0xE0, 0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE1, 0x06, \r
-0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x03, \r
-0x12, 0x57, 0xB2, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90, \r
-0xA1, 0x95, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, \r
-0xE0, 0x90, 0xA1, 0x95, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, \r
-0xF0, 0x7F, 0x01, 0xD1, 0xC0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0xF1, 0x9F, 0x22, 0x90, \r
-0x9F, 0x9C, 0xE0, 0xFF, 0x64, 0x02, 0x60, 0x16, 0xEF, 0xB4, 0x01, 0x0B, 0x90, 0xFE, 0x10, 0xE0, \r
-0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, \r
-0xA1, 0xF7, 0xE0, 0x30, 0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, \r
-0x02, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x02, \r
-0x12, 0x45, 0x49, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0xF9, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xF7, \r
-0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x7F, 0x01, 0x12, 0x75, 0x90, 0x22, 0xD3, 0x10, 0xAF, 0x01, \r
-0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, \r
-0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, \r
-0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA2, 0xE0, 0xF0, 0xA3, \r
-0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4C, 0x74, 0x90, 0xA2, 0xE0, 0xEF, 0xF0, 0x7F, 0x83, 0x12, \r
-0x4C, 0x74, 0xAE, 0x07, 0x90, 0xA2, 0xE0, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA2, \r
-0xE2, 0xE0, 0x94, 0x64, 0x90, 0xA2, 0xE1, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, \r
-0x44, 0x40, 0xF0, 0x90, 0xA2, 0xE0, 0xE0, 0xFF, 0x22, 0x90, 0xA2, 0xE1, 0xE4, 0x75, 0xF0, 0x01, \r
-0x12, 0x08, 0xD6, 0x80, 0xBE, 0xE4, 0xF5, 0x5E, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, \r
-0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, 0xEE, \r
-0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x1D, 0x80, 0x13, 0x74, 0x96, 0x2F, 0xF5, 0x82, \r
-0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, \r
-0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA3, 0x80, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0x90, 0xA3, 0x7B, 0xF0, 0xE5, 0x67, 0x54, 0x07, 0x90, 0xA3, 0x7D, 0xF0, 0x75, 0xF0, \r
-0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA3, 0x7E, 0xF0, 0x75, 0xF0, 0x04, \r
-0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0x90, 0xA3, 0x81, 0xF0, 0x75, 0xF0, \r
-0x04, 0xE5, 0x67, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA3, 0x82, 0xF0, 0xE5, 0x68, \r
-0x54, 0x7F, 0x90, 0xA3, 0x7C, 0xF0, 0xE5, 0x69, 0x70, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3, \r
-0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, \r
-0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, \r
-0x45, 0x39, 0x12, 0x44, 0xD9, 0x78, 0x01, 0x12, 0x08, 0x47, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x95, \r
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x81, 0xE0, \r
-0xFF, 0x90, 0xA3, 0x7C, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, \r
-0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA3, 0x82, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, \r
-0x68, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA3, 0x7C, 0xF0, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA3, 0x7F, \r
-0xF0, 0xE5, 0x69, 0x70, 0x33, 0x90, 0xA3, 0x7B, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
-0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA3, 0x7D, 0xE0, 0xFE, 0x74, 0x01, 0xA8, \r
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, \r
-0xA3, 0x7E, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x52, 0x90, 0xA3, 0x7B, 0xE0, 0x24, 0x81, 0xF5, 0x82, \r
-0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA3, 0x7D, 0xE0, 0xFE, \r
-0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, \r
-0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xFF, \r
-0x90, 0xA3, 0x7E, 0xF0, 0x90, 0xA3, 0x7C, 0xE0, 0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, \r
-0x54, 0xF8, 0x4F, 0x90, 0xA3, 0x7E, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, \r
-0x81, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x68, 0xF0, 0x90, 0xA3, 0x7E, 0xE0, 0xFF, 0x75, 0xF0, 0x10, \r
-0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, \r
-0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, 0x03, 0x4F, 0xFF, 0x75, \r
-0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x7D, 0x01, 0xAF, 0x67, \r
-0x71, 0x15, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, \r
-0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, \r
-0x16, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, \r
-0xA2, 0xB8, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94, \r
-0x19, 0x40, 0x05, 0x90, 0xA2, 0xB8, 0x80, 0x0B, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x17, \r
-0x12, 0x45, 0x49, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x01, 0x99, 0x75, 0xF0, \r
-0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xEF, \r
-0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, \r
-0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x2F, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
-0x19, 0x12, 0x45, 0x49, 0xE0, 0xF9, 0x54, 0x03, 0xFB, 0xEE, 0xD3, 0x9B, 0x50, 0x1B, 0xEE, 0x60, \r
-0x18, 0x1E, 0xEE, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, \r
-0x19, 0x12, 0x45, 0x49, 0xE9, 0x54, 0xF3, 0x4B, 0xF0, 0xED, 0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04, \r
-0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8E, \r
-0x6A, 0xE4, 0xFB, 0x01, 0x99, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75, \r
-0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, \r
-0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, \r
-0x8D, 0x05, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07, \r
-0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x45, \r
-0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, \r
-0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, \r
-0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xBF, 0x44, 0x80, \r
-0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0xD0, 0xD0, 0x92, \r
-0xAF, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x16, 0xF5, \r
-0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xB5, 0x12, 0x45, \r
-0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, \r
-0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, \r
-0xE0, 0xFF, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, \r
-0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
-0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, \r
-0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, \r
-0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, \r
-0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF, \r
-0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02, \r
-0x12, 0x06, 0xA2, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, \r
-0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, \r
-0x95, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5, \r
-0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x13, 0x13, 0x54, \r
-0x03, 0xFB, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, \r
-0x51, 0x51, 0x47, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, 0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, \r
-0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, 0x75, 0xF0, 0x04, \r
-0xEA, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA2, 0xC5, 0xF0, 0x75, 0xF0, 0x04, 0xEA, \r
-0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x05, 0x12, \r
-0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, \r
-0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x25, 0xE0, 0x24, 0x95, \r
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, \r
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0xC3, 0xF0, 0x74, \r
-0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0x74, 0x16, 0x2A, 0xF5, \r
-0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F, \r
-0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0xC1, 0x30, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7, \r
-0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, 0xC1, 0x30, 0xE5, 0x60, 0x64, 0x2C, \r
-0x70, 0x2A, 0xE5, 0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x1C, \r
-0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x90, \r
-0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, \r
-0xC1, 0x30, 0x90, 0xA2, 0xC5, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x7D, 0xE4, 0x90, 0xA2, \r
-0xC4, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA2, 0xC5, 0xE0, 0xFF, \r
-0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEA, \r
-0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, \r
-0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, \r
-0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, \r
-0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, 0xA2, \r
-0xC4, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40, \r
-0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA2, 0xC5, 0xE0, 0xF5, 0x5E, \r
-0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x01, 0x99, 0xAB, 0x07, 0x75, 0xF0, 0x10, \r
-0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, 0x62, 0xE5, 0x5E, 0x54, \r
-0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x16, 0x12, 0x45, \r
-0x49, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, \r
-0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, \r
-0x41, 0xF5, 0x83, 0x12, 0x45, 0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
-0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74, 0x16, 0x2B, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x05, 0x12, 0x45, \r
-0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
-0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, \r
-0x45, 0x49, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, 0x50, 0x1E, 0x05, 0x5F, 0xE5, \r
-0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, \r
-0x45, 0x49, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xE1, 0xC3, 0xE9, 0xC3, 0x95, 0x60, 0x50, \r
-0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0xE1, 0xC3, 0xED, 0x13, 0x13, 0x13, \r
-0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xED, 0x54, 0x07, \r
-0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, \r
-0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1D, 0xB9, 0x13, 0x14, 0x79, \r
-0x18, 0x89, 0x5E, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, \r
-0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80, 0x98, 0xE9, 0x65, 0x60, 0x70, \r
-0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x13, 0x54, \r
-0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x33, \r
-0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, \r
-0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, \r
-0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, 0x01, 0x99, 0xE4, 0xF5, \r
-0x51, 0x74, 0x90, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, \r
-0xAF, 0xD7, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, \r
-0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xAF, 0xD7, 0xE5, 0x51, 0x25, 0xE0, 0x24, \r
-0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, \r
-0x94, 0x00, 0x50, 0x02, 0xE1, 0xD7, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, \r
-0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x5E, 0xE5, 0x51, 0x25, 0xE0, \r
+0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0xA2, 0xF0, \r
+0xE0, 0xFF, 0x90, 0xA2, 0xEE, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x5C, 0xEE, 0x70, 0x05, 0x75, 0x54, \r
+0x05, 0x80, 0x03, 0xE4, 0xF5, 0x54, 0xE5, 0x54, 0xC3, 0x94, 0x20, 0x50, 0x08, 0xAF, 0x54, 0xD1, \r
+0x1D, 0x05, 0x54, 0x80, 0xF1, 0x90, 0xA2, 0xEE, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x10, 0xE0, 0x04, \r
+0xF0, 0x90, 0xA2, 0xF0, 0xE0, 0xFF, 0x90, 0xA2, 0xEE, 0xE0, 0xB5, 0x07, 0xC0, 0xE4, 0xF5, 0x54, \r
+0xE5, 0x54, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0xA2, 0xEF, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74, \r
+0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x08, 0xAF, 0x54, 0xD1, 0x1D, 0x05, 0x54, 0x80, 0xE1, 0x90, \r
+0xA2, 0xEE, 0xE0, 0x04, 0xF0, 0x80, 0x96, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEE, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0xBC, 0x47, 0xAD, \r
+0x07, 0xED, 0x24, 0x28, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0xEF, 0xE0, 0x2F, 0xFF, 0x90, 0xA2, \r
+0xEE, 0xE0, 0x3E, 0xF9, 0xC3, 0x74, 0xD8, 0x9D, 0x90, 0xA2, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, \r
+0xFC, 0xEC, 0xC3, 0x99, 0x40, 0x03, 0x02, 0x88, 0xB4, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x2C, \r
+0x90, 0xFD, 0x10, 0xF0, 0xEC, 0x70, 0x67, 0xF5, 0x56, 0x90, 0xA2, 0xF4, 0xE0, 0xC3, 0x13, 0xFF, \r
+0xE5, 0x56, 0xC3, 0x9F, 0x40, 0x02, 0x01, 0xB0, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x28, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xF0, 0xF0, 0xFB, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5, \r
+0x82, 0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC, \r
+0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xF1, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, \r
+0xA3, 0xF0, 0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0x9B, 0xE4, 0xF5, \r
+0x56, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, \r
+0xA2, 0xF0, 0xF0, 0xFB, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, \r
+0x83, 0xE0, 0x90, 0xA2, 0xF1, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0xA3, \r
+0xF0, 0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0xE5, 0x56, 0xB4, 0x80, 0xC1, \r
+0x0C, 0x02, 0x87, 0xF1, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x29, 0x90, 0xFD, 0x10, 0xF0, 0xE4, \r
+0xF5, 0x56, 0x90, 0xA2, 0xF5, 0xE0, 0xC3, 0x13, 0xFF, 0xE5, 0x56, 0xC3, 0x9F, 0x50, 0x3C, 0xE5, \r
+0x56, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xF0, \r
+0xF0, 0xFD, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
+0x90, 0xA2, 0xF1, 0xF0, 0xFE, 0x7C, 0x00, 0xE4, 0x2D, 0xFF, 0xEC, 0x3E, 0xFE, 0xA3, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0xB7, 0xE5, 0x55, 0x90, 0x04, 0x9E, \r
+0xF0, 0xE5, 0x54, 0xA3, 0xF0, 0x45, 0x55, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, \r
+0xAF, 0x22, 0x90, 0xA2, 0xEB, 0x74, 0x0A, 0xF0, 0x90, 0xA2, 0xF9, 0x74, 0x06, 0xF0, 0x12, 0x06, \r
+0x89, 0x90, 0xA2, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEE, 0xF0, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, \r
+0xA2, 0xF0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xF1, 0xF0, 0x90, 0x00, 0x05, \r
+0x12, 0x06, 0xA2, 0x90, 0xA2, 0xF2, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x02, 0x6F, 0xEA, \r
+0x12, 0x06, 0x89, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0xF5, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, \r
+0x12, 0x06, 0xA2, 0xF5, 0x57, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, \r
+0x12, 0x06, 0xA2, 0xF5, 0x59, 0xE5, 0x51, 0x12, 0x45, 0xC7, 0x89, 0xC3, 0x00, 0x89, 0xCB, 0x01, \r
+0x89, 0xD3, 0x02, 0x89, 0xDB, 0x03, 0x89, 0xE3, 0x04, 0x89, 0xEB, 0x05, 0x89, 0xF3, 0x06, 0x00, \r
+0x00, 0x8A, 0x0A, 0x75, 0x52, 0x02, 0x75, 0x53, 0x29, 0x80, 0x45, 0x75, 0x52, 0x06, 0x75, 0x53, \r
+0x2A, 0x80, 0x3D, 0x75, 0x52, 0x01, 0x75, 0x53, 0x31, 0x80, 0x35, 0x75, 0x52, 0x01, 0x75, 0x53, \r
+0x32, 0x80, 0x2D, 0x75, 0x52, 0x06, 0x75, 0x53, 0x33, 0x80, 0x25, 0x7B, 0x00, 0x7A, 0x00, 0x79, \r
+0x54, 0x21, 0x22, 0x90, 0xA2, 0x0E, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, \r
+0xF0, 0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, \r
+0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x5E, 0x9D, 0x90, 0xA1, 0xBE, \r
+0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, \r
+0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, \r
+0x22, 0x90, 0xA1, 0xBE, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, \r
+0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, \r
+0x61, 0x1E, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x1E, 0x90, 0xA1, 0x16, 0xE0, \r
+0x30, 0xE0, 0x1D, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, \r
+0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x4F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, \r
+0x1E, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x23, 0xE0, 0x60, \r
+0x0E, 0xEF, 0x70, 0x08, 0x90, 0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, \r
+0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, \r
+0x12, 0x58, 0x9C, 0xEF, 0x70, 0x02, 0xF5, 0x63, 0xE5, 0x63, 0x60, 0x42, 0x90, 0xA1, 0x1E, 0xE0, \r
+0x44, 0x10, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA3, 0xAE, \r
+0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x80, 0x0F, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0x23, 0xE0, \r
+0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA1, 0x22, 0xE0, 0x2F, 0x90, 0xA3, 0xAF, 0x12, \r
+0x48, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x56, 0x52, 0x51, 0x1D, 0x22, 0x90, \r
+0xA2, 0x25, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, \r
+0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, \r
+0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x19, \r
+0xE0, 0x30, 0xE0, 0x20, 0x90, 0xA2, 0x1E, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x14, \r
+0x74, 0x02, 0xF0, 0x71, 0x1F, 0x80, 0x0D, 0x90, 0xA2, 0x1E, 0xE0, 0xB4, 0x02, 0x06, 0x74, 0x03, \r
+0xF0, 0x12, 0x67, 0x36, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, \r
+0x54, 0x03, 0x20, 0xE0, 0x02, 0xA1, 0xEA, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x01, 0x70, 0x38, 0x90, \r
+0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06, 0x92, 0x74, \r
+0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x03, 0x84, \r
+0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xCF, 0xE4, 0x90, 0xA1, 0xD5, \r
+0xF0, 0x90, 0xA1, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, \r
+0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, \r
+0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD8, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, \r
+0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xCF, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x90, 0xA1, 0xE0, \r
+0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xA1, 0x30, 0x90, 0xA1, \r
+0xE3, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, \r
+0x12, 0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, \r
+0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA1, 0xE3, 0xE0, 0x94, 0x03, 0x40, 0x11, 0x90, \r
+0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xD2, 0xA1, 0x78, \r
+0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x7A, 0xEF, 0x54, 0xFB, 0xF0, \r
+0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xF2, \r
+0xE0, 0x30, 0xE0, 0x02, 0xA1, 0x5E, 0x90, 0xA1, 0xE0, 0xA1, 0x78, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, \r
+0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, \r
+0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, \r
+0x94, 0x80, 0x40, 0x0E, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x02, 0xA1, 0x5E, 0x90, 0xA1, 0xE0, \r
+0xA1, 0x78, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0xD5, 0x74, 0x09, 0xF0, 0x90, \r
+0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xE2, 0xF0, 0x90, 0xA3, 0xE5, 0xA1, 0x84, 0x90, \r
+0xA1, 0xE0, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x49, 0x69, 0x90, 0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0x7F, \r
+0x03, 0x12, 0x62, 0xF1, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4, \r
+0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC, \r
+0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0xA1, 0xE3, \r
+0xE0, 0x94, 0x03, 0x50, 0x02, 0xA1, 0xEA, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, \r
+0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x49, 0x5E, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, \r
+0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x07, 0x70, 0x4F, 0x90, 0xA1, 0xE3, 0xE0, 0xB4, 0x04, 0x05, 0x90, \r
+0xA1, 0xE0, 0x80, 0x34, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C, \r
+0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, \r
+0xD5, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xE2, 0xF0, 0x90, \r
+0xA3, 0xE5, 0x04, 0x80, 0x0F, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x49, 0x69, 0x90, \r
+0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0x80, 0x48, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90, \r
+0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xD4, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0xA1, \r
+0xE2, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA3, 0xE5, 0xE0, 0x90, 0xA1, 0xE0, 0x60, \r
+0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0x7F, \r
+0x03, 0x02, 0x62, 0xF1, 0x90, 0xA3, 0xE5, 0xE0, 0x90, 0xA1, 0xE0, 0x60, 0x05, 0x74, 0x05, 0xF0, \r
+0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0x90, 0xA3, 0x15, 0xEF, 0xF0, \r
+0x7F, 0x03, 0x12, 0x62, 0xF1, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0x30, \r
+0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, \r
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90, \r
+0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A, 0x90, 0xA1, 0xCE, 0xE0, 0xFF, 0x90, 0xA1, \r
+0xDE, 0x80, 0x21, 0x90, 0xA3, 0x15, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, 0xA1, 0xCE, 0xE0, 0xFE, \r
+0x90, 0xA1, 0xDD, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0xA1, 0xCF, 0xE0, \r
+0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, \r
+0x13, 0x54, 0x07, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, \r
+0x02, 0xE1, 0x09, 0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25, 0xE0, \r
+0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, 0x4C, 0x71, \r
+0x80, 0x77, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x54, 0x90, 0xA1, 0xD3, 0xE0, \r
+0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, \r
+0xE4, 0x90, 0xA1, 0xE3, 0xF0, 0x90, 0xA1, 0xE0, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFF, 0xB4, 0x01, \r
+0x08, 0x90, 0xA1, 0xD5, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, 0xA1, 0xD5, \r
+0x74, 0x07, 0xF0, 0x90, 0xA1, 0xBF, 0xE0, 0x60, 0x07, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x04, 0xF0, \r
+0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, 0x90, 0xA3, 0x15, 0xE0, 0xB4, \r
+0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD1, 0xE0, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x30, 0xE0, 0x1B, 0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, \r
+0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4B, 0xBB, \r
+0x90, 0xA1, 0xD0, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x22, 0x7E, 0x00, \r
+0x7F, 0x30, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xCD, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0xCE, \r
+0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, 0x9C, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x1D, \r
+0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x54, 0x01, 0xC4, 0x33, \r
+0x33, 0x54, 0xC0, 0xFE, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01, \r
+0x70, 0x0D, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x13, 0x90, \r
+0x9F, 0x9C, 0xE0, 0x64, 0x03, 0x70, 0x1C, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, \r
+0x7F, 0x01, 0xEF, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x90, 0xA1, 0xD0, 0xE0, 0x54, \r
+0xBF, 0x4F, 0xF0, 0x22, 0x90, 0xA3, 0x26, 0xEF, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0x60, 0x03, 0x02, \r
+0x90, 0x3F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, \r
+0x90, 0xA3, 0x27, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA3, 0x27, \r
+0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x05, 0x90, 0xA1, 0xEE, 0x80, 0x31, 0xE4, 0xFF, \r
+0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x0A, 0x90, \r
+0xA1, 0xEE, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x01, 0x9B, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90, \r
+0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x09, 0x90, 0xA1, 0xEE, 0x04, 0xF0, \r
+0xA3, 0xF0, 0x80, 0x77, 0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x8D, \r
+0xC3, 0x12, 0x45, 0x60, 0x70, 0x65, 0x90, 0xA1, 0xEE, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F, \r
+0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, \r
+0x27, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08, \r
+0x90, 0xA1, 0xEE, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xEE, 0xF0, 0x7F, 0x30, 0x7E, \r
+0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, \r
+0x08, 0x6D, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90, \r
+0xA1, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xEF, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xE8, 0xE0, 0x44, \r
+0x01, 0xF0, 0x7D, 0x11, 0x12, 0x46, 0xF8, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0xED, 0xF0, 0x90, \r
+0xA2, 0x0C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x63, 0x7F, 0x90, 0xA3, 0x26, 0xE0, 0xFD, 0x70, 0x02, \r
+0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, \r
+0x90, 0xA3, 0x26, 0xE0, 0xFD, 0xB4, 0x02, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0x44, 0x60, \r
+0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x90, 0xA1, \r
+0xE8, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA1, 0xED, 0xE0, 0x90, 0x07, 0x78, 0xF0, \r
+0x90, 0xA1, 0xEE, 0x12, 0x63, 0x7A, 0x12, 0x60, 0x4D, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5E, 0x12, \r
+0x67, 0xC8, 0x90, 0xA1, 0xE8, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54, \r
+0x0F, 0xC3, 0x9E, 0x40, 0x02, 0x80, 0xC7, 0x90, 0xA1, 0xE8, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, \r
+0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0xEF, 0x70, \r
+0x1C, 0x90, 0xA2, 0x1A, 0xE0, 0x54, 0x03, 0xFE, 0x70, 0x02, 0x80, 0x1B, 0xBE, 0x01, 0x02, 0x80, \r
+0x20, 0xBE, 0x02, 0x02, 0x80, 0x26, 0xEE, 0x64, 0x03, 0x70, 0x32, 0x80, 0x2A, 0x90, 0xA2, 0x1A, \r
+0xE0, 0xC4, 0x54, 0x03, 0xFE, 0x70, 0x07, 0x90, 0x07, 0x78, 0x04, 0xF0, 0x80, 0x1F, 0xBE, 0x01, \r
+0x08, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x80, 0x14, 0xBE, 0x02, 0x08, 0x90, 0x07, 0x78, 0x74, \r
+0x09, 0xF0, 0x80, 0x09, 0xBE, 0x03, 0x06, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x90, 0xA2, 0x19, \r
+0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x45, 0xEF, 0x70, 0x1F, 0xA3, 0xE0, 0x13, 0x13, \r
+0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x15, 0x74, \r
+0x01, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x20, 0x90, 0xA2, 0x1A, 0xE0, 0xC4, \r
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA3, \r
+0x15, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x63, 0x7F, 0x22, 0x90, \r
+0xA4, 0x06, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA4, \r
+0x06, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x98, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, \r
+0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x9F, 0x9D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, \r
+0x51, 0x90, 0x9F, 0x9E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F, \r
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04, \r
+0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA1, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, \r
+0x51, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, \r
+0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, \r
+0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, \r
+0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, \r
+0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x90, 0x25, \r
+0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70, 0x04, 0x51, 0xD7, 0x80, \r
+0x02, 0x51, 0xC6, 0x05, 0x54, 0x80, 0xC6, 0x51, 0xFC, 0xE5, 0x55, 0x70, 0x18, 0x90, 0xA0, 0x90, \r
+0xE0, 0x70, 0x12, 0x12, 0x60, 0x4D, 0x51, 0xE8, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x54, \r
+0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, \r
+0x45, 0xA9, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, \r
+0x12, 0x45, 0xA9, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, \r
+0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x55, 0x87, 0xE4, 0xFF, 0x74, 0x32, \r
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4, \r
+0x90, 0xA1, 0x2D, 0xF0, 0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x22, 0xE4, 0x90, 0xA3, \r
+0x05, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, \r
+0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x4D, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0x4D, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, \r
+0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF, 0x90, 0xA1, 0x2F, 0xE0, 0xFE, 0xC3, 0x74, \r
+0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, \r
+0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x2D, 0xE0, 0x04, 0xF0, 0x71, 0xEF, 0x90, 0xA1, \r
+0x2D, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x67, 0xE4, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x05, 0xF0, \r
+0x90, 0xA3, 0x05, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, 0x47, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA3, 0x06, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, \r
+0x40, 0x27, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0xA1, \r
+0x2C, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0xA1, 0x2C, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0xC3, \r
+0x74, 0x0A, 0x9F, 0x90, 0xA1, 0x2B, 0xF0, 0x80, 0x08, 0x90, 0xA3, 0x05, 0xE0, 0x04, 0xF0, 0x80, \r
+0xAF, 0x90, 0xA1, 0x2C, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x91, 0x21, 0x51, 0xFC, 0x22, 0x90, \r
+0xA1, 0xB9, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x24, 0x90, 0xA1, 0x31, 0xE0, \r
+0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x25, 0xE0, 0x24, \r
+0x08, 0x90, 0xA1, 0x30, 0xF0, 0xFB, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x91, 0x21, \r
+0x22, 0xAC, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0xA1, 0x2C, 0xE0, 0xD3, 0x94, \r
+0x03, 0x50, 0x07, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0xA1, \r
+0x22, 0xF0, 0x7D, 0x03, 0x90, 0xA1, 0x51, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0xA1, \r
+0x2F, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0xA1, 0x25, 0xE4, \r
+0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, \r
+0x05, 0x58, 0xF0, 0x22, 0x91, 0xB0, 0x90, 0xA3, 0x15, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, \r
+0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x55, 0x87, 0x90, 0xA3, 0x15, 0xE0, 0x30, 0xE6, 0x11, \r
+0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, \r
+0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0x30, 0xE0, 0xFB, 0x81, 0x21, \r
+0xE4, 0x90, 0xA3, 0x16, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0x90, 0xA3, \r
+0x16, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0xAE, 0x07, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0xB5, \r
+0x06, 0x01, 0x22, 0xC3, 0x90, 0xA3, 0x18, 0xE0, 0x94, 0x64, 0x90, 0xA3, 0x17, 0xE0, 0x94, 0x00, \r
+0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0x22, 0x90, \r
+0xA3, 0x17, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x90, 0x04, 0x24, 0xE0, 0xF5, \r
+0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA2, 0x3B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, \r
+0x25, 0x51, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, \r
+0x55, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, \r
+0xA1, 0x1A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, \r
+0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0xF0, 0x4E, \r
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA1, 0x16, 0xE0, \r
+0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0x18, 0xE0, 0x54, \r
+0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x19, 0xF0, 0x90, 0x00, 0x06, \r
+0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, \r
+0x2C, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, \r
+0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, \r
+0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, \r
+0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x06, 0x12, 0x06, \r
+0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x22, 0x50, 0x05, 0x74, 0x04, 0xF0, \r
+0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, \r
+0xFD, 0x7F, 0x02, 0x12, 0x55, 0x87, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, \r
+0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, \r
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, \r
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xBE, 0xF0, 0xEE, 0x54, 0x08, 0xFE, \r
+0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x10, 0xFD, \r
+0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0xBE, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, \r
+0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, \r
+0x90, 0xA1, 0xBE, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x29, 0xEF, 0xC3, \r
+0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4, \r
+0xF5, 0x52, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01, \r
+0xAD, 0x52, 0xAF, 0x51, 0x12, 0x63, 0x7F, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0xA2, 0xEE, \r
+0x12, 0x45, 0xBE, 0xD1, 0xCC, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x12, 0x5B, 0x5E, 0x90, 0xA1, 0x1A, \r
+0xE0, 0x60, 0x18, 0x90, 0xA2, 0xEE, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, \r
+0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0xD1, 0xDD, 0x22, 0x90, 0xA1, 0x16, 0xE0, \r
+0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x1E, 0xF0, 0x22, 0xEF, 0x24, 0xFE, \r
+0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0xA1, 0x20, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, \r
+0x90, 0xA1, 0xBC, 0xE0, 0x90, 0xA1, 0x20, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x20, 0xED, 0xF0, 0x90, \r
+0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xB9, 0xF0, 0x90, 0x00, \r
+0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xBA, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, \r
+0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xBC, 0xF0, 0x22, 0x90, 0xA1, 0xB9, \r
+0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, \r
+0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xBF, 0xF0, 0x60, 0x36, 0x90, 0xA1, 0xCD, 0xE0, \r
+0x20, 0xE0, 0x2F, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xC3, \r
+0x13, 0x30, 0xE0, 0x1E, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x15, 0x90, 0xA1, 0xBE, \r
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, \r
+0x09, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, 0x54, 0xFE, 0x4F, \r
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xC1, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, \r
+0xA2, 0x90, 0xA1, 0xC2, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0x90, 0xA1, 0xC3, 0xF0, 0x90, 0xA1, 0xC0, \r
+0xE0, 0x54, 0x01, 0xFF, 0x02, 0x60, 0x0B, 0x90, 0xA3, 0xE7, 0x12, 0x45, 0xBE, 0xE4, 0xFE, 0x90, \r
+0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, \r
+0x90, 0xA3, 0xE7, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, \r
+0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, \r
+0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, \r
+0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, 0xE7, 0x12, 0x45, 0xB5, 0x8E, \r
+0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, \r
+0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA2, \r
+0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA3, 0xEA, 0xE0, 0x70, 0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, \r
+0x4E, 0x90, 0xA2, 0x04, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0xEA, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xEB, \r
+0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, \r
+0x90, 0xA2, 0x04, 0x12, 0x45, 0x71, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, \r
+0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, \r
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA2, 0x00, 0x02, 0x08, 0x6D, \r
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF4, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, \r
+0x7F, 0x28, 0x12, 0x5E, 0x9D, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, \r
+0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0xA2, 0xEB, 0x12, \r
+0x45, 0xB5, 0x7D, 0x06, 0x7F, 0x0A, 0x12, 0x5E, 0x9D, 0x8F, 0x53, 0xE5, 0x53, 0x64, 0x01, 0x60, \r
+0x08, 0x90, 0x04, 0x9D, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, \r
+0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x12, 0x06, 0x89, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x52, 0xEC, \r
+0x3E, 0xF5, 0x51, 0xAF, 0x52, 0xFE, 0x12, 0x87, 0xB3, 0xEF, 0x70, 0x07, 0x90, 0x04, 0x9D, 0xE0, \r
+0x44, 0x10, 0xF0, 0xAF, 0x52, 0xAE, 0x51, 0x12, 0x87, 0x11, 0x90, 0x04, 0x9D, 0xE0, 0x44, 0x80, \r
+0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA2, 0x19, 0xE0, 0x54, 0xFE, 0x4E, \r
+0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, \r
+0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA2, 0x19, 0xF0, 0xEE, 0x54, 0x10, 0xFE, \r
+0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, \r
+0x90, 0xA2, 0x19, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA2, \r
+0x1A, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, \r
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30, 0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, \r
+0x90, 0xA2, 0x1A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x90, 0x00, 0x02, \r
+0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1B, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1C, \r
+0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1D, 0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0xFF, \r
+0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, \r
+0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x23, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x1C, 0xE0, \r
+0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, \r
+0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x25, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x1D, \r
+0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0x90, 0xA2, 0x27, 0xEE, 0xF0, \r
+0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA2, 0x1E, 0x74, 0x01, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, \r
+0x22, 0xE4, 0x90, 0xA2, 0x1E, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, \r
+0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xEB, 0x12, \r
+0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x29, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, \r
+0xA2, 0x2A, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x7D, 0x02, 0x7F, 0x38, 0x02, 0x5E, 0x9D, \r
+0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0xFF, 0x90, 0xA1, 0xF2, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, \r
+0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, \r
+0x30, 0xE0, 0x37, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x25, 0x90, 0xA2, 0x13, \r
+0xE0, 0x30, 0xE0, 0x02, 0x80, 0x24, 0x90, 0xFD, 0x62, 0xE0, 0xB4, 0xAD, 0x13, 0xA3, 0xE0, 0xB4, \r
+0x35, 0x0E, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22, \r
+0x80, 0x00, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, \r
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xA1, 0xF2, 0xE0, \r
+0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x65, 0xE0, \r
+0x44, 0x18, 0xF0, 0x22, 0x90, 0xA2, 0x13, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x07, 0x65, 0xE0, 0x54, \r
+0xE7, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0xF6, 0xF0, 0x90, 0xA3, 0xF6, \r
+0xE0, 0xFD, 0x70, 0x02, 0x81, 0x52, 0x90, 0x9F, 0xF3, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, \r
+0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, \r
+0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3, \r
+0xEB, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, \r
+0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x81, 0x2F, 0xE4, 0x90, 0xA3, 0xF7, 0xF0, 0x90, \r
+0xA3, 0xF7, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, \r
+0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, 0xF5, \r
+0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90, \r
+0x9F, 0xA3, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, \r
+0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, \r
+0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, \r
+0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
+0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xF7, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0xA3, 0xF6, 0xE0, \r
+0xFF, 0x90, 0xA3, 0xEB, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, \r
+0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xF6, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, \r
+0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x04, \r
+0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, \r
+0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x61, 0x0D, 0xE4, 0x90, 0x9F, 0xF4, 0xF0, 0x61, 0x0D, 0x90, \r
+0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, \r
+0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0x01, \r
+0xC3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, 0xC8, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, \r
+0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0xCB, 0xE0, 0x94, 0xE8, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x03, \r
+0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0xCA, \r
+0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, \r
+0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, \r
+0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, \r
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, \r
+0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, \r
+0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, \r
+0xF0, 0x22, 0x90, 0xA3, 0xCC, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x90, 0xA3, 0xEC, 0xE0, 0xFE, \r
+0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, \r
+0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA3, 0xCD, 0x12, 0x45, 0xB5, 0x8B, \r
+0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, \r
+0x26, 0x90, 0xA3, 0xCC, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, \r
+0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, \r
+0xF5, 0x41, 0x89, 0x42, 0x90, 0xA3, 0xCD, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, \r
+0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0xA2, 0x79, \r
+0xEB, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA2, 0xEB, 0xE0, 0xA3, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
+0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, \r
+0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xEE, \r
+0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
+0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, \r
+0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xF0, \r
+0xF0, 0x90, 0xA2, 0xEC, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA2, \r
+0xF4, 0xF0, 0x90, 0xA2, 0xF0, 0xE0, 0x90, 0xA2, 0xF5, 0xF0, 0x02, 0x6F, 0x0E, 0x90, 0xA3, 0xED, \r
+0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA3, 0xED, 0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, \r
+0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, \r
+0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, \r
+0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, \r
+0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, \r
+0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, \r
+0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, \r
+0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, \r
+0x90, 0xA2, 0xDB, 0xF0, 0xA3, 0xF0, 0xD1, 0x81, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA2, \r
+0xDC, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xDB, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, \r
+0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0xDB, 0xE4, 0x75, \r
+0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA2, 0xDC, \r
+0xE0, 0x94, 0x32, 0x90, 0xA2, 0xDB, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, \r
+0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xF9, \r
+0xF0, 0x74, 0x9E, 0xA3, 0xF0, 0x90, 0xA2, 0x2B, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, \r
+0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, \r
+0x01, 0x22, 0xE4, 0x90, 0x9F, 0x97, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, \r
+0x90, 0x01, 0xE4, 0x74, 0x17, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, \r
+0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, \r
+0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, \r
+0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, \r
+0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, \r
+0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, \r
+0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0xE4, \r
+0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0xA1, 0x1A, \r
+0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0x90, \r
+0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x22, 0x90, 0xA0, \r
+0x90, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, \r
+0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, \r
+0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA0, 0x90, \r
+0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, \r
+0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x02, 0x11, \r
+0x24, 0x02, 0x48, 0x5B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, \r
+0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, \r
+0x29, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, \r
+0xB9, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA0, 0x90, 0xE0, 0xB4, \r
+0x01, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1, \r
+0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2E, 0xEF, 0x54, 0xBF, 0xF0, 0x90, \r
+0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, \r
+0x54, 0xFE, 0xF0, 0x90, 0xA1, 0xD3, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, \r
+0x01, 0x7F, 0x0C, 0x02, 0x56, 0x56, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, \r
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, \r
+0x90, 0xA1, 0x17, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, \r
+0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x03, 0x12, 0x58, 0x4D, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, \r
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, \r
+0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xD4, 0x30, 0xE1, 0x06, 0xE0, 0x44, \r
+0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0x31, \r
+0x12, 0x22, 0x90, 0xA2, 0x2C, 0xE0, 0x30, 0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, \r
+0x0D, 0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0D, 0xEF, \r
+0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x2E, 0x74, 0x05, 0xF0, \r
+0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x7F, 0x01, 0x12, 0x4D, 0x68, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, \r
+0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, \r
+0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xE4, \r
+0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, \r
+0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, \r
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x0F, 0x12, 0x45, 0xA9, 0xE5, 0x82, \r
+0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, \r
+0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, \r
+0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91, \r
+0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, \r
+0x8D, 0x01, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, \r
+0x0E, 0xBE, 0x05, 0xE7, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0x13, \r
+0xF0, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, \r
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, \r
+0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, \r
+0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, \r
+0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, \r
+0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, \r
+0x74, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x75, \r
+0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, \r
+0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, \r
+0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, \r
+0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, \r
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, \r
+0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, \r
+0x54, 0x7F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, \r
+0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, \r
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x21, 0xE9, 0x74, \r
+0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA3, 0x36, \r
+0xEB, 0xF0, 0x70, 0x6C, 0x90, 0xA3, 0x36, 0xE0, 0xFE, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, \r
+0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA3, 0x37, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA3, 0x3B, \r
+0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9F, 0x96, 0xE0, \r
+0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA3, 0x3D, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x90, 0xA3, \r
+0x3F, 0xF0, 0x90, 0xA3, 0x39, 0x74, 0x0C, 0xF0, 0x90, 0xA3, 0x47, 0x74, 0x04, 0xF0, 0x7B, 0x01, \r
+0x7A, 0xA3, 0x79, 0x39, 0x12, 0x6F, 0xEA, 0x7F, 0x04, 0x12, 0x6C, 0xE0, 0x90, 0xA3, 0x37, 0xE0, \r
+0xFF, 0x90, 0xA3, 0x36, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, \r
+0x22, 0xE4, 0xF5, 0x5E, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, \r
+0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, 0xEE, 0xB4, 0x01, 0x08, 0xED, \r
+0xC3, 0x94, 0x0A, 0x40, 0x1D, 0x80, 0x13, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, \r
+0x83, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, 0x80, 0x03, 0xE4, \r
+0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x90, \r
+0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x16, 0x12, \r
+0x45, 0xA9, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA2, 0xEE, \r
+0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94, 0x19, 0x40, \r
+0x05, 0x90, 0xA2, 0xEE, 0x80, 0x0B, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x17, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x02, 0x77, 0x11, 0x90, 0xA2, 0xEB, \r
+0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, \r
+0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, \r
+0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, \r
+0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, \r
+0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, \r
+0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, \r
+0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, \r
+0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, \r
+0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, \r
+0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, \r
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0F, 0xE5, 0x51, \r
+0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x95, 0xF0, 0x74, 0x16, 0x25, \r
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5, 0x22, 0x75, 0xF0, 0x04, 0xE5, \r
+0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x74, 0x96, 0x25, \r
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x51, 0x71, 0xD5, 0x22, 0xAB, \r
+0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, \r
+0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x90, \r
+0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, \r
+0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, \r
+0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, \r
+0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74, \r
+0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, 0x90, \r
+0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, \r
+0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04, 0xEB, \r
+0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, 0x50, \r
+0x1E, 0x05, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xEB, \r
+0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xC1, 0xC7, 0xE9, \r
+0xC3, 0x95, 0x60, 0x50, 0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0xC1, 0xC7, \r
+0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12, 0x45, \r
+0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, \r
+0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, \r
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1D, \r
+0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, \r
+0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80, 0x98, \r
+0xE9, 0x65, 0x60, 0x70, 0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, \r
+0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, \r
+0xF5, 0x5E, 0x80, 0x33, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, \r
+0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
+0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, \r
+0xF5, 0x83, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, \r
+0x02, 0x77, 0x11, 0xAA, 0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45, \r
+0xA9, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x17, 0x12, \r
+0x45, 0xA9, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x16, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, \r
+0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, \r
+0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0xF9, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, \r
+0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, \r
+0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, \r
+0x03, 0x02, 0xA8, 0x51, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, \r
+0x15, 0x61, 0xE5, 0x61, 0x70, 0x03, 0x02, 0xA8, 0x51, 0xE5, 0x60, 0x64, 0x2C, 0x70, 0x2A, 0xE5, \r
+0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x1C, 0x15, 0x5F, 0xE5, \r
+0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, \r
+0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x03, 0x02, 0xA8, 0x51, \r
+0x90, 0xA2, 0xFB, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x50, 0x03, 0x02, 0xA8, 0x4B, 0xE4, 0x90, \r
+0xA2, 0xFA, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA2, 0xFB, 0xE0, \r
+0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, \r
+0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, \r
+0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, \r
+0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, \r
+0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, \r
+0xA2, 0xFA, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, \r
+0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA2, 0xFB, 0xE0, 0xF5, \r
+0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x77, 0x11, 0xE4, 0xF5, 0x51, \r
+0x74, 0x90, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xB0, \r
+0x52, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x13, \r
+0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xB0, 0x52, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x01, \r
+0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94, \r
+0x00, 0x50, 0x03, 0x02, 0xB0, 0x52, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74, \r
+0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xBE, 0xE5, 0x51, 0x25, 0xE0, \r
 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57, \r
-0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xB7\r
+0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xED\r
 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07, \r
 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, \r
 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, \r
-0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0xA2, 0xB9, 0xF0, 0xA3, \r
-0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, 0x9D, 0xFF, 0xEE, 0x95, 0xF0, 0x90, 0xA2, 0xBB\r
-0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, \r
+0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0xA2, 0xEF, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, 0x9D, 0xFF, 0xEE, 0x95, 0xF0, 0x90, 0xA2, 0xF1\r
+0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, \r
 0xF5, 0x52, 0x54, 0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x16, 0x12, 0x45, \r
-0x49, 0xE0, 0x90, 0xA2, 0xBD, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, \r
-0x49, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0xBE, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, \r
-0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x61, 0xD1, 0x90, 0xA2, \r
-0xBD, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, \r
+0xA9, 0xE0, 0x90, 0xA2, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0xF4, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, \r
+0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x81, 0x4B, 0x90, 0xA2, \r
+0xF3, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, \r
 0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, \r
 0xF5, 0x83, 0xE0, 0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, \r
-0x4B, 0x93, 0xF5, 0x58, 0x90, 0xA1, 0xCF, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, \r
-0xE5, 0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA1, 0xD1, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, \r
-0xE5, 0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA1, 0xD2, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, \r
-0xE5, 0x53, 0xB4, 0x09, 0x05, 0x90, 0xA1, 0xD3, 0x80, 0x03, 0x90, 0xA1, 0xD0, 0xE0, 0xF5, 0x5C, \r
+0x4B, 0x93, 0xF5, 0x58, 0x90, 0xA2, 0x0E, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, \r
+0xE5, 0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA2, 0x10, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, \r
+0xE5, 0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA2, 0x11, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, \r
+0xE5, 0x53, 0xB4, 0x09, 0x05, 0x90, 0xA2, 0x12, 0x80, 0x03, 0x90, 0xA2, 0x0F, 0xE0, 0xF5, 0x5C, \r
 0xE5, 0x5C, 0xC3, 0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, \r
 0x58, 0x25, 0x5C, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, \r
 0x40, 0x05, 0x75, 0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, \r
 0xE4, 0x95, 0x5C, 0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, \r
 0xF5, 0x58, 0x80, 0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, \r
-0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA2, 0xB1, 0x12, 0x45, 0x5E, 0xE5, 0x52, 0x90, \r
-0x42, 0x0B, 0x93, 0xFF, 0xD3, 0x90, 0xA2, 0xB8, 0xE0, 0x9F, 0x90, 0xA2, 0xB7, 0xE0, 0x94, 0x00, \r
-0x40, 0x05, 0x12, 0xA4, 0xB4, 0xC1, 0xDA, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, \r
-0x50, 0x5E, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x55, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, \r
-0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3, \r
-0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x02, 0x61, 0xA6, 0xE5, \r
-0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5, \r
-0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0x90, 0xA2, 0xB4, 0x12, \r
-0x45, 0x55, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, 0x02, 0x61, 0xA9, 0x61, 0x86, \r
-0xE5, 0x51, 0x70, 0x50, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x55, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, \r
-0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, \r
-0x9E, 0x50, 0x08, 0x90, 0x9F, 0x96, 0x74, 0x01, 0xF0, 0x80, 0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78, \r
-0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, \r
-0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, \r
-0x90, 0x9F, 0x96, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, \r
-0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, \r
-0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, \r
-0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, 0xE4, 0xF5, 0x5D, 0x90, 0xA2, \r
-0xB4, 0x12, 0x45, 0x55, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, \r
-0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, \r
-0xFF, 0x90, 0xA2, 0xB1, 0x12, 0x45, 0x55, 0x85, 0x5D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, \r
-0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, \r
-0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA2, 0xB1, 0x12, 0x45, 0x55, 0x90, 0x00, 0x05, \r
-0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, \r
-0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, \r
-0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, \r
-0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, \r
-0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, 0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, \r
-0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x39, \r
-0xC3, 0x12, 0x45, 0x00, 0x50, 0x07, 0xAF, 0x51, 0x12, 0xA6, 0x3B, 0x80, 0x1C, 0xE5, 0x53, 0x25, \r
-0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, \r
-0xE4, 0x93, 0x95, 0x54, 0x40, 0x03, 0x12, 0xA4, 0xB4, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, \r
-0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, 0xE0, 0x90, 0xA3, 0x02, 0xF0, 0x90, 0xA3, 0x01, 0xE5, \r
-0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, 0x12, 0x7E, 0x31, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xC1, \r
-0xAE, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, \r
-0x60, 0x02, 0xA1, 0x44, 0xAD, 0x53, 0xAF, 0x51, 0x12, 0xA0, 0x55, 0x74, 0x16, 0x25, 0x51, 0xF5, \r
-0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, \r
-0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
-0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0x81, 0xC9, 0x74, 0x16, 0x25, 0x51, 0xF5, \r
-0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xF2, 0x74, 0x96, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05, \r
-0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, \r
-0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF, \r
-0xE4, 0x33, 0xFE, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3, \r
-0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x10, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B, \r
-0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05, \r
-0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, \r
-0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
-0xE4, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x53, 0xF0, \r
-0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x54, \r
-0x03, 0x20, 0xE0, 0x02, 0xC1, 0x8B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, \r
-0x83, 0xE4, 0xF0, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, \r
-0xE4, 0xF0, 0xC1, 0x8B, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xC1, 0xAE, 0xF5, 0x54, 0xF5, 0x55, 0x75, \r
-0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3, \r
-0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, \r
-0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, \r
-0xF5, 0x59, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
-0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2, \r
-0xC0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x55, 0x75, \r
-0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, \r
-0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, \r
-0x1F, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, \r
-0xF5, 0x54, 0xC3, 0x90, 0xA2, 0xC1, 0xE0, 0x95, 0x55, 0x90, 0xA2, 0xC0, 0xE0, 0x95, 0x54, 0x40, \r
-0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, \r
-0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, \r
-0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
-0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74, \r
-0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51, \r
-0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, \r
-0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70, \r
-0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA2, 0xB8, 0xE0, 0x94, 0x03, \r
-0x90, 0xA2, 0xB7, 0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51, \r
-0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF8, 0x90, 0xA2, 0xC2, 0xF0, 0x45, 0x5B, 0xFF, \r
-0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x74, 0x96, \r
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x96, 0x50, \r
-0x0E, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, \r
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x81, 0x25, 0x51, 0xF5, 0x82, \r
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xD0, 0x90, 0xA2, 0xB7, 0xE0, \r
-0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, \r
-0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, \r
-0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, \r
-0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, \r
-0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xB9, 0xE0, 0xFE, 0xA3, 0xE0, \r
-0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, \r
-0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, \r
-0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, \r
-0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, \r
-0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xBB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3, 0x74, \r
-0xFF, 0x9B, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, \r
-0xFC, 0x90, 0x94, 0x91, 0x12, 0x45, 0x2D, 0xD3, 0x12, 0x45, 0x00, 0x90, 0x94, 0x91, 0x50, 0x19, \r
-0x12, 0x45, 0x2D, 0x90, 0xA2, 0xBB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x44, \r
-0xD9, 0x90, 0x94, 0x91, 0x12, 0x08, 0x6D, 0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, \r
-0xE4, 0xFD, 0xAF, 0x51, 0x12, 0xA3, 0x15, 0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x03, \r
-0x02, 0xA7, 0xD1, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xA9, 0xEF, 0xF0, \r
-0x75, 0xF0, 0x04, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50, \r
-0x02, 0x01, 0x86, 0xE4, 0xF5, 0x6B, 0x90, 0xA3, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90, 0x89, \r
-0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, \r
-0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, \r
-0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, \r
-0xA3, 0xAC, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, \r
-0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA3, 0xAC, 0xE0, 0x54, 0xF0, 0xF0, 0x90, \r
-0xA3, 0xAC, 0xE0, 0xFF, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, \r
-0x49, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x6B, \r
-0xE5, 0x6B, 0x64, 0x07, 0x70, 0x80, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x19, \r
-0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0xAA, 0xF0, 0x75, 0x6C, \r
-0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, \r
-0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, \r
-0x0F, 0x80, 0x19, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, \r
-0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xAB, 0xF0, \r
-0x90, 0xA3, 0xAB, 0xE0, 0x60, 0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, \r
-0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xAB, 0xE0, 0xFB, 0xEF, \r
-0x5B, 0x60, 0x1B, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA3, 0xAA, 0xF0, 0xED, \r
-0x60, 0x24, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x18, 0x15, 0x6B, \r
-0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, \r
-0x94, 0x00, 0x40, 0x02, 0x01, 0xA1, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, \r
-0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xA9, 0xE0, \r
-0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, \r
-0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xAB, 0xF0, 0x90, 0xA3, 0xAB, 0xE0, 0x60, 0x3C, 0xE4, \r
-0xF5, 0x6B, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, \r
-0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xAB, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x6C, 0x75, 0xF0, \r
-0x08, 0xA4, 0x25, 0x6B, 0xFC, 0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x17, 0x74, 0x20, \r
-0x2C, 0xFC, 0x80, 0x11, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, 0xE5, 0x6C, 0x64, \r
-0x07, 0x60, 0x02, 0x21, 0x3A, 0x90, 0xA3, 0xAA, 0xE0, 0xFF, 0x90, 0xA3, 0xA9, 0xE0, 0xFE, 0x75, \r
-0xF0, 0x04, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96, \r
-0x17, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, \r
-0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, \r
-0x90, 0xA3, 0xAA, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, \r
-0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, \r
-0x9E, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, \r
-0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D, \r
-0x12, 0xA0, 0x99, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45, \r
-0x49, 0xE4, 0xF0, 0x90, 0xA3, 0xAA, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, 0x74, 0x96, 0x2F, \r
-0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, 0xC3, 0x94, 0x04, \r
-0x90, 0xA3, 0xA9, 0xE0, 0x40, 0x0E, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, \r
-0x01, 0xF0, 0x80, 0x0B, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0, 0xD0, \r
-0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, \r
-0xA2, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, \r
-0x52, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, \r
-0x54, 0x0F, 0xF5, 0x57, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, \r
-0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56, 0x90, \r
-0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, \r
-0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, \r
-0x54, 0x80, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0, 0x04, \r
-0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60, \r
-0x02, 0x61, 0xFE, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, \r
-0x12, 0x45, 0x49, 0xE0, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x04, \r
-0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, \r
-0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, \r
-0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, \r
-0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, \r
-0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, \r
-0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, \r
-0x54, 0xFB, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, \r
-0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, \r
-0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x90, \r
-0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, \r
-0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x12, 0xAF, 0xE4, 0x22, 0xD3, \r
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD5, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x4C, 0x74, \r
-0xEF, 0x30, 0xE6, 0x4D, 0x7F, 0x8D, 0x12, 0x4C, 0x74, 0xEF, 0x64, 0x01, 0x70, 0x43, 0x90, 0xA3, \r
-0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0xFD, 0x90, 0xA3, 0xD5, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81, \r
-0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB, \r
-0xE4, 0xFF, 0x12, 0x47, 0xA8, 0x90, 0xA3, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, \r
-0xD1, 0x7F, 0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46, \r
-0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, \r
-0xD0, 0x90, 0xA3, 0x25, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA3, 0x2F, 0x12, \r
-0x08, 0x6D, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x11, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x2F, 0x12, 0x45, \r
-0x2D, 0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x27, 0x12, \r
-0x45, 0x11, 0x90, 0xA3, 0x2B, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, \r
-0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA3, 0x33, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x33, 0x12, \r
-0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x25, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, \r
-0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0xFE, \r
-0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, \r
-0x90, 0xA3, 0xDC, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0xA1, 0xF4, 0x90, 0x06, 0x03, 0xE0, 0x54, \r
-0xFB, 0xF0, 0x90, 0xA3, 0xDC, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, \r
-0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, \r
-0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0x91, 0x6A, 0x90, 0xA3, \r
-0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x00, 0x10, 0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, \r
-0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x6D, \r
-0x7F, 0x00, 0x7E, 0x0A, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, \r
-0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, \r
-0x12, 0x08, 0x5A, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0x91, 0x6A, 0x90, \r
-0xA3, 0x27, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0xE4, 0xFC, \r
-0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x2B, 0x12, \r
-0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x0C, 0x00, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x91, 0x66, 0x90, 0xA3, \r
-0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x79, 0x00, 0x00, \r
-0x04, 0x00, 0x80, 0x65, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, 0x27, 0x12, 0x08, \r
-0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, \r
-0x00, 0x7E, 0x08, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, \r
-0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x6A, 0x90, \r
-0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, \r
-0x00, 0x0C, 0x00, 0x91, 0x66, 0x90, 0xA3, 0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, \r
-0xA3, 0x19, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x76, 0xFA, 0xD0, 0xD0, 0x92, 0xAF, \r
-0x22, 0x90, 0xA1, 0xF7, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54, \r
-0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0xF7, 0xE0, 0xFE, 0xC3, 0x13, 0x54, \r
-0x07, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x50, 0x63, 0xE4, 0x90, 0xA1, 0xF9, 0xF0, \r
-0x12, 0x4F, 0xFA, 0x90, 0xA1, 0xF7, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0D, \r
-0x90, 0xA1, 0xFA, 0x12, 0x45, 0x49, 0xE0, 0xFA, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA1, 0xFB, 0x12, \r
-0x45, 0x49, 0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, \r
-0x0F, 0x90, 0xA3, 0xB0, 0xF0, 0xAF, 0x02, 0x12, 0x76, 0x79, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, \r
-0x54, 0x07, 0x75, 0xF0, 0x0D, 0x91, 0xD8, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, \r
-0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, \r
-0x12, 0x4E, 0xC7, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0x02, 0x75, \r
-0x90, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xA5, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, \r
-0x16, 0x90, 0xA2, 0xA5, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0xA2, 0x21, 0x74, 0x01, \r
-0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x21, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, \r
-0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xA8, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, \r
-0x12, 0x37, 0x4E, 0x90, 0xA2, 0xAC, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA8, 0x12, 0x45, 0x11, 0xEF, \r
-0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xA8, 0x12, 0x45, 0x11, \r
-0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xA8, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA8, 0x12, 0x45, \r
-0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA2, \r
-0xAC, 0x12, 0x45, 0x11, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, \r
-0xA2, 0xAC, 0x12, 0x45, 0x11, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xAC, 0x12, 0x08, 0x6D, \r
-0x90, 0xA2, 0xAC, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, \r
-0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, \r
-0xA1, 0xED, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, \r
-0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, \r
-0xA1, 0xEE, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA2, 0xCF, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, \r
-0x70, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7F, 0xED, 0x30, 0xE6, 0x4E, 0x90, \r
-0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, \r
-0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, \r
-0x64, 0x01, 0x70, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x66, 0xAE, \r
-0x80, 0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, \r
-0x02, 0x60, 0x05, 0x12, 0x67, 0xA4, 0x80, 0x0C, 0x12, 0x64, 0x9F, 0x80, 0x07, 0x90, 0xA1, 0x1E, \r
-0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, \r
-0x02, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x7B, 0xE0, 0x90, 0xA3, 0x88, 0x12, 0x50, \r
-0x8A, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, \r
-0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, \r
-0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, \r
-0x90, 0xA1, 0x7C, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA3, 0x88, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, \r
-0x58, 0x7E, 0x01, 0x12, 0x50, 0x92, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xEF, 0x60, \r
-0x3B, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFE, 0xF0, \r
-0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x4E, 0xD8, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08, \r
-0xE4, 0xFF, 0x12, 0x64, 0xC9, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x40, 0xF0, 0x7D, \r
-0x06, 0x7F, 0x01, 0x12, 0x55, 0x19, 0x90, 0xA1, 0x15, 0x74, 0x06, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, \r
-0x6F, 0x12, 0x4E, 0xD8, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x55, 0x19, 0x90, 0x05, 0x27, 0xE0, 0x54, \r
-0xBF, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, \r
-0x04, 0x7F, 0x01, 0x12, 0x55, 0x19, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, \r
-0x74, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, 0x70, \r
-0x0D, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x57, 0xB2, 0xE5, 0x63, \r
-0x30, 0xE6, 0x23, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, \r
-0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x67, 0xA4, 0x80, \r
-0x0C, 0x12, 0x64, 0x9F, 0x80, 0x07, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, 0x63, 0x90, \r
-0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, \r
-0x7B, 0xE0, 0x90, 0xA3, 0x88, 0x12, 0x50, 0x8A, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, \r
-0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0x41, 0x49, \r
-0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x49, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, \r
-0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0xA1, 0x21, 0xE0, 0x14, \r
-0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x23, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0xA1, \r
-0x20, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12, \r
-0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x12, 0x57, 0xE5, 0xEF, 0x70, 0x02, \r
-0xF5, 0x63, 0xE5, 0x63, 0x60, 0x43, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0x23, \r
-0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x80, \r
-0x0F, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, \r
-0xFF, 0x90, 0xA1, 0x22, 0xE0, 0x2F, 0x90, 0xA3, 0x88, 0x12, 0x50, 0x8A, 0x90, 0xA1, 0x1D, 0xE0, \r
-0x20, 0xE2, 0x03, 0x12, 0x53, 0x0D, 0x12, 0x57, 0xF3, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, \r
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, \r
-0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x1E, \r
-0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x7A, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, \r
-0x0F, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x22, \r
-0x12, 0x57, 0xB2, 0x22, 0x90, 0xA3, 0x96, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, \r
-0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, \r
-0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, \r
-0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, \r
-0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, \r
-0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, \r
-0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, \r
-0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, \r
-0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, \r
-0x91, 0x0D \r
+0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA2, 0xE7, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57, \r
+0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x5E, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00, \r
+0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, \r
+0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, \r
+0x9E, 0x40, 0x02, 0x81, 0x1C, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, \r
+0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE, \r
+0x3C, 0xFE, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, \r
+0x50, 0x02, 0x81, 0x23, 0x61, 0xFC, 0xE5, 0x51, 0x70, 0x50, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, \r
+0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, \r
+0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9F, 0x96, 0x74, 0x01, 0xF0, 0x80, \r
+0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, \r
+0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, \r
+0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9F, 0x96, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, \r
+0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, \r
+0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, \r
+0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, \r
+0x55, 0xE4, 0xF5, 0x5D, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4, \r
+0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, \r
+0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0xE7, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, \r
+0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, \r
+0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA2, 0xE7, \r
+0x12, 0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, \r
+0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, \r
+0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, \r
+0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, \r
+0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, \r
+0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, \r
+0x41, 0xF5, 0x83, 0x12, 0x45, 0x99, 0xC3, 0x12, 0x45, 0x60, 0x50, 0x07, 0xAF, 0x51, 0x12, 0xA5, \r
+0x3F, 0x80, 0x20, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, \r
+0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x07, 0x7D, 0x01, 0xAF, 0x51, \r
+0x12, 0xA6, 0xD3, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, \r
+0xA3, 0xE0, 0x90, 0xA3, 0x38, 0xF0, 0x90, 0xA3, 0x37, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, \r
+0xFF, 0x12, 0xA3, 0x1D, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE1, 0x28, 0x74, 0x96, 0x25, 0x51, 0xF5, \r
+0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, 0xBE, 0xAD, 0x53, \r
+0xAF, 0x51, 0x12, 0xA3, 0x91, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, \r
+0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, \r
+0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, \r
+0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, \r
+0xF5, 0x83, 0xE4, 0xA1, 0x43, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, \r
+0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x6C, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, \r
+0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01, \r
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, \r
+0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x96, 0x25, \r
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, \r
+0x80, 0x98, 0x50, 0x10, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, \r
+0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, \r
+0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, \r
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, \r
+0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74, \r
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x96, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, \r
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x16, 0x25, 0x51, \r
+0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x53, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, \r
+0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xE1, 0x05, \r
+0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0xF5, 0x5B, 0x74, \r
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0xE1, 0x05, 0xEC, 0x64, \r
+0x06, 0x60, 0x02, 0xE1, 0x28, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, \r
+0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, \r
+0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, \r
+0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x57, 0xAE, 0x56, \r
+0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24, \r
+0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2, 0xF6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, \r
+0xE4, 0xF5, 0x5A, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5, \r
+0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, \r
+0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0xFD, 0x7C, 0x00, 0x12, \r
+0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0xC3, 0x90, 0xA2, 0xF7, \r
+0xE0, 0x95, 0x55, 0x90, 0xA2, 0xF6, 0xE0, 0x95, 0x54, 0x40, 0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, \r
+0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, \r
+0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, \r
+0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, \r
+0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
+0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, \r
+0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, \r
+0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, \r
+0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, \r
+0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA2, 0xEE, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0xED, 0xE0, 0x94, 0x00, \r
+0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, \r
+0xE0, 0x54, 0xF8, 0x90, 0xA2, 0xF8, 0xF0, 0x45, 0x5B, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, \r
+0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, \r
+0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x96, 0x50, 0x0E, 0x25, 0x51, 0xF5, 0x82, 0xE4, \r
+0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, \r
+0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x81, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, \r
+0x64, 0x01, 0x60, 0x03, 0x02, 0xB0, 0x4B, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, \r
+0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, \r
+0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, \r
+0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, \r
+0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, \r
+0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xEF, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, \r
+0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, \r
+0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0, \r
+0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, \r
+0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, \r
+0xF0, 0x90, 0xA2, 0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3, 0x74, 0xFF, 0x9B, 0xFF, 0x74, 0xFF, \r
+0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0xFC, 0x90, 0x94, 0x91, 0x12, \r
+0x45, 0x8D, 0xD3, 0x12, 0x45, 0x60, 0x90, 0x94, 0x91, 0x50, 0x19, 0x12, 0x45, 0x8D, 0x90, 0xA2, \r
+0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x45, 0x39, 0x90, 0x94, 0x91, 0x12, \r
+0x08, 0x6D, 0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xFD, 0xAF, 0x51, 0x12, \r
+0x78, 0xC9, 0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xA8, 0x60, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD4, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x90, 0x96, \r
+0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50, 0x02, 0x21, 0x01, 0xE4, 0xF5, \r
+0x6B, 0x90, 0xA3, 0xD4, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, \r
+0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, \r
+0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, \r
+0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA3, 0xD7, 0xF0, 0x75, 0xF0, \r
+0x04, 0xED, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, \r
+0x6B, 0x70, 0x07, 0x90, 0xA3, 0xD7, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA3, 0xD7, 0xE0, 0xFF, 0x90, \r
+0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, \r
+0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, \r
+0x80, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, \r
+0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0xD5, 0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, \r
+0x1D, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, \r
+0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, \r
+0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, \r
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x60, \r
+0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, \r
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xD6, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x1B, 0xE5, 0x6C, \r
+0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA3, 0xD5, 0xF0, 0xED, 0x60, 0x24, 0xE0, 0xD3, 0x94, \r
+0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x18, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, \r
+0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x21, \r
+0x1C, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75, \r
+0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, \r
+0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, \r
+0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, \r
+0x90, 0xA3, 0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x60, 0x3C, 0xE4, 0xF5, 0x6B, 0x74, 0x01, 0x7E, \r
+0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, \r
+0xD6, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0xFC, \r
+0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x17, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05, \r
+0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, 0xE5, 0x6C, 0x64, 0x07, 0x60, 0x02, 0x21, 0xB5, \r
+0x90, 0xA3, 0xD5, 0xE0, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x16, \r
+0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xEC, \r
+0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x7F, 0xF5, \r
+0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, 0x90, 0xA3, 0xD5, 0xE0, 0x4E, \r
+0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, \r
+0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x6D, \r
+0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, \r
+0xF5, 0x6A, 0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D, 0x12, 0x77, 0x11, 0x90, 0xA3, \r
+0xD4, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x90, 0xA3, \r
+0xD5, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, \r
+0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, 0xC3, 0x94, 0x04, 0x90, 0xA3, 0xD4, 0xE0, 0x40, \r
+0x0E, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x24, \r
+0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, \r
+0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x1F, 0xF5, \r
+0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x52, 0x90, 0x00, 0x02, 0x12, \r
+0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x90, \r
+0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, \r
+0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, \r
+0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, \r
+0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x75, 0xF0, \r
+0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, \r
+0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, \r
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60, 0x02, 0x81, 0x78, 0xE5, 0x53, \r
+0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, \r
+0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, \r
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, \r
+0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, \r
+0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, \r
+0x45, 0xA9, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, \r
+0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, \r
+0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x16, \r
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, \r
+0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, \r
+0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, \r
+0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x58, 0xE5, \r
+0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x11, 0x5F, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF, \r
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x5B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, \r
+0xA3, 0x65, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x5D, 0x12, 0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA3, \r
+0x65, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, \r
+0xA3, 0x5D, 0x12, 0x45, 0x71, 0x90, 0xA3, 0x61, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, \r
+0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA3, 0x69, 0x12, 0x08, 0x6D, 0x90, \r
+0xA3, 0x69, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x5B, 0xE0, 0xFE, \r
+0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x30, 0x12, 0x45, \r
+0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, \r
+0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x07, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0xC1, 0x07, 0x90, 0x06, \r
+0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x07, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, \r
+0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, \r
+0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0x91, \r
+0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA4, 0x07, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, \r
+0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61, \r
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, \r
+0x00, 0x0C, 0x00, 0x90, 0xA4, 0x07, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, \r
+0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, \r
+0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0xA4, 0x07, 0xE0, \r
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, \r
+0xA3, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x91, \r
+0x79, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x4F, 0x12, 0x08, \r
+0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x65, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, \r
+0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, \r
+0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x61, 0x12, \r
+0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x91, 0x79, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, \r
+0x0C, 0x00, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xD1, 0x7D, 0xD0, 0xD0, \r
+0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, \r
+0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x49, 0xEC, 0xF0, 0xA3, \r
+0xED, 0xF0, 0x90, 0xA3, 0x48, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA3, \r
+0x53, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x4B, 0x12, 0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x53, \r
+0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, \r
+0x4B, 0x12, 0x45, 0x71, 0x90, 0xA3, 0x4F, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, \r
+0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA3, 0x57, 0x12, 0x08, 0x6D, 0x90, 0xA3, \r
+0x49, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x57, 0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, \r
+0x08, 0x6D, 0x90, 0xA3, 0x48, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, \r
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD8, 0xEF, 0xF0, 0xED, 0x64, 0x01, \r
+0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x72, 0x80, 0x08, 0x90, 0xA3, 0xD8, \r
+0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, \r
+0x72, 0xD1, 0x73, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, \r
+0x20, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0xD8, 0xE0, 0xFF, \r
+0xD1, 0x73, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0xD8, 0xE0, \r
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, \r
+0x01, 0xD1, 0x83, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDB, 0x7F, 0xFB, \r
+0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0xA2, 0xDB, 0xE0, 0x54, 0x30, 0xFF, 0xBF, \r
+0x20, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x56, 0xF0, 0x22, 0xD3, \r
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xDE, \r
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xE2, 0x12, 0x08, 0x6D, \r
+0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, \r
+0x24, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xDE, 0x12, \r
+0x08, 0x6D, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, \r
+0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA2, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, \r
+0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, \r
+0xEC, 0x90, 0xA2, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xE2, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, \r
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, \r
+0x90, 0xA0, 0x90, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, \r
+0x11, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, \r
+0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05, \r
+0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, \r
+0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x46, 0xF8, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x12, \r
+0x60, 0x4D, 0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, \r
+0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x46, 0xFD, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, \r
+0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, \r
+0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, \r
+0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, \r
+0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x23, 0xE0, \r
+0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xB9, 0xE0, 0xFF, 0x90, 0xA1, \r
+0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x17, \r
+0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA3, 0x05, 0xF0, 0xE0, 0xFD, 0x54, \r
+0xC0, 0x70, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7E, 0xED, 0x30, 0xE6, 0x4D, \r
+0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC3, 0x13, 0x20, \r
+0xE0, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x18, 0xE0, 0x54, \r
+0x0F, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x4B, \r
+0x58, 0x80, 0x21, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, \r
+0x64, 0x02, 0x60, 0x04, 0x31, 0x9E, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0xA1, 0x1E, \r
+0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, \r
+0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, \r
+0x21, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, \r
+0xBE, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x20, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x9F, \r
+0x9E, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4A, 0xB2, 0x90, 0xA4, 0x02, 0xEE, 0xF0, 0xA3, \r
+0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, \r
+0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, \r
+0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBB, 0xE0, 0xC3, \r
+0x13, 0x54, 0x7F, 0x90, 0xA3, 0xAF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48, \r
+0x29, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x17, \r
+0x90, 0xA1, 0xDF, 0xE0, 0x70, 0x60, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x57, 0x90, \r
+0xA1, 0xBF, 0xE0, 0x60, 0x4E, 0x80, 0x4F, 0x12, 0x73, 0xF1, 0xEF, 0x64, 0x01, 0x70, 0x47, 0x90, \r
+0xA1, 0x1E, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0xA1, 0x1C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, \r
+0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0xA1, 0x17, \r
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA1, 0xBF, 0xE0, 0x70, 0x18, 0x90, 0x06, \r
+0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, \r
+0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x60, 0x3B, 0x90, 0xA0, 0x90, 0xE0, \r
+0x64, 0x01, 0x70, 0x33, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12, \r
+0x49, 0x5E, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x49, 0x74, \r
+0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, 0x55, \r
+0x87, 0x90, 0xA1, 0x15, 0x74, 0x06, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x28, \r
+0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x12, 0x49, \r
+0x69, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x12, \r
+0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x0E, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4C, 0x04, 0x90, 0x01, \r
+0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x5A, 0x91, 0x12, 0x46, 0xFD, 0xE4, 0xFD, 0x7F, \r
+0x01, 0x12, 0x55, 0x87, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x49, \r
+0x5E, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, \r
+0xA1, 0x15, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x7D, 0x04, 0x7F, 0x01, \r
+0x12, 0x55, 0x87, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, \r
+0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xC0, 0x02, 0x08, 0xAA, \r
+0x90, 0xA3, 0xBD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, \r
+0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, \r
+0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, \r
+0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, \r
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, \r
+0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, \r
+0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, \r
+0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0xA3, 0xBB, 0xE0, \r
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x0C, 0xEF, 0xF0, 0x90, 0x9F, 0x9F, \r
+0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0E, 0x70, \r
+0x15, 0x90, 0xA4, 0x0C, 0xE0, 0x70, 0x3B, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, \r
+0x04, 0x12, 0x55, 0x7F, 0x80, 0x26, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA4, \r
+0x0C, 0xE0, 0x60, 0x1E, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, \r
+0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, \r
+0x49, 0x5E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, \r
+0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x00, 0x14, 0xF9, \r
 };\r
 \r
-u4Byte ArrayLength_MP_8723B_FW_MP = 31554;\r
+u4Byte ArrayLength_MP_8723B_FW_MP = 31870;\r
 \r
 \r
 void\r
@@ -6878,10 +7320,5 @@ ODM_ReadFirmware_MP_8723B_FW_MP(
 #endif\r
        *pFirmwareSize = ArrayLength_MP_8723B_FW_MP;\r
 }\r
-\r
-\r
-#endif // end of DM_ODM_SUPPORT_TYPE & (ODM_AP)\r
-\r
-\r
 #endif // end of HWIMG_SUPPORT\r
 \r
index 3246fbb9706f72a1d43328d0419165199b552eb6..98068e6b201bade48585e407cfd3f8394e87fad5 100755 (executable)
 * \r
 ******************************************************************************/\r
 \r
-//#include "Mp_Precomp.h"\r
+\r
 #include "../odm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 static BOOLEAN\r
-CheckCondition(\r
-    const u4Byte  Condition,\r
-    const u4Byte  Hex\r
+CheckPositive(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
     )\r
 {\r
-    u4Byte _board     = (Hex & 0x000000FF);\r
-    u4Byte _interface = (Hex & 0x0000FF00) >> 8;\r
-    u4Byte _platform  = (Hex & 0x00FF0000) >> 16;\r
-    u4Byte cond = Condition;\r
+    u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
+                           ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
+                           ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
+                           ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
+                           ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
 \r
-    if ( Condition == 0xCDCDCDCD )\r
-        return TRUE;\r
+       u4Byte    cond1   = Condition1, cond2 = Condition2;\r
+       u4Byte    driver1 = pDM_Odm->CutVersion       << 24 |  \r
+                               pDM_Odm->SupportPlatform  << 16 | \r
+                               pDM_Odm->PackageType      << 12 | \r
+                               pDM_Odm->SupportInterface << 8  |\r
+                               _BoardType;\r
 \r
-    cond = Condition & 0x000000FF;\r
-    if ( (_board != cond) && (cond != 0xFF) )\r
-        return FALSE;\r
+       u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
+                               pDM_Odm->TypeGPA  <<  8 | \r
+                               pDM_Odm->TypeALNA << 16 | \r
+                               pDM_Odm->TypeAPA  << 24; \r
 \r
-    cond = Condition & 0x0000FF00;\r
-    cond = cond >> 8;\r
-    if ( ((_interface & cond) == 0) && (cond != 0x07) )\r
-        return FALSE;\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
 \r
-    cond = Condition & 0x00FF0000;\r
-    cond = cond >> 16;\r
-    if ( ((_platform & cond) == 0) && (cond != 0x0F) )\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
+\r
+\r
+       //============== Value Defined Check ===============//\r
+       //QFN Type [15:12] and Cut Version [27:24] need to do value check\r
+       \r
+       if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
+               return FALSE;\r
+       if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
+               return FALSE;           \r
+\r
+       //=============== Bit Defined Check ================//\r
+    // We don't care [31:28] and [23:20]\r
+    //\r
+       cond1   &= 0x000F0FFF; \r
+       driver1 &= 0x000F0FFF; \r
+\r
+    if ((cond1 & driver1) == cond1) \r
+    {\r
+        u4Byte bitMask = 0;\r
+        if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE\r
+            return TRUE;\r
+\r
+        if ((cond1 & BIT0) != 0) //GLNA\r
+            bitMask |= 0x000000FF;\r
+        if ((cond1 & BIT1) != 0) //GPA\r
+            bitMask |= 0x0000FF00;\r
+        if ((cond1 & BIT2) != 0) //ALNA\r
+            bitMask |= 0x00FF0000;\r
+        if ((cond1 & BIT3) != 0) //APA\r
+            bitMask |= 0xFF000000;\r
+\r
+        if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched\r
+            return TRUE;\r
+        else\r
+            return FALSE;\r
+    }\r
+    else \r
+    {\r
         return FALSE;\r
+    }\r
+}\r
+static BOOLEAN\r
+CheckNegative(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
+    )\r
+{\r
     return TRUE;\r
 }\r
 \r
-\r
 /******************************************************************************\r
 *                           MAC_REG.TXT\r
 ******************************************************************************/\r
@@ -169,69 +223,73 @@ ODM_ReadAndConfig_MP_8723B_MAC_REG(
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8723B_MAC_REG;\r
-\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG, hex = 0x%X\n", hex));\r
-\r
-       for (i = 0; i < ArrayLen; i += 2 )\r
-       {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
+    u4Byte     i         = 0;\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8723B_MAC_REG;\r
        \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                       odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       i -= 2; // prevent from for-loop += 2\r
-                   }\r
-                   else // Configure matched pairs and skip to end of if-else.\r
-                   {\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                                       odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n"));\r
+\r
+    for (i = 0; i < ArrayLen; i += 2 )\r
+    {\r
+        u4Byte v1 = Array[i];\r
+        u4Byte v2 = Array[i+1];\r
+    \r
+        // This (offset, data) pair doesn't care the condition.\r
+        if ( v1 < 0x40000000 )\r
+        {\r
+           odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
+           continue;\r
+        }\r
+        else\r
+        {   // This line is the beginning of branch.\r
+            BOOLEAN bMatched = TRUE;\r
+            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+\r
+            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
+                bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
+                bMatched = FALSE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else {\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
+                    bMatched = FALSE;\r
+                else\r
+                    bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            }\r
 \r
+            if ( bMatched == FALSE )\r
+            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
+                while (v1 < 0x40000000 && i < ArrayLen -2)\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+\r
+                i -= 2; // prevent from for-loop += 2\r
+            }\r
+            else // Configure matched pairs and skip to end of if-else.\r
+            {\r
+                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
+                    odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                }\r
+\r
+                // Keeps reading until ENDIF.\r
+                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                }\r
+            }\r
+        } \r
+    }\r
+}\r
+\r
+u4Byte\r
+ODM_GetVersion_MP_8723B_MAC_REG(void)\r
+{\r
+          return 11;\r
 }\r
 \r
 #endif // end of HWIMG_SUPPORT\r
index 9745a2cd3ef56a2d99a94cd3f0074990faf890aa..1f74db8b12f7c4fd7120d944280b7cd55e00e4cc 100755 (executable)
@@ -22,7 +22,6 @@
 #ifndef __INC_MP_MAC_HW_IMG_8723B_H\r
 #define __INC_MP_MAC_HW_IMG_8723B_H\r
 \r
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);\r
 \r
 /******************************************************************************\r
 *                           MAC_REG.TXT\r
@@ -32,6 +31,7 @@ void
 ODM_ReadAndConfig_MP_8723B_MAC_REG( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_MAC_REG(void);\r
 \r
 #endif\r
 #endif // end of HWIMG_SUPPORT\r
index 7d197945e2eda2c298586c0113bf54182c49d619..23e086726e24687f69249852f9f28b57803a3425 100755 (executable)
 #if (RTL8723B_SUPPORT==1)\r
 \r
 #ifdef CONFIG_MP_INCLUDED\r
+\r
+//#define SIZE_OF_BT_MP_PATCH  20564\r
 u8 Rtl8723BFwBTImgArray[Rtl8723BFwBTImgArrayLength] = {\r
-0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x69, 0x4b, 0xb2, 0x20, 0xda, 0x4b, 0xb2, 0x40, 0x9a, 0x4b, 0xb3, 0x4b, 0xb0, 0x42, 0x34, 0x82, 0x34, 0x80, 0xcb, 0x4a, 0xb3, 0x40, 0xcb, \r
-0x4a, 0xb2, 0x20, 0xc2, 0x4a, 0xb2, 0x20, 0xc2, 0x4a, 0xb2, 0x20, 0xc2, 0x4a, 0xb2, 0x20, 0xca, 0x4a, 0xb3, 0x4b, 0xb2, 0x60, 0xda, 0x4b, 0xb3, 0x4b, 0xb2, 0x60, 0xda, 0x4b, 0xb3, 0x4c, 0xb2, \r
-0x60, 0xda, 0x4c, 0xb3, 0x4c, 0xb2, 0x60, 0xda, 0x4c, 0xb3, 0x4d, 0xb2, 0x60, 0xda, 0x4d, 0xb3, 0x4d, 0xb2, 0x60, 0xda, 0x4d, 0xb3, 0x4e, 0xb2, 0x60, 0xda, 0x4e, 0xb3, 0x4e, 0xb2, 0x60, 0xda, \r
-0x4e, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3, \r
-0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x52, 0xb2, 0x80, 0x18, 0x97, 0x2d, 0x60, 0xda, 0x51, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x52, 0xb2, 0x60, 0xda, \r
-0x52, 0xb3, 0x53, 0xb2, 0x60, 0xda, 0x53, 0xb3, 0x53, 0xb2, 0x60, 0xda, 0x53, 0xb3, 0x54, 0xb2, 0x60, 0xda, 0x54, 0xb3, 0x54, 0xb2, 0x60, 0xda, 0x45, 0xf1, 0x09, 0x6a, 0x00, 0xf1, 0x50, 0xc8, \r
-0x52, 0xb2, 0x00, 0xf4, 0x00, 0x6b, 0xa0, 0xf0, 0x76, 0xc8, 0x43, 0xd8, 0x50, 0xb2, 0x51, 0xb3, 0x25, 0xd8, 0x44, 0xd8, 0x02, 0x6a, 0x80, 0xf1, 0x42, 0xc0, 0x00, 0xf2, 0x00, 0x6a, 0xa0, 0xf0, \r
-0x52, 0xc8, 0x90, 0x6a, 0xa0, 0xf0, 0x54, 0xc8, 0xa0, 0xf0, 0x58, 0xc8, 0x4a, 0xb2, 0x60, 0xda, 0x4a, 0xb3, 0x4b, 0xb2, 0x60, 0xda, 0x4b, 0xb3, 0x4b, 0xb2, 0x60, 0xda, 0x4b, 0xb3, 0x4c, 0xb2, \r
-0x60, 0xda, 0x4c, 0xb3, 0x4c, 0xb2, 0x60, 0xda, 0x26, 0xd8, 0x27, 0xd8, 0x28, 0xd8, 0x80, 0x18, 0xf4, 0x2e, 0x29, 0xd8, 0xc0, 0xf1, 0x7f, 0xa0, 0x48, 0xb2, 0x60, 0xc2, 0xe0, 0xf1, 0x62, 0xa0, \r
-0x47, 0xb2, 0x60, 0xc2, 0x47, 0xb2, 0x00, 0x6b, 0x60, 0xc2, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x54, 0x8b, 0x10, 0x80, 0x24, 0xed, 0x10, 0x80, 0x46, 0x00, 0x11, 0x80, \r
-0x4c, 0x00, 0x11, 0x80, 0x44, 0x00, 0x11, 0x80, 0xa0, 0x94, 0x10, 0x80, 0xf8, 0x95, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0x01, 0xca, 0x10, 0x80, 0xe8, 0x07, 0x11, 0x80, \r
-0x89, 0xc4, 0x10, 0x80, 0x24, 0x19, 0x11, 0x80, 0x01, 0xc4, 0x10, 0x80, 0x80, 0x19, 0x11, 0x80, 0xa9, 0xdf, 0x10, 0x80, 0x14, 0x07, 0x11, 0x80, 0x81, 0xd2, 0x10, 0x80, 0x1c, 0x19, 0x11, 0x80, \r
-0x4d, 0xb9, 0x10, 0x80, 0x20, 0x19, 0x11, 0x80, 0x25, 0xd4, 0x10, 0x80, 0xb0, 0x07, 0x11, 0x80, 0x6d, 0xb8, 0x10, 0x80, 0xf8, 0x06, 0x11, 0x80, 0xe5, 0xd4, 0x10, 0x80, 0x08, 0x07, 0x11, 0x80, \r
-0xfd, 0xcb, 0x10, 0x80, 0xe0, 0x06, 0x11, 0x80, 0x71, 0xcb, 0x10, 0x80, 0xd0, 0x07, 0x11, 0x80, 0xf1, 0xb8, 0x10, 0x80, 0xc8, 0x07, 0x11, 0x80, 0x0d, 0xb9, 0x10, 0x80, 0xa0, 0x07, 0x11, 0x80, \r
-0x99, 0xce, 0x10, 0x80, 0xe8, 0x06, 0x11, 0x80, 0xa1, 0xcf, 0x10, 0x80, 0x48, 0x19, 0x11, 0x80, 0xa5, 0xe9, 0x10, 0x80, 0x90, 0x07, 0x11, 0x80, 0x9d, 0xb9, 0x10, 0x80, 0x34, 0x08, 0x11, 0x80, \r
-0xed, 0xdb, 0x10, 0x80, 0xf8, 0x1a, 0x11, 0x80, 0x99, 0xcc, 0x10, 0x80, 0x40, 0x19, 0x11, 0x80, 0xc5, 0xb9, 0x10, 0x80, 0xc4, 0x07, 0x11, 0x80, 0xc5, 0xca, 0x10, 0x80, 0x74, 0x19, 0x11, 0x80, \r
-0x01, 0xe0, 0x10, 0x80, 0x74, 0x07, 0x11, 0x80, 0x14, 0xc0, 0x52, 0x02, 0x58, 0xd5, 0xc8, 0x19, 0x99, 0xaf, 0x10, 0x80, 0x7c, 0x07, 0x11, 0x80, 0x45, 0xd6, 0x10, 0x80, 0xb4, 0x07, 0x11, 0x80, \r
-0x61, 0xd5, 0x10, 0x80, 0x58, 0x08, 0x11, 0x80, 0xed, 0xb9, 0x10, 0x80, 0x1c, 0x1a, 0x11, 0x80, 0x55, 0xbc, 0x10, 0x80, 0xdc, 0x1b, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0x98, 0x96, 0x11, 0x80, \r
-0x90, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0c, 0xb0, 0x90, 0x67, 0x00, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x3c, 0x6e, 0x01, 0x6a, 0x4b, 0xea, 0x47, 0xd8, 0x70, 0x6a, 0x43, 0xc0, \r
-0x0a, 0x6a, 0x4c, 0xc0, 0x08, 0x6a, 0x4d, 0xc0, 0x00, 0x6b, 0x05, 0xb2, 0x60, 0xc2, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xcc, 0x95, 0x11, 0x80, \r
-0xd6, 0x63, 0x53, 0x62, 0x52, 0xd1, 0x51, 0xd0, 0x00, 0xf4, 0x05, 0x6a, 0x7d, 0x67, 0x52, 0xcb, 0x0d, 0x6a, 0x20, 0xf0, 0x46, 0xc3, 0x20, 0xf0, 0x07, 0x04, 0x71, 0xb5, 0x00, 0x18, 0x0d, 0x33, \r
-0x06, 0x6e, 0x9d, 0x67, 0x01, 0x6a, 0x00, 0x6b, 0x20, 0xf0, 0x4f, 0xc4, 0x20, 0xf0, 0x53, 0xc4, 0x6c, 0xb2, 0x20, 0xf0, 0x6d, 0xc4, 0x20, 0xf0, 0x6e, 0xc4, 0x20, 0xf0, 0x70, 0xc4, 0x20, 0xf0, \r
-0x71, 0xc4, 0x20, 0xf0, 0x72, 0xc4, 0xc0, 0xf1, 0x6a, 0xc2, 0xc0, 0xf1, 0x7e, 0xc2, 0x03, 0x6b, 0x02, 0x6c, 0xc0, 0xf1, 0x7c, 0xc2, 0x64, 0xb3, 0xc0, 0xf1, 0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, \r
-0xc0, 0xf1, 0x9d, 0xc2, 0x80, 0xc3, 0x61, 0xb3, 0x00, 0x6c, 0x80, 0xdb, 0x81, 0xdb, 0x60, 0xf1, 0x70, 0xa2, 0x44, 0x67, 0x02, 0x73, 0x07, 0x60, 0x03, 0x73, 0xa0, 0xf0, 0x07, 0x60, 0x01, 0x73, \r
-0xa0, 0xf0, 0x04, 0x60, 0x0f, 0x10, 0xc0, 0xf2, 0x0c, 0x6b, 0x78, 0xea, 0x58, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0xc0, 0xf0, 0x68, 0xa3, 0x80, 0xf0, 0x19, 0x2b, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, \r
-0x0a, 0x5a, 0xf1, 0x61, 0x00, 0x18, 0xc8, 0x5e, 0x09, 0x04, 0x4a, 0xd2, 0x80, 0xf0, 0x10, 0x2a, 0x7d, 0x67, 0x20, 0xf0, 0x6d, 0xa3, 0x5d, 0x67, 0x9d, 0x67, 0x20, 0xf0, 0x4e, 0xa2, 0x20, 0xf0, \r
-0x8f, 0xa4, 0x4e, 0xd3, 0x7d, 0x67, 0x4f, 0xd2, 0x4d, 0xd4, 0x5d, 0x67, 0x20, 0xf0, 0x93, 0xa3, 0x20, 0xf0, 0x50, 0xa2, 0x20, 0xf0, 0x02, 0x05, 0x4b, 0xd4, 0x4c, 0xd2, 0x20, 0xf0, 0x12, 0xa3, \r
-0x20, 0xf0, 0x31, 0xa3, 0x00, 0x18, 0x28, 0xe2, 0x08, 0x04, 0x02, 0x22, 0x4a, 0xd2, 0x70, 0x10, 0x5d, 0x67, 0x00, 0x30, 0x2d, 0xe8, 0x31, 0xaa, 0xc0, 0xf2, 0x0c, 0x6a, 0x38, 0xb5, 0x58, 0xe9, \r
-0x3b, 0xb2, 0x12, 0xe9, 0x45, 0xe1, 0xe0, 0xf0, 0x88, 0x41, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x4f, 0x93, 0x4e, 0x94, 0x60, 0x32, 0x8d, 0xea, 0x60, 0xf2, 0x58, 0xc9, 0x5d, 0x67, 0x30, 0xf1, \r
-0x64, 0x42, 0x40, 0xa3, 0x7d, 0x67, 0x30, 0xf1, 0x80, 0x43, 0xe0, 0xf0, 0x55, 0xc1, 0x60, 0xa4, 0x9d, 0x67, 0x20, 0xf1, 0x4c, 0x44, 0xe0, 0xf0, 0x77, 0xc1, 0x80, 0xa2, 0x7d, 0x67, 0xe0, 0xf0, \r
-0x98, 0xc1, 0x20, 0xf0, 0x40, 0xa3, 0xe0, 0xf0, 0x4e, 0xc1, 0x01, 0x6a, 0x60, 0xf2, 0x5a, 0xc1, 0x00, 0x18, 0xe5, 0x9c, 0x91, 0xab, 0x9d, 0x67, 0x20, 0xf1, 0x48, 0x44, 0x80, 0xa2, 0x02, 0x32, \r
-0x5e, 0x32, 0x00, 0xf1, 0x8c, 0xc1, 0x13, 0x22, 0xef, 0xf7, 0x1f, 0x6a, 0x0c, 0xea, 0x01, 0x6b, 0x80, 0xf0, 0x44, 0xc9, 0x06, 0x6c, 0x04, 0xd3, 0xfc, 0x6d, 0x1e, 0xb3, 0x40, 0xf5, 0x0f, 0x6e, \r
-0x20, 0xf5, 0x17, 0x6f, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x06, 0x10, 0x5d, 0x67, 0x20, 0xf1, 0x68, 0x42, 0x40, 0xab, 0x80, 0xf0, 0x44, 0xc9, 0x00, 0x18, 0x92, 0xa0, 0x09, 0x04, \r
-0x02, 0x67, 0x0e, 0x22, 0x7d, 0x67, 0x20, 0xf0, 0x80, 0xa3, 0xe0, 0xf0, 0xa3, 0xa1, 0x00, 0x18, 0x02, 0xe2, 0x00, 0x65, 0x0a, 0xb4, 0x00, 0x18, 0xfe, 0xe1, 0x00, 0x65, 0x4a, 0xd0, 0x08, 0x10, \r
-0x5d, 0x67, 0x91, 0xaa, 0x20, 0x18, 0xfa, 0x25, 0x01, 0x6d, 0x02, 0x10, 0x0c, 0x6b, 0x4a, 0xd3, 0x4a, 0x92, 0x53, 0x97, 0x52, 0x91, 0x51, 0x90, 0x00, 0xef, 0x2a, 0x63, 0xa4, 0x95, 0x11, 0x80, \r
-0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x5c, 0x53, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x10, 0xb3, 0x00, 0x6d, 0xc0, 0xf1, 0xaa, 0xc3, \r
-0xc0, 0xf1, 0xbe, 0xc3, 0xff, 0x6a, 0x03, 0x6d, 0x8c, 0xea, 0xc0, 0xf1, 0xbc, 0xc3, 0x02, 0x6c, 0x0b, 0xb5, 0xc0, 0xf1, 0x89, 0xc3, 0xc0, 0xf1, 0x88, 0xc3, 0xc0, 0xf1, 0x9d, 0xc3, 0x60, 0xf1, \r
-0x40, 0xc3, 0x80, 0xc5, 0x00, 0x18, 0x2e, 0xaa, 0x82, 0x67, 0x06, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, \r
-0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x00, 0xf4, 0x06, 0x6a, 0x7d, 0x67, 0x4a, 0xcb, 0x03, 0x6a, 0x56, 0xc3, 0x13, 0x6a, 0x59, 0xc3, 0x1d, 0xb2, 0x6d, 0xa2, 0x08, 0x73, 0x1a, 0x60, \r
-0xff, 0x6c, 0x09, 0x4c, 0x98, 0xeb, 0x1b, 0xb2, 0x01, 0x6d, 0x12, 0xec, 0x91, 0xe2, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x0f, 0x26, 0x00, 0xf1, 0x52, 0xaa, 0x47, 0xeb, 0xac, 0xea, 0x0a, 0x22, \r
-0x20, 0xf1, 0x4c, 0xac, 0x7d, 0x67, 0x05, 0x04, 0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x0e, 0xb2, 0x4c, 0xa2, 0x0a, 0x72, 0x14, 0x60, 0xc0, 0xf2, 0x0c, 0x6b, \r
-0x78, 0xea, 0x0d, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0xe0, 0xf0, 0x66, 0xa2, 0x01, 0x73, 0x0a, 0x61, 0x60, 0xf2, 0x56, 0xaa, 0x7d, 0x67, 0x05, 0x04, 0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, \r
-0x88, 0x4f, 0x04, 0x05, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x6a, \r
-0x18, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb, 0x04, 0xf0, 0x06, 0x6b, 0x68, 0xcc, 0x54, 0xc4, 0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x59, 0xc4, 0x5a, 0xc4, 0x5b, 0xc4, 0x5c, 0xc4, 0x5d, 0xc4, \r
-0x5e, 0xc4, 0x5f, 0xc4, 0x0f, 0x6b, 0x07, 0x6a, 0x04, 0x00, 0x72, 0xc4, 0x20, 0xf0, 0x40, 0xc4, 0x20, 0x6b, 0x03, 0x6a, 0x73, 0xc4, 0x75, 0xc4, 0x20, 0xf0, 0x41, 0xc4, 0x00, 0x18, 0x13, 0xca, \r
-0x90, 0x67, 0x7d, 0x67, 0x04, 0xf0, 0x0a, 0x6a, 0x48, 0xcb, 0x01, 0x6a, 0x90, 0x67, 0x52, 0xc3, 0x00, 0x18, 0x8b, 0xca, 0x53, 0xc3, 0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, \r
-0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x00, 0x6a, 0x21, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb, 0x04, 0xf0, 0x0d, 0x6b, 0x68, 0xcc, 0x19, 0x6b, 0x72, 0xc4, 0x60, 0x6b, 0x6b, 0xeb, \r
-0x73, 0xc4, 0x75, 0xc4, 0x1b, 0xb3, 0x54, 0xc4, 0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x94, 0xa3, 0xbd, 0x67, 0x5f, 0xc5, 0x99, 0xc5, 0x95, 0xa3, 0x20, 0xf0, 0x40, 0xc5, 0x20, 0xf0, 0x42, 0xc5, \r
-0x9a, 0xc5, 0x96, 0xa3, 0x20, 0xf0, 0x44, 0xc5, 0x20, 0xf0, 0x45, 0xc5, 0x9b, 0xc5, 0x97, 0xa3, 0x20, 0xf0, 0x47, 0xc5, 0x20, 0xf0, 0x49, 0xc5, 0x9c, 0xc5, 0x98, 0xa3, 0x79, 0xa3, 0x9d, 0xc5, \r
-0x7e, 0xc5, 0x02, 0x6b, 0x20, 0xf0, 0x61, 0xc5, 0x20, 0xf0, 0x63, 0xc5, 0x1e, 0x6b, 0x20, 0xf0, 0x66, 0xc5, 0x12, 0x6b, 0x20, 0xf0, 0x68, 0xc5, 0x20, 0xf0, 0x6a, 0xc5, 0x20, 0xf0, 0x4b, 0xc5, \r
-0x00, 0x18, 0x41, 0xc8, 0x04, 0x04, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x0c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, \r
-0x7d, 0x67, 0x04, 0xf0, 0x1d, 0x6a, 0x48, 0xcb, 0x01, 0x6a, 0x52, 0xc3, 0x08, 0xb2, 0x41, 0xaa, 0x7f, 0x6b, 0x04, 0x04, 0x4a, 0x32, 0x6c, 0xea, 0x7d, 0x67, 0x00, 0x18, 0xa2, 0xc5, 0x53, 0xc3, \r
-0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdb, 0x63, 0x49, 0x62, 0x48, 0xd1, 0x47, 0xd0, 0x00, 0x69, 0x0e, 0xb2, 0x7d, 0x67, 0x20, 0xda, \r
-0x21, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x48, 0xcb, 0x0b, 0xb2, 0x81, 0xf1, 0x48, 0xaa, 0x0b, 0xb0, 0x32, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x4c, 0xd8, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, \r
-0x6c, 0xea, 0x29, 0xc0, 0x44, 0xc0, 0x49, 0x97, 0x48, 0x91, 0x47, 0x90, 0x00, 0xef, 0x25, 0x63, 0x5c, 0x53, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, \r
-0x46, 0xd0, 0x00, 0x68, 0x0b, 0xb2, 0x7d, 0x67, 0x00, 0xda, 0x01, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x12, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x48, 0xcb, 0x07, 0xb2, 0x84, 0xa2, 0x41, 0x6b, \r
-0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x09, 0xc2, 0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x1c, 0xb2, 0x00, 0x6b, \r
-0x60, 0xda, 0x61, 0xda, 0x1b, 0xb2, 0x64, 0xa2, 0x07, 0x6d, 0x6e, 0x34, 0xac, 0xec, 0x05, 0x54, 0x06, 0x61, 0x39, 0x6c, 0x8b, 0xec, 0x6c, 0xec, 0x20, 0x6b, 0x6d, 0xec, 0x84, 0xc2, 0x15, 0xb2, \r
-0x64, 0xa2, 0x07, 0x6c, 0x14, 0xb5, 0x6e, 0x33, 0x8c, 0xeb, 0x6d, 0xe5, 0x60, 0xa3, 0xc3, 0xa2, 0x6c, 0xec, 0x0f, 0x6b, 0x6b, 0xeb, 0x84, 0x35, 0xcc, 0xeb, 0xad, 0xeb, 0x63, 0xc2, 0xbd, 0x67, \r
-0x04, 0xf0, 0x1e, 0x6b, 0x68, 0xcd, 0x03, 0x6b, 0x72, 0xc5, 0x61, 0xaa, 0x7f, 0x6d, 0x6a, 0x33, 0xac, 0xeb, 0xbd, 0x67, 0x73, 0xc5, 0x40, 0x9a, 0x95, 0xc5, 0x04, 0x04, 0x42, 0x32, 0x00, 0x18, \r
-0x58, 0xc5, 0x54, 0xc5, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0x50, 0xea, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x57, 0x6c, 0x00, 0x18, \r
-0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x01, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, \r
-0x4d, 0xa6, 0xc4, 0x67, 0x06, 0xb2, 0x84, 0xa2, 0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, \r
-0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x7c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x79, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0x1e, 0xb3, 0xff, 0xf7, 0x1f, 0x68, \r
-0x80, 0x9b, 0x0c, 0xe9, 0x4c, 0xe8, 0x4c, 0x9b, 0x96, 0x34, 0xe3, 0xf7, 0x1f, 0x6d, 0x49, 0xe0, 0xac, 0xec, 0x98, 0xea, 0x4c, 0xdb, 0x4e, 0x9b, 0x49, 0xe1, 0x4e, 0xdb, 0x12, 0xec, 0x8d, 0xdb, \r
-0x7d, 0xf2, 0x01, 0x6b, 0x63, 0xe8, 0x02, 0x60, 0x63, 0xe9, 0x1d, 0x61, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf6, 0x01, 0x6b, 0x6b, 0xeb, \r
-0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf6, 0x00, 0x6b, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, \r
-0x00, 0x18, 0x4d, 0xa6, 0x6d, 0xee, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x11, 0xb2, 0x47, 0x9a, \r
-0xff, 0x68, 0x8c, 0xe8, 0x01, 0x4a, 0x04, 0x22, 0x0f, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x11, 0x20, 0x00, 0x69, 0x0b, 0xb0, 0x01, 0x6c, 0x0b, 0xb5, 0x0c, 0xb6, 0xf1, 0x67, 0x00, 0x18, \r
-0xd9, 0x1c, 0x04, 0xd1, 0x87, 0x98, 0x00, 0x18, 0xbe, 0x1c, 0x14, 0x6d, 0x00, 0x6a, 0x30, 0xc8, 0x20, 0xf0, 0x49, 0xc0, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, \r
-0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0x45, 0xa9, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0xff, 0x6b, \r
-0x0c, 0xea, 0x02, 0x4b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x00, 0xf2, 0x01, 0x6b, \r
-0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x0c, 0xb0, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0xd1, 0xa8, 0x01, 0x6d, 0x00, 0x18, \r
-0x4d, 0xa6, 0x42, 0x6c, 0x80, 0x18, 0x1d, 0x2a, 0x00, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x44, 0xc0, 0x00, 0x6a, 0x49, 0xc0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, \r
-0x90, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x20, 0xb2, 0x47, 0x9a, 0x08, 0xd4, 0x8e, 0xea, 0x05, 0x22, 0x01, 0x4c, 0x03, 0x24, 0x00, 0x18, 0xcb, 0x1c, 0x08, 0x04, \r
-0x1b, 0xb0, 0x64, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x08, 0x2a, 0x47, 0x98, 0x01, 0x4a, 0x29, 0x22, 0x18, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x24, 0x10, 0x02, 0x69, 0x6c, 0xe9, 0xff, 0x6a, \r
-0x4c, 0xe9, 0x07, 0x21, 0x80, 0x18, 0xf8, 0x29, 0x00, 0x65, 0x50, 0xa8, 0x01, 0x4a, 0x50, 0xc8, 0x18, 0x10, 0x7d, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x04, 0x6b, 0x4c, 0xeb, 0x06, 0x23, \r
-0x50, 0xa8, 0x20, 0xf0, 0x29, 0xc0, 0x01, 0x4a, 0x50, 0xc8, 0x0b, 0x10, 0x20, 0xf0, 0x49, 0xa0, 0x19, 0x5a, 0x04, 0x60, 0x01, 0x4a, 0x20, 0xf0, 0x49, 0xc0, 0x03, 0x10, 0x80, 0x18, 0x33, 0x2a, \r
-0x00, 0x65, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x6c, 0x02, 0xf0, \r
-0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x2c, 0xb2, 0xc1, 0xaa, 0x7f, 0x6a, 0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x80, 0x4a, 0x81, 0x4a, 0x4d, 0xee, 0xff, 0x6a, 0x4c, 0xee, 0x00, 0x18, \r
-0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf6, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, \r
-0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf6, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, \r
-0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x03, 0x69, 0x2b, 0xe9, 0xc2, 0x67, 0x2c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, \r
-0x0c, 0xea, 0x02, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0xc2, 0x67, 0x2c, 0xee, 0x01, 0x6d, \r
-0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x80, 0x18, 0x1d, 0x2a, 0x01, 0x6c, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, \r
-0x04, 0xd0, 0x00, 0x6c, 0xc4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0x6e, 0xff, 0xf7, 0x1f, 0x6b, 0x04, 0x4e, 0x4c, 0xeb, 0xcb, 0xee, \r
-0x6c, 0xee, 0x01, 0x6d, 0x0b, 0xb0, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x00, 0x6c, 0x80, 0x18, 0x1d, 0x2a, 0x44, 0xc0, 0x80, 0x18, 0xf8, 0x29, \r
-0x00, 0x65, 0x00, 0x6a, 0x49, 0xc0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x38, 0xb0, 0x90, 0xa0, 0x4f, 0xa0, \r
-0x04, 0x05, 0x80, 0x34, 0x4d, 0xec, 0x4e, 0xa0, 0x80, 0x34, 0x00, 0x18, 0x69, 0xbc, 0x4d, 0xec, 0x7d, 0x67, 0x48, 0xab, 0x8f, 0xa0, 0xdd, 0x67, 0x4c, 0xcb, 0x49, 0xab, 0xaa, 0xae, 0x4d, 0xcb, \r
-0x4e, 0xa0, 0x80, 0x33, 0x68, 0x33, 0x48, 0x32, 0x6d, 0xea, 0x03, 0x6b, 0xac, 0xeb, 0x6d, 0xea, 0x70, 0xa0, 0x4e, 0xce, 0x9a, 0x34, 0x68, 0x32, 0x7e, 0x33, 0x8d, 0xea, 0x05, 0x23, 0x09, 0xf4, \r
-0x00, 0x6b, 0x4d, 0xeb, 0x6f, 0xce, 0x06, 0x10, 0x0a, 0xf0, 0x00, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x5d, 0x67, 0x6f, 0xca, 0x00, 0x6a, 0x21, 0x10, 0xdd, 0x67, 0x44, 0x35, 0xb5, 0xe6, 0xac, 0xad, \r
-0x01, 0x6e, 0xa7, 0xeb, 0xcc, 0xed, 0x0c, 0x25, 0x0f, 0x6d, 0x77, 0xe5, 0xc4, 0xed, 0xa6, 0x67, 0x8d, 0xed, 0xa0, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6d, 0xac, 0xec, \r
-0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x10, 0x5b, 0xe7, 0x61, 0x44, 0x33, 0x01, 0x4a, 0xdd, 0x67, 0xac, 0xea, 0x6d, 0xe6, 0x04, 0x5a, 0x8c, 0xcb, 0x03, 0x60, 0x00, 0x6c, 0x64, 0x67, 0xdc, 0x17, \r
-0x5d, 0x67, 0xcc, 0xaa, 0x51, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcd, 0xab, 0x50, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x5d, 0x67, 0xce, 0xaa, 0x4f, 0x6c, 0x00, 0x18, \r
-0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcf, 0xab, 0x4e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, \r
-0x08, 0xd1, 0x07, 0xd0, 0x5e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x5e, 0x6c, 0x00, 0x18, \r
-0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0xc2, 0x67, 0x53, 0xb1, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, \r
-0x44, 0xa1, 0x07, 0x6b, 0xa3, 0xa1, 0x4e, 0x32, 0x6c, 0xea, 0x44, 0x34, 0x0f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc1, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x04, 0xd3, \r
-0xc3, 0xa1, 0x04, 0x93, 0x71, 0x6c, 0xc6, 0x36, 0x6c, 0xee, 0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0xd0, 0x36, 0x4d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x60, 0xa1, 0x01, 0x6a, \r
-0x01, 0x68, 0x6c, 0xea, 0x0b, 0x22, 0x44, 0xa1, 0x80, 0x48, 0xff, 0x48, 0x4c, 0xe8, 0xff, 0x6a, 0x4c, 0xe8, 0x0b, 0xe8, 0xc0, 0xf7, 0x02, 0x30, 0x03, 0x6a, 0x03, 0xe2, 0x39, 0xb1, 0x56, 0x6c, \r
-0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x80, 0x99, 0x00, 0x33, 0xe3, 0xf7, 0x1f, 0x6d, 0x96, 0x34, 0xac, 0xec, 0x78, 0x33, 0x8d, 0xeb, 0xfb, 0xf7, 0x1f, 0x6c, 0x8c, 0xeb, 0xff, 0xf7, 0x1f, 0x68, \r
-0x1c, 0xf0, 0x00, 0x6c, 0x8b, 0xec, 0x0c, 0xea, 0xc3, 0x67, 0x8c, 0xea, 0x4d, 0xee, 0x56, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0xc7, 0xa1, 0x46, 0xa1, 0x58, 0x6c, 0xc0, 0x36, 0x4d, 0xee, \r
-0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x04, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea, 0x68, 0xa1, 0x03, 0x6c, 0xc2, 0x67, 0x8c, 0xeb, 0x6d, 0xee, \r
-0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x80, 0x18, 0xbd, 0x2a, 0x00, 0x65, 0x63, 0xa1, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x1e, 0x22, 0x57, 0x6c, 0x00, 0x18, \r
-0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x80, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xc5, 0xa1, 0xe0, 0xf1, \r
-0x1d, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea, 0xc8, 0x36, 0xe0, 0xf3, 0x19, 0x4b, 0x6c, 0xee, 0x59, 0x6c, 0x01, 0x6d, 0x4d, 0xee, 0x0b, 0x10, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, \r
-0x0c, 0xea, 0x81, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, \r
-0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x42, 0xb0, 0x43, 0xa0, 0x07, 0x6b, 0xff, 0xf7, 0x1f, 0x69, 0x52, 0x32, 0x6c, 0xea, 0x05, 0x4a, 0x80, 0x18, 0xf7, 0x2a, \r
-0x04, 0xd2, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x2c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, \r
-0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x2c, 0xea, 0x00, 0xf2, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x42, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, \r
-0xd2, 0xa8, 0x51, 0xc8, 0x53, 0xa8, 0xc0, 0x36, 0xc0, 0x36, 0x4d, 0xee, 0x02, 0xf0, 0x00, 0x5e, 0x02, 0x61, 0xe1, 0xf7, 0x1f, 0x6e, 0x28, 0xb1, 0x20, 0xf0, 0x48, 0xa1, 0x0f, 0x6b, 0xd0, 0x36, \r
-0x6c, 0xea, 0x4d, 0xee, 0x42, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, \r
-0xff, 0xf7, 0x1f, 0x68, 0x04, 0x94, 0x1f, 0xf7, 0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x6c, 0xea, 0x1a, 0xb3, 0x8d, 0xe3, 0x20, 0xf1, 0xda, 0xa3, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, \r
-0x4d, 0xa6, 0x4d, 0xee, 0xc1, 0xa9, 0x7f, 0x6a, 0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, \r
-0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, \r
-0x4d, 0xa6, 0x57, 0x6c, 0x80, 0x18, 0x1d, 0x2a, 0x01, 0x6c, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, \r
-0x08, 0xd1, 0x07, 0xd0, 0x33, 0xb3, 0xe3, 0xa3, 0x07, 0x6a, 0x05, 0xd3, 0xf2, 0x37, 0x4c, 0xef, 0x05, 0x4f, 0x80, 0x18, 0xf7, 0x2a, 0x04, 0xd7, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, \r
-0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0, 0x00, 0x69, 0xc2, 0x67, 0x2d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, \r
-0x01, 0x6e, 0x0c, 0xea, 0xcb, 0xee, 0x4c, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xd1, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, \r
-0x00, 0x6d, 0x04, 0x97, 0x1f, 0xf7, 0x01, 0x6c, 0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0x1a, 0xb4, 0xfd, 0xe4, 0x20, 0xf1, 0xda, 0xa7, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, \r
-0x4d, 0xee, 0x05, 0x93, 0x7f, 0x6a, 0x3f, 0x6c, 0xc1, 0xab, 0x00, 0x6d, 0xca, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, \r
-0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, \r
-0x4d, 0xa6, 0x6c, 0xee, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x80, 0x18, 0xf7, 0x2a, \r
-0x00, 0x65, 0x00, 0x6b, 0x0c, 0xb2, 0x6e, 0xda, 0x6c, 0xda, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x00, 0xf2, 0x01, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x59, 0x6c, \r
-0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6c, 0xee, 0x80, 0x18, 0x75, 0x2a, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, \r
-0x42, 0xa4, 0xff, 0x6b, 0x04, 0x67, 0xff, 0x4a, 0x6c, 0xea, 0x22, 0x5a, 0x23, 0xa4, 0x2a, 0x60, 0x04, 0x0b, 0x44, 0x32, 0x49, 0xe3, 0x40, 0x8a, 0x4d, 0xe3, 0x00, 0xeb, 0x00, 0x65, 0x00, 0x65, \r
-0x49, 0x00, 0x9d, 0x00, 0x29, 0x02, 0xb7, 0x02, 0xf1, 0x02, 0x65, 0x03, 0x8d, 0x03, 0x9f, 0x03, 0xad, 0x03, 0xc3, 0x03, 0xd1, 0x03, 0x45, 0x00, 0x45, 0x00, 0xdf, 0x03, 0xd7, 0x04, 0xef, 0x04, \r
-0x45, 0x00, 0x07, 0x05, 0x15, 0x05, 0x23, 0x05, 0x53, 0x05, 0x61, 0x05, 0x73, 0x05, 0x81, 0x05, 0x93, 0x05, 0x97, 0x05, 0x9b, 0x05, 0xa7, 0x05, 0xb9, 0x05, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, \r
-0x45, 0x00, 0xd1, 0x05, 0x00, 0x6a, 0xde, 0x12, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, \r
-0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x80, 0x18, 0x1d, 0x2a, 0x00, 0x6c, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65, 0x00, 0x6d, 0x01, 0xf4, \r
-0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x80, 0xf5, 0x08, 0xb2, 0x0a, 0x6b, 0x6c, 0xc2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x6a, 0xc2, 0xa3, 0x12, 0x0b, 0x59, 0x80, 0xf2, \r
-0x1c, 0x60, 0x60, 0xf5, 0x10, 0xb2, 0x06, 0x21, 0x64, 0xa2, 0x40, 0x6a, 0x6c, 0xea, 0x80, 0xf2, 0x14, 0x2a, 0x06, 0x10, 0x84, 0xa2, 0x40, 0x6b, 0x8c, 0xeb, 0x02, 0x2b, 0x29, 0xc2, 0x91, 0x12, \r
-0x40, 0xf5, 0x10, 0xb2, 0x69, 0xa2, 0x0b, 0x59, 0x29, 0xc2, 0x04, 0xd3, 0xa0, 0xf0, 0x01, 0x60, 0x04, 0x0a, 0x24, 0x31, 0x25, 0xe2, 0x60, 0x89, 0x69, 0xe2, 0x00, 0xea, 0x00, 0x65, 0x00, 0x65, \r
-0x17, 0x00, 0x9f, 0x00, 0xb5, 0x00, 0xe9, 0x00, 0x09, 0x01, 0x0d, 0x01, 0x17, 0x01, 0x33, 0x01, 0x1b, 0x01, 0x23, 0x01, 0x2b, 0x01, 0x00, 0xf5, 0x1c, 0xb2, 0x44, 0xa2, 0x01, 0x6b, 0x4c, 0xeb, \r
-0x12, 0x23, 0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xa7, 0x2a, 0x00, 0x65, 0x18, 0x10, 0x04, 0x92, 0x02, 0x72, 0x04, 0x61, 0x80, 0x18, 0x33, 0x2a, 0x00, 0x65, 0x11, 0x10, 0x80, 0x18, \r
-0xe6, 0x29, 0x00, 0x65, 0x0d, 0x10, 0x04, 0x6b, 0x4c, 0xeb, 0x0a, 0x23, 0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xa4, 0x29, 0x00, 0x65, 0x03, 0x10, 0x80, 0x18, 0xb7, 0x29, 0x00, 0x65, \r
-0xc0, 0xf4, 0x10, 0xb1, 0x6c, 0x99, 0xed, 0x99, 0x4e, 0x99, 0x07, 0xd3, 0x06, 0xd7, 0x00, 0x18, 0xe8, 0x58, 0x05, 0xd2, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, \r
-0x0a, 0x6a, 0x4c, 0xc1, 0x08, 0x6a, 0x4d, 0xc1, 0x04, 0x92, 0x07, 0x93, 0x06, 0x97, 0x02, 0x5a, 0x20, 0xf2, 0x17, 0x60, 0x6c, 0xd9, 0x05, 0x93, 0xed, 0xd9, 0x6e, 0xd9, 0x32, 0x12, 0x80, 0xf4, \r
-0x14, 0xb1, 0x64, 0xa1, 0x02, 0x6a, 0x6d, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0xd6, 0x2b, 0x44, 0xc1, 0x25, 0x10, 0x60, 0xf4, 0x1c, 0xb3, 0x84, 0xa3, 0x03, 0x6a, 0x4b, 0xea, 0x8c, 0xea, \r
-0x04, 0x6c, 0x4c, 0xec, 0x07, 0x24, 0x02, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x80, 0x18, 0xc6, 0x29, 0x84, 0xc3, 0x05, 0x10, 0x01, 0x6c, 0x4d, 0xec, 0x80, 0x18, 0x59, 0x2b, 0x84, 0xc3, 0x40, 0xf4, \r
-0x14, 0xb3, 0x84, 0xa3, 0x40, 0x6a, 0xdf, 0x10, 0x40, 0xf4, 0x08, 0xb1, 0x64, 0xa1, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0x9f, 0x2b, 0x44, 0xc1, 0x64, 0xa1, \r
-0x40, 0x6a, 0x6d, 0xea, 0x44, 0xc1, 0xfd, 0x11, 0x01, 0x6c, 0x01, 0x10, 0x02, 0x6c, 0x80, 0x18, 0x1d, 0x29, 0x00, 0x65, 0xf6, 0x11, 0x03, 0x6c, 0xfa, 0x17, 0x80, 0x18, 0x71, 0x29, 0x00, 0x65, \r
-0xf0, 0x11, 0x80, 0x18, 0x56, 0x29, 0x00, 0x65, 0xec, 0x11, 0x80, 0x18, 0x31, 0x29, 0x00, 0x65, 0xe8, 0x11, 0x80, 0x18, 0xa0, 0x28, 0x00, 0x65, 0xe0, 0xf1, 0x03, 0x22, 0x12, 0x72, 0xc0, 0xf1, \r
-0x1c, 0x60, 0x00, 0x6c, 0x04, 0x6b, 0xdb, 0x11, 0x04, 0x59, 0xc0, 0xf1, 0x16, 0x60, 0x80, 0x18, 0x1d, 0x2a, 0x00, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, \r
-0x02, 0xf1, 0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x00, 0x18, 0xe8, 0x58, \r
-0x00, 0x65, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0xe9, 0xb3, 0x0a, 0x6a, 0x4c, 0xc3, 0x08, 0x6a, 0x2a, 0xc3, 0x4d, 0xc3, 0x00, 0x1c, 0x73, 0x1b, 0x07, 0xd3, \r
-0x07, 0x93, 0xa2, 0x67, 0x05, 0x6a, 0x84, 0xa3, 0x4b, 0xea, 0x01, 0x71, 0x8c, 0xea, 0x44, 0xc3, 0x09, 0x61, 0x03, 0x6c, 0x80, 0x18, 0x1d, 0x29, 0x06, 0xd5, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, \r
-0x06, 0x95, 0x05, 0x10, 0x02, 0x71, 0x03, 0x61, 0x04, 0x6c, 0x4d, 0xec, 0x84, 0xc3, 0x00, 0x1c, 0x7a, 0x1b, 0x85, 0x67, 0x96, 0x11, 0x4f, 0x59, 0x80, 0xf1, 0x0f, 0x60, 0x44, 0xa4, 0x08, 0x5a, \r
-0x80, 0xf1, 0x0b, 0x60, 0xd3, 0xb3, 0x7f, 0x6a, 0xa1, 0xab, 0x2c, 0xea, 0x48, 0x34, 0xe0, 0xf1, 0x1d, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x41, 0xcb, 0x84, 0xa0, 0x07, 0x6a, 0xa3, 0xa3, \r
-0x8c, 0xea, 0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0x79, 0x11, 0x0a, 0x59, 0x44, 0xa4, 0x65, 0xa4, 0x60, 0xf1, 0x10, 0x60, 0x60, 0x33, 0x4d, 0xeb, 0xe3, 0xf7, \r
-0x1f, 0x6c, 0xc4, 0xb2, 0x6c, 0xec, 0x94, 0x35, 0xc3, 0xb6, 0x80, 0x9a, 0xcc, 0xec, 0xad, 0xec, 0x80, 0xda, 0xc2, 0xb5, 0x24, 0x34, 0x91, 0xe5, 0x80, 0xac, 0x8c, 0x34, 0x62, 0xec, 0x40, 0xf1, \r
-0x1c, 0x61, 0x03, 0x59, 0x06, 0x60, 0x80, 0xa2, 0x02, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x60, 0xc2, 0x0c, 0x10, 0x80, 0xa2, 0xa4, 0xa2, 0x01, 0x6b, 0x8d, 0xeb, 0x06, 0x59, 0x60, 0xc2, 0x98, 0x67, \r
-0x7f, 0x6b, 0x9c, 0x34, 0xac, 0xeb, 0x8d, 0xeb, 0x64, 0xc2, 0xb5, 0xb2, 0x25, 0xe2, 0x80, 0xa1, 0xb0, 0xb3, 0x0f, 0x6a, 0x8c, 0xea, 0xa0, 0xa3, 0x44, 0x34, 0x1f, 0x6a, 0x4b, 0xea, 0xac, 0xea, \r
-0x8d, 0xea, 0x39, 0x11, 0x45, 0xa4, 0x08, 0x5a, 0x20, 0xf1, 0x17, 0x60, 0x44, 0xa4, 0xa9, 0xb3, 0xa4, 0xa3, 0x40, 0x32, 0x2d, 0xea, 0x53, 0xcb, 0x85, 0xa4, 0x07, 0x6a, 0x8c, 0xea, 0x4c, 0x34, \r
-0x39, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x44, 0xc3, 0x2b, 0x11, 0x44, 0xa4, 0xa1, 0xb3, 0x40, 0x32, 0x2d, 0xea, 0x52, 0xcb, 0x45, 0xa4, 0x20, 0xf0, 0x48, 0xc3, 0x22, 0x11, 0x9d, 0xb2, \r
-0x26, 0xc2, 0x64, 0xa4, 0x67, 0xc2, 0x65, 0xa4, 0x68, 0xc2, 0x1b, 0x11, 0x99, 0xb2, 0x63, 0xa2, 0x3e, 0x35, 0x7f, 0x6c, 0xbc, 0x35, 0x8c, 0xeb, 0xad, 0xeb, 0x8c, 0xe9, 0x63, 0xc2, 0x25, 0xc2, \r
-0x10, 0x11, 0x94, 0xb2, 0x2e, 0xc2, 0x64, 0xa4, 0x6f, 0xc2, 0x65, 0xa4, 0x70, 0xc2, 0x09, 0x11, 0x90, 0xb2, 0x31, 0xc2, 0x64, 0xa4, 0x72, 0xc2, 0x65, 0xa4, 0x73, 0xc2, 0x02, 0x11, 0x8d, 0xb3, \r
-0x49, 0xa3, 0x0a, 0x72, 0x2c, 0x61, 0x8c, 0xa3, 0x00, 0x6a, 0x0a, 0x74, 0x0e, 0x60, 0xc0, 0xf2, 0x0c, 0x4a, 0x58, 0xec, 0x8b, 0xb2, 0x12, 0xec, 0x91, 0xe2, 0xc0, 0xf0, 0x48, 0xa4, 0x04, 0x72, \r
-0x05, 0x6a, 0x03, 0x60, 0x0a, 0x6a, 0x4c, 0xc3, 0x00, 0x6a, 0x82, 0xb3, 0x8d, 0xa3, 0x08, 0x74, 0x5d, 0x60, 0xff, 0x6a, 0x09, 0x4a, 0x58, 0xec, 0x83, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x20, 0xf1, \r
-0xaf, 0xa2, 0x01, 0x6a, 0x4c, 0xed, 0x06, 0x25, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xec, 0x4c, 0xeb, 0x05, 0x6a, 0x4c, 0x2b, 0x77, 0xb2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6a, 0x47, 0x10, 0x8b, 0x42, \r
-0xff, 0x6b, 0x6c, 0xec, 0x03, 0x5c, 0x1a, 0x60, 0x00, 0x6a, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0x74, 0xb3, 0x12, 0xec, 0x91, 0xe3, 0xc0, 0xf0, 0x68, 0xa4, 0x04, 0x73, 0x09, 0x61, 0xe0, 0xf0, \r
-0xa8, 0x9c, 0x6c, 0xb3, 0xa5, 0xdb, 0xe0, 0xf0, 0x8c, 0xac, 0x4c, 0xc3, 0x8c, 0xcb, 0x26, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xe8, 0x61, 0x27, 0x10, 0x88, 0x42, 0x6c, 0xec, \r
-0x02, 0x5c, 0x24, 0x60, 0x00, 0x6a, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xea, 0x66, 0xb3, 0x01, 0x6d, 0x12, 0xec, 0x91, 0xe3, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x12, 0x26, 0x00, 0xf1, 0x72, 0xab, \r
-0x67, 0xea, 0xac, 0xeb, 0x0d, 0x23, 0x60, 0xf1, 0xbe, 0xac, 0x5a, 0xb3, 0xaa, 0xcb, 0x80, 0xf1, 0xa0, 0xac, 0xab, 0xcb, 0x80, 0xf1, 0x82, 0xac, 0x4d, 0xc3, 0x8c, 0xcb, 0x05, 0x6a, 0x06, 0x10, \r
-0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x08, 0x5a, 0xde, 0x61, 0x04, 0x6a, 0x51, 0xb3, 0x6a, 0xa3, 0x40, 0x32, 0x6d, 0xea, 0x66, 0x10, 0x55, 0xb3, 0x20, 0xf0, 0x9e, 0xa3, 0x20, 0xf0, 0x5d, 0xa3, \r
-0x20, 0xf0, 0x7c, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6d, 0x10, 0x4f, 0xb3, 0x40, 0xf0, 0x81, 0xa3, 0x40, 0xf0, 0x40, 0xa3, 0x20, 0xf0, 0x7f, 0xa3, 0x80, 0x34, 0x40, 0x32, \r
-0x80, 0x34, 0x8d, 0xea, 0x61, 0x10, 0x43, 0xb2, 0x34, 0xc2, 0x64, 0xa4, 0x75, 0xc2, 0x65, 0xa4, 0x76, 0xc2, 0x67, 0x10, 0x3f, 0xb2, 0x37, 0xc2, 0x64, 0xa4, 0x78, 0xc2, 0x65, 0xa4, 0x79, 0xc2, \r
-0x60, 0x10, 0x4f, 0x41, 0xff, 0x6b, 0x6c, 0xea, 0x09, 0x5a, 0x57, 0x60, 0x5c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x79, 0x6a, 0x4b, 0xea, 0x4c, 0xeb, \r
-0x2c, 0x36, 0x78, 0x6a, 0x4c, 0xee, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6d, 0xee, 0x48, 0x10, 0x30, 0xb3, 0x8c, 0x9b, 0x36, 0xb5, 0x58, 0xab, 0xac, 0xec, 0x8c, 0xdb, 0x21, 0x10, \r
-0x2c, 0xb4, 0xac, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6c, 0xdc, 0x18, 0x10, 0x28, 0xb3, 0x8e, 0x9b, 0x2e, 0xb5, 0x5c, 0xab, 0xac, 0xec, 0x8e, 0xdb, 0x11, 0x10, \r
-0x24, 0xb4, 0xae, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6e, 0xdc, 0x08, 0x10, 0x78, 0x6c, 0x03, 0x10, 0x76, 0x6c, 0x01, 0x10, 0x77, 0x6c, 0x00, 0x18, 0xab, 0xa5, \r
-0x01, 0x6d, 0x02, 0x6c, 0x13, 0x10, 0x1b, 0xb3, 0x96, 0xa3, 0x55, 0xa3, 0x74, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x08, 0x10, 0x16, 0xb3, 0x99, 0xa3, 0x58, 0xa3, 0x77, 0xa3, \r
-0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6d, 0xea, 0x03, 0x6c, 0x00, 0x6b, 0x0c, 0x10, 0x01, 0x6a, 0x2c, 0xea, 0x17, 0xb3, 0x40, 0xc3, 0x04, 0x10, 0x00, 0x6c, 0x03, 0x6b, 0x44, 0x67, \r
-0x03, 0x10, 0x00, 0x6c, 0x64, 0x67, 0x44, 0x67, 0x90, 0x34, 0x6d, 0xec, 0x83, 0xc0, 0x81, 0xa0, 0x10, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x61, 0xc0, 0xa0, 0x98, 0x02, 0x6c, 0x00, 0x18, 0xa5, 0x2e, \r
-0xc2, 0x67, 0x01, 0x6a, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0x1f, 0x00, 0xfc, 0xff, 0x3c, 0xea, 0x10, 0x80, 0x30, 0xea, 0x10, 0x80, \r
-0x20, 0x56, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x95, 0x11, 0x80, 0x20, 0xe8, 0x00, 0x65, 0x0c, 0xb2, 0x0d, 0xb4, 0x60, 0xa4, 0xa0, 0x9a, \r
-0x04, 0x6a, 0x6c, 0xea, 0x0c, 0x22, 0x40, 0xf7, 0xa2, 0x35, 0x66, 0x33, 0x01, 0x6c, 0xae, 0xeb, 0x8c, 0xeb, 0xff, 0x6c, 0x8c, 0xeb, 0x00, 0x6a, 0x04, 0x23, 0x20, 0xe8, 0x01, 0x6a, 0x05, 0xb2, \r
-0x40, 0xa2, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x50, 0xa0, 0x00, 0xb0, 0x98, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x07, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, \r
-0x05, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x05, 0xb3, 0x63, 0xda, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x2d, 0xdd, 0x10, 0x80, 0x00, 0x6a, 0x6f, 0xb5, \r
-0x55, 0xe5, 0xa0, 0xa5, 0x6e, 0xb3, 0x51, 0xe3, 0x20, 0xf1, 0xba, 0xc4, 0x01, 0x4a, 0xff, 0x6c, 0x8c, 0xea, 0x10, 0x5a, 0xf4, 0x61, 0x60, 0xf1, 0xa1, 0xa3, 0xfe, 0x75, 0x0b, 0x60, 0x0f, 0x6a, \r
-0xac, 0xea, 0xaf, 0x42, 0x8c, 0xed, 0x05, 0x5d, 0x05, 0x60, 0x10, 0x6c, 0x4d, 0xec, 0x60, 0xf1, 0x81, 0xc3, 0x03, 0x10, 0x15, 0x6a, 0x60, 0xf1, 0x41, 0xc3, 0x61, 0xb2, 0x0d, 0x6b, 0x40, 0xf1, \r
-0x7a, 0xc2, 0x0b, 0x6b, 0x40, 0xf1, 0x7b, 0xc2, 0x40, 0xf1, 0x7c, 0xc2, 0x40, 0xf1, 0x7d, 0xc2, 0x40, 0xf1, 0x7e, 0xc2, 0x00, 0x6b, 0x80, 0xf0, 0x7d, 0xc2, 0x24, 0xf0, 0x10, 0x6b, 0x60, 0xf1, \r
-0x62, 0xca, 0x06, 0xf7, 0x19, 0x6b, 0x60, 0xf1, 0x64, 0xca, 0x0b, 0xf2, 0x10, 0x6b, 0x60, 0xf1, 0x66, 0xca, 0x0e, 0xf5, 0x0a, 0x6b, 0x60, 0xf1, 0x68, 0xca, 0x04, 0xf5, 0x00, 0x6b, 0x6b, 0xeb, \r
-0x60, 0xf1, 0x6a, 0xca, 0x00, 0x6b, 0xc0, 0xf1, 0x68, 0xca, 0xc0, 0xf1, 0x6a, 0xca, 0xc0, 0xf1, 0x6c, 0xca, 0xc0, 0xf1, 0x6e, 0xca, 0x40, 0xf1, 0x7f, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x01, 0x6b, \r
-0x40, 0xf1, 0x7f, 0xc2, 0x46, 0xb2, 0x60, 0xf1, 0x60, 0xa2, 0xff, 0x73, 0x04, 0x61, 0x02, 0x6b, 0x6b, 0xeb, 0x60, 0xf1, 0x60, 0xc2, 0x42, 0xb2, 0x80, 0xf1, 0x62, 0xa2, 0xff, 0x73, 0x03, 0x61, \r
-0x05, 0x6b, 0x80, 0xf1, 0x62, 0xc2, 0x3e, 0xb2, 0x01, 0x6b, 0x80, 0xf1, 0x60, 0xc2, 0x80, 0xf1, 0x71, 0xc2, 0x80, 0xf1, 0x61, 0xa2, 0xfe, 0x73, 0x03, 0x61, 0x0f, 0x6b, 0x80, 0xf1, 0x61, 0xc2, \r
-0x37, 0xb2, 0x02, 0x6b, 0x80, 0xf1, 0x63, 0xc2, 0x80, 0xf1, 0x72, 0xc2, 0x00, 0x6a, 0x35, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0x32, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x84, 0xc3, 0x01, 0x4a, 0xff, 0x6b, \r
-0x6c, 0xea, 0x0d, 0x5a, 0xf4, 0x61, 0x00, 0x6a, 0x2f, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, \r
-0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x25, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x93, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0d, 0x5a, 0xe6, 0x61, 0x00, 0x6a, 0x23, 0xb4, \r
-0x51, 0xe4, 0x80, 0xa4, 0x1e, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x80, 0xc3, 0x20, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0xc0, 0xf1, 0x82, 0xc3, 0x1f, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, \r
-0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x11, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x84, 0xc3, \r
-0x15, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, \r
-0x83, 0x34, 0x07, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x86, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x5a, 0xc5, 0x61, 0x20, 0xe8, 0x00, 0x65, 0x24, 0xec, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80, \r
-0x34, 0xec, 0x10, 0x80, 0x4c, 0xec, 0x10, 0x80, 0x44, 0xec, 0x10, 0x80, 0x48, 0xec, 0x10, 0x80, 0x5c, 0xec, 0x10, 0x80, 0x60, 0xec, 0x10, 0x80, 0xff, 0x6a, 0x4c, 0xee, 0x4c, 0xec, 0x4c, 0xed, \r
-0xec, 0xea, 0x57, 0xe5, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0xd3, 0xe4, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6b, 0x12, 0xed, 0x98, 0xec, \r
-0x12, 0xec, 0x89, 0xe5, 0x20, 0xe8, 0x6c, 0xea, 0x20, 0xe8, 0x00, 0x65, 0x0a, 0xb2, 0x20, 0xf0, 0x70, 0xa2, 0x16, 0x6a, 0x6c, 0xea, 0x12, 0x72, 0x04, 0x61, 0x40, 0xa4, 0x01, 0x5a, 0x58, 0x67, \r
-0x40, 0xc4, 0x06, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x04, 0x52, 0x58, 0x67, 0x01, 0x6b, 0x20, 0xe8, 0x6e, 0xea, 0x4c, 0x00, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0x00, 0x6a, 0x11, 0xb3, \r
-0x60, 0x9b, 0x4c, 0x35, 0xff, 0x6c, 0xad, 0xe3, 0xc3, 0xa3, 0x80, 0x6b, 0x6b, 0xeb, 0x6c, 0xee, 0x8c, 0xee, 0x14, 0x2e, 0x0c, 0xb6, 0xc0, 0x9e, 0xb9, 0xe6, 0xc3, 0xa6, 0x6c, 0xee, 0x8c, 0xee, \r
-0x0d, 0x2e, 0x0a, 0xb6, 0xc0, 0x9e, 0xb5, 0xe6, 0xa3, 0xa5, 0xac, 0xeb, 0x8c, 0xeb, 0x06, 0x2b, 0x01, 0x4a, 0x8c, 0xea, 0x11, 0x5a, 0xe3, 0x61, 0x20, 0xe8, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x6a, \r
-0xf4, 0x1d, 0x11, 0x80, 0xcc, 0x1d, 0x11, 0x80, 0x04, 0x1f, 0x11, 0x80, 0x20, 0xe8, 0x01, 0x6a, 0x06, 0xb2, 0x60, 0xa2, 0x01, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x40, 0x9c, 0x11, 0x6b, 0x6b, 0xeb, \r
-0x6c, 0xea, 0x40, 0xdc, 0x20, 0xe8, 0x00, 0x6a, 0x98, 0x96, 0x11, 0x80, 0x0d, 0xb2, 0x40, 0xa2, 0x08, 0x22, 0x0d, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, \r
-0x0d, 0x2a, 0x0a, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x60, 0x9c, 0x02, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x01, 0x6b, 0x02, 0xb2, 0x60, 0xc2, 0x20, 0xe8, 0x00, 0x6a, \r
-0x98, 0x07, 0x11, 0x80, 0xdc, 0x37, 0x11, 0x80, 0x6c, 0x21, 0x11, 0x80, 0x64, 0xa4, 0x43, 0xa4, 0xc0, 0xa5, 0x60, 0x33, 0x4d, 0xe3, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x7f, 0xf4, 0x0f, 0x73, \r
-0x00, 0x6a, 0x09, 0x61, 0xc9, 0xe4, 0x01, 0x6b, 0x62, 0xc2, 0x41, 0x46, 0xff, 0x6b, 0x6c, 0xea, 0x41, 0xc4, 0x40, 0xc5, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6a, 0x05, 0xb3, \r
-0x40, 0xc3, 0x05, 0xb3, 0x40, 0xc3, 0x00, 0x6b, 0x04, 0xb2, 0x20, 0xe8, 0x60, 0xca, 0x00, 0x65, 0xf8, 0x95, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0x40, 0xac, 0x01, 0xf4, \r
-0x03, 0x6b, 0x6e, 0xea, 0x06, 0x2a, 0x05, 0xb3, 0x40, 0xc3, 0x05, 0xb3, 0x40, 0xc3, 0x05, 0xb3, 0x40, 0xcb, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0xf8, 0x95, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, \r
-0xfa, 0x95, 0x11, 0x80, 0x08, 0xb3, 0xa0, 0xa3, 0x01, 0x6b, 0x40, 0x9c, 0xac, 0xeb, 0x02, 0x23, 0x10, 0x6b, 0x6d, 0xea, 0x02, 0x6b, 0xac, 0xeb, 0x02, 0x23, 0x04, 0xb3, 0x6d, 0xea, 0x40, 0xdc, \r
-0x20, 0xe8, 0x00, 0x6a, 0x98, 0x96, 0x11, 0x80, 0x00, 0x00, 0x10, 0x00, 0x0b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6b, 0xfd, 0x4a, 0x6c, 0xea, 0x02, 0x5a, 0x0b, 0x60, 0x08, 0xb2, 0x40, 0xa2, \r
-0x08, 0x2a, 0x63, 0xa4, 0x02, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x43, 0xc4, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x89, 0x04, 0x11, 0x80, \r
-0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x45, 0xa4, 0xff, 0xf7, 0x1f, 0x68, 0xac, 0xe8, 0xa4, 0xa4, 0x0e, 0xd2, 0x63, 0xb2, 0x40, 0x82, 0x11, 0x6e, 0x00, 0x52, 0xa0, 0xf0, 0x1a, 0x60, \r
-0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xe8, 0x60, 0xb2, 0x01, 0x6b, 0xac, 0xeb, 0x12, 0xe9, 0x45, 0xe1, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x72, 0x06, 0x60, 0x13, 0x72, 0x04, 0x60, 0x90, 0x67, 0x17, 0x6d, \r
-0xc3, 0x67, 0x0b, 0x10, 0xe0, 0xf0, 0xc7, 0xa1, 0x6a, 0xee, 0x0b, 0x61, 0x80, 0xf0, 0x4c, 0xa9, 0x04, 0x6d, 0xac, 0xea, 0x06, 0x2a, 0x90, 0x67, 0x17, 0x6d, 0x20, 0x18, 0xf6, 0x27, 0x24, 0x6f, \r
-0x98, 0x10, 0x04, 0x4c, 0x41, 0xac, 0x0a, 0xd2, 0x42, 0xac, 0x0b, 0xd2, 0x43, 0xac, 0x08, 0xd2, 0x84, 0xac, 0x4e, 0xb2, 0x09, 0xe2, 0x09, 0xd4, 0x80, 0xa2, 0x03, 0x5c, 0x01, 0x4c, 0x01, 0x61, \r
-0x00, 0x6c, 0x80, 0xc2, 0x49, 0xb2, 0x09, 0xe2, 0x40, 0xa2, 0x03, 0x72, 0x55, 0x61, 0x08, 0x94, 0x02, 0x6f, 0x02, 0x5c, 0x03, 0x61, 0x84, 0x37, 0xff, 0x6a, 0x4c, 0xef, 0x09, 0x94, 0x03, 0x24, \r
-0x02, 0x4f, 0xff, 0x6a, 0x4c, 0xef, 0x0a, 0x92, 0x0b, 0x96, 0x90, 0x67, 0x00, 0x6d, 0x0f, 0xd3, 0x20, 0x18, 0x4b, 0x29, 0x04, 0xd2, 0x0c, 0xd2, 0x0c, 0x94, 0x02, 0x6a, 0x04, 0xd2, 0x3c, 0xb2, \r
-0x05, 0xd2, 0x3a, 0xb2, 0x06, 0xd4, 0x09, 0xe2, 0x0d, 0xd2, 0x40, 0xa2, 0x04, 0x6c, 0xfa, 0x6d, 0x06, 0xf3, 0x0b, 0x6e, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0c, 0x92, \r
-0x0f, 0x93, 0x2a, 0x22, 0x0d, 0x94, 0x00, 0x6a, 0xc3, 0x67, 0x40, 0xc4, 0x17, 0x6d, 0x00, 0x6a, 0x90, 0x67, 0x1c, 0x6f, 0x04, 0xd2, 0x20, 0x18, 0x04, 0x28, 0x0f, 0xd2, 0x7d, 0x67, 0x87, 0x43, \r
-0x25, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0x80, 0xf0, 0x7e, 0xc9, 0x67, 0x44, 0x19, 0x4b, 0x80, 0xab, 0x7d, 0x67, 0xa0, 0xf0, 0x82, 0xc9, 0x87, 0x43, 0x1d, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0xa0, 0xf0, \r
-0x66, 0xc9, 0x67, 0x44, 0x21, 0x4b, 0x80, 0xab, 0xa0, 0xf0, 0x80, 0xc9, 0x0f, 0x92, 0x00, 0xf2, 0x5d, 0xc1, 0x00, 0xf2, 0x5e, 0xc1, 0x2d, 0x10, 0x0b, 0x92, 0x08, 0x94, 0x0e, 0x95, 0x04, 0xd2, \r
-0x0a, 0x97, 0x09, 0x92, 0x05, 0xd4, 0xd0, 0x67, 0x83, 0x67, 0x0f, 0xd3, 0x20, 0x18, 0x25, 0x2c, 0x06, 0xd2, 0x01, 0x6e, 0x0f, 0x93, 0x1e, 0x22, 0xc3, 0x67, 0xe2, 0x67, 0x90, 0x67, 0x17, 0x6d, \r
-0x20, 0x18, 0xf6, 0x27, 0x0f, 0xd2, 0x0f, 0x92, 0x80, 0xf0, 0xfe, 0xa9, 0xb0, 0x67, 0x82, 0x67, 0x00, 0x18, 0xb4, 0x52, 0x02, 0x6e, 0x90, 0x67, 0x20, 0x18, 0xfa, 0x25, 0x04, 0x6d, 0x01, 0x6a, \r
-0x4b, 0xea, 0x00, 0xf2, 0x54, 0xc9, 0x00, 0x6a, 0x00, 0xf2, 0x56, 0xc1, 0x20, 0x18, 0x95, 0x28, 0x00, 0x65, 0x01, 0x6e, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x46, 0x67, 0x00, 0xef, 0x0a, 0x63, \r
-0xb8, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x18, 0xb2, 0x19, 0xb3, 0x63, 0xea, 0x26, 0x61, \r
-0x18, 0xb2, 0x80, 0x9a, 0x18, 0xb3, 0x8e, 0xeb, 0x21, 0x2b, 0x02, 0xaa, 0x17, 0xb5, 0x1d, 0x10, 0x17, 0xb4, 0x42, 0x45, 0x43, 0xec, 0x1a, 0x61, 0xc0, 0xa2, 0xff, 0xf7, 0x1f, 0x6f, 0x43, 0x46, \r
-0x43, 0xe8, 0x14, 0x61, 0x45, 0xe5, 0x23, 0xec, 0x11, 0x61, 0x81, 0xa5, 0x60, 0xa5, 0x80, 0x34, 0x6d, 0xec, 0xec, 0xec, 0xe0, 0xf3, 0x14, 0x5c, 0x09, 0x60, 0x43, 0xe0, 0x0d, 0xb2, 0x03, 0x4d, \r
-0x91, 0xe2, 0x00, 0x18, 0x0d, 0x33, 0xec, 0xe8, 0xb1, 0x67, 0xe2, 0x28, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0xf0, 0xff, 0x10, 0x80, 0x24, 0xed, 0x10, 0x80, \r
-0x28, 0xed, 0x10, 0x80, 0x55, 0xab, 0x23, 0x87, 0x2e, 0xed, 0x10, 0x80, 0xff, 0xff, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x46, 0xb2, 0x60, 0xf1, \r
-0x44, 0xa2, 0x0e, 0xd4, 0x00, 0x68, 0x03, 0x2a, 0x01, 0x6a, 0x40, 0xc4, 0x7c, 0x10, 0x43, 0xb1, 0x0d, 0xe1, 0x44, 0xa3, 0x01, 0x6d, 0x46, 0x32, 0xac, 0xea, 0x6d, 0x22, 0x90, 0x67, 0x08, 0xd3, \r
-0x00, 0x18, 0x43, 0xeb, 0x09, 0xd5, 0x08, 0x93, 0x09, 0x95, 0x4b, 0x22, 0x44, 0xa3, 0x4c, 0xed, 0x06, 0x25, 0x90, 0x67, 0x00, 0x18, 0x75, 0xf3, 0x04, 0x05, 0x00, 0x69, 0x0b, 0x10, 0x41, 0xa1, \r
-0x01, 0x72, 0x02, 0x61, 0x40, 0xa1, 0xf5, 0x22, 0x04, 0x04, 0x35, 0xb5, 0x00, 0x18, 0x0d, 0x33, 0x0a, 0x6e, 0xf3, 0x17, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xe9, 0x32, 0xb3, 0x12, 0xea, 0x69, 0xe2, \r
-0xc0, 0xf0, 0x68, 0xa2, 0x25, 0x23, 0xe0, 0xf0, 0x83, 0xa2, 0x0e, 0xec, 0x21, 0x2c, 0x20, 0xf2, 0x9d, 0xa2, 0x01, 0x74, 0x1d, 0x61, 0x0f, 0x73, 0x1b, 0x60, 0x14, 0x73, 0x19, 0x60, 0x12, 0x73, \r
-0x12, 0x61, 0xc0, 0xf0, 0x58, 0xa2, 0x0f, 0x2a, 0x23, 0xb2, 0x60, 0xf1, 0x67, 0xa2, 0x0b, 0x2b, 0x60, 0xf1, 0x44, 0xa2, 0x02, 0x5a, 0x07, 0x61, 0x23, 0xb2, 0x20, 0xf0, 0x56, 0xa2, 0x03, 0x22, \r
-0x22, 0xb2, 0x40, 0xa2, 0x05, 0x22, 0x04, 0x04, 0xb1, 0x67, 0x00, 0x18, 0x66, 0xe9, 0x01, 0x6e, 0x01, 0x49, 0xff, 0x6a, 0x4c, 0xe9, 0x0a, 0x59, 0xcd, 0x61, 0x00, 0x6b, 0x1b, 0xb2, 0x60, 0xc2, \r
-0x1a, 0x10, 0x1b, 0xb3, 0x23, 0x6c, 0x0d, 0xe3, 0x8b, 0xec, 0x80, 0xc3, 0x19, 0xb3, 0x0d, 0xe3, 0x40, 0xc3, 0x19, 0xb3, 0x0d, 0xe3, 0x40, 0xc3, 0x18, 0xb3, 0x0d, 0xe3, 0x40, 0xc3, 0x18, 0xb3, \r
-0x0d, 0xe3, 0x40, 0xc3, 0x17, 0xb3, 0x0d, 0xe3, 0x40, 0xc3, 0x17, 0xb3, 0x0d, 0xe3, 0x40, 0xc3, 0x16, 0xb3, 0x0d, 0xe3, 0x40, 0xc3, 0x01, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x04, 0x58, 0x87, 0x61, \r
-0x0e, 0x93, 0x00, 0x6a, 0x40, 0xc3, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x07, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0xe8, 0xf4, 0x04, 0x80, \r
-0x20, 0x56, 0x11, 0x80, 0x3c, 0x95, 0x11, 0x80, 0xa0, 0x94, 0x10, 0x80, 0xac, 0x51, 0x11, 0x80, 0x50, 0x4d, 0x11, 0x80, 0x74, 0x4d, 0x11, 0x80, 0x58, 0x51, 0x11, 0x80, 0x20, 0x51, 0x11, 0x80, \r
-0xdc, 0x4d, 0x11, 0x80, 0xb0, 0x51, 0x11, 0x80, 0x64, 0x4d, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x0f, 0xb0, 0x40, 0x98, 0x61, 0x42, 0x08, 0x23, 0x24, 0x6b, 0x78, 0xea, \r
-0x0d, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x0d, 0xb3, 0x63, 0xda, 0x0d, 0x10, 0x82, 0xf3, 0x08, 0x69, 0x01, 0x6c, 0xb0, 0x67, 0x09, 0xb6, 0x00, 0x6f, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd1, 0x80, 0x98, \r
-0x00, 0x18, 0xbe, 0x1c, 0xb1, 0x67, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x10, 0x06, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0xfd, 0xbd, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, \r
-0x04, 0xd0, 0x00, 0x68, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xe8, 0x0d, 0xb3, 0x12, 0xea, 0x69, 0xe2, 0xc0, 0xf0, 0x68, 0xa2, 0x04, 0x73, 0x08, 0x61, 0x80, 0xf2, 0x5c, 0xa2, 0x02, 0x72, 0x0a, 0x60, \r
-0x90, 0x67, 0x20, 0x18, 0x85, 0x2d, 0x03, 0x6d, 0x01, 0x48, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xe8, 0x0a, 0x58, 0xe8, 0x61, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x20, 0x56, 0x11, 0x80, \r
-0xf2, 0x63, 0x1b, 0x62, 0x1a, 0xd1, 0x19, 0xd0, 0x20, 0xf5, 0x1c, 0xb2, 0x7d, 0x67, 0x40, 0xaa, 0x51, 0xcb, 0x20, 0xf0, 0x82, 0xa3, 0x20, 0xf5, 0x14, 0xb2, 0x92, 0x35, 0xa0, 0xc2, 0x13, 0xd5, \r
-0x20, 0xf0, 0x63, 0xa3, 0x01, 0x6a, 0x86, 0x34, 0x6e, 0x31, 0x4c, 0xe9, 0x66, 0x33, 0x4c, 0xeb, 0x24, 0x31, 0x6d, 0xe9, 0x07, 0x6b, 0x6c, 0xec, 0x10, 0xd4, 0x7c, 0x6c, 0x98, 0xe9, 0x00, 0xf5, \r
-0x10, 0xb3, 0xb1, 0x67, 0x12, 0xec, 0x6d, 0xe4, 0x12, 0xd3, 0x60, 0xa3, 0x10, 0x94, 0x6c, 0xea, 0x00, 0x18, 0x49, 0xbd, 0x14, 0xd2, 0x11, 0xd2, 0x11, 0x93, 0x0a, 0x6a, 0x58, 0xeb, 0xe0, 0xf4, \r
-0x14, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x61, 0xaa, 0xe0, 0xf4, 0x0c, 0xb2, 0x60, 0xc2, 0xe0, 0xf4, 0x0c, 0xb2, 0x40, 0x9a, 0x04, 0x22, 0x20, 0xf0, 0x02, 0x04, 0x40, 0xea, 0x00, 0x65, 0x13, 0x94, \r
-0x09, 0x74, 0x07, 0x61, 0x10, 0x95, 0x00, 0x6c, 0x01, 0x25, 0x82, 0x41, 0x00, 0x18, 0xb8, 0x82, 0x00, 0x65, 0x7d, 0x67, 0x20, 0xf0, 0x43, 0xa3, 0x01, 0x68, 0x0c, 0xea, 0x2d, 0x22, 0xc0, 0xf4, \r
-0x00, 0xb2, 0x40, 0xa2, 0x03, 0x6b, 0x6c, 0xea, 0x14, 0x22, 0xa0, 0xf4, 0x18, 0xb3, 0x46, 0xab, 0x9d, 0x67, 0x50, 0xcc, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0xa0, 0xf4, 0x0c, 0xb4, 0x12, 0xea, \r
-0x49, 0xe4, 0x00, 0x6c, 0x20, 0xf2, 0x9d, 0xc2, 0xe0, 0xf0, 0xa3, 0xa2, 0x00, 0x18, 0x13, 0x3d, 0x8e, 0xa3, 0x80, 0xf4, 0x18, 0xb2, 0x60, 0xf1, 0x4b, 0xa2, 0x20, 0xf2, 0x0d, 0x22, 0x00, 0x6a, \r
-0x80, 0xf4, 0x0c, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x06, 0xd2, 0x06, 0x6c, 0xfa, 0x6d, 0x66, 0xf0, 0x02, 0x6e, 0xc0, 0xf5, 0x19, 0x6f, 0x32, 0x10, 0x10, 0x94, 0xb1, 0x67, 0x20, 0x18, 0xc0, 0x0e, \r
-0x09, 0x06, 0x0d, 0x2a, 0x10, 0x93, 0x60, 0xf4, 0x0c, 0xb2, 0x69, 0xe2, 0x40, 0xa2, 0x01, 0x72, 0x00, 0xf2, 0x12, 0x61, 0x60, 0xf4, 0x00, 0xb2, 0x69, 0xe2, 0x00, 0xc2, 0x0d, 0x12, 0x13, 0x94, \r
-0x02, 0x74, 0x20, 0x61, 0x20, 0xf4, 0x18, 0xb2, 0x40, 0xa2, 0x00, 0xf2, 0x05, 0x2a, 0x20, 0xf4, 0x1c, 0xb2, 0x44, 0x9a, 0x02, 0x72, 0xe0, 0xf1, 0x1f, 0x60, 0x00, 0x18, 0x1b, 0xaa, 0x00, 0x65, \r
-0x00, 0x18, 0xa5, 0x3a, 0x00, 0x65, 0x20, 0xf4, 0x08, 0xb3, 0x04, 0xd0, 0x05, 0xd3, 0x06, 0xd2, 0x06, 0x6c, 0xfa, 0x6d, 0x86, 0xf0, 0x07, 0x6e, 0xc0, 0xf5, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, \r
-0x00, 0x65, 0xea, 0x11, 0x10, 0x94, 0xb1, 0x67, 0x00, 0x18, 0xe8, 0xdf, 0x08, 0x06, 0xff, 0x72, 0xe0, 0xf1, 0x02, 0x60, 0x00, 0xf4, 0x04, 0xb2, 0x40, 0x9a, 0xbd, 0x67, 0x10, 0xad, 0x0d, 0x22, \r
-0x14, 0x93, 0x3c, 0x6c, 0x12, 0x95, 0x98, 0xeb, 0x7d, 0x67, 0xd1, 0xab, 0x12, 0xec, 0x91, 0xe5, 0x04, 0x4c, 0x40, 0xea, 0xb0, 0x67, 0xc0, 0xf1, 0x0f, 0x2a, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xe8, \r
-0x13, 0x93, 0xf1, 0xb2, 0x12, 0x94, 0x12, 0xe8, 0x41, 0xe0, 0x01, 0x6a, 0x44, 0xeb, 0x14, 0x93, 0x15, 0xd2, 0x3c, 0x6a, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x72, 0xa2, 0x02, 0x73, \r
-0xe0, 0xf0, 0x00, 0x61, 0x20, 0xf0, 0x70, 0xa2, 0xff, 0x73, 0xc0, 0xf0, 0x1b, 0x60, 0x20, 0xf0, 0x74, 0xa2, 0x10, 0x95, 0xae, 0xeb, 0xc0, 0xf0, 0x15, 0x2b, 0x13, 0x95, 0x96, 0xaa, 0xa0, 0x33, \r
-0x70, 0x33, 0x8e, 0xeb, 0xc0, 0xf0, 0x0e, 0x2b, 0x20, 0xf0, 0x76, 0xa2, 0x01, 0x4b, 0x20, 0xf0, 0x76, 0xc2, 0xc0, 0xf0, 0x4d, 0xa0, 0x02, 0x72, 0x15, 0x61, 0x15, 0x93, 0x08, 0xf4, 0x10, 0x6a, \r
-0x6c, 0xea, 0x06, 0x22, 0xa0, 0xf0, 0x5c, 0xa8, 0x01, 0x4a, 0xa0, 0xf0, 0x5c, 0xc8, 0x0a, 0x10, 0x15, 0x94, 0x11, 0xf1, 0x00, 0x6a, 0x8c, 0xea, 0x05, 0x22, 0xc0, 0xf0, 0x42, 0xa8, 0x01, 0x4a, \r
-0xc0, 0xf0, 0x42, 0xc8, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xbd, 0x67, 0x70, 0xad, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x50, 0xa2, 0x6a, 0xea, 0x0e, 0x60, 0x02, 0x6c, 0x04, 0xd4, \r
-0xcb, 0xb4, 0x05, 0xd4, 0xfa, 0x6d, 0x02, 0x6c, 0xc6, 0xf0, 0x0e, 0x6e, 0x61, 0xf4, 0x17, 0x6f, 0x06, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, \r
-0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x15, 0x61, 0xbf, 0xb2, 0x60, 0xf1, 0x45, 0xa2, 0x11, 0x22, 0x20, 0x18, 0x02, 0x26, 0x00, 0x65, 0x2e, 0xea, 0x0c, 0x22, 0xc0, 0xf0, \r
-0x58, 0xa0, 0x09, 0x2a, 0x00, 0x18, 0xac, 0x3b, 0x01, 0x6c, 0xbd, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xb9, 0xb3, \r
-0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0xb6, 0xa2, 0xc0, 0xf0, 0x4a, 0xab, 0x03, 0x6c, 0x42, 0x32, 0x4a, 0x32, 0x8c, 0xea, 0x44, 0x32, 0x42, 0xed, 0x2f, 0x61, 0xac, 0xb2, 0x60, 0xf1, 0x47, 0xa2, \r
-0x2b, 0x22, 0x17, 0xd3, 0x20, 0x18, 0x02, 0x26, 0x16, 0xd4, 0x2e, 0xea, 0x17, 0x93, 0x16, 0x94, 0x23, 0x22, 0xc0, 0xf0, 0x59, 0xa0, 0x20, 0x2a, 0xab, 0xb2, 0xa0, 0xaa, 0x02, 0x6a, 0xac, 0xea, \r
-0x1b, 0x2a, 0xc0, 0xf0, 0x6a, 0xab, 0xa9, 0xb5, 0x40, 0xa5, 0x62, 0x33, 0x72, 0x33, 0x8c, 0xeb, 0x01, 0x4a, 0xff, 0x6e, 0x64, 0x33, 0xcc, 0xea, 0x01, 0x4b, 0x7a, 0xea, 0x01, 0x2b, 0xe5, 0xe8, \r
-0x40, 0xc5, 0x10, 0xea, 0x09, 0x2a, 0x00, 0x18, 0x97, 0x3b, 0x01, 0x6c, 0x9c, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0x9a, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x10, 0x6b, \r
-0x6c, 0xea, 0x30, 0x22, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x04, 0x61, 0x95, 0xb2, 0x00, 0xf1, 0x54, 0xa2, 0x06, 0x2a, \r
-0xe0, 0xf0, 0x47, 0xa0, 0x1f, 0x2a, 0x93, 0xb2, 0x40, 0xa2, 0x1c, 0x2a, 0x92, 0xb3, 0x40, 0xa3, 0xff, 0x6c, 0x01, 0x4a, 0x8c, 0xea, 0x40, 0xc3, 0x8a, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x07, 0x6c, \r
-0x7a, 0x33, 0x8c, 0xeb, 0x64, 0x33, 0x01, 0x4b, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xea, 0x09, 0x2a, 0x00, 0x18, 0x6c, 0xd0, 0x01, 0x6c, 0x88, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, \r
-0x8d, 0xea, 0x40, 0xc3, 0xe0, 0xf0, 0x67, 0xa0, 0x15, 0x94, 0xff, 0x6a, 0x01, 0x5b, 0x78, 0x67, 0x6b, 0xeb, 0x6c, 0xea, 0x19, 0xf5, 0x18, 0x6b, 0x8c, 0xeb, 0x04, 0x23, 0x10, 0x95, 0x02, 0x25, \r
-0x01, 0x6a, 0x02, 0x10, 0xff, 0x72, 0x03, 0x60, 0x7d, 0xb4, 0x31, 0xe4, 0x40, 0xc4, 0x6f, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x10, 0x60, 0x80, 0xf2, \r
-0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x61, 0x11, 0x94, 0x0a, 0x6a, 0xbd, 0x67, 0x58, 0xec, 0x91, 0xad, 0x60, 0xb5, 0x17, 0xd3, 0x12, 0xea, 0x00, 0x18, 0x86, 0x07, 0x55, 0xe5, 0x17, 0x93, 0x06, 0x23, \r
-0x5d, 0x67, 0x90, 0xaa, 0x00, 0x18, 0x51, 0xa3, 0x17, 0xd3, 0x17, 0x93, 0x5f, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x04, 0x60, 0x80, 0xf2, 0x5c, 0xa0, \r
-0x03, 0x72, 0x0c, 0x60, 0x59, 0xb2, 0x29, 0xe2, 0x80, 0xf1, 0x40, 0xa2, 0x07, 0x22, 0x91, 0x67, 0x00, 0x18, 0xce, 0x06, 0x17, 0xd3, 0x10, 0xd2, 0x17, 0x93, 0x02, 0x10, 0x00, 0x6c, 0x10, 0xd4, \r
-0x11, 0x95, 0x2a, 0x25, 0x5f, 0xb2, 0x29, 0xe2, 0x44, 0xa2, 0x01, 0x6c, 0x46, 0x32, 0x8c, 0xea, 0x23, 0x22, 0x22, 0x2b, 0x5c, 0xb2, 0xa9, 0xe2, 0x60, 0xa2, 0x6a, 0x33, 0x60, 0xc2, 0xe0, 0xf0, \r
-0x47, 0xa0, 0x01, 0x72, 0x19, 0x61, 0x59, 0xb2, 0xa9, 0xe2, 0x40, 0xa2, 0x15, 0x2a, 0x60, 0xf0, 0x56, 0xa8, 0x7d, 0x67, 0x01, 0x4a, 0x60, 0xf0, 0x56, 0xc8, 0x20, 0xf3, 0x0b, 0x6a, 0x58, 0xcb, \r
-0x53, 0xb2, 0x80, 0x9a, 0x0d, 0x92, 0xb0, 0xab, 0x0b, 0x96, 0x04, 0xd2, 0x0c, 0x97, 0x0e, 0x92, 0x0a, 0xd5, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x4e, 0xb2, 0x40, 0x9a, 0x06, 0x22, 0x7d, 0x67, \r
-0xb1, 0xab, 0x10, 0x96, 0x40, 0xea, 0x08, 0x04, 0x57, 0x2a, 0x44, 0xb2, 0x40, 0xa2, 0x19, 0x2a, 0x40, 0xb2, 0x40, 0xa2, 0x16, 0x2a, 0xc0, 0xf0, 0x6d, 0xa0, 0x02, 0x6c, 0x46, 0xb2, 0x8e, 0xeb, \r
-0x0a, 0x23, 0x01, 0x6b, 0x60, 0xc2, 0x37, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x03, 0x6c, 0x42, 0x32, 0x46, 0x32, 0x4c, 0xec, 0x03, 0x10, 0x60, 0xc2, 0x40, 0xb2, 0x80, 0xa2, 0x00, 0x18, 0x6c, 0xd0, \r
-0x00, 0x65, 0x10, 0x95, 0x02, 0x2d, 0x13, 0x92, 0x08, 0x22, 0x13, 0x93, 0x01, 0x73, 0x27, 0x61, 0x10, 0x94, 0x25, 0x2c, 0x25, 0xb2, 0x44, 0x9a, 0x22, 0x22, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x6d, \r
-0xae, 0xea, 0x1d, 0x2a, 0x36, 0xb3, 0x02, 0x49, 0x28, 0x31, 0x27, 0xe3, 0x60, 0x99, 0x00, 0x53, 0x16, 0x61, 0x11, 0x93, 0x14, 0x23, 0x11, 0x94, 0x0a, 0x6b, 0x18, 0xf0, 0x00, 0x6d, 0x78, 0xec, \r
-0x14, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0x83, 0xab, 0x00, 0x18, 0x5c, 0x3b, 0x16, 0xd2, 0x11, 0x95, 0x16, 0x92, 0x26, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x23, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x13, 0xb2, \r
-0x60, 0xf1, 0x49, 0xa2, 0x01, 0x72, 0x08, 0x61, 0x00, 0xf2, 0x52, 0xa0, 0x05, 0x22, 0xa0, 0xf0, 0x44, 0xa8, 0x01, 0x4a, 0xa0, 0xf0, 0x44, 0xc8, 0x1b, 0x97, 0x1a, 0x91, 0x19, 0x90, 0x00, 0xef, \r
-0x0e, 0x63, 0x00, 0x65, 0x08, 0x00, 0x00, 0xb6, 0x89, 0x04, 0x11, 0x80, 0xf8, 0x37, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xd8, 0x1a, 0x11, 0x80, 0xdc, 0x1a, 0x11, 0x80, 0x0c, 0x52, 0x11, 0x80, \r
-0x18, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x19, 0x11, 0x80, 0xdc, 0x19, 0x11, 0x80, 0x28, 0x1a, 0x11, 0x80, 0x37, 0x1a, 0x11, 0x80, \r
-0x4c, 0x00, 0x11, 0x80, 0x20, 0x01, 0x00, 0xb6, 0x38, 0x1a, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x8e, 0x1b, 0x11, 0x80, 0x36, 0x1a, 0x11, 0x80, 0x34, 0x1a, 0x11, 0x80, 0xc8, 0x19, 0x11, 0x80, \r
-0xd4, 0x3b, 0x11, 0x80, 0x90, 0x19, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80, 0xe4, 0x37, 0x11, 0x80, 0x24, 0x1a, 0x11, 0x80, 0xf9, 0x19, 0x11, 0x80, 0x49, 0x00, 0x11, 0x80, 0x0c, 0xa3, 0x00, 0xb0, \r
-0xfc, 0x63, 0x07, 0x62, 0x0f, 0xb3, 0x60, 0xf1, 0x64, 0x9b, 0x0f, 0xb2, 0x6c, 0xea, 0x0f, 0xb3, 0x6e, 0xea, 0x13, 0x2a, 0x0e, 0xb2, 0xff, 0xf7, 0x1f, 0x6b, 0xff, 0x6c, 0x40, 0xaa, 0x1f, 0x4c, \r
-0x4c, 0xeb, 0x5d, 0x67, 0x68, 0xca, 0x08, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x7d, 0x67, 0x50, 0xc3, 0x00, 0x18, 0x5c, 0x3b, 0xa8, 0xab, 0x07, 0x97, 0x00, 0xef, 0x04, 0x63, \r
-0x2c, 0x52, 0x11, 0x80, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x00, 0xb6, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x09, 0xb3, 0x60, 0x9b, 0x81, 0x43, \r
-0x07, 0x24, 0x24, 0x6c, 0x98, 0xeb, 0x07, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0x06, 0xb4, 0x83, 0xdb, 0x00, 0x1c, 0x7a, 0x1b, 0x82, 0x67, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x20, 0x06, 0x11, 0x80, \r
-0xb8, 0x8b, 0x11, 0x80, 0xf1, 0xe1, 0x10, 0x80, 0xf0, 0x63, 0x1f, 0x62, 0x1e, 0xd1, 0x1d, 0xd0, 0x80, 0xac, 0xc0, 0xf2, 0x0c, 0x68, 0xc3, 0xb2, 0x18, 0xec, 0x18, 0xd4, 0xa0, 0xa5, 0x12, 0xd5, \r
-0x12, 0xe8, 0x41, 0xe0, 0xe0, 0xf0, 0x47, 0xa0, 0x13, 0xd2, 0xa0, 0xf0, 0x60, 0xa8, 0x19, 0xd3, 0xa0, 0xf0, 0x82, 0xa8, 0x80, 0xf0, 0x7e, 0xa8, 0x17, 0xd4, 0xa0, 0xf0, 0xa6, 0xa8, 0x16, 0xd5, \r
-0xe0, 0xf0, 0x4e, 0xa0, 0x11, 0xd2, 0x00, 0x6a, 0xc0, 0xf2, 0x44, 0xc0, 0xc0, 0xf2, 0x45, 0xc0, 0xe0, 0xf0, 0x23, 0xa0, 0x11, 0x94, 0x1b, 0xd3, 0x00, 0x18, 0x49, 0xbd, 0xb1, 0x67, 0x0a, 0x6c, \r
-0x98, 0xea, 0x14, 0xd2, 0xb0, 0xb2, 0x12, 0xec, 0x49, 0xe4, 0x15, 0xd2, 0xe0, 0xf0, 0xa3, 0xa0, 0x00, 0x18, 0x56, 0x3d, 0x11, 0x94, 0x12, 0x92, 0x1b, 0x93, 0x0c, 0x22, 0x13, 0x94, 0x01, 0x74, \r
-0x09, 0x61, 0x15, 0x92, 0x03, 0xf4, 0x00, 0x6c, 0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x1b, 0x93, 0x00, 0x1c, 0x73, 0x1b, 0x1b, 0xd3, 0x0a, 0x04, 0xb1, 0x67, 0x00, 0x18, \r
-0x44, 0x97, 0x1a, 0xd2, 0x0a, 0x92, 0xa1, 0xb4, 0x1b, 0x93, 0x46, 0x32, 0x01, 0x4a, 0x8c, 0xea, 0x0a, 0xd2, 0xa0, 0xf2, 0x9e, 0xa8, 0x10, 0xd4, 0x07, 0x2c, 0x12, 0x95, 0x01, 0x75, 0x04, 0x61, \r
-0x00, 0x1c, 0x7a, 0x1b, 0x1a, 0x94, 0x26, 0x11, 0x06, 0x22, 0x05, 0x23, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xe9, 0x01, 0x10, 0x00, 0x69, 0xff, 0xf7, 0x1f, 0x6c, 0x27, 0xe3, 0x8c, 0xe9, \r
-0x19, 0x94, 0x85, 0xe1, 0x23, 0xeb, 0x01, 0x60, 0x67, 0xe1, 0x12, 0x95, 0x01, 0x75, 0x02, 0x60, 0x10, 0xd3, 0x16, 0x10, 0x8d, 0xb3, 0xa0, 0xf2, 0x8c, 0x98, 0x8c, 0xeb, 0x43, 0xeb, 0x67, 0xe2, \r
-0x03, 0x61, 0x8b, 0xb1, 0x67, 0xe1, 0x45, 0xe1, 0x10, 0x95, 0x4b, 0xe3, 0xba, 0xe9, 0x01, 0x2d, 0xe5, 0xe8, 0x12, 0xe9, 0x01, 0x49, 0xb8, 0xe9, 0x12, 0xe9, 0x25, 0xe2, 0x83, 0xb2, 0x4c, 0xe9, \r
-0x11, 0x93, 0xe0, 0xf0, 0xa3, 0xa0, 0x02, 0x6c, 0x74, 0x32, 0xa0, 0x35, 0xff, 0x6b, 0x6c, 0xea, 0xac, 0x35, 0x4d, 0xed, 0xff, 0xf7, 0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x0a, 0x93, \r
-0x71, 0xe1, 0x11, 0xd4, 0x05, 0x10, 0x11, 0x95, 0x10, 0x92, 0x55, 0xe5, 0x11, 0xd5, 0x45, 0xe1, 0x08, 0x59, 0xf9, 0x61, 0x00, 0x18, 0xa5, 0x3a, 0x1b, 0xd3, 0x11, 0x94, 0x1b, 0x93, 0x6f, 0xe4, \r
-0x64, 0x33, 0x6d, 0xe2, 0x70, 0xd8, 0x10, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4e, 0x6c, 0x11, 0x95, 0xff, 0xf7, 0x1f, 0x6a, 0x48, 0x6c, 0x4c, 0xed, 0x19, 0xd5, 0x00, 0x18, 0x5c, 0x3b, 0x1b, 0xd2, \r
-0x13, 0x93, 0x12, 0x2b, 0x16, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0x6c, 0x17, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4a, 0x6c, 0x67, 0xb3, 0x1b, 0x92, 0x00, 0xf2, 0x1c, 0x6c, 0xa0, 0xab, 0x40, 0x6b, \r
-0x4c, 0xed, 0x6d, 0xed, 0x4c, 0xed, 0x16, 0x10, 0x63, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x10, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x16, 0x94, 0x03, 0x24, 0x4c, 0x6c, 0x01, 0x6d, 0x05, 0x10, \r
-0x4c, 0x6c, 0x00, 0x6d, 0x02, 0x10, 0x16, 0x95, 0x4c, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x17, 0x95, 0x4a, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x07, 0x6d, 0x00, 0x18, 0x5c, 0x3b, \r
-0x00, 0x6c, 0x12, 0x95, 0x0e, 0x2d, 0x13, 0x92, 0x01, 0x72, 0x0b, 0x61, 0x14, 0x93, 0x53, 0xb2, 0x69, 0xe2, 0xa0, 0xc2, 0x52, 0xb2, 0x69, 0xe2, 0x7d, 0x67, 0x87, 0x43, 0x41, 0x4c, 0x60, 0xa4, \r
-0x60, 0xc2, 0x1a, 0x94, 0x00, 0x1c, 0x7a, 0x1b, 0x02, 0x49, 0x00, 0x18, 0x1c, 0x04, 0x00, 0x65, 0x01, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0x91, 0xbe, 0x5e, 0x6c, 0x11, 0x95, 0x19, 0x94, 0x03, 0x6a, \r
-0x04, 0xd2, 0x48, 0xb2, 0x05, 0xd2, 0x06, 0xd4, 0xa4, 0x32, 0x07, 0xd5, 0x00, 0x6c, 0xfa, 0x6d, 0x05, 0xf4, 0x19, 0x6e, 0x40, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd2, 0x12, 0x92, 0x1f, 0x2a, \r
-0x13, 0x93, 0x01, 0x73, 0x0c, 0x61, 0x15, 0x92, 0x18, 0xf0, 0x00, 0x6c, 0x03, 0xf4, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x20, 0x6a, 0x00, 0xf2, 0x50, 0xc0, 0x24, 0x10, 0x51, 0x59, \r
-0x06, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x93, 0x18, 0xf0, 0x00, 0x6c, 0x01, 0xf4, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xab, 0x13, 0x94, \r
-0x12, 0x2c, 0x12, 0x95, 0x10, 0x25, 0x51, 0x59, 0x0e, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x92, 0x01, 0xf4, 0x00, 0x6c, 0x18, 0xf0, 0x00, 0x6d, \r
-0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x10, 0x94, 0x7d, 0x67, 0x60, 0xf2, 0x0b, 0x6a, 0x5a, 0xcb, 0x25, 0xb2, 0x0b, 0xd4, 0x80, 0x9a, 0x0e, 0x92, 0x10, 0x95, 0x0c, 0x96, 0x04, 0xd2, 0x0d, 0x97, \r
-0x0f, 0x92, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x03, 0x6a, 0x10, 0x95, 0x04, 0xd2, 0x1d, 0xb2, 0x05, 0xd2, 0x16, 0x93, 0x17, 0x92, 0x06, 0xd5, 0x05, 0x6c, 0xfa, 0x6d, 0x65, 0xf4, 0x0f, 0x6e, \r
-0x82, 0xf7, 0x1e, 0x6f, 0x07, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd3, 0x14, 0x94, 0x0d, 0x24, 0x64, 0x67, 0xff, 0x4b, 0x68, 0x33, 0x15, 0xb4, 0x71, 0xe4, 0x00, 0x6a, 0x40, 0xdc, 0x14, 0xb4, \r
-0x71, 0xe4, 0x40, 0xdc, 0x13, 0xb4, 0x6d, 0xe4, 0x40, 0xdb, 0x18, 0x95, 0x12, 0xb2, 0x00, 0x6b, 0xa9, 0xe2, 0x60, 0xc2, 0x1f, 0x97, 0x1e, 0x91, 0x1d, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x10, 0x63, \r
-0x20, 0x56, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x02, 0x00, 0xb6, 0x4c, 0x00, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80, 0x90, 0x19, 0x11, 0x80, \r
-0xc8, 0xe7, 0x04, 0x80, 0xa0, 0x48, 0x11, 0x80, 0x44, 0x1a, 0x11, 0x80, 0x74, 0x1a, 0x11, 0x80, 0xa4, 0x1a, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd1, 0x0d, 0xd0, \r
-0x7a, 0xb2, 0x01, 0x6c, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x78, 0xb3, 0x60, 0xab, 0x09, 0xd3, 0x78, 0xb3, 0x60, 0xa3, 0x8e, 0xeb, 0x04, 0x2b, 0x77, 0xb4, 0x60, 0xc4, 0x77, 0xb4, \r
-0x60, 0xc4, 0x00, 0x6b, 0x08, 0xd3, 0xd5, 0x10, 0x75, 0xb3, 0x60, 0x9b, 0x05, 0x23, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb, 0xc0, 0xf0, 0x12, 0x23, 0x09, 0x94, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb, \r
-0x8f, 0xe8, 0x4c, 0xe8, 0x00, 0x31, 0x20, 0x31, 0x23, 0x31, 0x23, 0x31, 0x03, 0x23, 0x00, 0x18, 0x05, 0x9c, 0x00, 0x65, 0x6b, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x0f, 0x22, \r
-0x00, 0x51, 0x0d, 0x60, 0x00, 0x18, 0xde, 0x1a, 0x00, 0x65, 0x67, 0xb2, 0x40, 0xf0, 0x63, 0xa2, 0x06, 0x23, 0xff, 0xf7, 0x1e, 0x6b, 0x6c, 0xe8, 0x00, 0x6b, 0x40, 0xf0, 0x63, 0xc2, 0x08, 0x6a, \r
-0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xcd, 0x09, 0x00, 0x65, 0x02, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x80, 0x18, 0x90, 0x2f, 0x00, 0x65, 0x01, 0x6a, 0x0c, 0xea, 0x46, 0x22, 0x00, 0x18, 0x42, 0x13, \r
-0x00, 0x6c, 0x5a, 0xb2, 0x40, 0xa2, 0x40, 0x22, 0x59, 0xb2, 0x60, 0xf1, 0x44, 0xa2, 0x3c, 0x22, 0x58, 0xb1, 0xe0, 0xf0, 0x47, 0xa1, 0x01, 0x72, 0x37, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x5a, \r
-0x33, 0x61, 0xc0, 0xf0, 0x4d, 0xa1, 0x02, 0x6b, 0x6e, 0xea, 0x2e, 0x2a, 0xe0, 0xf0, 0x8e, 0xa1, 0xe0, 0xf0, 0xa3, 0xa1, 0xc3, 0x67, 0x00, 0x18, 0x8f, 0x3c, 0x0a, 0xd2, 0x00, 0xf2, 0x65, 0xa1, \r
-0x0a, 0x92, 0x0f, 0x73, 0x13, 0x60, 0x9d, 0x67, 0x01, 0x6b, 0x03, 0x6e, 0x78, 0xc4, 0x5a, 0xc4, 0x64, 0x6b, 0x00, 0x6c, 0x06, 0x05, 0xe6, 0x67, 0x04, 0xd3, 0x00, 0x18, 0x23, 0xe3, 0x05, 0xd2, \r
-0x0f, 0x6a, 0x00, 0xf2, 0x45, 0xc1, 0x00, 0x18, 0xce, 0x06, 0x00, 0x6c, 0x3f, 0xb2, 0xa0, 0xa2, 0xe1, 0xf7, 0x1d, 0x6a, 0xa0, 0x35, 0xb0, 0x35, 0x4d, 0xed, 0x3f, 0xb2, 0x81, 0xa2, 0xff, 0xf7, \r
-0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x20, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf4, 0x05, 0x00, 0x65, 0x04, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x43, 0x11, 0x00, 0x65, \r
-0x02, 0xf0, 0x00, 0x6a, 0x0c, 0xea, 0x09, 0x22, 0x00, 0x18, 0x5f, 0x11, 0x00, 0x65, 0x33, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb6, 0xa3, 0x00, 0x65, 0x00, 0xf6, 0x00, 0x6a, 0x0c, 0xea, \r
-0x06, 0x22, 0x2f, 0xb2, 0xff, 0xf7, 0x1f, 0x6c, 0x40, 0xaa, 0x4c, 0xec, 0x08, 0xd4, 0x00, 0xf2, 0x00, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf6, 0x12, 0x08, 0x94, 0x00, 0xf4, 0x00, 0x6a, \r
-0x0c, 0xea, 0x0f, 0x22, 0x00, 0x18, 0x2f, 0x13, 0x08, 0x94, 0xfe, 0xf7, 0x1f, 0x6d, 0x00, 0x18, 0xac, 0xbe, 0x5e, 0x6c, 0x1b, 0xb2, 0xe0, 0xf0, 0x54, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb9, 0xab, \r
-0x00, 0x65, 0x01, 0xf0, 0x00, 0x69, 0x50, 0x67, 0x2c, 0xea, 0x07, 0x22, 0x00, 0x18, 0x17, 0x13, 0x00, 0x65, 0x5e, 0x6c, 0x00, 0x18, 0x91, 0xbe, 0xb1, 0x67, 0xff, 0x6a, 0x01, 0x4a, 0x0c, 0xea, \r
-0x03, 0x22, 0x00, 0x18, 0x46, 0x05, 0x00, 0x65, 0x08, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x09, 0x94, 0x8f, 0xeb, 0x4c, 0xeb, 0x3f, 0xf7, 0x06, 0x2b, 0x0f, 0x97, 0x0e, 0x91, \r
-0x0d, 0x90, 0x00, 0xef, 0x08, 0x63, 0x00, 0x65, 0xbe, 0x00, 0x00, 0xb6, 0x7e, 0x04, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0x0c, 0x3b, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80, \r
-0x4c, 0x00, 0x11, 0x80, 0x50, 0x46, 0x11, 0x80, 0xf8, 0x95, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0xf0, 0x1a, 0x11, 0x80, 0x5c, 0x00, 0x00, 0xb6, \r
-0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x2b, 0xb2, 0x40, 0x9a, 0x1e, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x40, 0x9c, 0x04, 0x67, 0x6c, 0xea, 0x7c, 0x6b, 0x4c, 0xeb, 0x40, 0xdc, 0x05, 0x23, \r
-0x25, 0xb3, 0x26, 0xb2, 0x00, 0x18, 0xe5, 0x39, 0x60, 0xda, 0x61, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x99, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x03, 0x22, \r
-0x80, 0x18, 0xf6, 0x31, 0x00, 0x65, 0x61, 0xa0, 0x10, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xe0, 0x03, 0x00, 0x65, 0x61, 0xa0, 0x08, 0x6a, 0x4c, 0xeb, 0x0a, 0x23, 0x15, 0xb3, 0x61, 0xa3, \r
-0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x65, 0x00, 0x18, 0xe6, 0x37, 0x00, 0x65, 0x61, 0xa0, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, \r
-0xad, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x20, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x2d, 0x02, 0x00, 0x65, 0x0b, 0xb2, 0x60, 0xa2, 0x04, 0x23, 0x00, 0x6b, 0x00, 0x18, 0x5a, 0x33, 0x60, 0xc2, \r
-0x00, 0x6b, 0x08, 0xb2, 0x60, 0xc2, 0x05, 0x97, 0x04, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x03, 0x63, 0xf4, 0x21, 0x11, 0x80, 0x32, 0x97, 0x79, 0x23, 0x60, 0x8b, 0x10, 0x80, 0x98, 0x07, 0x11, 0x80, \r
-0xe4, 0x07, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x22, 0xb0, 0x40, 0xa0, 0x01, 0x69, 0x2c, 0xea, 0x38, 0x22, 0x21, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x00, 0x18, 0x64, 0x35, \r
-0x04, 0xd2, 0x04, 0x92, 0x1e, 0xb3, 0xff, 0x6c, 0x60, 0xda, 0x1e, 0xb2, 0x60, 0x9a, 0x40, 0xa0, 0x40, 0xf7, 0x62, 0x33, 0x46, 0x32, 0x2c, 0xea, 0x8c, 0xea, 0x2c, 0xeb, 0x4e, 0xeb, 0x04, 0x2b, \r
-0x19, 0xb3, 0x80, 0x9b, 0x01, 0x4c, 0x80, 0xdb, 0x18, 0xb3, 0x80, 0xa3, 0x07, 0x6b, 0x8c, 0xeb, 0x1a, 0x23, 0x40, 0x6b, 0x8c, 0xeb, 0x17, 0x2b, 0x0f, 0xb3, 0xa0, 0xa3, 0x08, 0x6b, 0xac, 0xeb, \r
-0x12, 0x23, 0x10, 0xb3, 0x04, 0x6c, 0xac, 0xec, 0x60, 0x9b, 0x06, 0x24, 0x40, 0xf7, 0x62, 0x33, 0x01, 0x6c, 0x8c, 0xeb, 0x6e, 0xea, 0x02, 0x10, 0x0d, 0xb2, 0x40, 0xa2, 0x04, 0x2a, 0x0a, 0xb2, \r
-0x60, 0x9a, 0x01, 0x4b, 0x60, 0xda, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x98, 0x96, 0x11, 0x80, 0xcc, 0x07, 0x11, 0x80, 0xed, 0xb8, 0x10, 0x80, \r
-0x50, 0xa0, 0x00, 0xb0, 0x08, 0x22, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x1d, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x20, 0x6b, 0x6c, 0xea, 0x2d, 0x2a, \r
-0x1b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x04, 0x72, 0x28, 0x60, 0x03, 0x72, 0x26, 0x60, 0x19, 0xb2, 0x40, 0x9a, 0x23, 0x2a, 0x18, 0xb2, 0x40, 0xa2, 0x01, 0x6f, 0x18, 0xb3, 0x56, 0x36, 0xec, 0xee, \r
-0x01, 0x4e, 0x64, 0x6f, 0xf8, 0xee, 0x80, 0xab, 0xff, 0x6d, 0x12, 0xee, 0xc2, 0xec, 0x12, 0x61, 0x40, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x13, 0x23, 0x07, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x0f, 0x23, \r
-0x80, 0x18, 0x27, 0x2e, 0x00, 0x65, 0x00, 0x6c, 0x01, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x65, 0x05, 0x10, 0x01, 0x4c, 0x80, 0xcb, 0x02, 0x10, 0x01, 0x6a, 0x01, 0x10, 0x00, 0x6a, \r
-0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0x92, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, \r
-0x12, 0xb2, 0xa0, 0xa2, 0x40, 0x6a, 0x60, 0x9c, 0xac, 0xea, 0xff, 0x6c, 0x0d, 0x22, 0x07, 0x6a, 0xac, 0xea, 0x8c, 0xea, 0x09, 0x22, 0x8c, 0xeb, 0x13, 0x23, 0x00, 0x6b, 0x0c, 0xb2, 0x60, 0xca, \r
-0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x0c, 0x10, 0xff, 0x6a, 0x6c, 0xea, 0x09, 0x22, 0x09, 0xb2, 0x60, 0xa2, 0x1e, 0x6a, 0x6c, 0xea, 0x06, 0x6b, 0x6e, 0xea, 0x02, 0x2a, 0x06, 0xb3, 0x40, 0xc3, \r
-0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x94, 0x96, 0x11, 0x80, 0x92, 0x96, 0x11, 0x80, 0x44, 0x20, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2, \r
-0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x94, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2, \r
-0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x94, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x12, 0xb2, 0x60, 0xa2, \r
-0x40, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x07, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x0d, 0xb3, 0x0d, 0xb2, 0x60, 0xda, 0x0d, 0xb3, 0x7c, 0x4b, \r
-0x0d, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x08, 0x22, 0x0c, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x03, 0x10, 0x00, 0x1c, 0xb7, 0x1b, 0x00, 0x65, 0x09, 0xb2, 0x40, 0x9a, 0xfa, 0x2a, 0x05, 0x97, \r
-0x00, 0xef, 0x03, 0x63, 0x94, 0x96, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01, 0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0xe8, 0x3b, 0x11, 0x80, \r
-0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0xff, 0xf7, 0x1f, 0x6a, 0x8c, 0xea, 0x57, 0xb3, 0x16, 0xd2, 0x48, 0x32, 0x49, 0xe3, 0x00, 0x6b, 0x00, 0x9a, 0x15, 0xd3, 0x17, 0xd3, 0x9d, 0x10, \r
-0x43, 0xa8, 0x43, 0x2a, 0x15, 0x93, 0x01, 0x4b, 0x15, 0xd3, 0x15, 0x94, 0xff, 0x6b, 0x6c, 0xec, 0x0b, 0x5c, 0x15, 0xd4, 0x02, 0x61, 0x46, 0xd8, 0x92, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, \r
-0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x2b, 0x61, 0x17, 0x92, 0x0e, 0x2a, 0x16, 0x93, 0x68, 0x32, 0x46, 0xb3, 0x49, 0xe3, 0x60, 0x9a, 0x04, 0x2b, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x7f, 0x10, \r
-0x66, 0x98, 0x14, 0xd3, 0x60, 0xda, 0x05, 0x10, 0x46, 0x98, 0x17, 0x93, 0x46, 0xdb, 0x46, 0x98, 0x14, 0xd2, 0x01, 0x6a, 0x47, 0xd8, 0x00, 0x6a, 0x00, 0x1c, 0x7a, 0x1b, 0x46, 0xd8, 0x43, 0x98, \r
-0x03, 0x22, 0x80, 0x98, 0x40, 0xea, 0xa5, 0x98, 0x44, 0x98, 0x01, 0x72, 0x65, 0x61, 0x47, 0x98, 0x01, 0x72, 0x62, 0x61, 0x80, 0x98, 0x20, 0x18, 0x7a, 0x34, 0xa2, 0x98, 0x5d, 0x10, 0x00, 0x1c, \r
-0x7a, 0x1b, 0x00, 0x65, 0x06, 0x98, 0x14, 0xd0, 0x57, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x09, 0x61, 0x43, 0xa8, 0x66, 0x98, 0xff, 0x4a, 0x43, 0xc8, \r
-0x00, 0x1c, 0x7a, 0x1b, 0x14, 0xd3, 0x17, 0xd0, 0x04, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x14, 0xd0, 0x47, 0x98, 0x02, 0x72, 0x40, 0x61, 0x63, 0x98, 0x25, 0xb2, 0x4b, 0xe3, 0x3c, 0x2a, \r
-0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x23, 0xb3, 0x12, 0xe9, 0x65, 0xe1, 0x8b, 0x99, 0x60, 0x98, 0x8e, 0xeb, 0x2d, 0x2b, 0xe0, 0xf0, 0xa3, 0xa1, 0x12, 0x04, 0x00, 0x18, 0x44, 0x97, 0x18, 0xd2, \r
-0x0b, 0x6b, 0x04, 0xd3, 0x1c, 0xb3, 0x05, 0xd3, 0x18, 0x92, 0x12, 0x93, 0x02, 0x6c, 0x07, 0xd2, 0x06, 0xd3, 0xe0, 0xf0, 0x43, 0xa1, 0xfa, 0x6d, 0x84, 0xf1, 0x02, 0x6e, 0x08, 0xd2, 0xe0, 0xf0, \r
-0x4e, 0xa1, 0x64, 0xf4, 0x14, 0x6f, 0x09, 0xd2, 0x4d, 0x99, 0x0a, 0xd2, 0x60, 0xf2, 0x52, 0xa1, 0x0b, 0xd2, 0x60, 0xf2, 0x53, 0xa1, 0x0c, 0xd2, 0x4c, 0x99, 0x0d, 0xd2, 0x40, 0x98, 0x0e, 0xd2, \r
-0x43, 0xa8, 0x0f, 0xd2, 0x48, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x10, 0xd2, 0x05, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xc4, 0x61, 0x14, 0x90, 0x7f, 0xf7, 0x01, 0x28, 0x1d, 0x97, \r
-0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef, 0x0f, 0x63, 0xb8, 0x8a, 0x11, 0x80, 0xe5, 0xb9, 0x04, 0x80, 0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xc8, 0x72, \r
-0x04, 0x61, 0x80, 0x18, 0x40, 0x33, 0x80, 0xac, 0x03, 0x10, 0x20, 0x18, 0x89, 0x35, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd0, 0x68, 0xa4, \r
-0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x0a, 0x02, 0x00, 0x65, 0x56, 0x2a, 0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x38, 0xb3, 0x01, 0x22, 0x01, 0x6a, 0x40, 0xc3, 0x68, 0xa0, \r
-0x04, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x97, 0x01, 0x90, 0x67, 0x47, 0x2a, 0x68, 0xa0, 0x08, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x72, 0x01, 0x90, 0x67, 0x3f, 0x2a, 0x2f, 0xb2, \r
-0x7c, 0x4a, 0x58, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x18, 0x22, 0x68, 0xa0, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xf0, 0x01, 0x90, 0x67, 0x2e, 0x2a, \r
-0x68, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xdc, 0x01, 0x90, 0x67, 0x26, 0x2a, 0x62, 0x98, 0xc1, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x37, 0x22, 0x20, 0xb2, 0x80, 0xf0, 0x7c, 0xa2, \r
-0x5d, 0x67, 0x20, 0xf0, 0x70, 0xc2, 0x04, 0x6a, 0x6c, 0xea, 0x07, 0x22, 0x66, 0xa0, 0x7f, 0x6a, 0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x6c, 0xea, 0x46, 0xc0, 0x18, 0xb2, 0x20, 0xf0, 0x7b, 0xa2, \r
-0x5d, 0x67, 0x20, 0xf0, 0x74, 0xc2, 0x40, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x66, 0xa0, 0x21, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x46, 0xc0, 0x00, 0x18, 0x69, 0x37, 0x84, 0x40, 0x05, 0x6a, 0x04, 0xd2, \r
-0x0f, 0xb2, 0x05, 0xd2, 0x40, 0x98, 0x04, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x43, 0x98, 0xe4, 0xf0, 0x0e, 0x6e, 0xa1, 0xf1, 0x1a, 0x6f, 0x07, 0xd2, 0x42, 0x98, 0x08, 0xd2, 0x41, 0x98, 0x09, 0xd2, \r
-0x44, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd2, 0x0f, 0x97, 0x0e, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x08, 0x63, 0x00, 0x65, 0x99, 0x96, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, \r
-0xf7, 0x63, 0x11, 0x62, 0x10, 0xd1, 0x0f, 0xd0, 0x5a, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x28, 0x6e, 0x00, 0x6b, 0x58, 0xb2, 0x80, 0x18, 0x91, 0x28, 0x60, 0xc2, 0x57, 0xb2, 0x80, 0xf0, \r
-0x9c, 0xa2, 0x40, 0x6b, 0x56, 0xb5, 0x8d, 0xeb, 0x97, 0xaa, 0x80, 0xf0, 0x7c, 0xc2, 0x08, 0x6b, 0x8d, 0xeb, 0x96, 0xaa, 0x77, 0xca, 0x07, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x51, 0xb4, \r
-0x76, 0xca, 0x60, 0x9c, 0xad, 0xeb, 0x60, 0xdc, 0x00, 0x6c, 0x4f, 0xb3, 0x80, 0xcb, 0x78, 0xaa, 0x4e, 0xb2, 0x80, 0xa2, 0x01, 0x6d, 0x8e, 0x32, 0xac, 0xea, 0x50, 0x36, 0x11, 0x6a, 0x4b, 0xea, \r
-0x6c, 0xea, 0x92, 0x33, 0xac, 0xeb, 0xcd, 0xea, 0x60, 0x33, 0xff, 0xf5, 0x1e, 0x4d, 0x64, 0x33, 0xac, 0xea, 0x6d, 0xea, 0x07, 0x6b, 0x8c, 0xeb, 0x04, 0x53, 0x04, 0x61, 0x07, 0x6b, 0x6b, 0xeb, \r
-0x4c, 0xeb, 0x07, 0x10, 0x03, 0x6c, 0x6c, 0xec, 0x84, 0x33, 0x07, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x8d, 0xeb, 0x3a, 0xb2, 0x78, 0xca, 0x3d, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, \r
-0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x39, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x12, 0x22, 0x00, 0x68, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, \r
-0x4a, 0x24, 0x01, 0x6c, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x01, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x04, 0x58, 0xef, 0x61, 0x2d, 0xb2, 0x60, 0xa2, 0x10, 0x6a, \r
-0x6c, 0xea, 0x11, 0x22, 0x2b, 0xb4, 0xa3, 0xa4, 0x09, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x43, 0xc4, 0x01, 0x6d, 0x29, 0xb4, 0x76, 0x32, 0xac, 0xea, 0xc0, 0xa4, 0x03, 0x4a, 0x54, 0x35, 0x1f, 0x6a, \r
-0xcc, 0xea, 0xad, 0xea, 0x40, 0xc4, 0x21, 0xb2, 0x00, 0xa2, 0x21, 0xb2, 0xc0, 0xa2, 0x23, 0xb2, 0xa0, 0xa2, 0x23, 0xb2, 0x04, 0x6c, 0x6c, 0xec, 0x40, 0x9a, 0x65, 0x67, 0x0b, 0x24, 0xc6, 0x34, \r
-0x40, 0xf7, 0x42, 0x32, 0x8e, 0xea, 0x01, 0x6c, 0x8c, 0xea, 0xff, 0x6c, 0x8c, 0xea, 0x00, 0x6b, 0x01, 0x22, 0x01, 0x6b, 0x1b, 0xb2, 0x07, 0x69, 0xe0, 0x9a, 0x19, 0xb2, 0x80, 0x9a, 0x1a, 0xb2, \r
-0x40, 0x9a, 0x04, 0xd1, 0x07, 0xd6, 0x08, 0xd5, 0x0a, 0xd7, 0x0b, 0xd4, 0x17, 0xb1, 0x05, 0x6c, 0xfa, 0x6d, 0x24, 0xf0, 0x05, 0x6e, 0xa4, 0xf3, 0x12, 0x6f, 0x05, 0xd1, 0x06, 0xd0, 0x09, 0xd3, \r
-0x20, 0x18, 0xa3, 0x30, 0x0c, 0xd2, 0x11, 0x97, 0x10, 0x91, 0x0f, 0x90, 0x00, 0xef, 0x09, 0x63, 0xd0, 0x95, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x01, 0x00, \r
-0x5c, 0xa0, 0x00, 0xb0, 0x92, 0x96, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0x98, 0x96, 0x11, 0x80, 0x30, 0x21, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, \r
-0x40, 0xa0, 0x00, 0xb0, 0x2c, 0x00, 0x00, 0xb5, 0xc8, 0xe7, 0x04, 0x80, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd1, 0x0d, 0xd0, 0xff, 0x69, 0x42, 0xb0, 0x8c, 0xe9, 0x61, 0xf3, 0x06, 0x6d, 0x00, 0x18, \r
-0x5c, 0x3b, 0x22, 0x6c, 0x20, 0xf0, 0xbf, 0xa0, 0xf3, 0x6a, 0x24, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0x40, 0xf0, 0xa1, 0xa0, 0x40, 0xf0, 0x40, 0xa0, 0x26, 0x6c, 0xa0, 0x35, \r
-0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0xeb, 0xf0, 0x12, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x28, 0x6c, 0x93, 0xf7, 0x1a, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x2a, 0x6c, 0x00, 0x18, 0x5e, 0x3a, 0x01, 0x6c, \r
-0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x2e, 0xb2, 0x20, 0x6d, 0x5e, 0x6c, 0x60, 0xaa, 0x9f, 0xf7, 0x1f, 0x6a, 0xee, 0xf1, 0x09, 0x68, 0x6c, 0xea, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, \r
-0xff, 0x6c, 0x09, 0x4c, 0x00, 0x18, 0x5c, 0x3b, 0x03, 0x6d, 0x27, 0xb2, 0x41, 0xa2, 0x27, 0xb3, 0x01, 0xf4, 0x00, 0x6d, 0x6d, 0xe2, 0x80, 0xab, 0xff, 0xf7, 0x1f, 0x6b, 0x8c, 0xe8, 0x24, 0xb4, \r
-0xc0, 0xa4, 0x07, 0x6c, 0x8c, 0xee, 0x23, 0xb4, 0x80, 0xac, 0xc0, 0x36, 0xc4, 0x36, 0x8d, 0xed, 0x21, 0xb4, 0x80, 0xa4, 0x09, 0xd2, 0x0a, 0xd3, 0x80, 0x34, 0x90, 0x34, 0x8d, 0xed, 0x1f, 0xb4, \r
-0x81, 0xa4, 0x6c, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x08, 0xd6, 0x1d, 0xb4, 0xa0, 0xa4, 0x08, 0x96, 0xff, 0x6c, 0xa0, 0x35, 0x09, 0x92, 0x0a, 0x93, 0xbc, 0x35, 0x21, 0x4c, 0xcd, 0xed, 0x0d, 0xec, \r
-0x8d, 0xed, 0x6c, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x82, 0x67, 0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x00, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x0d, 0x6d, 0x0b, 0x21, 0x04, 0x00, 0x90, 0x67, \r
-0x55, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x0a, 0x6e, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x29, 0x3d, 0xd0, 0x67, 0x0f, 0x97, 0x0e, 0x91, 0x0d, 0x90, 0x00, 0xef, 0x08, 0x63, 0x4c, 0x00, 0x11, 0x80, \r
-0x5e, 0x00, 0x00, 0xb6, 0x3c, 0xf2, 0x04, 0x80, 0x00, 0x00, 0x00, 0xb6, 0x28, 0x05, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xf8, 0x95, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0xf9, 0x95, 0x11, 0x80, \r
-0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x5c, 0xb2, 0x0d, 0xd5, 0x60, 0xa2, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x26, 0x67, 0x03, 0x22, 0x00, 0x6b, 0x59, 0xb2, 0x60, 0xda, 0x40, 0xa8, \r
-0x7f, 0xf4, 0x14, 0x72, 0x39, 0x60, 0x7f, 0xf4, 0x15, 0x6b, 0x63, 0xea, 0x12, 0x60, 0x7f, 0xf4, 0x0f, 0x72, 0x80, 0xf0, 0x1b, 0x60, 0xfb, 0x4b, 0x63, 0xea, 0x04, 0x60, 0x1f, 0xf4, 0x16, 0x72, \r
-0x35, 0x60, 0x89, 0x10, 0x7f, 0xf4, 0x10, 0x72, 0x44, 0x60, 0x7f, 0xf4, 0x13, 0x72, 0x20, 0x60, 0x82, 0x10, 0x9f, 0xf4, 0x00, 0x72, 0x78, 0x60, 0x9f, 0xf4, 0x01, 0x6b, 0x63, 0xea, 0x04, 0x60, \r
-0x7f, 0xf4, 0x15, 0x72, 0x08, 0x60, 0x77, 0x10, 0x5f, 0xf5, 0x04, 0x72, 0x3a, 0x60, 0x5f, 0xf5, 0x05, 0x72, 0x2f, 0x60, 0x70, 0x10, 0x63, 0xa0, 0x42, 0xb2, 0x60, 0xc2, 0x64, 0xa0, 0x42, 0xb2, \r
-0x60, 0xc2, 0x46, 0xa0, 0x65, 0xa0, 0x40, 0x32, 0x6d, 0xea, 0x40, 0xb3, 0x40, 0xcb, 0x6e, 0x10, 0x63, 0xa0, 0x3d, 0xb2, 0x60, 0xc2, 0x6a, 0x10, 0x3d, 0xb2, 0x84, 0xa2, 0x19, 0x6b, 0x6b, 0xeb, \r
-0x6c, 0xec, 0x84, 0xc2, 0x85, 0xa2, 0x8c, 0xeb, 0x65, 0xc2, 0x60, 0x10, 0x39, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x50, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x36, 0xb2, \r
-0x80, 0x18, 0x27, 0x2e, 0x00, 0xc2, 0x00, 0x68, 0x47, 0x2a, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x43, 0x10, 0x43, 0xa0, 0x00, 0x6c, 0x01, 0x22, 0x01, 0x6c, 0x80, 0x18, 0x53, 0x34, 0x00, 0x65, \r
-0x45, 0x10, 0x24, 0xa0, 0x63, 0xa0, 0x1f, 0x6a, 0x4c, 0xe9, 0x2c, 0xb2, 0x01, 0x23, 0x01, 0x6b, 0x20, 0xf0, 0x6e, 0xc2, 0x02, 0x6a, 0x04, 0xd2, 0x29, 0xb2, 0x05, 0xd2, 0x27, 0xb3, 0x20, 0xf0, \r
-0x4e, 0xa3, 0x05, 0x6c, 0xfa, 0x6d, 0x43, 0xf6, 0x15, 0x6e, 0x41, 0xf5, 0x10, 0x6f, 0x06, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd1, 0x0c, 0x21, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, \r
-0x1f, 0x6b, 0x4c, 0xeb, 0x05, 0x23, 0x2e, 0xeb, 0x03, 0x2b, 0x1c, 0xb2, 0x20, 0xf0, 0x2f, 0xc2, 0x85, 0xa0, 0x1a, 0xb3, 0x07, 0x6a, 0x8c, 0xea, 0xa3, 0xa3, 0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, \r
-0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0x12, 0x10, 0x63, 0xa0, 0x00, 0x6a, 0x01, 0x23, 0x01, 0x6a, 0x14, 0xb3, 0x40, 0xc3, 0x0b, 0x10, 0x01, 0x68, 0x0d, 0x93, 0x00, 0x6a, 0x00, 0xc3, 0x40, 0xc1, \r
-0x00, 0x6a, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x80, 0xa8, 0x00, 0x18, 0x8d, 0x8f, 0x00, 0x6d, 0x01, 0x6a, 0xf5, 0x17, 0x98, 0x96, 0x11, 0x80, 0xcc, 0x07, 0x11, 0x80, \r
-0xf9, 0x95, 0x11, 0x80, 0xf8, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xb8, 0x51, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, \r
-0x90, 0x96, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x16, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x21, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c, \r
-0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x0f, 0xb2, 0x60, 0x9a, 0x24, 0x6a, 0x05, 0x6c, 0x58, 0xeb, 0x0d, 0xb3, 0xfa, 0x6d, 0x83, 0xf4, 0x06, 0x6e, 0x01, 0xf0, 0x0c, 0x6f, \r
-0x12, 0xea, 0x49, 0xe3, 0x0a, 0xb3, 0x63, 0xda, 0x00, 0x6a, 0x0a, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, \r
-0x94, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x79, 0xcc, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0f, 0xb0, 0x60, 0xa0, 0x07, 0x6a, \r
-0x6c, 0xea, 0x14, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c, 0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x08, 0xb2, 0x60, 0x9a, 0x24, 0x6a, \r
-0x58, 0xeb, 0x07, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x94, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, \r
-0x59, 0xcc, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x19, 0xb2, 0xa0, 0x9a, 0x19, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x26, 0x22, 0x18, 0xb2, 0x80, 0xa2, 0x07, 0x6a, 0x8c, 0xea, 0x21, 0x22, \r
-0x16, 0xb2, 0x41, 0xaa, 0x80, 0xf4, 0x40, 0x32, 0x80, 0xf5, 0x42, 0x32, 0xac, 0xea, 0x19, 0x22, 0x40, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x13, 0x22, 0x40, 0x6a, 0x4c, 0xec, \r
-0x04, 0x2c, 0x80, 0x18, 0x09, 0x35, 0x00, 0x65, 0x0c, 0x10, 0x00, 0x6d, 0x0c, 0xb4, 0x4c, 0xeb, 0xa0, 0xcc, 0x04, 0x23, 0x80, 0x18, 0x25, 0x35, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x4a, 0x24, \r
-0x01, 0x6c, 0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x2c, 0x00, 0x00, 0xb5, 0x98, 0x96, 0x11, 0x80, 0x94, 0x96, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80, 0x92, 0x96, 0x11, 0x80, \r
-0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x40, 0xac, 0x03, 0xf0, 0x03, 0x6b, 0x04, 0x67, 0x4e, 0xeb, 0x25, 0x67, 0x1c, 0x2b, 0x2f, 0xb2, 0x02, 0x6c, 0xc0, 0xf1, 0x6a, 0xc2, 0xc0, 0xf1, \r
-0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0x2c, 0xb3, 0x80, 0xa3, 0x01, 0x4c, 0x80, 0xc3, 0x03, 0x6b, 0x60, 0xf1, 0x60, 0xc2, 0x00, 0x18, 0x2e, 0xaa, 0x03, 0x6c, 0x28, 0xb3, 0x80, 0xa3, 0x05, 0x6a, \r
-0x4b, 0xea, 0x8c, 0xea, 0x09, 0x6c, 0x8b, 0xec, 0x8c, 0xea, 0x40, 0xc3, 0x3a, 0x10, 0xff, 0xf5, 0x10, 0x72, 0x0f, 0x61, 0x43, 0xa4, 0x22, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0x6d, 0xe2, 0x60, 0x9b, \r
-0x04, 0xd4, 0x20, 0xb4, 0x05, 0xd4, 0x06, 0xd2, 0x07, 0xd3, 0x04, 0x6c, 0x43, 0xf2, 0x12, 0x6e, 0x1c, 0x10, 0xff, 0xf5, 0x11, 0x72, 0x25, 0x61, 0x47, 0xa4, 0x66, 0xa4, 0xfa, 0x6d, 0x40, 0x32, \r
-0x6d, 0xea, 0x65, 0xa4, 0x40, 0x32, 0x43, 0xf2, 0x1e, 0x6e, 0x6d, 0xea, 0x64, 0xa4, 0x40, 0x32, 0x83, 0xa4, 0x6d, 0xea, 0x12, 0xb3, 0x6d, 0xe4, 0x40, 0xdb, 0x02, 0x6b, 0x04, 0xd3, 0x11, 0xb3, \r
-0x05, 0xd3, 0x63, 0xa0, 0x07, 0xd2, 0x04, 0x6c, 0x06, 0xd3, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0x80, 0xa8, 0x00, 0x6d, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x66, 0x6a, \r
-0x40, 0xc1, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x30, 0x3b, 0x11, 0x80, 0x00, 0xa0, 0x00, 0xb0, \r
-0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x62, 0xa4, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x0b, 0x22, 0x1d, 0xb2, 0xa1, 0xa2, 0x0c, 0x6a, 0xac, 0xea, 0x0c, 0x72, \r
-0x09, 0x60, 0x7f, 0x6a, 0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x02, 0x10, 0x21, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x42, 0xc4, 0x62, 0xa4, 0xa0, 0x6a, 0x4c, 0xeb, 0x0e, 0x23, 0x14, 0xb4, 0x96, 0xac, \r
-0x14, 0xb5, 0x01, 0x6e, 0x82, 0x34, 0x96, 0x34, 0x40, 0x9d, 0xcc, 0xec, 0x12, 0xb6, 0x80, 0x34, 0x80, 0x34, 0xcc, 0xea, 0x8d, 0xea, 0x40, 0xdd, 0x0c, 0xb2, 0x80, 0xa2, 0x1e, 0x6a, 0x8c, 0xea, \r
-0x02, 0x72, 0x0e, 0x61, 0x0d, 0xb2, 0x40, 0xa2, 0x0b, 0x22, 0x0d, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x02, 0x61, 0x00, 0x6c, 0x02, 0x23, 0x04, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0xbe, 0x33, 0x00, 0x65, \r
-0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x44, 0x20, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x5c, 0xa0, 0x00, 0xb0, 0xff, 0xff, 0xfe, 0xff, 0x99, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, \r
-0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x68, 0x18, 0xb4, 0x04, 0x32, 0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c, \r
-0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x1e, 0x58, 0xeb, 0x61, 0x00, 0x68, 0x0e, 0xb4, 0x04, 0x32, 0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, \r
-0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c, 0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x22, 0x58, 0xeb, 0x61, 0x05, 0x97, \r
-0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xa4, 0xeb, 0x10, 0x80, 0xe0, 0xeb, 0x10, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, \r
-0xff, 0xf7, 0x1f, 0x68, 0x22, 0x67, 0x10, 0xf0, 0x00, 0x6e, 0x0c, 0xe9, 0xcb, 0xee, 0x2d, 0xee, 0x0c, 0xee, 0x0e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x24, 0x6c, 0x00, 0x18, 0xab, 0xa5, \r
-0x00, 0x6d, 0xd1, 0x67, 0x0e, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x04, 0xd2, 0x04, 0x92, 0xe1, 0xf7, 0x1f, 0x6b, 0x09, 0x97, 0x4c, 0xeb, 0x43, 0x67, 0x0c, 0xea, 0x08, 0x91, 0x07, 0x90, \r
-0x00, 0xef, 0x05, 0x63, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x68, 0x24, 0x67, 0x04, 0x32, 0x49, 0xe1, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x29, 0x60, 0x1e, 0xf0, 0x00, 0x6a, \r
-0x6c, 0xea, 0x0c, 0xf0, 0x00, 0x72, 0x07, 0x61, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x00, 0x18, 0x3f, 0x1c, 0x80, 0xaa, 0x18, 0x10, 0x04, 0xf0, 0x00, 0x72, 0x0b, 0x61, 0xff, 0x6c, 0x8c, 0xeb, \r
-0x40, 0x6a, 0x67, 0x33, 0x4d, 0xeb, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x6c, 0xec, 0x01, 0x6d, 0x07, 0x10, 0x0d, 0x2a, 0x41, 0x40, 0x44, 0x32, 0xff, 0x6c, 0x49, 0xe1, 0x6c, 0xec, 0x00, 0x6d, \r
-0x00, 0x18, 0x4d, 0xa6, 0xc0, 0xaa, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0xd1, 0x17, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x04, 0x6c, 0x00, 0x18, \r
-0xab, 0xa5, 0x00, 0x6d, 0x20, 0x6b, 0x4d, 0xeb, 0xff, 0xf7, 0x1f, 0x6e, 0x6c, 0xee, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x04, 0x6c, 0x00, 0x18, 0x3f, 0x1c, 0x50, 0x6c, 0x04, 0x6c, 0x00, 0x18, \r
-0xab, 0xa5, 0x00, 0x6d, 0x05, 0x97, 0x1f, 0x6b, 0x6c, 0xea, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0xff, 0x68, 0x00, 0x6e, 0x01, 0x6d, 0x8c, 0xe8, \r
-0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x5a, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x6c, 0xe9, 0xff, 0xf7, \r
-0x1e, 0x6e, 0x6c, 0xea, 0x5a, 0x6c, 0x01, 0x6d, 0x2c, 0xee, 0x08, 0xd2, 0x00, 0x18, 0x4d, 0xa6, 0x09, 0xd3, 0x08, 0x92, 0x09, 0x93, 0x03, 0x6e, 0x4d, 0xee, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, \r
-0x4d, 0xa6, 0x5c, 0x6c, 0x4c, 0xb4, 0x80, 0x18, 0xe9, 0x35, 0x00, 0x65, 0x80, 0x18, 0x06, 0x36, 0x00, 0x65, 0x08, 0x5a, 0x05, 0x61, 0x02, 0x6c, 0x00, 0x6d, 0x1d, 0xf6, 0x00, 0x6e, 0x04, 0x10, \r
-0x02, 0x6c, 0x00, 0x6d, 0x19, 0xf6, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x43, 0xb4, 0x80, 0x18, 0xe9, 0x35, 0x00, 0x65, 0x06, 0x20, 0x90, 0x67, 0x00, 0x18, 0x44, 0x1c, 0x00, 0x68, \r
-0x70, 0x67, 0x23, 0x10, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x41, 0x6c, 0x38, 0xf0, 0x03, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x18, 0x3f, 0x1c, 0x0a, 0x6c, \r
-0x00, 0x68, 0x7e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x00, 0x6b, 0x4c, 0xeb, 0x02, 0x23, 0x00, 0x6b, 0x0a, 0x10, 0x00, 0x18, 0x44, 0x1c, 0x0a, 0x6c, 0x01, 0x48, 0xff, 0xf7, \r
-0x1f, 0x6a, 0x4c, 0xe8, 0x64, 0x58, 0xed, 0x61, 0x01, 0x6b, 0x2d, 0xb4, 0x80, 0x18, 0xe9, 0x35, 0x09, 0xd3, 0x5a, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xd1, 0x67, 0x08, 0x96, 0x5c, 0x6c, \r
-0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x7e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x40, 0x6c, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x18, \r
-0x4d, 0xa6, 0x08, 0xd2, 0x09, 0x93, 0x09, 0x23, 0x21, 0x6c, 0x08, 0xf2, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x07, 0x10, 0x21, 0x6c, 0x00, 0x18, 0xab, 0xa5, \r
-0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x4c, 0xe9, 0x16, 0xb3, 0x01, 0x6a, 0x04, 0x6c, 0xfa, 0x6d, 0x22, 0xf7, 0x03, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd3, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, \r
-0xa3, 0x30, 0x04, 0xd2, 0x09, 0x93, 0x02, 0x6a, 0x04, 0xd2, 0x05, 0xd3, 0x08, 0x93, 0xff, 0xf7, 0x1f, 0x6a, 0x05, 0x6c, 0x6c, 0xea, 0xfa, 0x6d, 0x22, 0xf7, 0x04, 0x6e, 0x44, 0xf5, 0x18, 0x6f, \r
-0x06, 0xd1, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x51, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x64, 0xec, 0x10, 0x80, 0x74, 0xec, 0x10, 0x80, 0xf4, 0xec, 0x10, 0x80, \r
-0xc8, 0xe7, 0x04, 0x80, 0xf5, 0x63, 0x15, 0x62, 0x14, 0xd1, 0x13, 0xd0, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x3f, 0x6c, 0x00, 0x6d, 0xff, 0x69, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, \r
-0x2c, 0xea, 0xff, 0xf7, 0x1f, 0x6b, 0x6c, 0xe8, 0x0c, 0xd2, 0x0c, 0x95, 0x02, 0x30, 0x01, 0x6a, 0x2c, 0xe8, 0x82, 0x67, 0xd0, 0x67, 0xe2, 0x67, 0x11, 0xd3, 0x80, 0x18, 0x14, 0x36, 0x04, 0xd2, \r
-0x0c, 0x95, 0x03, 0x6a, 0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0x14, 0x36, 0x04, 0xd2, 0x42, 0x34, 0x1f, 0x6d, 0x8a, 0x34, 0x56, 0x32, 0xac, 0xec, 0xac, 0xea, 0x0c, 0x95, 0x03, 0x6e, \r
-0x0b, 0xd4, 0x04, 0xd6, 0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0x14, 0x36, 0x0a, 0xd2, 0x42, 0x37, 0x1f, 0x6c, 0xea, 0x37, 0x8c, 0xef, 0x09, 0xd7, 0x56, 0x35, 0x8c, 0xed, 0x0b, 0x96, \r
-0x09, 0x94, 0x08, 0xd5, 0x2c, 0xed, 0x2c, 0xee, 0x2c, 0xec, 0x0d, 0xd5, 0x0a, 0x97, 0x97, 0xe6, 0x10, 0xd6, 0x0d, 0x96, 0x2c, 0xef, 0x0e, 0xd4, 0xd3, 0xe7, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, \r
-0x83, 0x34, 0x98, 0xec, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x11, 0x93, 0x0f, 0xd7, 0x12, 0xec, 0xb8, 0xed, 0x12, 0xed, 0xb1, 0xe4, 0x6c, 0xec, 0x11, 0x5c, 0x09, 0x60, 0x09, 0x94, \r
-0x0b, 0x95, 0x08, 0x96, 0x0a, 0x97, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xe1, 0xe6, 0x50, 0x10, 0x0c, 0x95, 0xd0, 0x67, 0x03, 0x6a, 0x00, 0x6c, 0x0f, 0x6f, 0x11, 0xd3, 0x80, 0x18, 0x14, 0x36, \r
-0x04, 0xd2, 0x42, 0x34, 0x1f, 0x6d, 0x8a, 0x34, 0xac, 0xec, 0x10, 0x96, 0xe4, 0x67, 0x2c, 0xef, 0x56, 0x30, 0xac, 0xe8, 0xf7, 0xe6, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x0d, 0x65, \r
-0x0f, 0x95, 0x0c, 0xe9, 0x11, 0x93, 0x3b, 0xe5, 0x00, 0xf6, 0xc0, 0x36, 0x00, 0xf6, 0xc3, 0x36, 0xd8, 0xee, 0xa8, 0x67, 0x12, 0xee, 0xb8, 0xed, 0x12, 0xed, 0xb9, 0xe6, 0x0e, 0x95, 0x6c, 0xee, \r
-0x11, 0x5e, 0xff, 0xe5, 0x0d, 0x95, 0x00, 0xf6, 0xe0, 0x37, 0x00, 0xf6, 0xe3, 0x37, 0x27, 0xe5, 0x00, 0xf6, 0x20, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0x12, 0xed, 0xf8, 0xef, 0x12, 0xef, \r
-0xf5, 0xe5, 0x6c, 0xed, 0x09, 0x60, 0xc3, 0xed, 0x0d, 0x61, 0x0b, 0x97, 0xe5, 0xe4, 0x0a, 0x94, 0x27, 0x31, 0x6c, 0xe9, 0x81, 0xe0, 0x0c, 0x10, 0x11, 0x5d, 0x04, 0x61, 0x00, 0x6c, 0x11, 0x68, \r
-0x10, 0x69, 0x09, 0x10, 0x09, 0x95, 0x08, 0x96, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xc1, 0xe0, 0x07, 0x30, 0x6c, 0xe8, 0x01, 0x6c, 0x1f, 0x6b, 0x4c, 0xeb, 0x08, 0x24, 0x10, 0xf0, 0x00, 0x6a, \r
-0x4b, 0xea, 0x4d, 0xeb, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x11, 0x10, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x11, 0xd3, 0x46, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, \r
-0x00, 0x6e, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x11, 0x93, 0x20, 0x31, 0x28, 0x31, 0x14, 0x30, 0x2d, 0xe8, 0x6d, 0xe8, 0x00, 0x36, 0xc0, 0x36, 0xc3, 0x36, 0xff, 0xf7, \r
-0x1f, 0x6a, 0xc3, 0x36, 0x4c, 0xee, 0x21, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x21, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, \r
-0x02, 0x6b, 0x04, 0xd3, 0x01, 0x6c, 0x09, 0xb3, 0xfa, 0x6d, 0xa2, 0xf7, 0x12, 0x6e, 0xa4, 0xf3, 0x0d, 0x6f, 0x06, 0xd0, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x15, 0x97, 0x14, 0x91, \r
-0x13, 0x90, 0x00, 0xef, 0x0b, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd0, 0x40, 0xb3, 0xc0, 0xf1, 0x90, 0xa3, 0x05, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x9d, 0x67, \r
-0x20, 0xf0, 0x40, 0xc4, 0xc0, 0xf1, 0x50, 0xc3, 0x00, 0x18, 0x29, 0xa8, 0x00, 0x65, 0x3a, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x5e, 0x6e, 0x38, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, \r
-0x34, 0x6e, 0x80, 0x18, 0xd4, 0x35, 0x00, 0x65, 0x02, 0x67, 0x01, 0x6a, 0x04, 0xd2, 0x02, 0x6c, 0x33, 0xb2, 0xfa, 0x6d, 0x03, 0xf0, 0x14, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd2, 0x20, 0x18, \r
-0xa3, 0x30, 0x06, 0xd0, 0x7b, 0x70, 0x2f, 0xb4, 0x01, 0x60, 0x2f, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x22, 0x6e, 0x2d, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x2e, 0x6e, 0x2c, 0xb2, \r
-0x80, 0x9a, 0x2c, 0xb2, 0x4c, 0xec, 0x23, 0xb2, 0xe0, 0xf1, 0x63, 0xa2, 0xff, 0x73, 0x07, 0x60, 0x04, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x1e, 0xf0, 0x02, 0x6a, 0x8d, 0xea, 0x04, 0x10, 0x26, 0xb2, \r
-0xff, 0x73, 0x8d, 0xea, 0x05, 0x60, 0x08, 0x6c, 0x6c, 0xec, 0x02, 0x24, 0x23, 0xb3, 0x6c, 0xea, 0x1f, 0xb3, 0x80, 0x18, 0xb8, 0x35, 0x40, 0xdb, 0x00, 0x18, 0x1b, 0xa7, 0x00, 0x65, 0x00, 0x18, \r
-0xd2, 0xa6, 0x00, 0x65, 0x00, 0x18, 0x1e, 0xa4, 0x00, 0x65, 0x1d, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x1b, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x1a, 0xb3, 0x63, 0xda, \r
-0x01, 0x6b, 0x1a, 0xb2, 0x80, 0x18, 0x79, 0x36, 0x60, 0xc2, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x02, 0x6e, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x10, 0x6e, 0x00, 0x6c, \r
-0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x0b, 0x97, 0x0a, 0x90, 0x00, 0xef, 0x06, 0x63, 0x4c, 0x00, 0x11, 0x80, 0x40, 0x02, 0x11, 0x80, 0x58, 0xea, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, \r
-0x04, 0xeb, 0x10, 0x80, 0xc0, 0xea, 0x10, 0x80, 0x48, 0xeb, 0x10, 0x80, 0xac, 0xa0, 0x00, 0xb0, 0x00, 0x00, 0xef, 0xff, 0x01, 0xf0, 0x10, 0x00, 0xff, 0xff, 0xef, 0xff, 0x90, 0x04, 0x11, 0x80, \r
-0xb8, 0x8b, 0x11, 0x80, 0x2d, 0xdd, 0x10, 0x80, 0x22, 0x1b, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5b, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x03, 0x23, 0x20, 0xf0, 0x4f, 0xa2, \r
-0x26, 0x10, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea, 0x41, 0x72, 0x0f, 0x61, 0x00, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0xa4, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x62, 0x33, 0x72, 0x33, 0x00, 0x6a, \r
-0x16, 0x23, 0x80, 0x18, 0x06, 0x36, 0x00, 0x65, 0x12, 0x10, 0xa0, 0xf1, 0x1a, 0x6c, 0x10, 0xf0, 0x0f, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x4b, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, \r
-0x6c, 0xea, 0x42, 0x32, 0x3f, 0x6b, 0x6c, 0xea, 0x46, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x47, 0xb3, 0x80, 0xf1, 0x81, 0xa3, 0x7f, 0x22, 0x46, 0xb5, 0xa0, 0xa5, 0x7c, 0x2d, 0x8b, 0xe2, 0x00, 0xf6, \r
-0x40, 0x32, 0x00, 0xf6, 0x43, 0x32, 0x04, 0xd2, 0x42, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0x5e, 0x2a, 0x80, 0xf1, 0x40, 0xa3, 0x5b, 0x22, 0x80, 0xf1, 0x43, 0xa3, 0x03, 0x2a, 0x01, 0x6a, 0x80, 0xf1, \r
-0x43, 0xc3, 0x3d, 0xb2, 0x00, 0x82, 0x39, 0xb2, 0x80, 0xf1, 0x43, 0xa2, 0x04, 0x93, 0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x9c, 0xa6, 0x12, 0xec, 0x32, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, \r
-0x05, 0x2b, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea, 0x41, 0x72, 0x40, 0x61, 0x32, 0xb2, 0x40, 0x82, 0x4e, 0xe8, 0x3c, 0x20, 0x31, 0xb2, 0x60, 0xa2, 0x07, 0x5b, 0x02, 0x61, 0x06, 0x6b, 0x60, 0xc2, \r
-0x2e, 0xb2, 0xa0, 0xa2, 0x27, 0xb2, 0x63, 0xa2, 0x07, 0x6c, 0x72, 0x36, 0x8c, 0xee, 0xc2, 0xed, 0x06, 0x60, 0x8c, 0xed, 0x88, 0x4c, 0xb0, 0x35, 0x6c, 0xec, 0xad, 0xec, 0x83, 0xc2, 0x21, 0xb2, \r
-0x43, 0xa2, 0x07, 0x6b, 0x02, 0x6c, 0x52, 0x32, 0x6c, 0xea, 0x61, 0x42, 0x8b, 0xec, 0x8c, 0xeb, 0x23, 0xb4, 0x20, 0xf1, 0x16, 0x4b, 0xff, 0xf7, 0x1f, 0x68, 0x8d, 0xe3, 0x20, 0xab, 0x01, 0x6b, \r
-0x4c, 0xeb, 0x6c, 0x33, 0x02, 0x6c, 0x00, 0x6d, 0x0c, 0xe9, 0x00, 0x18, 0xab, 0xa5, 0x27, 0xeb, 0x1f, 0xf7, 0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x0c, 0xe9, 0x6c, 0xea, 0x20, 0x31, 0x0c, 0xe9, \r
-0xc2, 0x67, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x2d, 0xee, 0x0f, 0xb2, 0x80, 0xf1, 0x71, 0xa2, 0x10, 0x23, 0x80, 0xf1, 0x72, 0xa2, 0x03, 0x2b, 0x01, 0x6b, 0x80, 0xf1, 0x72, 0xc2, \r
-0x0a, 0xb2, 0x80, 0xf1, 0x52, 0xa2, 0x04, 0x93, 0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x3e, 0xa8, 0x12, 0xec, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, \r
-0x90, 0x95, 0x11, 0x80, 0xba, 0x01, 0x00, 0xb6, 0x4c, 0x00, 0x11, 0x80, 0x90, 0x96, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x25, 0x1b, 0x11, 0x80, 0x78, 0x04, 0x11, 0x80, 0x00, 0x00, 0x00, 0xb6, \r
-0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0xff, 0xf7, 0x1f, 0x69, 0x02, 0x74, 0x0e, 0xd4, 0x0f, 0xd5, 0x11, 0xd7, 0xcc, 0xe9, 0x1d, 0x61, 0x2b, 0xb2, 0x61, 0xa2, 0x0c, 0x6a, 0x6c, 0xea, \r
-0x0c, 0x72, 0x17, 0x61, 0x00, 0x6a, 0x29, 0xb3, 0x60, 0x9b, 0xc0, 0xf7, 0x62, 0x33, 0x11, 0x23, 0x27, 0xb3, 0x01, 0x4a, 0x43, 0xeb, 0xf7, 0x60, 0x00, 0x6a, 0x26, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, \r
-0xa2, 0xf2, 0x0b, 0x6e, 0xe1, 0xf3, 0x00, 0x6f, 0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x21, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x28, 0x22, 0x00, 0x1c, 0x73, 0x1b, \r
-0x00, 0x65, 0x60, 0xa0, 0x08, 0xd2, 0x40, 0x6a, 0x6c, 0xea, 0x07, 0x22, 0x00, 0x6b, 0x1b, 0xb2, 0x60, 0xca, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x16, 0x10, 0x19, 0xb4, 0xa0, 0xa4, 0x19, 0xb2, \r
-0x04, 0x6b, 0xac, 0xeb, 0x40, 0x9a, 0x09, 0x23, 0x40, 0xf7, 0x42, 0x33, 0xa6, 0x32, 0x6e, 0xea, 0x01, 0x6b, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x10, 0x13, 0xb2, 0x40, 0xa2, 0x03, 0x22, \r
-0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x00, 0x1c, 0x7a, 0x1b, 0x08, 0x94, 0x11, 0x97, 0x0e, 0x94, 0x0f, 0x95, 0x00, 0x18, 0x3e, 0x20, 0xd1, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, \r
-0x07, 0x63, 0x00, 0x65, 0x44, 0x20, 0x11, 0x80, 0x1c, 0xa3, 0x00, 0xb0, 0xa0, 0x86, 0x01, 0x00, 0xc8, 0xe7, 0x04, 0x80, 0x94, 0x96, 0x11, 0x80, 0x92, 0x96, 0x11, 0x80, 0x98, 0x96, 0x11, 0x80, \r
-0x50, 0xa0, 0x00, 0xb0, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x02, 0x67, 0x0f, 0xb2, 0x60, 0x9a, 0x0f, 0xb2, 0x00, 0x6c, 0x6e, 0xea, \r
-0x02, 0x2a, 0x0e, 0xb2, 0x80, 0x9a, 0x0e, 0xb3, 0x82, 0x34, 0x82, 0x34, 0x40, 0x9b, 0xff, 0xf7, 0x1f, 0x6d, 0x80, 0x34, 0xac, 0xea, 0x80, 0x34, 0x8d, 0xea, 0x40, 0xdb, 0x00, 0x18, 0xfd, 0x25, \r
-0x00, 0x6c, 0x00, 0x1c, 0x7a, 0x1b, 0x90, 0x67, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, 0x64, 0x8b, 0x10, 0x80, 0x30, 0x00, 0x00, 0xb5, \r
-0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x44, 0x67, 0x80, 0x9c, 0x3f, 0x6b, 0xff, 0x6e, 0x8c, 0xeb, 0x30, 0x73, 0x73, 0x61, 0x62, 0xa2, 0x02, 0x6c, 0xa8, 0x43, 0xea, 0x4d, 0xa3, 0xec, 0xc0, 0xf0, \r
-0x00, 0x61, 0xa4, 0xa2, 0x83, 0xa2, 0x05, 0x5d, 0x5a, 0x60, 0x04, 0x0e, 0xa4, 0x35, 0xb5, 0xe6, 0xa0, 0x8d, 0xb9, 0xe6, 0x00, 0xee, 0x00, 0x65, 0x0f, 0x00, 0x79, 0x01, 0x0b, 0x00, 0x4f, 0x00, \r
-0x5b, 0x00, 0x5d, 0xb4, 0x29, 0x10, 0x1e, 0x73, 0x18, 0x61, 0x00, 0x6b, 0xc0, 0xf2, 0x0c, 0x6d, 0xb8, 0xeb, 0x5a, 0xb6, 0x12, 0xed, 0xd5, 0xe5, 0xe0, 0xf0, 0xe3, 0xa5, 0x58, 0xb6, 0x8e, 0xef, \r
-0x04, 0x2f, 0x40, 0xf2, 0x88, 0x45, 0xa0, 0xde, 0x16, 0x10, 0x00, 0x6d, 0xa0, 0xde, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x0a, 0x5b, 0xea, 0x61, 0x32, 0x10, 0x51, 0xb3, 0x80, 0x9b, 0x2f, 0x24, \r
-0x40, 0xf2, 0x08, 0x4c, 0x08, 0x10, 0x0a, 0x6b, 0x78, 0xec, 0x4e, 0xb3, 0x12, 0xec, 0x71, 0xe4, 0x02, 0x10, 0x4d, 0xb4, 0x01, 0x10, 0x23, 0x24, 0x62, 0xa2, 0x1e, 0x73, 0x0a, 0x61, 0x62, 0xa4, \r
-0xc1, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36, 0x6d, 0xee, 0x60, 0xa4, 0x6d, 0xee, 0x63, 0xa4, 0x0b, 0x10, 0x1f, 0x73, 0x0e, 0x61, 0x66, 0xa4, 0xc5, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36, \r
-0x6d, 0xee, 0x64, 0xa4, 0x6d, 0xee, 0x67, 0xa4, 0x00, 0xf6, 0x60, 0x33, 0x6d, 0xee, 0x04, 0x6b, 0x08, 0x10, 0xc9, 0xa4, 0x68, 0xa4, 0xc0, 0x36, 0x6d, 0xee, 0x02, 0x6b, 0x02, 0x10, 0x00, 0x6b, \r
-0xc3, 0x67, 0x81, 0xa2, 0x70, 0x33, 0x63, 0xc2, 0x10, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x61, 0xc2, 0xa0, 0x9a, 0x00, 0x18, 0xa5, 0x2e, 0x02, 0x6c, 0x56, 0x10, 0x23, 0x73, 0x54, 0x60, 0x11, 0x73, \r
-0x32, 0x61, 0xa1, 0x9a, 0x82, 0x32, 0x42, 0x32, 0xcc, 0xea, 0x1c, 0x22, 0xa2, 0x32, 0xcc, 0xea, 0x34, 0x5a, 0x07, 0x61, 0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x06, 0xf2, 0x00, 0x6a, \r
-0x4d, 0xed, 0xa2, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x14, 0x5a, 0x07, 0x60, 0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x02, 0xf4, 0x00, 0x6a, 0x4d, 0xed, 0x00, 0xf6, 0x82, 0x33, 0x23, 0xb2, \r
-0x60, 0xc2, 0x02, 0x10, 0x21, 0xb3, 0x40, 0xc3, 0x20, 0xb2, 0x40, 0xa2, 0xff, 0x6b, 0xff, 0x4a, 0x6c, 0xea, 0x0e, 0x5a, 0x28, 0x60, 0x1e, 0xb2, 0x01, 0x68, 0x00, 0x18, 0x4d, 0xf4, 0x00, 0xc2, \r
-0x1c, 0xb2, 0x00, 0xc2, 0x20, 0x10, 0x1b, 0x73, 0x1c, 0x61, 0x82, 0x34, 0x82, 0x34, 0xcc, 0xec, 0x03, 0x2c, 0x00, 0xf2, 0x00, 0x68, 0x02, 0x10, 0x20, 0xf2, 0x00, 0x68, 0xa0, 0xf1, 0x06, 0x6c, \r
-0x00, 0x18, 0x5c, 0x3b, 0xb0, 0x67, 0x01, 0x6a, 0x04, 0xd2, 0x04, 0x6c, 0x12, 0xb2, 0xfa, 0x6d, 0x02, 0xf2, 0x17, 0x6e, 0xa1, 0xf1, 0x14, 0x6f, 0x05, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd0, \r
-0x02, 0x10, 0x00, 0x6a, 0x01, 0x10, 0x01, 0x6a, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x0a, 0xb4, 0x72, 0x17, 0x24, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x6c, 0x07, 0x11, 0x80, \r
-0x78, 0x51, 0x11, 0x80, 0x54, 0x4d, 0x11, 0x80, 0x66, 0x07, 0x11, 0x80, 0x9a, 0x96, 0x11, 0x80, 0xa0, 0x94, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x78, 0x4d, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, \r
-0xff, 0x6d, 0x00, 0x18, 0x93, 0x8c, 0xcc, 0xed, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x04, 0x67, 0x00, 0x1c, 0x73, 0x1b, 0x04, 0xd5, \r
-0x1a, 0xb4, 0x22, 0x67, 0x40, 0x9c, 0x04, 0x95, 0x01, 0x4a, 0x26, 0x22, 0xff, 0x6a, 0xac, 0xea, 0x01, 0x72, 0x04, 0x60, 0x20, 0x18, 0x42, 0x2f, 0x90, 0x67, 0x1e, 0x10, 0x00, 0x18, 0xcb, 0x1c, \r
-0x00, 0x65, 0x01, 0x6b, 0x12, 0xb2, 0x6b, 0xeb, 0x60, 0xc2, 0x12, 0xb2, 0x01, 0x6d, 0x40, 0x9a, 0xac, 0xea, 0x12, 0x2a, 0x10, 0xb3, 0x76, 0xab, 0x10, 0xb4, 0x62, 0x33, 0x76, 0x33, 0x40, 0x9c, \r
-0xac, 0xeb, 0x0f, 0xb5, 0x60, 0x33, 0x60, 0x33, 0xac, 0xea, 0x6d, 0xea, 0x0d, 0xb3, 0x40, 0xdc, 0x0d, 0xb4, 0x40, 0x9b, 0x8d, 0xea, 0x40, 0xdb, 0x00, 0x1c, 0x7a, 0x1b, 0x91, 0x67, 0x09, 0x97, \r
-0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x20, 0x06, 0x11, 0x80, 0x24, 0x06, 0x11, 0x80, 0x50, 0x60, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x5c, 0xa0, 0x00, 0xb0, 0xff, 0xff, 0xfe, 0xff, \r
-0x40, 0xa0, 0x00, 0xb0, 0x00, 0x00, 0x80, 0x00, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf3, 0x0a, 0x72, 0x04, 0x61, 0x00, 0x18, 0xcb, 0xed, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x58, 0xf5, \r
-0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x15, 0x3a, 0x00, 0x65, 0x0e, 0xb2, 0x20, 0xf0, 0x55, 0xa2, 0x05, 0x2a, 0x80, 0xf1, 0x10, 0x6c, 0x00, 0x18, \r
-0x5c, 0x3b, 0x00, 0x6d, 0x0a, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x08, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x08, 0xb3, 0x63, 0xda, 0x80, 0x18, 0x14, 0x31, 0x00, 0x65, \r
-0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x3c, 0x95, 0x11, 0x80, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x2d, 0xdd, 0x10, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, \r
-0x44, 0xac, 0x04, 0x67, 0x01, 0x72, 0x1f, 0x61, 0x20, 0x9c, 0x02, 0x6a, 0x04, 0xd2, 0x21, 0xb2, 0x05, 0xd2, 0x06, 0xd1, 0x41, 0x9c, 0xfa, 0x6d, 0x04, 0x6c, 0x01, 0xf2, 0x02, 0x6e, 0x41, 0xf5, \r
-0x0b, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x3f, 0x6a, 0x2c, 0xea, 0x30, 0x72, 0x27, 0x61, 0x41, 0xa8, 0xff, 0x6b, 0x6c, 0xea, 0x23, 0x2a, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, \r
-0x17, 0xb3, 0x40, 0xdb, 0x1c, 0x10, 0x17, 0xb2, 0x20, 0xa2, 0x19, 0x29, 0x02, 0x6a, 0x04, 0xd2, 0x10, 0xb2, 0x05, 0xd2, 0x40, 0x9c, 0xfa, 0x6d, 0x41, 0xf2, 0x06, 0x6e, 0x06, 0xd2, 0x41, 0x9c, \r
-0x41, 0xf5, 0x0c, 0x6f, 0x05, 0x6c, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0e, 0xb2, 0x40, 0xa2, 0x06, 0x22, 0x40, 0xa0, 0x30, 0x72, 0x03, 0x60, 0x0c, 0xb2, 0x20, 0xda, 0x03, 0x10, 0x00, 0x18, \r
-0x15, 0x31, 0x90, 0x67, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0x54, 0x8b, 0x10, 0x80, 0x5c, 0x8b, 0x10, 0x80, 0x68, 0x8b, 0x10, 0x80, \r
-0x67, 0x07, 0x11, 0x80, 0xcc, 0x95, 0x11, 0x80, 0x68, 0x07, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0xfc, 0xba, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xf7, 0x63, 0x11, 0x62, \r
-0x10, 0xd0, 0x00, 0x18, 0x79, 0xbb, 0x04, 0x67, 0x44, 0xa8, 0x20, 0xf3, 0x01, 0x72, 0x4b, 0x61, 0x28, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x03, 0x72, 0x46, 0x61, 0x27, 0xb2, 0x40, 0xaa, 0x01, 0x72, \r
-0x13, 0x61, 0x26, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x0f, 0x61, 0x25, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0x4c, 0xeb, 0x06, 0x23, 0xff, 0xf6, 0x1f, 0x6d, \r
-0xac, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x1e, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x2b, 0x61, 0x1d, 0xb2, 0x40, 0xa2, 0x28, 0x2a, 0x09, 0x6a, 0x04, 0xd2, 0x1c, 0xb2, 0x05, 0xd2, 0x1c, 0xb2, \r
-0x80, 0xf2, 0x7e, 0xa2, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd3, 0x80, 0xf2, 0x7f, 0xa2, 0x81, 0xf1, 0x16, 0x6e, 0xc1, 0xf3, 0x19, 0x6f, 0x07, 0xd3, 0xa0, 0xf2, 0x60, 0xa2, 0x08, 0xd3, 0xa0, 0xf2, \r
-0x61, 0xa2, 0x09, 0xd3, 0xa0, 0xf2, 0x62, 0xa2, 0x0a, 0xd3, 0xa0, 0xf2, 0x63, 0xa2, 0x0b, 0xd3, 0xa0, 0xf2, 0x68, 0xa2, 0x0c, 0xd3, 0xa0, 0xf2, 0x66, 0xaa, 0x0d, 0xd3, 0xa0, 0xf2, 0x44, 0xaa, \r
-0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x11, 0x97, 0x10, 0x90, 0x00, 0xef, 0x09, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x40, 0x1a, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0xac, 0x00, 0x00, 0xb6, \r
-0xe8, 0x39, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x20, 0x56, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf1, 0x14, 0x6b, 0x6e, 0xea, 0x04, 0x2a, 0x60, 0xac, \r
-0x05, 0xb5, 0x6d, 0xe5, 0x40, 0xc3, 0x00, 0x18, 0xde, 0x5c, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xd0, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x03, 0x8e, \r
-0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x5f, 0x5d, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xef, 0x63, 0x21, 0x62, 0x20, 0xd1, 0x1f, 0xd0, \r
-0x44, 0xac, 0x60, 0xf2, 0x04, 0x68, 0x24, 0x67, 0x4e, 0xe8, 0x1e, 0x28, 0xab, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0xa0, 0xf0, 0x11, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x00, 0x18, 0xe8, 0x58, \r
-0x22, 0x67, 0xa7, 0xb2, 0x00, 0xc2, 0xa7, 0xb2, 0x00, 0xc2, 0xa7, 0xb2, 0x00, 0xca, 0x80, 0x18, 0x1d, 0x29, 0x03, 0x6c, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x20, 0x18, 0xf1, 0x25, 0x00, 0x65, \r
-0x00, 0x1c, 0x7a, 0x1b, 0x91, 0x67, 0x33, 0x11, 0x60, 0xf4, 0x1f, 0x72, 0x80, 0xf0, 0x14, 0x61, 0x9a, 0xb2, 0x41, 0x9a, 0xfe, 0x4a, 0x02, 0x5a, 0x80, 0xf0, 0x0e, 0x60, 0x40, 0x9c, 0x17, 0x05, \r
-0x84, 0x42, 0x20, 0x18, 0xdc, 0x24, 0x1b, 0xd2, 0x98, 0xb3, 0x80, 0xa3, 0x1b, 0x92, 0x98, 0xb3, 0x07, 0x2c, 0x60, 0xa3, 0x02, 0x2b, 0x97, 0xb4, 0x60, 0xc4, 0x01, 0x4b, 0x94, 0xb4, 0x03, 0x10, \r
-0x60, 0xa3, 0x02, 0x2b, 0x93, 0xb4, 0x60, 0xc4, 0x00, 0x6c, 0x3f, 0x10, 0x92, 0xb3, 0x84, 0x35, 0xb5, 0xe3, 0xfd, 0x67, 0xc0, 0xad, 0x40, 0xf0, 0xbc, 0xaf, 0xce, 0xed, 0x33, 0x2d, 0xa7, 0x44, \r
-0x11, 0x4d, 0xa4, 0x35, 0xb5, 0xe3, 0xc0, 0xad, 0x40, 0xf0, 0xbe, 0xaf, 0xce, 0xed, 0x2a, 0x2d, 0xa7, 0x44, 0x29, 0x4d, 0xa4, 0x35, 0xad, 0xe3, 0xa0, 0xab, 0x60, 0xf0, 0x60, 0xaf, 0xae, 0xeb, \r
-0x21, 0x2b, 0x86, 0xb4, 0x80, 0x9c, 0xa2, 0x67, 0x00, 0x18, 0xe8, 0x1c, 0x1c, 0xd3, 0x05, 0x6a, 0x04, 0xd2, 0x83, 0xb2, 0x05, 0xd2, 0x40, 0xa0, 0x1c, 0x93, 0x02, 0x6c, 0x06, 0xd2, 0x07, 0xd3, \r
-0x7d, 0x67, 0x60, 0xf0, 0x40, 0xab, 0xfa, 0x6d, 0xe0, 0xf6, 0x05, 0x6e, 0x08, 0xd2, 0x40, 0xf0, 0x5e, 0xab, 0x61, 0xf6, 0x1e, 0x6f, 0x09, 0xd2, 0x40, 0xf0, 0x5c, 0xab, 0x20, 0x18, 0xa3, 0x30, \r
-0x0a, 0xd2, 0xd5, 0x10, 0x01, 0x4c, 0xff, 0x6b, 0x6c, 0xec, 0x72, 0xb0, 0x60, 0xa0, 0x63, 0xec, 0xbd, 0x61, 0x18, 0x5c, 0x16, 0x60, 0xfd, 0x67, 0x40, 0xf0, 0xdc, 0xaf, 0x6e, 0xb2, 0x84, 0x35, \r
-0xb5, 0xe2, 0xc0, 0xcd, 0xa7, 0x44, 0x11, 0x4d, 0x30, 0x4c, 0x84, 0x34, 0xa4, 0x35, 0xb5, 0xe2, 0x40, 0xf0, 0xde, 0xaf, 0x89, 0xe2, 0x60, 0xf0, 0x80, 0xaf, 0x01, 0x4b, 0xc0, 0xcd, 0x60, 0xc0, \r
-0x80, 0xca, 0x05, 0x6a, 0x04, 0xd2, 0x66, 0xb2, 0x05, 0xd2, 0x62, 0xb2, 0x40, 0xa2, 0x7d, 0x67, 0x01, 0x6c, 0x06, 0xd2, 0x01, 0x6a, 0x07, 0xd2, 0x60, 0xf0, 0x40, 0xab, 0xfa, 0x6d, 0xe0, 0xf6, \r
-0x16, 0x6e, 0x08, 0xd2, 0x40, 0xf0, 0x5e, 0xab, 0x61, 0xf6, 0x1e, 0x6f, 0x09, 0xd2, 0x40, 0xf0, 0x5c, 0xab, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd2, 0x44, 0xa9, 0x80, 0xf4, 0x00, 0x72, 0x80, 0xf0, \r
-0x13, 0x61, 0x00, 0x99, 0x64, 0xa0, 0x8b, 0xa8, 0x66, 0x32, 0x13, 0x72, 0x1a, 0xd4, 0x05, 0x60, 0x18, 0x72, 0x03, 0x60, 0x17, 0x72, 0x80, 0xf0, 0x07, 0x61, 0xa4, 0xa1, 0x41, 0x99, 0x66, 0x33, \r
-0xba, 0xc0, 0x16, 0x04, 0x1b, 0xd2, 0x00, 0x18, 0x44, 0x97, 0x1c, 0xd3, 0x1c, 0x93, 0x1b, 0x92, 0x7f, 0x73, 0x04, 0x60, 0x00, 0x6d, 0xe1, 0xf4, 0x16, 0x6f, 0x03, 0x10, 0xa5, 0xa0, 0x01, 0xf4, \r
-0x16, 0x6f, 0x10, 0x6e, 0x84, 0xa0, 0x04, 0xd6, 0x45, 0xb6, 0x05, 0xd6, 0x16, 0x96, 0x07, 0xd3, 0x08, 0xd5, 0x06, 0xd6, 0xb9, 0xa0, 0xc4, 0x67, 0x0a, 0xd2, 0x09, 0xd5, 0x01, 0x6d, 0xac, 0xee, \r
-0x0b, 0xd6, 0xcb, 0xa8, 0x0c, 0xd6, 0x3f, 0xb6, 0x49, 0xe6, 0x44, 0xa2, 0x0e, 0xd4, 0x40, 0xf7, 0x06, 0x6e, 0x4c, 0xed, 0x0d, 0xd5, 0x45, 0xa0, 0xfa, 0x6d, 0x04, 0x6c, 0x0f, 0xd2, 0x46, 0xa0, \r
-0x10, 0xd2, 0x47, 0xa0, 0x11, 0xd2, 0x48, 0xa0, 0x12, 0xd2, 0x49, 0xa0, 0x13, 0xd2, 0x4a, 0xa0, 0x14, 0xd2, 0x4b, 0xa0, 0x1c, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x15, 0xd2, 0x1a, 0x95, 0x1c, 0x93, \r
-0xff, 0x75, 0x3c, 0x60, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xed, 0x2f, 0xb2, 0x12, 0xe9, 0x25, 0xe2, 0xe0, 0xf0, 0x46, 0xa1, 0x01, 0x72, 0x32, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x0b, 0x72, 0x11, 0x61, \r
-0x2a, 0xb2, 0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x00, 0xf2, 0x0f, 0xa1, 0x01, 0x6a, 0x4e, 0xe8, 0x2d, 0x28, 0x8b, 0x99, 0x00, 0x18, 0xb8, 0x1c, 0x00, 0x6d, 0x00, 0xf2, 0x0f, 0xc1, \r
-0x26, 0x10, 0x1a, 0x94, 0xb0, 0x67, 0x00, 0x18, 0x58, 0xe2, 0x1c, 0xd3, 0x1c, 0x93, 0x17, 0x73, 0x05, 0x61, 0x1a, 0x95, 0x80, 0x18, 0x88, 0x2e, 0x90, 0x67, 0x10, 0x10, 0x13, 0x73, 0x05, 0x61, \r
-0x1a, 0x95, 0x20, 0x18, 0x05, 0x04, 0x90, 0x67, 0x09, 0x10, 0x18, 0x73, 0x07, 0x61, 0x12, 0x6a, 0xc0, 0xf0, 0x48, 0xc1, 0x1a, 0x95, 0x20, 0x18, 0x58, 0x01, 0x90, 0x67, 0x13, 0xb2, 0x80, 0x9a, \r
-0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x03, 0x10, 0x20, 0x18, 0x43, 0x24, 0x91, 0x67, 0x21, 0x97, 0x20, 0x91, 0x1f, 0x90, 0x00, 0xef, 0x11, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xf8, 0x95, 0x11, 0x80, \r
-0xf9, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xc4, 0x74, 0x11, 0x80, 0xc5, 0x74, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0xa4, 0x48, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, \r
-0xd4, 0x3b, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x9c, 0x48, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x01, 0x6b, 0x6b, 0xeb, 0x25, 0xb2, 0x60, 0xda, 0x00, 0x68, 0x0e, 0x10, \r
-0x0c, 0x6b, 0x78, 0xe8, 0x12, 0xeb, 0x49, 0xe3, 0x62, 0x9a, 0x07, 0x23, 0x20, 0x18, 0x9c, 0x32, 0x81, 0x9a, 0x03, 0x22, 0x1e, 0xb2, 0x00, 0xda, 0x06, 0x10, 0x01, 0x48, 0x1d, 0xb2, 0x80, 0xf0, \r
-0x64, 0xa2, 0x02, 0xeb, 0xed, 0x60, 0x1c, 0xb3, 0x1c, 0xb2, 0x60, 0xda, 0x1c, 0xb3, 0x7c, 0x4b, 0x1c, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x04, 0x22, 0x1b, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, \r
-0x1a, 0xb2, 0x40, 0xa2, 0xff, 0x72, 0x07, 0x61, 0x19, 0xb2, 0x40, 0xaa, 0x04, 0x2a, 0x00, 0x18, 0x74, 0x39, 0x00, 0x65, 0x01, 0x10, 0x00, 0x6a, 0x0d, 0xb3, 0x60, 0x9b, 0x81, 0x43, 0x07, 0x2c, \r
-0x14, 0xb3, 0x60, 0x9b, 0xc7, 0x23, 0xc6, 0x2a, 0x40, 0xeb, 0x00, 0x65, 0xc3, 0x17, 0x0c, 0x68, 0x18, 0xeb, 0x08, 0xb2, 0x04, 0x01, 0xb1, 0x67, 0x12, 0xe8, 0x41, 0xe0, 0x20, 0x18, 0xa3, 0x32, \r
-0x81, 0x98, 0xb8, 0x2a, 0x40, 0x98, 0x40, 0xea, 0x91, 0x67, 0xb4, 0x17, 0x2c, 0x8a, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01, 0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, \r
-0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0x6e, 0x04, 0x11, 0x80, 0x0e, 0x19, 0x11, 0x80, 0x9c, 0x86, 0x11, 0x80, 0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x09, 0x6a, 0x04, 0xd2, \r
-0x31, 0xb2, 0x05, 0xd2, 0x31, 0xb2, 0x40, 0xaa, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x30, 0xb2, 0x40, 0xaa, 0x80, 0xf5, 0x00, 0x6e, 0xa1, 0xf3, 0x16, 0x6f, 0x07, 0xd2, 0x2d, 0xb2, 0x40, 0x9a, \r
-0x08, 0xd2, 0x2d, 0xb2, 0x40, 0xf0, 0x61, 0xa2, 0x09, 0xd3, 0x40, 0xf0, 0x60, 0xa2, 0x0a, 0xd3, 0x20, 0xf0, 0x7f, 0xa2, 0x0b, 0xd3, 0x20, 0xf0, 0x7e, 0xa2, 0x0c, 0xd3, 0x20, 0xf0, 0x7d, 0xa2, \r
-0x0d, 0xd3, 0x20, 0xf0, 0x5c, 0xa2, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x04, 0xf7, 0x10, 0x6d, 0x00, 0x18, 0xcb, 0x31, 0x01, 0x6c, 0x21, 0xb2, 0x60, 0x9a, 0x21, 0xb2, 0x6e, 0xea, 0x11, 0x2a, \r
-0x20, 0xb1, 0x60, 0x99, 0x20, 0xb2, 0x21, 0xb0, 0x6c, 0xea, 0x4e, 0xe8, 0x0a, 0x28, 0x00, 0xf6, 0x62, 0x33, 0x1f, 0xb2, 0x60, 0xc2, 0x3f, 0xf4, 0x00, 0x6c, 0x00, 0x18, 0x8d, 0x8f, 0x00, 0x6d, \r
-0x00, 0xd9, 0x1c, 0xb2, 0x80, 0x9a, 0x1c, 0xb3, 0x8e, 0xeb, 0x01, 0x2b, 0x60, 0xda, 0x1b, 0xb2, 0x80, 0x9a, 0x1b, 0xb3, 0x8e, 0xeb, 0x01, 0x2b, 0x60, 0xda, 0x11, 0xb3, 0x0f, 0xb2, 0x60, 0xda, \r
-0x18, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x62, 0xda, 0x63, 0xda, 0x00, 0x1c, 0x43, 0x1b, 0x64, 0xda, 0x80, 0x18, 0xf3, 0x39, 0x00, 0x65, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x00, 0xef, \r
-0x0a, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0x44, 0x00, 0x11, 0x80, 0x46, 0x00, 0x11, 0x80, 0x68, 0x21, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x58, 0x8b, 0x10, 0x80, 0xef, 0xbe, 0x23, 0x87, \r
-0x5c, 0x8b, 0x10, 0x80, 0xff, 0xff, 0xff, 0x00, 0xee, 0xff, 0xc0, 0x00, 0x80, 0x07, 0x11, 0x80, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, 0x68, 0x8b, 0x10, 0x80, 0x58, 0x3b, 0x7a, 0x93, \r
-0xd0, 0x74, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x14, 0xb2, 0x14, 0xb3, 0x63, 0xda, 0x14, 0xb3, 0x72, 0xda, 0x14, 0xb3, 0x75, 0xda, 0x14, 0xb3, 0x69, 0xda, \r
-0x14, 0xb3, 0x6c, 0xda, 0x14, 0xb3, 0x6f, 0xda, 0x14, 0xb3, 0x66, 0xda, 0x14, 0xb3, 0x7b, 0xda, 0x14, 0xb3, 0x60, 0xda, 0x14, 0xb3, 0x80, 0x18, 0x91, 0x28, 0x78, 0xda, 0x80, 0x18, 0x6b, 0x2f, \r
-0x00, 0x65, 0x12, 0xb3, 0x12, 0xb2, 0x80, 0x18, 0x25, 0x3a, 0x60, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xdd, 0xe1, 0x10, 0x80, 0xe8, 0x1d, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, \r
-0x79, 0xce, 0x10, 0x80, 0xd9, 0xe4, 0x10, 0x80, 0xc9, 0xe4, 0x10, 0x80, 0xb9, 0xe4, 0x10, 0x80, 0x91, 0xe4, 0x10, 0x80, 0xbd, 0xe3, 0x10, 0x80, 0xad, 0xe3, 0x10, 0x80, 0xf9, 0xe2, 0x10, 0x80, \r
-0xa9, 0xe2, 0x10, 0x80, 0x89, 0xe2, 0x10, 0x80, 0xc1, 0xde, 0x10, 0x80, 0x64, 0x2f, 0x11, 0x80, 0x04, 0x0b, 0x0f, 0x04, 0x0a, 0x0e, 0x08, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x1b, 0x00, 0xb7, 0x00, \r
-0x53, 0x01, 0x36, 0x00, 0x6f, 0x01, 0xa7, 0x02, 0x53, 0x00, 0x28, 0x02, 0xfd, 0x03, 0x25, 0x00, 0x07, 0x04, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x74, 0x41, 0x01, 0x10, 0xac, 0x80, 0x01, 0xf0, \r
-0x0a, 0x22, 0x62, 0x02, 0x4e, 0x22, 0x9a, 0x06, 0x50, 0x22, 0x9a, 0x06, 0x34, 0x21, 0xf5, 0xff, 0x36, 0x21, 0xff, 0xfe, 0x18, 0x20, 0x0f, 0x69, 0x34, 0x20, 0x55, 0x22, 0x38, 0x20, 0xa8, 0xc0, \r
-0x25, 0x00, 0x00, 0x72, 0x26, 0x00, 0x00, 0x72, 0x3d, 0x00, 0x00, 0xfe, 0x2e, 0x00, 0x95, 0xa7, 0x32, 0x00, 0x95, 0xa7, 0x22, 0x00, 0x00, 0x84, 0x27, 0x00, 0xa0, 0x6a, 0x28, 0x00, 0xa0, 0x6a, \r
-0x29, 0x00, 0x03, 0x22, 0x2a, 0x00, 0x01, 0x20, 0x2b, 0x00, 0xc9, 0xad, 0x2f, 0x00, 0xc9, 0xad, 0x33, 0x00, 0x00, 0xc0, 0x37, 0x00, 0x00, 0xc0, 0x3c, 0x00, 0x15, 0x00, 0xff, 0xff, 0xff, 0xff, \r
-0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x2a, 0x08, 0x32, 0x00, 0x64, 0x04, 0x33, 0x00, 0x42, 0x40, 0x34, 0x00, 0xcc, 0x27, 0x35, 0x00, 0xd0, 0x48, \r
-0x36, 0x00, 0x00, 0x40, 0x37, 0x00, 0x10, 0x05, 0x38, 0x00, 0x0c, 0x00, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0, 0x2b, 0x00, 0x43, 0x00, 0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, \r
-0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x4a, 0x08, 0x32, 0x00, 0x64, 0x04, 0x33, 0x00, 0x84, 0xf8, 0x34, 0x00, 0x7e, 0x11, \r
-0x35, 0x00, 0xd0, 0xf8, 0x37, 0x00, 0x90, 0x05, 0x38, 0x00, 0x08, 0x00, 0x36, 0x00, 0x00, 0x40, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0, 0x2b, 0x00, 0x43, 0x00, 0x2c, 0x00, 0x43, 0x00, \r
-0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x06, 0x10, 0x3f, 0x00, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00, 0x1c, 0x00, 0x21, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x0e, 0x00, 0xe2, 0xd1, \r
-0x35, 0x00, 0xd0, 0x4e, 0x0e, 0x00, 0xe2, 0x51, 0x24, 0x00, 0x01, 0x00, 0x00, 0x60, 0x00, 0x01, 0x0e, 0x00, 0xe2, 0xd1, 0x35, 0x00, 0xd0, 0x48, 0x0e, 0x00, 0xe2, 0x51, 0x3f, 0x00, 0x00, 0x00, \r
-0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x40, 0x11, 0x00, 0x3d, 0x00, 0x12, 0x00, 0x36, 0x9f, 0x18, 0x00, 0x6c, 0x4e, 0x0e, 0x00, 0xe2, 0x51, \r
-0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x9b, 0x7d, 0x13, 0x00, 0x0e, 0x60, 0x13, 0x00, 0x9e, 0x5c, 0x13, 0x00, 0x0a, 0x30, 0x13, 0x00, 0xf8, 0x2f, 0x13, 0x00, 0xc5, 0x1f, 0x13, 0x00, 0x90, 0x00, \r
-0x19, 0x00, 0x9b, 0x7d, 0x19, 0x00, 0x0e, 0x60, 0x19, 0x00, 0x9e, 0x5c, 0x19, 0x00, 0x0a, 0x30, 0x19, 0x00, 0xf8, 0x2f, 0x19, 0x00, 0xc5, 0x1f, 0x19, 0x00, 0x90, 0x00, 0xff, 0xff, 0xff, 0xff, \r
-0x15, 0x00, 0x40, 0x00, 0x15, 0x00, 0xc0, 0x20, 0x15, 0x00, 0xc0, 0x41, 0x15, 0x00, 0xc0, 0x68, 0x15, 0x00, 0xc0, 0x89, 0x15, 0x00, 0xc0, 0xb0, 0x15, 0x00, 0xc0, 0xd1, 0x15, 0x00, 0xc0, 0xf3, \r
-0x1a, 0x00, 0x40, 0x00, 0x1a, 0x00, 0xc0, 0x20, 0x1a, 0x00, 0xc0, 0x41, 0x1a, 0x00, 0xc0, 0x68, 0x1a, 0x00, 0xc0, 0x89, 0x1a, 0x00, 0xc0, 0xb0, 0x1a, 0x00, 0xc0, 0xd1, 0x1a, 0x00, 0xc0, 0xf3, \r
-0xff, 0xff, 0xff, 0xff, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x28, 0x2b, 0x2e, 0x6b, 0x6e, 0x8b, 0x8e, 0xce, 0xee, 0xee, 0xee, 0xf7, 0xf7, 0xf9, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0d, 0x17, 0x18, 0x19, \r
-0x19, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0x19, 0x19, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, \r
-0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf4, 0x01, \r
-0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x20, 0x00, 0x48, 0x42, 0x20, 0x00, 0x01, 0x44, 0x20, 0x00, 0x48, 0x46, 0x20, 0x00, 0x81, 0x48, 0x20, 0x00, 0x00, \r
-0x4a, 0x20, 0x00, 0xf8, 0x4c, 0x20, 0x00, 0x00, 0x4e, 0x20, 0xd8, 0x00, 0x50, 0x20, 0x90, 0xcc, 0x52, 0x20, 0x00, 0x18, 0x54, 0x20, 0x10, 0x8c, 0x56, 0x20, 0x00, 0xe0, 0x58, 0x20, 0x00, 0x50, \r
-0x5a, 0x20, 0x00, 0x80, 0x5c, 0x20, 0x00, 0x20, 0x5e, 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x0e, 0x20, 0x01, 0x00, 0x02, 0x20, 0x60, 0xc0, 0x00, 0x60, 0x0a, 0x00, 0x02, 0x20, 0x20, 0xc0, \r
-0x00, 0x60, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x20, 0x00, 0x0c, 0x20, 0x10, 0x00, \r
-0x0e, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x47, 0x67, 0x6c, \r
-0xea, 0x2b, 0x00, 0x00, 0xce, 0xa1, 0x2f, 0x80\r
+0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x69, 0x4f, 0xb2, 0x20, 0xda, 0x4f, 0xb2, 0x40, 0x9a, 0x4f, 0xb3, 0x4f, 0xb0, 0x42, 0x34, 0x82, 0x34, 0x80, 0xcb, 0x4e, 0xb3, 0x40, 0xcb,\r
+0x4e, 0xb2, 0x20, 0xc2, 0x4e, 0xb2, 0x20, 0xc2, 0x01, 0x6b, 0x4e, 0xb2, 0x60, 0xc2, 0x4e, 0xb2, 0x20, 0xc2, 0x4e, 0xb2, 0x20, 0xc2, 0x4e, 0xb2, 0x20, 0xca, 0x4e, 0xb3, 0x4e, 0xb2, 0x60, 0xda,\r
+0x4e, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3,\r
+0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x53, 0xb2, 0x60, 0xda, 0x53, 0xb3, 0x53, 0xb2, 0x60, 0xda, 0x53, 0xb3, 0x54, 0xb2,\r
+0x60, 0xda, 0x54, 0xb3, 0x54, 0xb2, 0x60, 0xda, 0x54, 0xb3, 0x55, 0xb2, 0x60, 0xda, 0x55, 0xb3, 0x55, 0xb2, 0x60, 0xda, 0x55, 0xb3, 0x56, 0xb2, 0x80, 0x18, 0xf8, 0x2d, 0x60, 0xda, 0x55, 0xb3,\r
+0x55, 0xb2, 0x60, 0xda, 0x55, 0xb3, 0x56, 0xb2, 0x60, 0xda, 0x56, 0xb3, 0x56, 0xb2, 0x60, 0xda, 0x56, 0xb3, 0x57, 0xb2, 0x60, 0xda, 0x57, 0xb3, 0x57, 0xb2, 0x60, 0xda, 0x57, 0xb3, 0x58, 0xb2,\r
+0x60, 0xda, 0x45, 0xf1, 0x09, 0x6a, 0x00, 0xf1, 0x50, 0xc8, 0x56, 0xb2, 0x00, 0xf4, 0x00, 0x6b, 0xa0, 0xf0, 0x76, 0xc8, 0x43, 0xd8, 0x54, 0xb2, 0x54, 0xb3, 0x25, 0xd8, 0x44, 0xd8, 0x02, 0x6a,\r
+0x80, 0xf1, 0x42, 0xc0, 0x00, 0xf2, 0x00, 0x6a, 0xa0, 0xf0, 0x52, 0xc8, 0x90, 0x6a, 0xa0, 0xf0, 0x54, 0xc8, 0xa0, 0xf0, 0x58, 0xc8, 0x4e, 0xb2, 0x60, 0xda, 0x4e, 0xb3, 0x4e, 0xb2, 0x60, 0xda,\r
+0x4e, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x00, 0x6a, 0xe0, 0xf1, 0x45, 0xc0, 0x26, 0xd8, 0x27, 0xd8, 0x28, 0xd8, 0x80, 0x18, 0x4d, 0x34, 0x29, 0xd8, 0x80, 0x18,\r
+0x8e, 0x36, 0x00, 0x65, 0xc0, 0xf1, 0x7f, 0xa0, 0x48, 0xb2, 0x60, 0xc2, 0xe0, 0xf1, 0x62, 0xa0, 0x47, 0xb2, 0x60, 0xc2, 0x47, 0xb2, 0x00, 0x6b, 0x60, 0xc2, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90,\r
+0x00, 0xef, 0x04, 0x63, 0x54, 0x8b, 0x10, 0x80, 0x50, 0xf0, 0x10, 0x80, 0x46, 0x00, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x44, 0x00, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80,\r
+0x08, 0x96, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0xe1, 0xc9, 0x10, 0x80, 0xe8, 0x07, 0x11, 0x80, 0xf9, 0xc3, 0x10, 0x80, 0x24, 0x19, 0x11, 0x80,\r
+0xa9, 0xc3, 0x10, 0x80, 0x80, 0x19, 0x11, 0x80, 0x01, 0xe4, 0x10, 0x80, 0x14, 0x07, 0x11, 0x80, 0x9d, 0xd3, 0x10, 0x80, 0x1c, 0x19, 0x11, 0x80, 0xed, 0xba, 0x10, 0x80, 0x20, 0x19, 0x11, 0x80,\r
+0x25, 0xd6, 0x10, 0x80, 0xb0, 0x07, 0x11, 0x80, 0x0d, 0xba, 0x10, 0x80, 0xf8, 0x06, 0x11, 0x80, 0xe5, 0xd6, 0x10, 0x80, 0x08, 0x07, 0x11, 0x80, 0xdd, 0xcb, 0x10, 0x80, 0xe0, 0x06, 0x11, 0x80,\r
+0x51, 0xcb, 0x10, 0x80, 0xd0, 0x07, 0x11, 0x80, 0x91, 0xba, 0x10, 0x80, 0xc8, 0x07, 0x11, 0x80, 0xad, 0xba, 0x10, 0x80, 0xa0, 0x07, 0x11, 0x80, 0x89, 0xce, 0x10, 0x80, 0xe8, 0x06, 0x11, 0x80,\r
+0x91, 0xcf, 0x10, 0x80, 0x48, 0x19, 0x11, 0x80, 0xad, 0xec, 0x10, 0x80, 0x90, 0x07, 0x11, 0x80, 0x6d, 0xbb, 0x10, 0x80, 0x34, 0x08, 0x11, 0x80, 0x09, 0xdf, 0x10, 0x80, 0xf8, 0x1a, 0x11, 0x80,\r
+0x79, 0xcc, 0x10, 0x80, 0x40, 0x19, 0x11, 0x80, 0xc5, 0xbb, 0x10, 0x80, 0xc4, 0x07, 0x11, 0x80, 0xa5, 0xca, 0x10, 0x80, 0x74, 0x19, 0x11, 0x80, 0x59, 0xe4, 0x10, 0x80, 0x74, 0x07, 0x11, 0x80,\r
+0x14, 0xc0, 0x52, 0x02, 0x58, 0xd5, 0xc8, 0x19, 0x2d, 0xb0, 0x10, 0x80, 0x7c, 0x07, 0x11, 0x80, 0x45, 0xd8, 0x10, 0x80, 0xb4, 0x07, 0x11, 0x80, 0x61, 0xd7, 0x10, 0x80, 0x58, 0x08, 0x11, 0x80,\r
+0xed, 0xbb, 0x10, 0x80, 0x1c, 0x1a, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x1c, 0x96, 0x11, 0x80, 0x09, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0d, 0xb0, 0x90, 0x67, 0x00, 0x6d,\r
+0x00, 0x18, 0x40, 0x33, 0x40, 0x6e, 0x01, 0x6a, 0x4b, 0xea, 0x47, 0xd8, 0x70, 0x6a, 0x43, 0xc0, 0x0a, 0x6a, 0x4c, 0xc0, 0x08, 0x6a, 0x4d, 0xc0, 0x06, 0xb3, 0x00, 0x6a, 0x40, 0xc3, 0x06, 0xb3,\r
+0x40, 0xc3, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0xd1, 0x95, 0x11, 0x80, 0xd6, 0x63, 0x53, 0x62, 0x52, 0xd1, 0x51, 0xd0,\r
+0x00, 0xf4, 0x05, 0x6a, 0x7d, 0x67, 0x52, 0xcb, 0x0d, 0x6a, 0x20, 0xf0, 0x46, 0xc3, 0x20, 0xf0, 0x07, 0x04, 0x71, 0xb5, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x9d, 0x67, 0x01, 0x6a, 0x00, 0x6b,\r
+0x20, 0xf0, 0x4f, 0xc4, 0x20, 0xf0, 0x53, 0xc4, 0x6c, 0xb2, 0x20, 0xf0, 0x6d, 0xc4, 0x20, 0xf0, 0x6e, 0xc4, 0x20, 0xf0, 0x70, 0xc4, 0x20, 0xf0, 0x71, 0xc4, 0x20, 0xf0, 0x72, 0xc4, 0xc0, 0xf1,\r
+0x6a, 0xc2, 0xc0, 0xf1, 0x7e, 0xc2, 0x03, 0x6b, 0x02, 0x6c, 0xc0, 0xf1, 0x7c, 0xc2, 0x64, 0xb3, 0xc0, 0xf1, 0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0xc0, 0xf1, 0x9d, 0xc2, 0x80, 0xc3, 0x61, 0xb3,\r
+0x00, 0x6c, 0x80, 0xdb, 0x81, 0xdb, 0x60, 0xf1, 0x70, 0xa2, 0x44, 0x67, 0x02, 0x73, 0x07, 0x60, 0x03, 0x73, 0xa0, 0xf0, 0x07, 0x60, 0x01, 0x73, 0xa0, 0xf0, 0x04, 0x60, 0x0f, 0x10, 0xc0, 0xf2,\r
+0x0c, 0x6b, 0x78, 0xea, 0x58, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0xc0, 0xf0, 0x68, 0xa3, 0x80, 0xf0, 0x19, 0x2b, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xf1, 0x61, 0x00, 0x18, 0xc8, 0x5e,\r
+0x09, 0x04, 0x4a, 0xd2, 0x80, 0xf0, 0x10, 0x2a, 0x7d, 0x67, 0x20, 0xf0, 0x6d, 0xa3, 0x5d, 0x67, 0x9d, 0x67, 0x20, 0xf0, 0x4e, 0xa2, 0x20, 0xf0, 0x8f, 0xa4, 0x4e, 0xd3, 0x7d, 0x67, 0x4f, 0xd2,\r
+0x4d, 0xd4, 0x5d, 0x67, 0x20, 0xf0, 0x93, 0xa3, 0x20, 0xf0, 0x50, 0xa2, 0x20, 0xf0, 0x02, 0x05, 0x4b, 0xd4, 0x4c, 0xd2, 0x20, 0xf0, 0x12, 0xa3, 0x20, 0xf0, 0x31, 0xa3, 0x00, 0x18, 0x28, 0xe2,\r
+0x08, 0x04, 0x02, 0x22, 0x4a, 0xd2, 0x70, 0x10, 0x5d, 0x67, 0x00, 0x30, 0x2d, 0xe8, 0x31, 0xaa, 0xc0, 0xf2, 0x0c, 0x6a, 0x38, 0xb5, 0x58, 0xe9, 0x3b, 0xb2, 0x12, 0xe9, 0x45, 0xe1, 0xe0, 0xf0,\r
+0x88, 0x41, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x4f, 0x93, 0x4e, 0x94, 0x60, 0x32, 0x8d, 0xea, 0x60, 0xf2, 0x58, 0xc9, 0x5d, 0x67, 0x30, 0xf1, 0x64, 0x42, 0x40, 0xa3, 0x7d, 0x67, 0x30, 0xf1,\r
+0x80, 0x43, 0xe0, 0xf0, 0x55, 0xc1, 0x60, 0xa4, 0x9d, 0x67, 0x20, 0xf1, 0x4c, 0x44, 0xe0, 0xf0, 0x77, 0xc1, 0x80, 0xa2, 0x7d, 0x67, 0xe0, 0xf0, 0x98, 0xc1, 0x20, 0xf0, 0x40, 0xa3, 0xe0, 0xf0,\r
+0x4e, 0xc1, 0x01, 0x6a, 0x60, 0xf2, 0x5a, 0xc1, 0x00, 0x18, 0xe5, 0x9c, 0x91, 0xab, 0x9d, 0x67, 0x20, 0xf1, 0x48, 0x44, 0x80, 0xa2, 0x02, 0x32, 0x5e, 0x32, 0x00, 0xf1, 0x8c, 0xc1, 0x13, 0x22,\r
+0xef, 0xf7, 0x1f, 0x6a, 0x0c, 0xea, 0x01, 0x6b, 0x80, 0xf0, 0x44, 0xc9, 0x06, 0x6c, 0x04, 0xd3, 0xfc, 0x6d, 0x1e, 0xb3, 0x80, 0xf5, 0x12, 0x6e, 0x20, 0xf5, 0x17, 0x6f, 0x05, 0xd3, 0x20, 0x18,\r
+0xa3, 0x30, 0x06, 0xd2, 0x06, 0x10, 0x5d, 0x67, 0x20, 0xf1, 0x68, 0x42, 0x40, 0xab, 0x80, 0xf0, 0x44, 0xc9, 0x00, 0x18, 0x92, 0xa0, 0x09, 0x04, 0x02, 0x67, 0x0e, 0x22, 0x7d, 0x67, 0x20, 0xf0,\r
+0x80, 0xa3, 0xe0, 0xf0, 0xa3, 0xa1, 0x00, 0x18, 0x02, 0xe2, 0x00, 0x65, 0x0a, 0xb4, 0x00, 0x18, 0xfe, 0xe1, 0x00, 0x65, 0x4a, 0xd0, 0x08, 0x10, 0x5d, 0x67, 0x91, 0xaa, 0x20, 0x18, 0xfa, 0x25,\r
+0x01, 0x6d, 0x02, 0x10, 0x0c, 0x6b, 0x4a, 0xd3, 0x4a, 0x92, 0x53, 0x97, 0x52, 0x91, 0x51, 0x90, 0x00, 0xef, 0x2a, 0x63, 0xa4, 0x95, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80,\r
+0x5c, 0x53, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x10, 0xb3, 0x00, 0x6d, 0xc0, 0xf1, 0xaa, 0xc3, 0xc0, 0xf1, 0xbe, 0xc3, 0xff, 0x6a, 0x03, 0x6d,\r
+0x8c, 0xea, 0xc0, 0xf1, 0xbc, 0xc3, 0x02, 0x6c, 0x0b, 0xb5, 0xc0, 0xf1, 0x89, 0xc3, 0xc0, 0xf1, 0x88, 0xc3, 0xc0, 0xf1, 0x9d, 0xc3, 0x60, 0xf1, 0x40, 0xc3, 0x80, 0xc5, 0x00, 0x18, 0x2e, 0xaa,\r
+0x82, 0x67, 0x06, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62,\r
+0x00, 0xf4, 0x06, 0x6a, 0x7d, 0x67, 0x4a, 0xcb, 0x03, 0x6a, 0x56, 0xc3, 0x13, 0x6a, 0x59, 0xc3, 0x1d, 0xb2, 0x6d, 0xa2, 0x08, 0x73, 0x1a, 0x60, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xeb, 0x1b, 0xb2,\r
+0x01, 0x6d, 0x12, 0xec, 0x91, 0xe2, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x0f, 0x26, 0x00, 0xf1, 0x52, 0xaa, 0x47, 0xeb, 0xac, 0xea, 0x0a, 0x22, 0x20, 0xf1, 0x4c, 0xac, 0x7d, 0x67, 0x05, 0x04,\r
+0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x0e, 0xb2, 0x4c, 0xa2, 0x0a, 0x72, 0x14, 0x60, 0xc0, 0xf2, 0x0c, 0x6b, 0x78, 0xea, 0x0d, 0xb3, 0x12, 0xea, 0x49, 0xe3,\r
+0xe0, 0xf0, 0x66, 0xa2, 0x01, 0x73, 0x0a, 0x61, 0x60, 0xf2, 0x56, 0xaa, 0x7d, 0x67, 0x05, 0x04, 0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x47, 0x97, 0x00, 0xef,\r
+0x24, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x6a, 0x18, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb,\r
+0x04, 0xf0, 0x06, 0x6b, 0x68, 0xcc, 0x54, 0xc4, 0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x59, 0xc4, 0x5a, 0xc4, 0x5b, 0xc4, 0x5c, 0xc4, 0x5d, 0xc4, 0x5e, 0xc4, 0x5f, 0xc4, 0x0f, 0x6b, 0x07, 0x6a,\r
+0x04, 0x00, 0x72, 0xc4, 0x20, 0xf0, 0x40, 0xc4, 0x20, 0x6b, 0x03, 0x6a, 0x73, 0xc4, 0x75, 0xc4, 0x20, 0xf0, 0x41, 0xc4, 0x00, 0x18, 0x13, 0xca, 0x90, 0x67, 0x7d, 0x67, 0x04, 0xf0, 0x0a, 0x6a,\r
+0x48, 0xcb, 0x01, 0x6a, 0x90, 0x67, 0x52, 0xc3, 0x00, 0x18, 0x8b, 0xca, 0x53, 0xc3, 0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62,\r
+0x00, 0x6a, 0x21, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb, 0x04, 0xf0, 0x0d, 0x6b, 0x68, 0xcc, 0x19, 0x6b, 0x72, 0xc4, 0x60, 0x6b, 0x6b, 0xeb, 0x73, 0xc4, 0x75, 0xc4, 0x1b, 0xb3, 0x54, 0xc4,\r
+0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x94, 0xa3, 0xbd, 0x67, 0x5f, 0xc5, 0x99, 0xc5, 0x95, 0xa3, 0x20, 0xf0, 0x40, 0xc5, 0x20, 0xf0, 0x42, 0xc5, 0x9a, 0xc5, 0x96, 0xa3, 0x20, 0xf0, 0x44, 0xc5,\r
+0x20, 0xf0, 0x45, 0xc5, 0x9b, 0xc5, 0x97, 0xa3, 0x20, 0xf0, 0x47, 0xc5, 0x20, 0xf0, 0x49, 0xc5, 0x9c, 0xc5, 0x98, 0xa3, 0x79, 0xa3, 0x9d, 0xc5, 0x7e, 0xc5, 0x02, 0x6b, 0x20, 0xf0, 0x61, 0xc5,\r
+0x20, 0xf0, 0x63, 0xc5, 0x1e, 0x6b, 0x20, 0xf0, 0x66, 0xc5, 0x12, 0x6b, 0x20, 0xf0, 0x68, 0xc5, 0x20, 0xf0, 0x6a, 0xc5, 0x20, 0xf0, 0x4b, 0xc5, 0x00, 0x18, 0x41, 0xc8, 0x04, 0x04, 0x47, 0x97,\r
+0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x0c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x7d, 0x67, 0x04, 0xf0, 0x1d, 0x6a, 0x48, 0xcb,\r
+0x01, 0x6a, 0x52, 0xc3, 0x08, 0xb2, 0x41, 0xaa, 0x7f, 0x6b, 0x04, 0x04, 0x4a, 0x32, 0x6c, 0xea, 0x7d, 0x67, 0x00, 0x18, 0xa2, 0xc5, 0x53, 0xc3, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65,\r
+0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdb, 0x63, 0x49, 0x62, 0x48, 0xd1, 0x47, 0xd0, 0x00, 0x69, 0x0e, 0xb2, 0x7d, 0x67, 0x20, 0xda, 0x21, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x48, 0xcb,\r
+0x0b, 0xb2, 0x81, 0xf1, 0x48, 0xaa, 0x0b, 0xb0, 0x32, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x4d, 0xd8, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x29, 0xc0, 0x44, 0xc0, 0x49, 0x97,\r
+0x48, 0x91, 0x47, 0x90, 0x00, 0xef, 0x25, 0x63, 0x5c, 0x53, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x68, 0x0b, 0xb2, 0x7d, 0x67,\r
+0x00, 0xda, 0x01, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x12, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x48, 0xcb, 0x07, 0xb2, 0x84, 0xa2, 0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x09, 0xc2,\r
+0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x1c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x1b, 0xb2, 0x64, 0xa2,\r
+0x07, 0x6d, 0x6e, 0x34, 0xac, 0xec, 0x05, 0x54, 0x06, 0x61, 0x39, 0x6c, 0x8b, 0xec, 0x6c, 0xec, 0x20, 0x6b, 0x6d, 0xec, 0x84, 0xc2, 0x15, 0xb2, 0x64, 0xa2, 0x07, 0x6c, 0x14, 0xb5, 0x6e, 0x33,\r
+0x8c, 0xeb, 0x6d, 0xe5, 0x60, 0xa3, 0xc3, 0xa2, 0x6c, 0xec, 0x0f, 0x6b, 0x6b, 0xeb, 0x84, 0x35, 0xcc, 0xeb, 0xad, 0xeb, 0x63, 0xc2, 0xbd, 0x67, 0x04, 0xf0, 0x1e, 0x6b, 0x68, 0xcd, 0x03, 0x6b,\r
+0x72, 0xc5, 0x61, 0xaa, 0x7f, 0x6d, 0x6a, 0x33, 0xac, 0xeb, 0xbd, 0x67, 0x73, 0xc5, 0x40, 0x9a, 0x95, 0xc5, 0x04, 0x04, 0x42, 0x32, 0x00, 0x18, 0x58, 0xc5, 0x54, 0xc5, 0x47, 0x97, 0x00, 0xef,\r
+0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0x5c, 0xed, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b,\r
+0x02, 0xf1, 0x01, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x06, 0xb2, 0x84, 0xa2,\r
+0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd1, 0x0f, 0xd0,\r
+0x7c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x79, 0x6c, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0x3f, 0xb3, 0x0c, 0xe9, 0x4c, 0xe8, 0x58, 0xab, 0x8d, 0x9b,\r
+0xe3, 0xf7, 0x1f, 0x6d, 0x4b, 0xe0, 0x89, 0xe2, 0x80, 0x9b, 0x4d, 0xdb, 0x18, 0xcb, 0x96, 0x34, 0xac, 0xec, 0x98, 0xea, 0xaf, 0x9b, 0x12, 0xec, 0x8e, 0xdb, 0x99, 0xab, 0x39, 0xcb, 0x93, 0xe1,\r
+0xb1, 0xe4, 0x8f, 0xdb, 0x34, 0xb3, 0xa0, 0xa3, 0x0a, 0x5d, 0x18, 0x61, 0x06, 0x6d, 0x04, 0xd5, 0x32, 0xb5, 0x05, 0xd5, 0x02, 0xf1, 0x11, 0x6d, 0x06, 0xd5, 0x07, 0xd5, 0x0b, 0xd4, 0xfc, 0x6d,\r
+0x02, 0x6c, 0xc0, 0xf2, 0x08, 0x6e, 0xa4, 0xf3, 0x11, 0x6f, 0x0c, 0xd3, 0x08, 0xd0, 0x09, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd1, 0x0c, 0x93, 0x00, 0x6a, 0x40, 0xc3, 0x26, 0xb2, 0x60, 0xa2,\r
+0x01, 0x4b, 0x60, 0xc2, 0x7d, 0xf2, 0x01, 0x6a, 0x43, 0xe8, 0x02, 0x60, 0x43, 0xe9, 0x3a, 0x61, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf6,\r
+0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf6, 0x00, 0x6b, 0xc2, 0x67,\r
+0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x03, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18,\r
+0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x05, 0xb2, 0x00, 0x6b,\r
+0x78, 0xca, 0x79, 0xca, 0x11, 0x97, 0x10, 0x91, 0x0f, 0x90, 0x00, 0xef, 0x09, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xd1, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfb, 0x63, 0x09, 0x62,\r
+0x08, 0xd1, 0x07, 0xd0, 0x11, 0xb2, 0x47, 0x9a, 0xff, 0x68, 0x8c, 0xe8, 0x01, 0x4a, 0x04, 0x22, 0x0f, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x11, 0x20, 0x00, 0x69, 0x0b, 0xb0, 0x01, 0x6c,\r
+0x0b, 0xb5, 0x0c, 0xb6, 0xf1, 0x67, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd1, 0x87, 0x98, 0x00, 0x18, 0xbe, 0x1c, 0x64, 0x6d, 0x00, 0x6a, 0x30, 0xc8, 0x20, 0xf0, 0x49, 0xc0, 0x09, 0x97, 0x08, 0x91,\r
+0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0xed, 0xa9, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5,\r
+0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0xff, 0x6b, 0x0c, 0xea, 0x02, 0x4b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5,\r
+0x01, 0x6d, 0x0c, 0xea, 0x00, 0xf2, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x0c, 0xb0, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6,\r
+0xc4, 0x67, 0xd1, 0xa8, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x42, 0x6c, 0x80, 0x18, 0x47, 0x2a, 0x00, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x44, 0xc0, 0x00, 0x6a, 0x49, 0xc0,\r
+0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x20, 0xb2, 0x47, 0x9a, 0x08, 0xd4, 0x8e, 0xea, 0x05, 0x22, 0x01, 0x4c,\r
+0x03, 0x24, 0x00, 0x18, 0xcb, 0x1c, 0x08, 0x04, 0x1b, 0xb0, 0x64, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x08, 0x2a, 0x47, 0x98, 0x01, 0x4a, 0x29, 0x22, 0x18, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65,\r
+0x24, 0x10, 0x02, 0x69, 0x6c, 0xe9, 0xff, 0x6a, 0x4c, 0xe9, 0x07, 0x21, 0x80, 0x18, 0xfe, 0x29, 0x00, 0x65, 0x50, 0xa8, 0x01, 0x4a, 0x50, 0xc8, 0x18, 0x10, 0x7d, 0x6c, 0x00, 0x18, 0xab, 0xa5,\r
+0x01, 0x6d, 0x04, 0x6b, 0x4c, 0xeb, 0x06, 0x23, 0x50, 0xa8, 0x20, 0xf0, 0x29, 0xc0, 0x01, 0x4a, 0x50, 0xc8, 0x0b, 0x10, 0x20, 0xf0, 0x49, 0xa0, 0x19, 0x5a, 0x04, 0x60, 0x01, 0x4a, 0x20, 0xf0,\r
+0x49, 0xc0, 0x03, 0x10, 0x80, 0x18, 0x5d, 0x2a, 0x00, 0x65, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62,\r
+0x04, 0xd0, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x19, 0xb2, 0xc1, 0xaa, 0x7f, 0x6a, 0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x80, 0x4a, 0x81, 0x4a, 0x4d, 0xee,\r
+0xff, 0x6a, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf7, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee,\r
+0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0xc2, 0x67, 0x01, 0x6d, 0x6d, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c,\r
+0x80, 0x18, 0x47, 0x2a, 0x01, 0x6c, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x6c, 0xc4, 0x67, 0x00, 0x18,\r
+0x4d, 0xa6, 0xa4, 0x67, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0x6e, 0xff, 0xf7, 0x1f, 0x6b, 0x04, 0x4e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x01, 0x6d, 0x0b, 0xb0, 0x00, 0x18,\r
+0x4d, 0xa6, 0x57, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x00, 0x6c, 0x80, 0x18, 0x47, 0x2a, 0x44, 0xc0, 0x80, 0x18, 0xfe, 0x29, 0x00, 0x65, 0x00, 0x6a, 0x49, 0xc0, 0x05, 0x97,\r
+0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x38, 0xb0, 0x90, 0xa0, 0x4f, 0xa0, 0x04, 0x05, 0x80, 0x34, 0x4d, 0xec, 0x4e, 0xa0,\r
+0x80, 0x34, 0x00, 0x18, 0x69, 0xbc, 0x4d, 0xec, 0x7d, 0x67, 0x48, 0xab, 0x8f, 0xa0, 0xdd, 0x67, 0x4c, 0xcb, 0x49, 0xab, 0xaa, 0xae, 0x4d, 0xcb, 0x4e, 0xa0, 0x80, 0x33, 0x68, 0x33, 0x48, 0x32,\r
+0x6d, 0xea, 0x03, 0x6b, 0xac, 0xeb, 0x6d, 0xea, 0x70, 0xa0, 0x4e, 0xce, 0x9a, 0x34, 0x68, 0x32, 0x7e, 0x33, 0x8d, 0xea, 0x05, 0x23, 0x09, 0xf4, 0x00, 0x6b, 0x4d, 0xeb, 0x6f, 0xce, 0x06, 0x10,\r
+0x0a, 0xf0, 0x00, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x5d, 0x67, 0x6f, 0xca, 0x00, 0x6a, 0x21, 0x10, 0xdd, 0x67, 0x44, 0x35, 0xb5, 0xe6, 0xac, 0xad, 0x01, 0x6e, 0xa7, 0xeb, 0xcc, 0xed, 0x0c, 0x25,\r
+0x0f, 0x6d, 0x77, 0xe5, 0xc4, 0xed, 0xa6, 0x67, 0x8d, 0xed, 0xa0, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6d, 0xac, 0xec, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x10, 0x5b,\r
+0xe7, 0x61, 0x44, 0x33, 0x01, 0x4a, 0xdd, 0x67, 0xac, 0xea, 0x6d, 0xe6, 0x04, 0x5a, 0x8c, 0xcb, 0x03, 0x60, 0x00, 0x6c, 0x64, 0x67, 0xdc, 0x17, 0x5d, 0x67, 0xcc, 0xaa, 0x51, 0x6c, 0x00, 0x18,\r
+0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcd, 0xab, 0x50, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x5d, 0x67, 0xce, 0xaa, 0x4f, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcf, 0xab,\r
+0x4e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5e, 0x6c, 0x00, 0x18,\r
+0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x5e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18,\r
+0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0xc2, 0x67, 0x53, 0xb1, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x44, 0xa1, 0x07, 0x6b, 0xa3, 0xa1, 0x4e, 0x32,\r
+0x6c, 0xea, 0x44, 0x34, 0x0f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc1, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x04, 0xd3, 0xc3, 0xa1, 0x04, 0x93, 0x71, 0x6c, 0xc6, 0x36,\r
+0x6c, 0xee, 0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0xd0, 0x36, 0x4d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x60, 0xa1, 0x01, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x0b, 0x22, 0x44, 0xa1,\r
+0x80, 0x48, 0xff, 0x48, 0x4c, 0xe8, 0xff, 0x6a, 0x4c, 0xe8, 0x0b, 0xe8, 0xc0, 0xf7, 0x02, 0x30, 0x03, 0x6a, 0x03, 0xe2, 0x39, 0xb1, 0x56, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x80, 0x99,\r
+0x00, 0x33, 0xe3, 0xf7, 0x1f, 0x6d, 0x96, 0x34, 0xac, 0xec, 0x78, 0x33, 0x8d, 0xeb, 0xfb, 0xf7, 0x1f, 0x6c, 0x8c, 0xeb, 0xff, 0xf7, 0x1f, 0x68, 0x1c, 0xf0, 0x00, 0x6c, 0x8b, 0xec, 0x0c, 0xea,\r
+0xc3, 0x67, 0x8c, 0xea, 0x4d, 0xee, 0x56, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0xc7, 0xa1, 0x46, 0xa1, 0x58, 0x6c, 0xc0, 0x36, 0x4d, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c,\r
+0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x04, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea, 0x68, 0xa1, 0x03, 0x6c, 0xc2, 0x67, 0x8c, 0xeb, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d,\r
+0x80, 0x18, 0xd3, 0x2a, 0x00, 0x65, 0x63, 0xa1, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x1e, 0x22, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x80, 0x6b,\r
+0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xc5, 0xa1, 0xe0, 0xf1, 0x1d, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea,\r
+0xc8, 0x36, 0xe0, 0xf3, 0x19, 0x4b, 0x6c, 0xee, 0x59, 0x6c, 0x01, 0x6d, 0x4d, 0xee, 0x0b, 0x10, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x81, 0x6b, 0x6b, 0xeb, 0xc2, 0x67,\r
+0x57, 0x6c, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62,\r
+0x08, 0xd1, 0x07, 0xd0, 0x42, 0xb0, 0x43, 0xa0, 0x07, 0x6b, 0xff, 0xf7, 0x1f, 0x69, 0x52, 0x32, 0x6c, 0xea, 0x05, 0x4a, 0x80, 0x18, 0x0d, 0x2b, 0x04, 0xd2, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5,\r
+0x01, 0x6d, 0x2c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x2c, 0xea,\r
+0x00, 0xf2, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x42, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xd2, 0xa8, 0x51, 0xc8, 0x53, 0xa8, 0xc0, 0x36,\r
+0xc0, 0x36, 0x4d, 0xee, 0x02, 0xf0, 0x00, 0x5e, 0x02, 0x61, 0xe1, 0xf7, 0x1f, 0x6e, 0x28, 0xb1, 0x20, 0xf0, 0x48, 0xa1, 0x0f, 0x6b, 0xd0, 0x36, 0x6c, 0xea, 0x4d, 0xee, 0x42, 0x6c, 0x00, 0x18,\r
+0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x04, 0x94, 0x1f, 0xf7,\r
+0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x6c, 0xea, 0x1a, 0xb3, 0x8d, 0xe3, 0x20, 0xf1, 0xda, 0xa3, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4d, 0xee, 0xc1, 0xa9, 0x7f, 0x6a,\r
+0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, 0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6,\r
+0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x80, 0x18, 0x47, 0x2a,\r
+0x01, 0x6c, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x33, 0xb3, 0xe3, 0xa3,\r
+0x07, 0x6a, 0x05, 0xd3, 0xf2, 0x37, 0x4c, 0xef, 0x05, 0x4f, 0x80, 0x18, 0x0d, 0x2b, 0x04, 0xd7, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0,\r
+0x00, 0x69, 0xc2, 0x67, 0x2d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x01, 0x6e, 0x0c, 0xea, 0xcb, 0xee, 0x4c, 0xee,\r
+0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xd1, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x04, 0x97, 0x1f, 0xf7, 0x01, 0x6c,\r
+0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0x1a, 0xb4, 0xfd, 0xe4, 0x20, 0xf1, 0xda, 0xa7, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4d, 0xee, 0x05, 0x93, 0x7f, 0x6a, 0x3f, 0x6c,\r
+0xc1, 0xab, 0x00, 0x6d, 0xca, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, 0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6,\r
+0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6c, 0xee, 0x09, 0x97, 0x08, 0x91,\r
+0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7,\r
+0x1f, 0x68, 0x0c, 0xea, 0x00, 0xf2, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf7,\r
+0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x03, 0x6b, 0x6b, 0xeb, 0xc2, 0x67,\r
+0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x80, 0x18, 0x0d, 0x2b, 0x00, 0x65, 0x06, 0xb2, 0x00, 0x6b, 0x6f, 0xda, 0x6d, 0xda, 0x78, 0xca, 0x80, 0x18, 0x9f, 0x2a, 0x79, 0xca,\r
+0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x42, 0xa4, 0xff, 0x6b, 0x04, 0x67, 0xff, 0x4a, 0x6c, 0xea, 0x25, 0x5a,\r
+0x23, 0xa4, 0x2d, 0x60, 0x04, 0x0b, 0x44, 0x32, 0x49, 0xe3, 0x40, 0x8a, 0x4d, 0xe3, 0x00, 0xeb, 0x00, 0x65, 0x00, 0x65, 0x4f, 0x00, 0xa3, 0x00, 0xb3, 0x02, 0x41, 0x03, 0x7b, 0x03, 0xef, 0x03,\r
+0x17, 0x04, 0x29, 0x04, 0x37, 0x04, 0x4d, 0x04, 0x5b, 0x04, 0x4b, 0x00, 0x4b, 0x00, 0x69, 0x04, 0x61, 0x05, 0x79, 0x05, 0x4b, 0x00, 0x91, 0x05, 0x9f, 0x05, 0xad, 0x05, 0xdf, 0x05, 0xed, 0x05,\r
+0xff, 0x05, 0x0d, 0x06, 0x1f, 0x06, 0x23, 0x06, 0x27, 0x06, 0x33, 0x06, 0x45, 0x06, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5d, 0x06, 0x95, 0x06, 0x9d, 0x06, 0xaf, 0x06, 0x00, 0x6a,\r
+0x4a, 0x13, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d,\r
+0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x80, 0x18, 0x47, 0x2a, 0x00, 0x6c, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54,\r
+0xc5, 0x67, 0x60, 0xf6, 0x00, 0xb2, 0x0a, 0x6b, 0x6c, 0xc2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x6a, 0xc2, 0x0f, 0x13, 0x0e, 0x59, 0x00, 0xf3, 0x08, 0x60, 0x40, 0xf6, 0x04, 0xb2,\r
+0x06, 0x21, 0x64, 0xa2, 0x40, 0x6a, 0x6c, 0xea, 0x00, 0xf3, 0x00, 0x2a, 0x06, 0x10, 0x84, 0xa2, 0x40, 0x6b, 0x8c, 0xeb, 0x02, 0x2b, 0x29, 0xc2, 0xfd, 0x12, 0x20, 0xf6, 0x08, 0xb2, 0x69, 0xa2,\r
+0x0e, 0x59, 0x29, 0xc2, 0x06, 0xd3, 0xe0, 0xf0, 0x03, 0x60, 0x04, 0x0a, 0x24, 0x31, 0x25, 0xe2, 0x60, 0x89, 0x69, 0xe2, 0x00, 0xea, 0x00, 0x65, 0x1d, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xef, 0x00,\r
+0x0f, 0x01, 0x13, 0x01, 0x1d, 0x01, 0xb9, 0x01, 0x21, 0x01, 0x29, 0x01, 0x31, 0x01, 0x39, 0x01, 0x6d, 0x01, 0xa7, 0x01, 0xe0, 0xf5, 0x0c, 0xb2, 0x44, 0xa2, 0x01, 0x6b, 0x4c, 0xeb, 0x12, 0x23,\r
+0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xbd, 0x2a, 0x00, 0x65, 0x18, 0x10, 0x06, 0x92, 0x02, 0x72, 0x04, 0x61, 0x80, 0x18, 0x5d, 0x2a, 0x00, 0x65, 0x11, 0x10, 0x80, 0x18, 0xec, 0x29,\r
+0x00, 0x65, 0x0d, 0x10, 0x04, 0x6b, 0x4c, 0xeb, 0x0a, 0x23, 0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xaa, 0x29, 0x00, 0x65, 0x03, 0x10, 0x80, 0x18, 0xbd, 0x29, 0x00, 0x65, 0xa0, 0xf5,\r
+0x04, 0xb1, 0x6d, 0x99, 0xee, 0x99, 0x4f, 0x99, 0x09, 0xd3, 0x08, 0xd7, 0x00, 0x18, 0xe8, 0x58, 0x07, 0xd2, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x0a, 0x6a,\r
+0x4c, 0xc1, 0x08, 0x6a, 0x4d, 0xc1, 0x06, 0x92, 0x09, 0x93, 0x08, 0x97, 0x02, 0x5a, 0xa0, 0xf2, 0x01, 0x60, 0x6d, 0xd9, 0x07, 0x93, 0xee, 0xd9, 0x6f, 0xd9, 0x9c, 0x12, 0x60, 0xf5, 0x04, 0xb1,\r
+0x64, 0xa1, 0x02, 0x6a, 0x6d, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0xec, 0x2b, 0x44, 0xc1, 0x25, 0x10, 0x40, 0xf5, 0x10, 0xb3, 0x84, 0xa3, 0x03, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x04, 0x6c,\r
+0x4c, 0xec, 0x07, 0x24, 0x02, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x80, 0x18, 0xcc, 0x29, 0x84, 0xc3, 0x05, 0x10, 0x01, 0x6c, 0x4d, 0xec, 0x80, 0x18, 0x6f, 0x2b, 0x84, 0xc3, 0x20, 0xf5, 0x04, 0xb3,\r
+0x84, 0xa3, 0x40, 0x6a, 0x1f, 0x11, 0x00, 0xf5, 0x1c, 0xb1, 0x64, 0xa1, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0xb5, 0x2b, 0x44, 0xc1, 0x64, 0xa1, 0x40, 0x6a,\r
+0x6d, 0xea, 0x44, 0xc1, 0x67, 0x12, 0x01, 0x6c, 0x01, 0x10, 0x02, 0x6c, 0x80, 0x18, 0x23, 0x29, 0x00, 0x65, 0x60, 0x12, 0x03, 0x6c, 0xfa, 0x17, 0x80, 0x18, 0x77, 0x29, 0x00, 0x65, 0x5a, 0x12,\r
+0x80, 0x18, 0x5c, 0x29, 0x00, 0x65, 0x56, 0x12, 0x80, 0x18, 0x37, 0x29, 0x00, 0x65, 0x52, 0x12, 0xc0, 0xf4, 0x10, 0xb2, 0x80, 0xa2, 0x01, 0x6b, 0x8c, 0xeb, 0xc0, 0xf4, 0x0c, 0xb4, 0x60, 0xc4,\r
+0x60, 0x9a, 0xc0, 0xf4, 0x08, 0xb4, 0x76, 0x33, 0xc0, 0xf4, 0x60, 0x33, 0x80, 0xf5, 0x62, 0x33, 0x60, 0xcc, 0x40, 0xa2, 0x0f, 0x6b, 0x00, 0x6c, 0x46, 0x32, 0x6c, 0xea, 0xa0, 0xf4, 0x10, 0xb3,\r
+0x40, 0xc3, 0x19, 0x10, 0x80, 0xf4, 0x1c, 0xb2, 0x80, 0xa2, 0x01, 0x6b, 0x8c, 0xeb, 0x80, 0xf4, 0x18, 0xb4, 0x60, 0xc4, 0x60, 0x9a, 0x80, 0xf4, 0x14, 0xb4, 0x76, 0x33, 0xc0, 0xf4, 0x60, 0x33,\r
+0x80, 0xf5, 0x62, 0x33, 0x60, 0xcc, 0x40, 0xa2, 0x0f, 0x6b, 0x01, 0x6c, 0x46, 0x32, 0x6c, 0xea, 0x60, 0xf4, 0x1c, 0xb3, 0x40, 0xc3, 0x80, 0x18, 0x6e, 0x34, 0x00, 0x65, 0x1b, 0x12, 0x60, 0xf4,\r
+0x04, 0xb2, 0x40, 0xa2, 0x0f, 0x6b, 0x46, 0x32, 0x6c, 0xea, 0x60, 0xf4, 0x04, 0xb3, 0x40, 0xc3, 0x80, 0x18, 0xa6, 0x28, 0x00, 0x65, 0x00, 0xf2, 0x0d, 0x22, 0x12, 0x72, 0x00, 0xf2, 0x06, 0x60,\r
+0x00, 0x6c, 0x04, 0x6b, 0x05, 0x12, 0x04, 0x59, 0x00, 0xf2, 0x00, 0x60, 0x80, 0x18, 0x47, 0x2a, 0x00, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1,\r
+0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65,\r
+0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0xfd, 0xb3, 0x0a, 0x6a, 0x4c, 0xc3, 0x08, 0x6a, 0x2a, 0xc3, 0x4d, 0xc3, 0x00, 0x1c, 0x73, 0x1b, 0x09, 0xd3, 0x09, 0x93,\r
+0xa2, 0x67, 0x05, 0x6a, 0x84, 0xa3, 0x4b, 0xea, 0x01, 0x71, 0x8c, 0xea, 0x44, 0xc3, 0x09, 0x61, 0x03, 0x6c, 0x80, 0x18, 0x23, 0x29, 0x08, 0xd5, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x08, 0x95,\r
+0x05, 0x10, 0x02, 0x71, 0x03, 0x61, 0x04, 0x6c, 0x4d, 0xec, 0x84, 0xc3, 0x00, 0x1c, 0x7a, 0x1b, 0x85, 0x67, 0xc0, 0x11, 0x4f, 0x59, 0xa0, 0xf1, 0x19, 0x60, 0x44, 0xa4, 0x08, 0x5a, 0xa0, 0xf1,\r
+0x15, 0x60, 0xe8, 0xb3, 0x7f, 0x6a, 0xa1, 0xab, 0x2c, 0xea, 0x48, 0x34, 0xe0, 0xf1, 0x1d, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x41, 0xcb, 0x84, 0xa0, 0x07, 0x6a, 0xa3, 0xa3, 0x8c, 0xea,\r
+0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0xa3, 0x11, 0x0a, 0x59, 0x44, 0xa4, 0x65, 0xa4, 0x80, 0xf1, 0x1a, 0x60, 0x60, 0x33, 0x4d, 0xeb, 0xe3, 0xf7, 0x1f, 0x6c,\r
+0xd8, 0xb2, 0x6c, 0xec, 0x94, 0x35, 0xdb, 0xb6, 0x80, 0x9a, 0xcc, 0xec, 0xad, 0xec, 0x80, 0xda, 0xd9, 0xb5, 0x24, 0x34, 0x91, 0xe5, 0x80, 0xac, 0x8c, 0x34, 0x62, 0xec, 0x80, 0xf1, 0x06, 0x61,\r
+0x03, 0x59, 0x06, 0x60, 0x80, 0xa2, 0x02, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x60, 0xc2, 0x0c, 0x10, 0x80, 0xa2, 0xa4, 0xa2, 0x01, 0x6b, 0x8d, 0xeb, 0x06, 0x59, 0x60, 0xc2, 0x98, 0x67, 0x7f, 0x6b,\r
+0x9c, 0x34, 0xac, 0xeb, 0x8d, 0xeb, 0x64, 0xc2, 0xcc, 0xb2, 0x25, 0xe2, 0x80, 0xa1, 0xc5, 0xb3, 0x0f, 0x6a, 0x8c, 0xea, 0xa0, 0xa3, 0x44, 0x34, 0x1f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea,\r
+0x63, 0x11, 0x45, 0xa4, 0x08, 0x5a, 0x60, 0xf1, 0x01, 0x60, 0x44, 0xa4, 0xbd, 0xb3, 0xa4, 0xa3, 0x40, 0x32, 0x2d, 0xea, 0x53, 0xcb, 0x85, 0xa4, 0x07, 0x6a, 0x8c, 0xea, 0x4c, 0x34, 0x39, 0x6a,\r
+0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x44, 0xc3, 0x55, 0x11, 0x44, 0xa4, 0xb5, 0xb3, 0x40, 0x32, 0x2d, 0xea, 0x52, 0xcb, 0x45, 0xa4, 0x20, 0xf0, 0x48, 0xc3, 0x4c, 0x11, 0xb1, 0xb2, 0x26, 0xc2,\r
+0x64, 0xa4, 0x67, 0xc2, 0x65, 0xa4, 0x68, 0xc2, 0x45, 0x11, 0xae, 0xb2, 0x63, 0xa2, 0x3e, 0x35, 0x7f, 0x6c, 0xbc, 0x35, 0x8c, 0xeb, 0xad, 0xeb, 0x8c, 0xe9, 0x63, 0xc2, 0x25, 0xc2, 0x3a, 0x11,\r
+0xa8, 0xb2, 0x2e, 0xc2, 0x64, 0xa4, 0x6f, 0xc2, 0x65, 0xa4, 0x70, 0xc2, 0x33, 0x11, 0xa5, 0xb2, 0x31, 0xc2, 0x64, 0xa4, 0x72, 0xc2, 0x65, 0xa4, 0x73, 0xc2, 0x2c, 0x11, 0xa1, 0xb3, 0x49, 0xa3,\r
+0x0a, 0x72, 0x2c, 0x61, 0x8c, 0xa3, 0x00, 0x6a, 0x0a, 0x74, 0x0e, 0x60, 0xc0, 0xf2, 0x0c, 0x4a, 0x58, 0xec, 0xa3, 0xb2, 0x12, 0xec, 0x91, 0xe2, 0xc0, 0xf0, 0x48, 0xa4, 0x04, 0x72, 0x05, 0x6a,\r
+0x03, 0x60, 0x0a, 0x6a, 0x4c, 0xc3, 0x00, 0x6a, 0x96, 0xb3, 0x8d, 0xa3, 0x08, 0x74, 0x5d, 0x60, 0xff, 0x6a, 0x09, 0x4a, 0x58, 0xec, 0x9b, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x20, 0xf1, 0xaf, 0xa2,\r
+0x01, 0x6a, 0x4c, 0xed, 0x06, 0x25, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xec, 0x4c, 0xeb, 0x05, 0x6a, 0x4c, 0x2b, 0x8c, 0xb2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6a, 0x47, 0x10, 0x8b, 0x42, 0xff, 0x6b,\r
+0x6c, 0xec, 0x03, 0x5c, 0x1a, 0x60, 0x00, 0x6a, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0x8c, 0xb3, 0x12, 0xec, 0x91, 0xe3, 0xc0, 0xf0, 0x68, 0xa4, 0x04, 0x73, 0x09, 0x61, 0xe0, 0xf0, 0xa8, 0x9c,\r
+0x80, 0xb3, 0xa5, 0xdb, 0xe0, 0xf0, 0x8c, 0xac, 0x4c, 0xc3, 0x8c, 0xcb, 0x26, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xe8, 0x61, 0x27, 0x10, 0x88, 0x42, 0x6c, 0xec, 0x02, 0x5c,\r
+0x24, 0x60, 0x00, 0x6a, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xea, 0x7e, 0xb3, 0x01, 0x6d, 0x12, 0xec, 0x91, 0xe3, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x12, 0x26, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xea,\r
+0xac, 0xeb, 0x0d, 0x23, 0x60, 0xf1, 0xbe, 0xac, 0x6e, 0xb3, 0xaa, 0xcb, 0x80, 0xf1, 0xa0, 0xac, 0xab, 0xcb, 0x80, 0xf1, 0x82, 0xac, 0x4d, 0xc3, 0x8c, 0xcb, 0x05, 0x6a, 0x06, 0x10, 0x01, 0x4a,\r
+0xff, 0x6b, 0x6c, 0xea, 0x08, 0x5a, 0xde, 0x61, 0x04, 0x6a, 0x66, 0xb3, 0x6a, 0xa3, 0x40, 0x32, 0x6d, 0xea, 0x67, 0x10, 0x6c, 0xb3, 0x20, 0xf0, 0x9e, 0xa3, 0x20, 0xf0, 0x5d, 0xa3, 0x20, 0xf0,\r
+0x7c, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6e, 0x10, 0x66, 0xb3, 0x40, 0xf0, 0x81, 0xa3, 0x40, 0xf0, 0x40, 0xa3, 0x20, 0xf0, 0x7f, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34,\r
+0x8d, 0xea, 0x62, 0x10, 0x57, 0xb2, 0x34, 0xc2, 0x64, 0xa4, 0x75, 0xc2, 0x65, 0xa4, 0x76, 0xc2, 0x91, 0x10, 0x54, 0xb2, 0x37, 0xc2, 0x64, 0xa4, 0x78, 0xc2, 0x65, 0xa4, 0x79, 0xc2, 0x8a, 0x10,\r
+0x4f, 0x41, 0xff, 0x6b, 0x6c, 0xea, 0x09, 0x5a, 0x80, 0xf0, 0x00, 0x60, 0x5c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x79, 0x6a, 0x4b, 0xea, 0x4c, 0xeb,\r
+0x2c, 0x36, 0x78, 0x6a, 0x4c, 0xee, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6d, 0xee, 0x71, 0x10, 0x44, 0xb3, 0x8d, 0x9b, 0x4d, 0xb5, 0x5a, 0xab, 0xac, 0xec, 0x8d, 0xdb, 0x21, 0x10,\r
+0x40, 0xb4, 0xad, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6d, 0xdc, 0x18, 0x10, 0x3c, 0xb3, 0x8f, 0x9b, 0x45, 0xb5, 0x5e, 0xab, 0xac, 0xec, 0x8f, 0xdb, 0x11, 0x10,\r
+0x38, 0xb4, 0xaf, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6f, 0xdc, 0x08, 0x10, 0x78, 0x6c, 0x03, 0x10, 0x76, 0x6c, 0x01, 0x10, 0x77, 0x6c, 0x00, 0x18, 0xab, 0xa5,\r
+0x01, 0x6d, 0x02, 0x6c, 0x13, 0x10, 0x2f, 0xb3, 0x96, 0xa3, 0x55, 0xa3, 0x74, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x08, 0x10, 0x2a, 0xb3, 0x99, 0xa3, 0x58, 0xa3, 0x77, 0xa3,\r
+0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6d, 0xea, 0x03, 0x6c, 0x00, 0x6b, 0x35, 0x10, 0x64, 0x6a, 0x58, 0xe9, 0x2e, 0xb4, 0x40, 0x9c, 0x01, 0x4a, 0x12, 0xe9, 0x03, 0x22, 0x00, 0x18,\r
+0xcb, 0x1c, 0x00, 0x65, 0x27, 0x21, 0x80, 0x18, 0x61, 0x38, 0x00, 0x65, 0x00, 0x6a, 0x01, 0x6c, 0x27, 0xb5, 0x28, 0xb6, 0xe2, 0x67, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd2, 0x24, 0xb2, 0x80, 0x9a,\r
+0x00, 0x18, 0xbe, 0x1c, 0xb1, 0x67, 0x16, 0x10, 0x1f, 0xb2, 0x80, 0xf1, 0x21, 0xc2, 0x12, 0x10, 0x1d, 0xb2, 0x00, 0x6b, 0x80, 0xf1, 0x71, 0xc2, 0x0d, 0x21, 0x01, 0x6b, 0x80, 0xf1, 0x71, 0xc2,\r
+0x09, 0x10, 0x01, 0x6a, 0x2c, 0xea, 0x1c, 0xb3, 0x40, 0xc3, 0x04, 0x10, 0x00, 0x6c, 0x03, 0x6b, 0x44, 0x67, 0x03, 0x10, 0x00, 0x6c, 0x64, 0x67, 0x44, 0x67, 0x90, 0x34, 0x6d, 0xec, 0x83, 0xc0,\r
+0x81, 0xa0, 0x10, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x61, 0xc0, 0xa0, 0x98, 0x02, 0x6c, 0x00, 0x18, 0xa5, 0x2e, 0xc2, 0x67, 0x01, 0x6a, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63,\r
+0x90, 0x95, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x1f, 0x00, 0xfc, 0xff, 0x48, 0xed, 0x10, 0x80, 0x3c, 0xed, 0x10, 0x80, 0x20, 0x56, 0x11, 0x80,\r
+0xa4, 0x3c, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0xff, 0xff, 0x90, 0x04, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80, 0xd0, 0x95, 0x11, 0x80, 0x20, 0xe8, 0x00, 0x65, 0x0c, 0xb2, 0x0d, 0xb4,\r
+0x60, 0xa4, 0xa0, 0x9a, 0x04, 0x6a, 0x6c, 0xea, 0x0c, 0x22, 0x40, 0xf7, 0xa2, 0x35, 0x66, 0x33, 0x01, 0x6c, 0xae, 0xeb, 0x8c, 0xeb, 0xff, 0x6c, 0x8c, 0xeb, 0x00, 0x6a, 0x04, 0x23, 0x20, 0xe8,\r
+0x01, 0x6a, 0x05, 0xb2, 0x40, 0xa2, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x50, 0xa0, 0x00, 0xb0, 0x1c, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x07, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23,\r
+0x24, 0x6b, 0x78, 0xea, 0x05, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x05, 0xb3, 0x63, 0xda, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80,\r
+0x00, 0x6a, 0x76, 0xb5, 0x55, 0xe5, 0xa0, 0xa5, 0x75, 0xb3, 0x51, 0xe3, 0x20, 0xf1, 0xba, 0xc4, 0x01, 0x4a, 0xff, 0x6c, 0x8c, 0xea, 0x10, 0x5a, 0xf4, 0x61, 0x60, 0xf1, 0xa1, 0xa3, 0xfe, 0x75,\r
+0x0b, 0x60, 0x0f, 0x6a, 0xac, 0xea, 0xaf, 0x42, 0x8c, 0xed, 0x05, 0x5d, 0x05, 0x60, 0x10, 0x6c, 0x4d, 0xec, 0x60, 0xf1, 0x81, 0xc3, 0x03, 0x10, 0x15, 0x6a, 0x60, 0xf1, 0x41, 0xc3, 0x68, 0xb2,\r
+0x40, 0xf1, 0x7a, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x0d, 0x6b, 0x40, 0xf1, 0x7a, 0xc2, 0x64, 0xb2, 0x40, 0xf1, 0x7a, 0xa2, 0x0a, 0x73, 0x0c, 0x61, 0x0d, 0x6b, 0x40, 0xf1, 0x7a, 0xc2, 0x0b, 0x6b,\r
+0x40, 0xf1, 0x7b, 0xc2, 0x40, 0xf1, 0x7c, 0xc2, 0x40, 0xf1, 0x7d, 0xc2, 0x40, 0xf1, 0x7e, 0xc2, 0x5b, 0xb2, 0x00, 0x6b, 0x80, 0xf0, 0x7d, 0xc2, 0x24, 0xf0, 0x10, 0x6b, 0x60, 0xf1, 0x62, 0xca,\r
+0x06, 0xf7, 0x19, 0x6b, 0x60, 0xf1, 0x64, 0xca, 0x0b, 0xf2, 0x10, 0x6b, 0x60, 0xf1, 0x66, 0xca, 0x0e, 0xf5, 0x0a, 0x6b, 0x60, 0xf1, 0x68, 0xca, 0x04, 0xf5, 0x00, 0x6b, 0x6b, 0xeb, 0x60, 0xf1,\r
+0x6a, 0xca, 0x00, 0x6b, 0xc0, 0xf1, 0x68, 0xca, 0xc0, 0xf1, 0x6a, 0xca, 0xc0, 0xf1, 0x6c, 0xca, 0xc0, 0xf1, 0x6e, 0xca, 0x40, 0xf1, 0x7f, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x01, 0x6b, 0x40, 0xf1,\r
+0x7f, 0xc2, 0x47, 0xb2, 0x60, 0xf1, 0x60, 0xa2, 0xff, 0x73, 0x04, 0x61, 0x02, 0x6b, 0x6b, 0xeb, 0x60, 0xf1, 0x60, 0xc2, 0x42, 0xb2, 0x80, 0xf1, 0x62, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x05, 0x6b,\r
+0x80, 0xf1, 0x62, 0xc2, 0x3e, 0xb2, 0x01, 0x6b, 0x80, 0xf1, 0x60, 0xc2, 0x80, 0xf1, 0x71, 0xc2, 0x80, 0xf1, 0x61, 0xa2, 0xfe, 0x73, 0x03, 0x61, 0x0f, 0x6b, 0x80, 0xf1, 0x61, 0xc2, 0x38, 0xb2,\r
+0x02, 0x6b, 0x80, 0xf1, 0x63, 0xc2, 0x80, 0xf1, 0x72, 0xc2, 0x00, 0x6a, 0x35, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0x33, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x84, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea,\r
+0x0d, 0x5a, 0xf4, 0x61, 0x00, 0x6a, 0x30, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b,\r
+0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x25, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x93, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0d, 0x5a, 0xe6, 0x61, 0x00, 0x6a, 0x23, 0xb4, 0x51, 0xe4,\r
+0x80, 0xa4, 0x1f, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x80, 0xc3, 0x21, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0xc0, 0xf1, 0x82, 0xc3, 0x1f, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb,\r
+0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x12, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x84, 0xc3, 0x16, 0xb3,\r
+0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34,\r
+0x07, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x86, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x5a, 0xc5, 0x61, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x30, 0xef, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80,\r
+0x40, 0xef, 0x10, 0x80, 0x58, 0xef, 0x10, 0x80, 0x50, 0xef, 0x10, 0x80, 0x54, 0xef, 0x10, 0x80, 0x68, 0xef, 0x10, 0x80, 0x6c, 0xef, 0x10, 0x80, 0xff, 0x6a, 0x4c, 0xee, 0x4c, 0xec, 0x4c, 0xed,\r
+0xec, 0xea, 0x57, 0xe5, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0xd3, 0xe4, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6b, 0x12, 0xed, 0x98, 0xec,\r
+0x12, 0xec, 0x89, 0xe5, 0x20, 0xe8, 0x6c, 0xea, 0x20, 0xe8, 0x00, 0x65, 0x0a, 0xb2, 0x20, 0xf0, 0x70, 0xa2, 0x16, 0x6a, 0x6c, 0xea, 0x12, 0x72, 0x04, 0x61, 0x40, 0xa4, 0x01, 0x5a, 0x58, 0x67,\r
+0x40, 0xc4, 0x06, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x04, 0x52, 0x58, 0x67, 0x01, 0x6b, 0x20, 0xe8, 0x6e, 0xea, 0x4c, 0x00, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x00, 0x6a, 0x11, 0xb3,\r
+0x60, 0x9b, 0x4c, 0x35, 0xff, 0x6c, 0xad, 0xe3, 0xc3, 0xa3, 0x80, 0x6b, 0x6b, 0xeb, 0x6c, 0xee, 0x8c, 0xee, 0x14, 0x2e, 0x0c, 0xb6, 0xc0, 0x9e, 0xb9, 0xe6, 0xc3, 0xa6, 0x6c, 0xee, 0x8c, 0xee,\r
+0x0d, 0x2e, 0x0a, 0xb6, 0xc0, 0x9e, 0xb5, 0xe6, 0xa3, 0xa5, 0xac, 0xeb, 0x8c, 0xeb, 0x06, 0x2b, 0x01, 0x4a, 0x8c, 0xea, 0x11, 0x5a, 0xe3, 0x61, 0x20, 0xe8, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x6a,\r
+0xf4, 0x1d, 0x11, 0x80, 0xcc, 0x1d, 0x11, 0x80, 0x04, 0x1f, 0x11, 0x80, 0x20, 0xe8, 0x01, 0x6a, 0x06, 0xb2, 0x60, 0xa2, 0x01, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x40, 0x9c, 0x11, 0x6b, 0x6b, 0xeb,\r
+0x6c, 0xea, 0x40, 0xdc, 0x20, 0xe8, 0x00, 0x6a, 0x1c, 0x96, 0x11, 0x80, 0x0d, 0xb2, 0x40, 0xa2, 0x08, 0x22, 0x0d, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea,\r
+0x0d, 0x2a, 0x0a, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x60, 0x9c, 0x02, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x01, 0x6b, 0x02, 0xb2, 0x60, 0xc2, 0x20, 0xe8, 0x00, 0x6a,\r
+0x98, 0x07, 0x11, 0x80, 0xdc, 0x37, 0x11, 0x80, 0x6c, 0x21, 0x11, 0x80, 0x64, 0xa4, 0x43, 0xa4, 0xc0, 0xa5, 0x60, 0x33, 0x4d, 0xe3, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x7f, 0xf4, 0x0f, 0x73,\r
+0x00, 0x6a, 0x09, 0x61, 0xc9, 0xe4, 0x01, 0x6b, 0x62, 0xc2, 0x41, 0x46, 0xff, 0x6b, 0x6c, 0xea, 0x41, 0xc4, 0x40, 0xc5, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x0d, 0xb3, 0xc0, 0xf0,\r
+0x8a, 0xab, 0x08, 0xf0, 0x01, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0xc0, 0xf0, 0x4a, 0xcb, 0x00, 0x6a, 0x09, 0xb3, 0x40, 0xc3, 0x09, 0xb3, 0x40, 0xc3, 0x00, 0x6a, 0x09, 0xb3, 0x40, 0xcb, 0x09, 0xb3,\r
+0x40, 0xc3, 0x09, 0xb3, 0x40, 0xc3, 0x01, 0x6b, 0x08, 0xb2, 0x20, 0xe8, 0x60, 0xc2, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80,\r
+0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0x40, 0xac, 0x01, 0xf4, 0x03, 0x6b, 0x6e, 0xea, 0x16, 0x2a, 0x0d, 0xb4, 0xc0, 0xf0, 0xaa, 0xac, 0xf6, 0xf3, 0x1c, 0x4b,\r
+0xac, 0xeb, 0xc0, 0xf0, 0x6a, 0xcc, 0x0a, 0xb3, 0x40, 0xc3, 0x0a, 0xb4, 0x0a, 0xb3, 0x40, 0xc3, 0x40, 0xcc, 0x00, 0x6b, 0x09, 0xb2, 0x60, 0xc2, 0x09, 0xb2, 0x60, 0xc2, 0x01, 0x6b, 0x09, 0xb2,\r
+0x60, 0xc2, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80,\r
+0x08, 0x96, 0x11, 0x80, 0x08, 0xb3, 0xa0, 0xa3, 0x01, 0x6b, 0x40, 0x9c, 0xac, 0xeb, 0x02, 0x23, 0x10, 0x6b, 0x6d, 0xea, 0x02, 0x6b, 0xac, 0xeb, 0x02, 0x23, 0x04, 0xb3, 0x6d, 0xea, 0x40, 0xdc,\r
+0x20, 0xe8, 0x00, 0x6a, 0x1c, 0x96, 0x11, 0x80, 0x00, 0x00, 0x10, 0x00, 0x0b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6b, 0xfd, 0x4a, 0x6c, 0xea, 0x02, 0x5a, 0x0b, 0x60, 0x08, 0xb2, 0x40, 0xa2,\r
+0x08, 0x2a, 0x63, 0xa4, 0x02, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x43, 0xc4, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x89, 0x04, 0x11, 0x80,\r
+0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x45, 0xa4, 0xff, 0xf7, 0x1f, 0x68, 0xac, 0xe8, 0xa4, 0xa4, 0x0e, 0xd2, 0x63, 0xb2, 0x40, 0x82, 0x11, 0x6e, 0x00, 0x52, 0xa0, 0xf0, 0x1a, 0x60,\r
+0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xe8, 0x60, 0xb2, 0x01, 0x6b, 0xac, 0xeb, 0x12, 0xe9, 0x45, 0xe1, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x72, 0x06, 0x60, 0x13, 0x72, 0x04, 0x60, 0x90, 0x67, 0x17, 0x6d,\r
+0xc3, 0x67, 0x0b, 0x10, 0xe0, 0xf0, 0xc7, 0xa1, 0x6a, 0xee, 0x0b, 0x61, 0x80, 0xf0, 0x4c, 0xa9, 0x04, 0x6d, 0xac, 0xea, 0x06, 0x2a, 0x90, 0x67, 0x17, 0x6d, 0x20, 0x18, 0xf6, 0x27, 0x24, 0x6f,\r
+0x98, 0x10, 0x04, 0x4c, 0x41, 0xac, 0x0a, 0xd2, 0x42, 0xac, 0x0b, 0xd2, 0x43, 0xac, 0x08, 0xd2, 0x84, 0xac, 0x4e, 0xb2, 0x09, 0xe2, 0x09, 0xd4, 0x80, 0xa2, 0x03, 0x5c, 0x01, 0x4c, 0x01, 0x61,\r
+0x00, 0x6c, 0x80, 0xc2, 0x49, 0xb2, 0x09, 0xe2, 0x40, 0xa2, 0x03, 0x72, 0x55, 0x61, 0x08, 0x94, 0x02, 0x6f, 0x02, 0x5c, 0x03, 0x61, 0x84, 0x37, 0xff, 0x6a, 0x4c, 0xef, 0x09, 0x94, 0x03, 0x24,\r
+0x02, 0x4f, 0xff, 0x6a, 0x4c, 0xef, 0x0a, 0x92, 0x0b, 0x96, 0x90, 0x67, 0x00, 0x6d, 0x0f, 0xd3, 0x20, 0x18, 0x4b, 0x29, 0x04, 0xd2, 0x0c, 0xd2, 0x0c, 0x94, 0x02, 0x6a, 0x04, 0xd2, 0x3c, 0xb2,\r
+0x05, 0xd2, 0x3a, 0xb2, 0x06, 0xd4, 0x09, 0xe2, 0x0d, 0xd2, 0x40, 0xa2, 0x04, 0x6c, 0xfa, 0x6d, 0x07, 0xf0, 0x14, 0x6e, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0c, 0x92,\r
+0x0f, 0x93, 0x2a, 0x22, 0x0d, 0x94, 0x00, 0x6a, 0xc3, 0x67, 0x40, 0xc4, 0x17, 0x6d, 0x00, 0x6a, 0x90, 0x67, 0x1c, 0x6f, 0x04, 0xd2, 0x20, 0x18, 0x04, 0x28, 0x0f, 0xd2, 0x7d, 0x67, 0x87, 0x43,\r
+0x25, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0x80, 0xf0, 0x7e, 0xc9, 0x67, 0x44, 0x19, 0x4b, 0x80, 0xab, 0x7d, 0x67, 0xa0, 0xf0, 0x82, 0xc9, 0x87, 0x43, 0x1d, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0xa0, 0xf0,\r
+0x66, 0xc9, 0x67, 0x44, 0x21, 0x4b, 0x80, 0xab, 0xa0, 0xf0, 0x80, 0xc9, 0x0f, 0x92, 0x00, 0xf2, 0x5d, 0xc1, 0x00, 0xf2, 0x5e, 0xc1, 0x2d, 0x10, 0x0b, 0x92, 0x08, 0x94, 0x0e, 0x95, 0x04, 0xd2,\r
+0x0a, 0x97, 0x09, 0x92, 0x05, 0xd4, 0xd0, 0x67, 0x83, 0x67, 0x0f, 0xd3, 0x20, 0x18, 0x25, 0x2c, 0x06, 0xd2, 0x01, 0x6e, 0x0f, 0x93, 0x1e, 0x22, 0xc3, 0x67, 0xe2, 0x67, 0x90, 0x67, 0x17, 0x6d,\r
+0x20, 0x18, 0xf6, 0x27, 0x0f, 0xd2, 0x0f, 0x92, 0x80, 0xf0, 0xfe, 0xa9, 0xb0, 0x67, 0x82, 0x67, 0x00, 0x18, 0xb4, 0x52, 0x02, 0x6e, 0x90, 0x67, 0x20, 0x18, 0xfa, 0x25, 0x04, 0x6d, 0x01, 0x6a,\r
+0x4b, 0xea, 0x00, 0xf2, 0x54, 0xc9, 0x00, 0x6a, 0x00, 0xf2, 0x56, 0xc1, 0x20, 0x18, 0x95, 0x28, 0x00, 0x65, 0x01, 0x6e, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x46, 0x67, 0x00, 0xef, 0x0a, 0x63,\r
+0xb8, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xd8, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf2, 0x63, 0x1b, 0x62, 0x1a, 0xd1, 0x19, 0xd0, 0x40, 0xf5, 0x14, 0xb2, 0x7d, 0x67, 0x40, 0xaa,\r
+0x51, 0xcb, 0x20, 0xf0, 0x82, 0xa3, 0x40, 0xf5, 0x0c, 0xb2, 0x92, 0x35, 0xa0, 0xc2, 0x13, 0xd5, 0x20, 0xf0, 0x63, 0xa3, 0x01, 0x6a, 0x86, 0x34, 0x6e, 0x31, 0x4c, 0xe9, 0x66, 0x33, 0x4c, 0xeb,\r
+0x24, 0x31, 0x6d, 0xe9, 0x07, 0x6b, 0x6c, 0xec, 0x10, 0xd4, 0x7c, 0x6c, 0x98, 0xe9, 0x20, 0xf5, 0x08, 0xb3, 0xb1, 0x67, 0x12, 0xec, 0x6d, 0xe4, 0x12, 0xd3, 0x60, 0xa3, 0x10, 0x94, 0x6c, 0xea,\r
+0x00, 0x18, 0x49, 0xbd, 0x14, 0xd2, 0x11, 0xd2, 0x11, 0x93, 0x0a, 0x6a, 0x58, 0xeb, 0x00, 0xf5, 0x0c, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x61, 0xaa, 0x00, 0xf5, 0x04, 0xb2, 0x60, 0xc2, 0x00, 0xf5,\r
+0x04, 0xb2, 0x40, 0x9a, 0x04, 0x22, 0x20, 0xf0, 0x02, 0x04, 0x40, 0xea, 0x00, 0x65, 0x13, 0x94, 0x09, 0x74, 0x07, 0x61, 0x10, 0x95, 0x00, 0x6c, 0x01, 0x25, 0x82, 0x41, 0x00, 0x18, 0xb8, 0x82,\r
+0x00, 0x65, 0x7d, 0x67, 0x20, 0xf0, 0x43, 0xa3, 0x01, 0x68, 0x0c, 0xea, 0x2d, 0x22, 0xc0, 0xf4, 0x18, 0xb2, 0x40, 0xa2, 0x03, 0x6b, 0x6c, 0xea, 0x14, 0x22, 0xc0, 0xf4, 0x10, 0xb3, 0x46, 0xab,\r
+0x9d, 0x67, 0x50, 0xcc, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0xc0, 0xf4, 0x04, 0xb4, 0x12, 0xea, 0x49, 0xe4, 0x00, 0x6c, 0x20, 0xf2, 0x9d, 0xc2, 0xe0, 0xf0, 0xa3, 0xa2, 0x00, 0x18, 0x13, 0x3d,\r
+0x8e, 0xa3, 0xa0, 0xf4, 0x10, 0xb2, 0x60, 0xf1, 0x4b, 0xa2, 0x20, 0xf2, 0x1a, 0x22, 0x00, 0x6a, 0xa0, 0xf4, 0x04, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x06, 0xd2, 0x06, 0x6c, 0xfa, 0x6d, 0x26, 0xf5,\r
+0x05, 0x6e, 0xc0, 0xf5, 0x19, 0x6f, 0x32, 0x10, 0x10, 0x94, 0xb1, 0x67, 0x20, 0x18, 0xc0, 0x0e, 0x09, 0x06, 0x0d, 0x2a, 0x10, 0x93, 0x80, 0xf4, 0x04, 0xb2, 0x69, 0xe2, 0x40, 0xa2, 0x01, 0x72,\r
+0x00, 0xf2, 0x1f, 0x61, 0x60, 0xf4, 0x18, 0xb2, 0x69, 0xe2, 0x00, 0xc2, 0x1a, 0x12, 0x13, 0x94, 0x02, 0x74, 0x20, 0x61, 0x40, 0xf4, 0x10, 0xb2, 0x40, 0xa2, 0x00, 0xf2, 0x12, 0x2a, 0x40, 0xf4,\r
+0x14, 0xb2, 0x44, 0x9a, 0x02, 0x72, 0x00, 0xf2, 0x0c, 0x60, 0x00, 0x18, 0x1b, 0xaa, 0x00, 0x65, 0x00, 0x18, 0xa5, 0x3a, 0x00, 0x65, 0x40, 0xf4, 0x00, 0xb3, 0x04, 0xd0, 0x05, 0xd3, 0x06, 0xd2,\r
+0x06, 0x6c, 0xfa, 0x6d, 0x46, 0xf5, 0x0a, 0x6e, 0xc0, 0xf5, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0xf7, 0x11, 0x10, 0x94, 0xb1, 0x67, 0x00, 0x18, 0xe8, 0xdf, 0x08, 0x06, 0xff, 0x72,\r
+0xe0, 0xf1, 0x0f, 0x60, 0x00, 0xf4, 0x1c, 0xb2, 0x40, 0x9a, 0xbd, 0x67, 0x10, 0xad, 0x0d, 0x22, 0x14, 0x93, 0x3c, 0x6c, 0x12, 0x95, 0x98, 0xeb, 0x7d, 0x67, 0xd1, 0xab, 0x12, 0xec, 0x91, 0xe5,\r
+0x04, 0x4c, 0x40, 0xea, 0xb0, 0x67, 0xc0, 0xf1, 0x1c, 0x2a, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xe8, 0x13, 0x93, 0xf7, 0xb2, 0x12, 0x94, 0x12, 0xe8, 0x41, 0xe0, 0x01, 0x6a, 0x44, 0xeb, 0x14, 0x93,\r
+0x15, 0xd2, 0x3c, 0x6a, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x72, 0xa2, 0x02, 0x73, 0xe0, 0xf0, 0x00, 0x61, 0x20, 0xf0, 0x70, 0xa2, 0xff, 0x73, 0xc0, 0xf0, 0x1b, 0x60, 0x20, 0xf0,\r
+0x74, 0xa2, 0x10, 0x95, 0xae, 0xeb, 0xc0, 0xf0, 0x15, 0x2b, 0x13, 0x95, 0x96, 0xaa, 0xa0, 0x33, 0x70, 0x33, 0x8e, 0xeb, 0xc0, 0xf0, 0x0e, 0x2b, 0x20, 0xf0, 0x76, 0xa2, 0x01, 0x4b, 0x20, 0xf0,\r
+0x76, 0xc2, 0xc0, 0xf0, 0x4d, 0xa0, 0x02, 0x72, 0x15, 0x61, 0x15, 0x93, 0x08, 0xf4, 0x10, 0x6a, 0x6c, 0xea, 0x06, 0x22, 0xa0, 0xf0, 0x5c, 0xa8, 0x01, 0x4a, 0xa0, 0xf0, 0x5c, 0xc8, 0x0a, 0x10,\r
+0x15, 0x94, 0x11, 0xf1, 0x00, 0x6a, 0x8c, 0xea, 0x05, 0x22, 0xc0, 0xf0, 0x42, 0xa8, 0x01, 0x4a, 0xc0, 0xf0, 0x42, 0xc8, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xbd, 0x67, 0x70, 0xad,\r
+0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x50, 0xa2, 0x6a, 0xea, 0x0e, 0x60, 0x02, 0x6c, 0x04, 0xd4, 0xd1, 0xb4, 0x05, 0xd4, 0xfa, 0x6d, 0x02, 0x6c, 0xa6, 0xf5, 0x13, 0x6e, 0x61, 0xf4, 0x17, 0x6f,\r
+0x06, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x15, 0x61, 0xc5, 0xb2, 0x60, 0xf1,\r
+0x45, 0xa2, 0x11, 0x22, 0x20, 0x18, 0x02, 0x26, 0x00, 0x65, 0x2e, 0xea, 0x0c, 0x22, 0xc0, 0xf0, 0x58, 0xa0, 0x09, 0x2a, 0x00, 0x18, 0xac, 0x3b, 0x01, 0x6c, 0xc3, 0xb3, 0x80, 0xa3, 0x01, 0x6a,\r
+0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xbf, 0xb3, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0xb6, 0xa2, 0xc0, 0xf0, 0x4a, 0xab, 0x03, 0x6c, 0x42, 0x32,\r
+0x4a, 0x32, 0x8c, 0xea, 0x44, 0x32, 0x42, 0xed, 0x2f, 0x61, 0xb2, 0xb2, 0x60, 0xf1, 0x47, 0xa2, 0x2b, 0x22, 0x17, 0xd3, 0x20, 0x18, 0x02, 0x26, 0x16, 0xd4, 0x2e, 0xea, 0x17, 0x93, 0x16, 0x94,\r
+0x23, 0x22, 0xc0, 0xf0, 0x59, 0xa0, 0x20, 0x2a, 0xb1, 0xb2, 0xa0, 0xaa, 0x02, 0x6a, 0xac, 0xea, 0x1b, 0x2a, 0xc0, 0xf0, 0x6a, 0xab, 0xaf, 0xb5, 0x40, 0xa5, 0x62, 0x33, 0x72, 0x33, 0x8c, 0xeb,\r
+0x01, 0x4a, 0xff, 0x6e, 0x64, 0x33, 0xcc, 0xea, 0x01, 0x4b, 0x7a, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x40, 0xc5, 0x10, 0xea, 0x09, 0x2a, 0x00, 0x18, 0x97, 0x3b, 0x01, 0x6c, 0xa2, 0xb3, 0x80, 0xa3,\r
+0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0xa0, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x10, 0x6b, 0x6c, 0xea, 0x30, 0x22, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4,\r
+0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x04, 0x61, 0x9b, 0xb2, 0x00, 0xf1, 0x54, 0xa2, 0x06, 0x2a, 0xe0, 0xf0, 0x47, 0xa0, 0x1f, 0x2a, 0x99, 0xb2, 0x40, 0xa2, 0x1c, 0x2a, 0x98, 0xb3, 0x40, 0xa3,\r
+0xff, 0x6c, 0x01, 0x4a, 0x8c, 0xea, 0x40, 0xc3, 0x90, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x07, 0x6c, 0x7a, 0x33, 0x8c, 0xeb, 0x64, 0x33, 0x01, 0x4b, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xea,\r
+0x09, 0x2a, 0x00, 0x18, 0x6c, 0xd0, 0x01, 0x6c, 0x8e, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0xe0, 0xf0, 0x67, 0xa0, 0x15, 0x94, 0xff, 0x6a, 0x01, 0x5b, 0x78, 0x67,\r
+0x6b, 0xeb, 0x6c, 0xea, 0x19, 0xf5, 0x18, 0x6b, 0x8c, 0xeb, 0x04, 0x23, 0x10, 0x95, 0x02, 0x25, 0x01, 0x6a, 0x02, 0x10, 0xff, 0x72, 0x03, 0x60, 0x83, 0xb4, 0x31, 0xe4, 0x40, 0xc4, 0x75, 0xb2,\r
+0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x10, 0x60, 0x80, 0xf2, 0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x61, 0x11, 0x94, 0x0a, 0x6a, 0xbd, 0x67, 0x58, 0xec, 0x91, 0xad,\r
+0x66, 0xb5, 0x17, 0xd3, 0x12, 0xea, 0x00, 0x18, 0x86, 0x07, 0x55, 0xe5, 0x17, 0x93, 0x06, 0x23, 0x5d, 0x67, 0x90, 0xaa, 0x00, 0x18, 0x51, 0xa3, 0x17, 0xd3, 0x17, 0x93, 0x65, 0xb2, 0x60, 0xf1,\r
+0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x04, 0x60, 0x80, 0xf2, 0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x60, 0x5f, 0xb2, 0x29, 0xe2, 0x80, 0xf1, 0x40, 0xa2, 0x07, 0x22, 0x91, 0x67,\r
+0x00, 0x18, 0xce, 0x06, 0x17, 0xd3, 0x10, 0xd2, 0x17, 0x93, 0x02, 0x10, 0x00, 0x6c, 0x10, 0xd4, 0x11, 0x95, 0x2a, 0x25, 0x65, 0xb2, 0x29, 0xe2, 0x44, 0xa2, 0x01, 0x6c, 0x46, 0x32, 0x8c, 0xea,\r
+0x23, 0x22, 0x22, 0x2b, 0x62, 0xb2, 0xa9, 0xe2, 0x60, 0xa2, 0x6a, 0x33, 0x60, 0xc2, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x72, 0x19, 0x61, 0x5f, 0xb2, 0xa9, 0xe2, 0x40, 0xa2, 0x15, 0x2a, 0x60, 0xf0,\r
+0x56, 0xa8, 0x7d, 0x67, 0x01, 0x4a, 0x60, 0xf0, 0x56, 0xc8, 0x20, 0xf3, 0x0b, 0x6a, 0x58, 0xcb, 0x59, 0xb2, 0x80, 0x9a, 0x0d, 0x92, 0xb0, 0xab, 0x0b, 0x96, 0x04, 0xd2, 0x0c, 0x97, 0x0e, 0x92,\r
+0x0a, 0xd5, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x54, 0xb2, 0x40, 0x9a, 0x06, 0x22, 0x7d, 0x67, 0xb1, 0xab, 0x10, 0x96, 0x40, 0xea, 0x08, 0x04, 0x64, 0x2a, 0x4a, 0xb2, 0x40, 0xa2, 0x19, 0x2a,\r
+0x46, 0xb2, 0x40, 0xa2, 0x16, 0x2a, 0xc0, 0xf0, 0x6d, 0xa0, 0x02, 0x6c, 0x4c, 0xb2, 0x8e, 0xeb, 0x0a, 0x23, 0x01, 0x6b, 0x60, 0xc2, 0x3d, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x03, 0x6c, 0x42, 0x32,\r
+0x46, 0x32, 0x4c, 0xec, 0x03, 0x10, 0x60, 0xc2, 0x46, 0xb2, 0x80, 0xa2, 0x00, 0x18, 0x6c, 0xd0, 0x00, 0x65, 0x10, 0x95, 0x02, 0x2d, 0x13, 0x92, 0x08, 0x22, 0x13, 0x93, 0x01, 0x73, 0x34, 0x61,\r
+0x10, 0x94, 0x32, 0x2c, 0x2b, 0xb2, 0x44, 0x9a, 0x2f, 0x22, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x6d, 0xae, 0xea, 0x2a, 0x2a, 0x3c, 0xb3, 0x02, 0x49, 0x28, 0x31, 0x27, 0xe3, 0x60, 0x99, 0x00, 0x53,\r
+0x23, 0x61, 0x11, 0x93, 0x21, 0x23, 0x11, 0x94, 0x0a, 0x6b, 0x18, 0xf0, 0x00, 0x6d, 0x78, 0xec, 0x1a, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0x83, 0xab, 0x00, 0x18, 0x5c, 0x3b, 0x16, 0xd2, 0x11, 0x95,\r
+0x16, 0x92, 0x2c, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x29, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x01, 0x6b, 0x04, 0xd3, 0x03, 0x6c, 0x18, 0xb3, 0xfa, 0x6d, 0x86, 0xf6, 0x06, 0x6e, 0xc4, 0xf3, 0x15, 0x6f,\r
+0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x12, 0xb2, 0x60, 0xf1, 0x49, 0xa2, 0x01, 0x72, 0x08, 0x61, 0x00, 0xf2, 0x52, 0xa0, 0x05, 0x22, 0xa0, 0xf0, 0x44, 0xa8, 0x01, 0x4a, 0xa0, 0xf0,\r
+0x44, 0xc8, 0x1b, 0x97, 0x1a, 0x91, 0x19, 0x90, 0x00, 0xef, 0x0e, 0x63, 0x08, 0x00, 0x00, 0xb6, 0x89, 0x04, 0x11, 0x80, 0xf8, 0x37, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xd8, 0x1a, 0x11, 0x80,\r
+0xdc, 0x1a, 0x11, 0x80, 0x0c, 0x52, 0x11, 0x80, 0x18, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x19, 0x11, 0x80, 0xdc, 0x19, 0x11, 0x80,\r
+0x28, 0x1a, 0x11, 0x80, 0x37, 0x1a, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x20, 0x01, 0x00, 0xb6, 0x38, 0x1a, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x8e, 0x1b, 0x11, 0x80, 0x36, 0x1a, 0x11, 0x80,\r
+0x34, 0x1a, 0x11, 0x80, 0xc8, 0x19, 0x11, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0x90, 0x19, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80, 0xe4, 0x37, 0x11, 0x80, 0x24, 0x1a, 0x11, 0x80, 0xf9, 0x19, 0x11, 0x80,\r
+0x49, 0x00, 0x11, 0x80, 0x0c, 0xa3, 0x00, 0xb0, 0xfc, 0x63, 0x07, 0x62, 0x0f, 0xb3, 0x60, 0xf1, 0x64, 0x9b, 0x0f, 0xb2, 0x6c, 0xea, 0x0f, 0xb3, 0x6e, 0xea, 0x13, 0x2a, 0x0e, 0xb2, 0xff, 0xf7,\r
+0x1f, 0x6b, 0xff, 0x6c, 0x40, 0xaa, 0x1f, 0x4c, 0x4c, 0xeb, 0x5d, 0x67, 0x68, 0xca, 0x08, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x7d, 0x67, 0x50, 0xc3, 0x00, 0x18, 0x5c, 0x3b,\r
+0xa8, 0xab, 0x07, 0x97, 0x00, 0xef, 0x04, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x00, 0xb6, 0xf0, 0x63, 0x1f, 0x62, 0x1e, 0xd1, 0x1d, 0xd0,\r
+0x80, 0xac, 0xc0, 0xf2, 0x0c, 0x68, 0xdf, 0xb2, 0x18, 0xec, 0x18, 0xd4, 0xa0, 0xa5, 0x12, 0xd5, 0x12, 0xe8, 0x41, 0xe0, 0xe0, 0xf0, 0x47, 0xa0, 0x13, 0xd2, 0xa0, 0xf0, 0x60, 0xa8, 0x19, 0xd3,\r
+0xa0, 0xf0, 0x82, 0xa8, 0x80, 0xf0, 0x7e, 0xa8, 0x17, 0xd4, 0xa0, 0xf0, 0xa6, 0xa8, 0x16, 0xd5, 0xe0, 0xf0, 0x4e, 0xa0, 0x11, 0xd2, 0x00, 0x6a, 0xc0, 0xf2, 0x44, 0xc0, 0xc0, 0xf2, 0x45, 0xc0,\r
+0xe0, 0xf0, 0x23, 0xa0, 0x11, 0x94, 0x1b, 0xd3, 0x00, 0x18, 0x49, 0xbd, 0xb1, 0x67, 0x0a, 0x6c, 0x98, 0xea, 0x14, 0xd2, 0xcc, 0xb2, 0x12, 0xec, 0x49, 0xe4, 0x15, 0xd2, 0xe0, 0xf0, 0xa3, 0xa0,\r
+0x00, 0x18, 0x56, 0x3d, 0x11, 0x94, 0x12, 0x92, 0x1b, 0x93, 0x1a, 0x22, 0x13, 0x94, 0x01, 0x74, 0x17, 0x61, 0x15, 0x92, 0x03, 0xf4, 0x00, 0x6c, 0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97,\r
+0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0xc1, 0xb2, 0x05, 0xd2, 0x04, 0x6c, 0x7b, 0x6a, 0xfa, 0x6d, 0x06, 0xf0, 0x11, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x1b, 0x93,\r
+0x00, 0x1c, 0x73, 0x1b, 0x1b, 0xd3, 0x0a, 0x04, 0xb1, 0x67, 0x00, 0x18, 0x44, 0x97, 0x1a, 0xd2, 0x0a, 0x92, 0xb7, 0xb4, 0x1b, 0x93, 0x46, 0x32, 0x01, 0x4a, 0x8c, 0xea, 0x0a, 0xd2, 0xa0, 0xf2,\r
+0x9e, 0xa8, 0x10, 0xd4, 0x07, 0x2c, 0x12, 0x95, 0x01, 0x75, 0x04, 0x61, 0x00, 0x1c, 0x7a, 0x1b, 0x1a, 0x94, 0x50, 0x11, 0x06, 0x22, 0x05, 0x23, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xe9,\r
+0x01, 0x10, 0x00, 0x69, 0xff, 0xf7, 0x1f, 0x6c, 0x27, 0xe3, 0x8c, 0xe9, 0x19, 0x94, 0x85, 0xe1, 0x23, 0xeb, 0x01, 0x60, 0x67, 0xe1, 0x12, 0x95, 0x01, 0x75, 0x02, 0x60, 0x10, 0xd3, 0x16, 0x10,\r
+0xa3, 0xb3, 0xa0, 0xf2, 0x8c, 0x98, 0x8c, 0xeb, 0x43, 0xeb, 0x67, 0xe2, 0x03, 0x61, 0xa1, 0xb1, 0x67, 0xe1, 0x45, 0xe1, 0x10, 0x95, 0x4b, 0xe3, 0xba, 0xe9, 0x01, 0x2d, 0xe5, 0xe8, 0x12, 0xe9,\r
+0x01, 0x49, 0xb8, 0xe9, 0x12, 0xe9, 0x25, 0xe2, 0x99, 0xb2, 0x4c, 0xe9, 0x11, 0x93, 0xe0, 0xf0, 0xa3, 0xa0, 0x02, 0x6c, 0x74, 0x32, 0xa0, 0x35, 0xff, 0x6b, 0x6c, 0xea, 0xac, 0x35, 0x4d, 0xed,\r
+0xff, 0xf7, 0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x0a, 0x93, 0x71, 0xe1, 0x11, 0xd4, 0x05, 0x10, 0x11, 0x95, 0x10, 0x92, 0x55, 0xe5, 0x11, 0xd5, 0x45, 0xe1, 0x08, 0x59, 0xf9, 0x61,\r
+0x00, 0x18, 0xa5, 0x3a, 0x1b, 0xd3, 0x11, 0x94, 0x1b, 0x93, 0x6f, 0xe4, 0x64, 0x33, 0x6d, 0xe2, 0x70, 0xd8, 0x10, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4e, 0x6c, 0x11, 0x95, 0xff, 0xf7, 0x1f, 0x6a,\r
+0x48, 0x6c, 0x4c, 0xed, 0x19, 0xd5, 0x00, 0x18, 0x5c, 0x3b, 0x1b, 0xd2, 0x13, 0x93, 0x12, 0x2b, 0x16, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0x6c, 0x17, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4a, 0x6c,\r
+0x7d, 0xb3, 0x1b, 0x92, 0x00, 0xf2, 0x1c, 0x6c, 0xa0, 0xab, 0x40, 0x6b, 0x4c, 0xed, 0x6d, 0xed, 0x4c, 0xed, 0x16, 0x10, 0x79, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x10, 0xf0, 0x00, 0x6a, 0x6c, 0xea,\r
+0x08, 0x22, 0x16, 0x94, 0x03, 0x24, 0x4c, 0x6c, 0x01, 0x6d, 0x05, 0x10, 0x4c, 0x6c, 0x00, 0x6d, 0x02, 0x10, 0x16, 0x95, 0x4c, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x17, 0x95, 0x4a, 0x6c,\r
+0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x07, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x6c, 0x12, 0x95, 0x0e, 0x2d, 0x13, 0x92, 0x01, 0x72, 0x0b, 0x61, 0x14, 0x93, 0x69, 0xb2, 0x69, 0xe2, 0xa0, 0xc2,\r
+0x68, 0xb2, 0x69, 0xe2, 0x7d, 0x67, 0x87, 0x43, 0x41, 0x4c, 0x60, 0xa4, 0x60, 0xc2, 0x1a, 0x94, 0x00, 0x1c, 0x7a, 0x1b, 0x02, 0x49, 0x00, 0x18, 0x1c, 0x04, 0x00, 0x65, 0x01, 0xf0, 0x00, 0x6d,\r
+0x00, 0x18, 0x91, 0xbe, 0x5e, 0x6c, 0x03, 0x6a, 0x19, 0x95, 0x04, 0xd2, 0x11, 0x92, 0x57, 0xb4, 0x05, 0xd4, 0x06, 0xd5, 0x07, 0xd2, 0x00, 0x6c, 0x44, 0x32, 0xfa, 0x6d, 0xa6, 0xf0, 0x1c, 0x6e,\r
+0x40, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd2, 0x12, 0x94, 0x3b, 0x2c, 0x13, 0x95, 0x01, 0x75, 0x1a, 0x61, 0x15, 0x92, 0x18, 0xf0, 0x00, 0x6c, 0x03, 0xf4, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97,\r
+0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0x49, 0xb3, 0x7b, 0x6a, 0x04, 0x6c, 0xfa, 0x6d, 0xc6, 0xf0, 0x1f, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x20, 0x6a,\r
+0x00, 0xf2, 0x50, 0xc0, 0x40, 0x10, 0x51, 0x59, 0x06, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x92, 0x18, 0xf0, 0x00, 0x6c, 0x01, 0xf4, 0x00, 0x6d,\r
+0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0x38, 0xb2, 0x05, 0xd2, 0x04, 0x6c, 0x7b, 0x6a, 0xfa, 0x6d, 0xe6, 0xf0, 0x10, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x20, 0x18, 0xa3, 0x30,\r
+0x06, 0xd2, 0x13, 0x93, 0x20, 0x2b, 0x12, 0x94, 0x1e, 0x24, 0x51, 0x59, 0x1c, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x92, 0x01, 0xf4, 0x00, 0x6c,\r
+0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0x27, 0xb2, 0x05, 0xd2, 0x04, 0x6c, 0x7b, 0x6a, 0xfa, 0x6d, 0x06, 0xf1, 0x01, 0x6e, 0xc4, 0xf3, 0x15, 0x6f,\r
+0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x10, 0x94, 0x7d, 0x67, 0x60, 0xf2, 0x0b, 0x6a, 0x5a, 0xcb, 0x25, 0xb2, 0x0b, 0xd4, 0x80, 0x9a, 0x0e, 0x92, 0x10, 0x95, 0x0c, 0x96, 0x04, 0xd2, 0x0d, 0x97,\r
+0x0f, 0x92, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x03, 0x6a, 0x10, 0x95, 0x04, 0xd2, 0x17, 0xb2, 0x05, 0xd2, 0x16, 0x93, 0x17, 0x92, 0x06, 0xd5, 0x05, 0x6c, 0xfa, 0x6d, 0x06, 0xf1, 0x15, 0x6e,\r
+0x82, 0xf7, 0x1e, 0x6f, 0x07, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd3, 0x14, 0x94, 0x0d, 0x24, 0x64, 0x67, 0xff, 0x4b, 0x68, 0x33, 0x15, 0xb4, 0x71, 0xe4, 0x00, 0x6a, 0x40, 0xdc, 0x14, 0xb4,\r
+0x71, 0xe4, 0x40, 0xdc, 0x13, 0xb4, 0x6d, 0xe4, 0x40, 0xdb, 0x18, 0x95, 0x12, 0xb2, 0x00, 0x6b, 0xa9, 0xe2, 0x60, 0xc2, 0x1f, 0x97, 0x1e, 0x91, 0x1d, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x10, 0x63,\r
+0x20, 0x56, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x02, 0x00, 0xb6, 0x4c, 0x00, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80,\r
+0x90, 0x19, 0x11, 0x80, 0xa0, 0x48, 0x11, 0x80, 0x44, 0x1a, 0x11, 0x80, 0x74, 0x1a, 0x11, 0x80, 0xa4, 0x1a, 0x11, 0x80, 0xd8, 0x95, 0x11, 0x80, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd1, 0x0d, 0xd0,\r
+0x7a, 0xb2, 0x01, 0x6c, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x78, 0xb3, 0x60, 0xab, 0x09, 0xd3, 0x78, 0xb3, 0x60, 0xa3, 0x8e, 0xeb, 0x04, 0x2b, 0x77, 0xb4, 0x60, 0xc4, 0x77, 0xb4,\r
+0x60, 0xc4, 0x00, 0x6b, 0x08, 0xd3, 0xd5, 0x10, 0x75, 0xb3, 0x60, 0x9b, 0x05, 0x23, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb, 0xc0, 0xf0, 0x12, 0x23, 0x09, 0x94, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb,\r
+0x8f, 0xe8, 0x4c, 0xe8, 0x00, 0x31, 0x20, 0x31, 0x23, 0x31, 0x23, 0x31, 0x03, 0x23, 0x00, 0x18, 0x05, 0x9c, 0x00, 0x65, 0x6b, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x0f, 0x22,\r
+0x00, 0x51, 0x0d, 0x60, 0x00, 0x18, 0xde, 0x1a, 0x00, 0x65, 0x67, 0xb2, 0x40, 0xf0, 0x63, 0xa2, 0x06, 0x23, 0xff, 0xf7, 0x1e, 0x6b, 0x6c, 0xe8, 0x00, 0x6b, 0x40, 0xf0, 0x63, 0xc2, 0x08, 0x6a,\r
+0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xcd, 0x09, 0x00, 0x65, 0x02, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x80, 0x18, 0x74, 0x2f, 0x00, 0x65, 0x01, 0x6a, 0x0c, 0xea, 0x46, 0x22, 0x00, 0x18, 0x42, 0x13,\r
+0x00, 0x6c, 0x5a, 0xb2, 0x40, 0xa2, 0x40, 0x22, 0x59, 0xb2, 0x60, 0xf1, 0x44, 0xa2, 0x3c, 0x22, 0x58, 0xb1, 0xe0, 0xf0, 0x47, 0xa1, 0x01, 0x72, 0x37, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x5a,\r
+0x33, 0x61, 0xc0, 0xf0, 0x4d, 0xa1, 0x02, 0x6b, 0x6e, 0xea, 0x2e, 0x2a, 0xe0, 0xf0, 0x8e, 0xa1, 0xe0, 0xf0, 0xa3, 0xa1, 0xc3, 0x67, 0x00, 0x18, 0x8f, 0x3c, 0x0a, 0xd2, 0x00, 0xf2, 0x65, 0xa1,\r
+0x0a, 0x92, 0x0f, 0x73, 0x13, 0x60, 0x9d, 0x67, 0x01, 0x6b, 0x03, 0x6e, 0x78, 0xc4, 0x5a, 0xc4, 0x64, 0x6b, 0x00, 0x6c, 0x06, 0x05, 0xe6, 0x67, 0x04, 0xd3, 0x00, 0x18, 0x23, 0xe3, 0x05, 0xd2,\r
+0x0f, 0x6a, 0x00, 0xf2, 0x45, 0xc1, 0x00, 0x18, 0xce, 0x06, 0x00, 0x6c, 0x3f, 0xb2, 0xa0, 0xa2, 0xe1, 0xf7, 0x1d, 0x6a, 0xa0, 0x35, 0xb0, 0x35, 0x4d, 0xed, 0x3f, 0xb2, 0x81, 0xa2, 0xff, 0xf7,\r
+0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x20, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf4, 0x05, 0x00, 0x65, 0x04, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x43, 0x11, 0x00, 0x65,\r
+0x02, 0xf0, 0x00, 0x6a, 0x0c, 0xea, 0x09, 0x22, 0x00, 0x18, 0x5f, 0x11, 0x00, 0x65, 0x33, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb6, 0xa3, 0x00, 0x65, 0x00, 0xf6, 0x00, 0x6a, 0x0c, 0xea,\r
+0x06, 0x22, 0x2f, 0xb2, 0xff, 0xf7, 0x1f, 0x6c, 0x40, 0xaa, 0x4c, 0xec, 0x08, 0xd4, 0x00, 0xf2, 0x00, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf6, 0x12, 0x08, 0x94, 0x00, 0xf4, 0x00, 0x6a,\r
+0x0c, 0xea, 0x0f, 0x22, 0x00, 0x18, 0x2f, 0x13, 0x08, 0x94, 0xfe, 0xf7, 0x1f, 0x6d, 0x00, 0x18, 0xac, 0xbe, 0x5e, 0x6c, 0x1b, 0xb2, 0xe0, 0xf0, 0x54, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb9, 0xab,\r
+0x00, 0x65, 0x01, 0xf0, 0x00, 0x69, 0x50, 0x67, 0x2c, 0xea, 0x07, 0x22, 0x00, 0x18, 0x17, 0x13, 0x00, 0x65, 0x5e, 0x6c, 0x00, 0x18, 0x91, 0xbe, 0xb1, 0x67, 0xff, 0x6a, 0x01, 0x4a, 0x0c, 0xea,\r
+0x03, 0x22, 0x00, 0x18, 0x46, 0x05, 0x00, 0x65, 0x08, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x09, 0x94, 0x8f, 0xeb, 0x4c, 0xeb, 0x3f, 0xf7, 0x06, 0x2b, 0x0f, 0x97, 0x0e, 0x91,\r
+0x0d, 0x90, 0x00, 0xef, 0x08, 0x63, 0x00, 0x65, 0xbe, 0x00, 0x00, 0xb6, 0x7e, 0x04, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0x0c, 0x3b, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80,\r
+0x4c, 0x00, 0x11, 0x80, 0x50, 0x46, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0xf0, 0x1a, 0x11, 0x80, 0x5c, 0x00, 0x00, 0xb6,\r
+0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x2b, 0xb2, 0x40, 0x9a, 0x1e, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x40, 0x9c, 0x04, 0x67, 0x6c, 0xea, 0x7c, 0x6b, 0x4c, 0xeb, 0x40, 0xdc, 0x05, 0x23,\r
+0x25, 0xb3, 0x26, 0xb2, 0x00, 0x18, 0xe5, 0x39, 0x60, 0xda, 0x61, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x99, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x03, 0x22,\r
+0x80, 0x18, 0xee, 0x31, 0x00, 0x65, 0x61, 0xa0, 0x10, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xe0, 0x03, 0x00, 0x65, 0x61, 0xa0, 0x08, 0x6a, 0x4c, 0xeb, 0x0a, 0x23, 0x15, 0xb3, 0x61, 0xa3,\r
+0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x65, 0x00, 0x18, 0xe6, 0x37, 0x00, 0x65, 0x61, 0xa0, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18,\r
+0xad, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x20, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x2d, 0x02, 0x00, 0x65, 0x0b, 0xb2, 0x60, 0xa2, 0x04, 0x23, 0x00, 0x6b, 0x00, 0x18, 0x5a, 0x33, 0x60, 0xc2,\r
+0x00, 0x6b, 0x08, 0xb2, 0x60, 0xc2, 0x05, 0x97, 0x04, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x03, 0x63, 0xf4, 0x21, 0x11, 0x80, 0x32, 0x97, 0x79, 0x23, 0x60, 0x8b, 0x10, 0x80, 0x98, 0x07, 0x11, 0x80,\r
+0xe4, 0x07, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x22, 0xb0, 0x40, 0xa0, 0x01, 0x69, 0x2c, 0xea, 0x38, 0x22, 0x21, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x00, 0x18, 0x64, 0x35,\r
+0x04, 0xd2, 0x04, 0x92, 0x1e, 0xb3, 0xff, 0x6c, 0x60, 0xda, 0x1e, 0xb2, 0x60, 0x9a, 0x40, 0xa0, 0x40, 0xf7, 0x62, 0x33, 0x46, 0x32, 0x2c, 0xea, 0x8c, 0xea, 0x2c, 0xeb, 0x4e, 0xeb, 0x04, 0x2b,\r
+0x19, 0xb3, 0x80, 0x9b, 0x01, 0x4c, 0x80, 0xdb, 0x18, 0xb3, 0x80, 0xa3, 0x07, 0x6b, 0x8c, 0xeb, 0x1a, 0x23, 0x40, 0x6b, 0x8c, 0xeb, 0x17, 0x2b, 0x0f, 0xb3, 0xa0, 0xa3, 0x08, 0x6b, 0xac, 0xeb,\r
+0x12, 0x23, 0x10, 0xb3, 0x04, 0x6c, 0xac, 0xec, 0x60, 0x9b, 0x06, 0x24, 0x40, 0xf7, 0x62, 0x33, 0x01, 0x6c, 0x8c, 0xeb, 0x6e, 0xea, 0x02, 0x10, 0x0d, 0xb2, 0x40, 0xa2, 0x04, 0x2a, 0x0a, 0xb2,\r
+0x60, 0x9a, 0x01, 0x4b, 0x60, 0xda, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x1c, 0x96, 0x11, 0x80, 0xcc, 0x07, 0x11, 0x80, 0x8d, 0xba, 0x10, 0x80,\r
+0x50, 0xa0, 0x00, 0xb0, 0x08, 0x22, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x1d, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x20, 0x6b, 0x6c, 0xea, 0x2d, 0x2a,\r
+0x1b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x04, 0x72, 0x28, 0x60, 0x03, 0x72, 0x26, 0x60, 0x19, 0xb2, 0x40, 0x9a, 0x23, 0x2a, 0x18, 0xb2, 0x40, 0xa2, 0x01, 0x6f, 0x18, 0xb3, 0x56, 0x36, 0xec, 0xee,\r
+0x01, 0x4e, 0x64, 0x6f, 0xf8, 0xee, 0x80, 0xab, 0xff, 0x6d, 0x12, 0xee, 0xc2, 0xec, 0x12, 0x61, 0x40, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x13, 0x23, 0x07, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x0f, 0x23,\r
+0x80, 0x18, 0x8f, 0x2e, 0x00, 0x65, 0x00, 0x6c, 0x01, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x65, 0x05, 0x10, 0x01, 0x4c, 0x80, 0xcb, 0x02, 0x10, 0x01, 0x6a, 0x01, 0x10, 0x00, 0x6a,\r
+0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62,\r
+0x12, 0xb2, 0xa0, 0xa2, 0x40, 0x6a, 0x60, 0x9c, 0xac, 0xea, 0xff, 0x6c, 0x0d, 0x22, 0x07, 0x6a, 0xac, 0xea, 0x8c, 0xea, 0x09, 0x22, 0x8c, 0xeb, 0x13, 0x23, 0x00, 0x6b, 0x0c, 0xb2, 0x60, 0xca,\r
+0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x0c, 0x10, 0xff, 0x6a, 0x6c, 0xea, 0x09, 0x22, 0x09, 0xb2, 0x60, 0xa2, 0x1e, 0x6a, 0x6c, 0xea, 0x06, 0x6b, 0x6e, 0xea, 0x02, 0x2a, 0x06, 0xb3, 0x40, 0xc3,\r
+0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x18, 0x96, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80, 0x44, 0x20, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2,\r
+0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x18, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2,\r
+0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x18, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x12, 0xb2, 0x60, 0xa2,\r
+0x40, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x07, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x0d, 0xb3, 0x0d, 0xb2, 0x60, 0xda, 0x0d, 0xb3, 0x7c, 0x4b,\r
+0x0d, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x08, 0x22, 0x0c, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x03, 0x10, 0x00, 0x1c, 0xb7, 0x1b, 0x00, 0x65, 0x09, 0xb2, 0x40, 0x9a, 0xfa, 0x2a, 0x05, 0x97,\r
+0x00, 0xef, 0x03, 0x63, 0x18, 0x96, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01, 0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0xe8, 0x3b, 0x11, 0x80,\r
+0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0xff, 0xf7, 0x1f, 0x6a, 0x8c, 0xea, 0x00, 0x1c, 0x73, 0x1b, 0x16, 0xd2, 0x16, 0x94, 0x88, 0x33, 0x58, 0xb4, 0x6d, 0xe4, 0x82, 0x67, 0x00, 0x1c,\r
+0x7a, 0x1b, 0x00, 0x9b, 0x00, 0x6a, 0x15, 0xd2, 0x17, 0xd2, 0x9f, 0x10, 0x23, 0xa8, 0x45, 0x29, 0x15, 0x94, 0xff, 0x6a, 0x01, 0x4c, 0x4c, 0xec, 0x0b, 0x5c, 0x15, 0xd4, 0x06, 0x61, 0x00, 0x1c,\r
+0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x26, 0xd8, 0x0f, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x2b, 0x61, 0x17, 0x92, 0x0e, 0x2a, 0x16, 0x93, 0x68, 0x32,\r
+0x46, 0xb3, 0x49, 0xe3, 0x60, 0x9a, 0x04, 0x2b, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x7f, 0x10, 0x66, 0x98, 0x14, 0xd3, 0x60, 0xda, 0x05, 0x10, 0x46, 0x98, 0x17, 0x93, 0x46, 0xdb, 0x46, 0x98,\r
+0x14, 0xd2, 0x01, 0x6a, 0x47, 0xd8, 0x00, 0x6a, 0x00, 0x1c, 0x7a, 0x1b, 0x46, 0xd8, 0x43, 0x98, 0x03, 0x22, 0x80, 0x98, 0x40, 0xea, 0xa5, 0x98, 0x44, 0x98, 0x01, 0x72, 0x65, 0x61, 0x47, 0x98,\r
+0x01, 0x72, 0x62, 0x61, 0x80, 0x98, 0x20, 0x18, 0x7a, 0x34, 0xa2, 0x98, 0x5d, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x06, 0x98, 0x14, 0xd0, 0x57, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65,\r
+0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x09, 0x61, 0x43, 0xa8, 0x66, 0x98, 0xff, 0x4a, 0x43, 0xc8, 0x00, 0x1c, 0x7a, 0x1b, 0x14, 0xd3, 0x17, 0xd0, 0x04, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65,\r
+0x14, 0xd0, 0x47, 0x98, 0x02, 0x72, 0x40, 0x61, 0x63, 0x98, 0x25, 0xb2, 0x4b, 0xe3, 0x3c, 0x2a, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x23, 0xb3, 0x12, 0xe9, 0x65, 0xe1, 0x8b, 0x99, 0x60, 0x98,\r
+0x8e, 0xeb, 0x2d, 0x2b, 0xe0, 0xf0, 0xa3, 0xa1, 0x12, 0x04, 0x00, 0x18, 0x44, 0x97, 0x18, 0xd2, 0x0b, 0x6b, 0x04, 0xd3, 0x1c, 0xb3, 0x05, 0xd3, 0x18, 0x92, 0x12, 0x93, 0x02, 0x6c, 0x07, 0xd2,\r
+0x06, 0xd3, 0xe0, 0xf0, 0x43, 0xa1, 0xfa, 0x6d, 0xe4, 0xf5, 0x1e, 0x6e, 0x08, 0xd2, 0xe0, 0xf0, 0x4e, 0xa1, 0x64, 0xf4, 0x14, 0x6f, 0x09, 0xd2, 0x4d, 0x99, 0x0a, 0xd2, 0x60, 0xf2, 0x52, 0xa1,\r
+0x0b, 0xd2, 0x60, 0xf2, 0x53, 0xa1, 0x0c, 0xd2, 0x4c, 0x99, 0x0d, 0xd2, 0x40, 0x98, 0x0e, 0xd2, 0x43, 0xa8, 0x0f, 0xd2, 0x48, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x10, 0xd2, 0x05, 0x10, 0x01, 0x4a,\r
+0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xc4, 0x61, 0x14, 0x90, 0x5f, 0xf7, 0x1f, 0x28, 0x1d, 0x97, 0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef, 0x0f, 0x63, 0xb8, 0x8a, 0x11, 0x80, 0xe5, 0xb9, 0x04, 0x80,\r
+0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xc8, 0x72, 0x04, 0x61, 0x80, 0x18, 0x38, 0x33, 0x80, 0xac, 0x03, 0x10, 0x20, 0x18, 0x89, 0x35, 0x00, 0x65,\r
+0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd0, 0x68, 0xa4, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x0a, 0x02, 0x00, 0x65, 0x56, 0x2a,\r
+0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x38, 0xb3, 0x01, 0x22, 0x01, 0x6a, 0x40, 0xc3, 0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x97, 0x01, 0x90, 0x67, 0x47, 0x2a, 0x68, 0xa0,\r
+0x08, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x72, 0x01, 0x90, 0x67, 0x3f, 0x2a, 0x2f, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x18, 0x22, 0x68, 0xa0, 0x80, 0x6a, 0x4b, 0xea,\r
+0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xf0, 0x01, 0x90, 0x67, 0x2e, 0x2a, 0x68, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xdc, 0x01, 0x90, 0x67, 0x26, 0x2a,\r
+0x62, 0x98, 0xc1, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x37, 0x22, 0x20, 0xb2, 0x80, 0xf0, 0x7c, 0xa2, 0x5d, 0x67, 0x20, 0xf0, 0x70, 0xc2, 0x04, 0x6a, 0x6c, 0xea, 0x07, 0x22, 0x66, 0xa0, 0x7f, 0x6a,\r
+0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x6c, 0xea, 0x46, 0xc0, 0x18, 0xb2, 0x20, 0xf0, 0x7b, 0xa2, 0x5d, 0x67, 0x20, 0xf0, 0x74, 0xc2, 0x40, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x66, 0xa0, 0x21, 0x6a,\r
+0x4b, 0xea, 0x6c, 0xea, 0x46, 0xc0, 0x00, 0x18, 0x69, 0x37, 0x84, 0x40, 0x05, 0x6a, 0x04, 0xd2, 0x0f, 0xb2, 0x05, 0xd2, 0x40, 0x98, 0x04, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x43, 0x98, 0x44, 0xf5,\r
+0x1d, 0x6e, 0xa1, 0xf1, 0x1a, 0x6f, 0x07, 0xd2, 0x42, 0x98, 0x08, 0xd2, 0x41, 0x98, 0x09, 0xd2, 0x44, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd2, 0x0f, 0x97, 0x0e, 0x90, 0x01, 0x6a, 0x00, 0xef,\r
+0x08, 0x63, 0x00, 0x65, 0x1d, 0x96, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd1, 0x0f, 0xd0, 0x59, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x40, 0x33,\r
+0x28, 0x6e, 0x80, 0x18, 0x95, 0x28, 0x00, 0x65, 0x56, 0xb2, 0x80, 0xf0, 0x9c, 0xa2, 0x40, 0x6b, 0x55, 0xb5, 0x8d, 0xeb, 0x97, 0xaa, 0x80, 0xf0, 0x7c, 0xc2, 0x08, 0x6b, 0x8d, 0xeb, 0x96, 0xaa,\r
+0x77, 0xca, 0x07, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x50, 0xb4, 0x76, 0xca, 0x60, 0x9c, 0xad, 0xeb, 0x60, 0xdc, 0x00, 0x6c, 0x4e, 0xb3, 0x80, 0xcb, 0x78, 0xaa, 0x4d, 0xb2, 0x80, 0xa2,\r
+0x01, 0x6d, 0x8e, 0x32, 0xac, 0xea, 0x50, 0x36, 0x11, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x92, 0x33, 0xac, 0xeb, 0xcd, 0xea, 0x60, 0x33, 0xff, 0xf5, 0x1e, 0x4d, 0x64, 0x33, 0xac, 0xea, 0x6d, 0xea,\r
+0x07, 0x6b, 0x8c, 0xeb, 0x04, 0x53, 0x04, 0x61, 0x07, 0x6b, 0x6b, 0xeb, 0x4c, 0xeb, 0x07, 0x10, 0x03, 0x6c, 0x6c, 0xec, 0x84, 0x33, 0x07, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x8d, 0xeb, 0x39, 0xb2,\r
+0x78, 0xca, 0x3c, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x38, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea,\r
+0x12, 0x22, 0x00, 0x68, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x01, 0x48, 0xff, 0x6a,\r
+0x4c, 0xe8, 0x04, 0x58, 0xef, 0x61, 0x2c, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x11, 0x22, 0x2a, 0xb4, 0xa3, 0xa4, 0x09, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x43, 0xc4, 0x01, 0x6d, 0x28, 0xb4,\r
+0x76, 0x32, 0xac, 0xea, 0xc0, 0xa4, 0x03, 0x4a, 0x54, 0x35, 0x1f, 0x6a, 0xcc, 0xea, 0xad, 0xea, 0x40, 0xc4, 0x20, 0xb2, 0x00, 0xa2, 0x20, 0xb2, 0xc0, 0xa2, 0x22, 0xb2, 0xa0, 0xa2, 0x22, 0xb2,\r
+0x04, 0x6c, 0x6c, 0xec, 0x40, 0x9a, 0x65, 0x67, 0x0b, 0x24, 0xc6, 0x34, 0x40, 0xf7, 0x42, 0x32, 0x8e, 0xea, 0x01, 0x6c, 0x8c, 0xea, 0xff, 0x6c, 0x8c, 0xea, 0x00, 0x6b, 0x01, 0x22, 0x01, 0x6b,\r
+0x1a, 0xb2, 0x07, 0x69, 0xe0, 0x9a, 0x18, 0xb2, 0x80, 0x9a, 0x19, 0xb2, 0x40, 0x9a, 0x04, 0xd1, 0x07, 0xd6, 0x08, 0xd5, 0x0a, 0xd7, 0x0b, 0xd4, 0x16, 0xb1, 0x05, 0x6c, 0xfa, 0x6d, 0x84, 0xf4,\r
+0x13, 0x6e, 0xa4, 0xf3, 0x12, 0x6f, 0x05, 0xd1, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x0c, 0xd2, 0x11, 0x97, 0x10, 0x91, 0x0f, 0x90, 0x00, 0xef, 0x09, 0x63, 0xd8, 0x95, 0x11, 0x80,\r
+0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xa0, 0x00, 0xb0, 0x16, 0x96, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x1c, 0x96, 0x11, 0x80, 0x30, 0x21, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80,\r
+0xd2, 0x06, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0x40, 0xa0, 0x00, 0xb0, 0x2c, 0x00, 0x00, 0xb5, 0xc8, 0xe7, 0x04, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x18, 0xb2, 0x19, 0xb3,\r
+0x63, 0xea, 0x26, 0x61, 0x18, 0xb2, 0x80, 0x9a, 0x18, 0xb3, 0x8e, 0xeb, 0x21, 0x2b, 0x02, 0xaa, 0x17, 0xb5, 0x1d, 0x10, 0x17, 0xb4, 0x42, 0x45, 0x43, 0xec, 0x1a, 0x61, 0xc0, 0xa2, 0xff, 0xf7,\r
+0x1f, 0x6f, 0x43, 0x46, 0x43, 0xe8, 0x14, 0x61, 0x45, 0xe5, 0x23, 0xec, 0x11, 0x61, 0x81, 0xa5, 0x60, 0xa5, 0x80, 0x34, 0x6d, 0xec, 0xec, 0xec, 0xe0, 0xf3, 0x14, 0x5c, 0x09, 0x60, 0x43, 0xe0,\r
+0x0d, 0xb2, 0x03, 0x4d, 0x91, 0xe2, 0x00, 0x18, 0x0d, 0x33, 0xec, 0xe8, 0xb1, 0x67, 0xe2, 0x28, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0xf0, 0xff, 0x10, 0x80,\r
+0x50, 0xf0, 0x10, 0x80, 0x54, 0xf0, 0x10, 0x80, 0x55, 0xab, 0x23, 0x87, 0x5a, 0xf0, 0x10, 0x80, 0xff, 0xff, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xf4, 0x63, 0x17, 0x62, 0x16, 0xd1, 0x15, 0xd0,\r
+0xff, 0x69, 0x69, 0xb0, 0x61, 0xf3, 0x06, 0x6d, 0x8c, 0xe9, 0x00, 0x18, 0x5c, 0x3b, 0x22, 0x6c, 0x20, 0xf0, 0xbf, 0xa0, 0xf3, 0x6a, 0x24, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed,\r
+0x40, 0xf0, 0xa1, 0xa0, 0x40, 0xf0, 0x40, 0xa0, 0x26, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0xeb, 0xf0, 0x12, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x28, 0x6c, 0x93, 0xf7, 0x1a, 0x6d,\r
+0x00, 0x18, 0x5c, 0x3b, 0x2a, 0x6c, 0x00, 0x18, 0x5e, 0x3a, 0x01, 0x6c, 0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x55, 0xb2, 0xff, 0xf7, 0x1f, 0x6b, 0x60, 0x6d, 0x80, 0xaa, 0x9f, 0xf7,\r
+0x1f, 0x6a, 0x8c, 0xea, 0x52, 0xb4, 0x80, 0xa4, 0x01, 0x2c, 0x20, 0x6d, 0x4d, 0xed, 0x6c, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x5e, 0x6c, 0xff, 0x6c, 0x09, 0x4c, 0x00, 0x18, 0x5c, 0x3b, 0x03, 0x6d,\r
+0x4c, 0xb2, 0x41, 0xa2, 0x00, 0x6d, 0x10, 0xd2, 0x10, 0x93, 0x4b, 0xb2, 0x49, 0xe3, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x83, 0x67, 0x49, 0xb3, 0x60, 0xa3, 0x4c, 0xec, 0x11, 0xd4, 0x12, 0xd3,\r
+0x47, 0xb3, 0x60, 0xa3, 0x0a, 0x2b, 0x41, 0xb3, 0x5e, 0x6c, 0xa0, 0xab, 0x80, 0x6b, 0x4c, 0xed, 0x6d, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0xf0, 0x6d, 0x42, 0xb0, 0x42, 0xb4, 0xe0, 0xf3,\r
+0x1d, 0x6e, 0x00, 0x18, 0x40, 0x33, 0x00, 0x65, 0xa0, 0xa8, 0x01, 0x6e, 0x3e, 0xb4, 0x00, 0x18, 0x42, 0x3b, 0x00, 0x6f, 0x40, 0xa8, 0x01, 0xf4, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x4d, 0xed,\r
+0x3a, 0xb2, 0x40, 0xa2, 0x40, 0x32, 0x50, 0x32, 0x4d, 0xed, 0x39, 0xb2, 0x81, 0xa2, 0x00, 0x18, 0x5c, 0x3b, 0x0c, 0xed, 0x11, 0x93, 0xee, 0xf1, 0x09, 0x6a, 0x12, 0x94, 0x6c, 0xea, 0x35, 0xb3,\r
+0x60, 0xa3, 0x07, 0x6d, 0x8c, 0xed, 0xa0, 0x35, 0x60, 0x33, 0x7c, 0x33, 0xa4, 0x35, 0x6d, 0xed, 0xff, 0x6b, 0x21, 0x4b, 0x6d, 0xea, 0x10, 0x94, 0x4d, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x0c, 0xed,\r
+0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x00, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x0d, 0x6d, 0x1f, 0xb2, 0x40, 0xa2, 0x08, 0x22, 0x28, 0xb2, 0x40, 0xa2, 0xc4, 0x6c, 0x40, 0x35, 0x4d, 0xed,\r
+0x00, 0x18, 0x5c, 0x3b, 0x0c, 0xed, 0x06, 0x6a, 0x04, 0xd2, 0x24, 0xb2, 0x05, 0xd2, 0x21, 0xb2, 0x40, 0xa2, 0x03, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x1c, 0xb2, 0x40, 0xa2, 0x44, 0xf1, 0x06, 0x6e,\r
+0xc4, 0xf3, 0x1a, 0x6f, 0x07, 0xd2, 0x17, 0xb2, 0x40, 0xaa, 0x08, 0xd2, 0x10, 0xb2, 0x40, 0xa2, 0x09, 0xd2, 0x19, 0xb2, 0x40, 0xa2, 0x0a, 0xd2, 0x11, 0xb2, 0x40, 0xa2, 0x20, 0x18, 0xa3, 0x30,\r
+0x0b, 0xd2, 0x0b, 0x21, 0x0c, 0x00, 0x90, 0x67, 0x55, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x0a, 0x6e, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x29, 0x3d, 0xd0, 0x67, 0x17, 0x97, 0x16, 0x91, 0x15, 0x90,\r
+0x00, 0xef, 0x0c, 0x63, 0x4c, 0x00, 0x11, 0x80, 0x5e, 0x00, 0x00, 0xb6, 0x06, 0x96, 0x11, 0x80, 0x3c, 0xf2, 0x04, 0x80, 0x00, 0x00, 0x00, 0xb6, 0x28, 0x05, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80,\r
+0x04, 0x96, 0x11, 0x80, 0xa0, 0x94, 0x10, 0x80, 0x01, 0x96, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0x02, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfa, 0x63, 0x0b, 0x62,\r
+0x0a, 0xd1, 0x09, 0xd0, 0x8e, 0xb2, 0x0d, 0xd5, 0x60, 0xa2, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x26, 0x67, 0x03, 0x22, 0x00, 0x6b, 0x8b, 0xb2, 0x60, 0xda, 0x40, 0xa8, 0x7f, 0xf4, 0x15, 0x72,\r
+0x36, 0x60, 0x7f, 0xf4, 0x16, 0x6b, 0x63, 0xea, 0x16, 0x60, 0x7f, 0xf4, 0x10, 0x72, 0x67, 0x60, 0xfb, 0x4b, 0x63, 0xea, 0x09, 0x60, 0x1f, 0xf4, 0x16, 0x72, 0x4c, 0x60, 0x7f, 0xf4, 0x0f, 0x72,\r
+0x00, 0x6d, 0xe0, 0xf0, 0x16, 0x60, 0xe9, 0x10, 0x7f, 0xf4, 0x13, 0x72, 0x36, 0x60, 0x7f, 0xf4, 0x14, 0x72, 0x36, 0x60, 0xe2, 0x10, 0x9f, 0xf4, 0x11, 0x72, 0xa0, 0xf0, 0x0c, 0x60, 0x9f, 0xf4,\r
+0x12, 0x6b, 0x63, 0xea, 0x09, 0x60, 0x9f, 0xf4, 0x00, 0x72, 0x80, 0xf0, 0x03, 0x60, 0x9f, 0xf4, 0x10, 0x72, 0x80, 0xf0, 0x06, 0x60, 0xd1, 0x10, 0x5f, 0xf5, 0x04, 0x72, 0x48, 0x60, 0x5f, 0xf5,\r
+0x05, 0x72, 0x3d, 0x60, 0x9f, 0xf4, 0x12, 0x72, 0xa0, 0xf0, 0x0e, 0x60, 0xc6, 0x10, 0x63, 0xa0, 0x6d, 0xb2, 0x60, 0xc2, 0x64, 0xa0, 0x6d, 0xb2, 0x60, 0xc2, 0x46, 0xa0, 0x65, 0xa0, 0x40, 0x32,\r
+0x6d, 0xea, 0x6b, 0xb3, 0x40, 0xcb, 0x67, 0xa0, 0x6a, 0xb2, 0x60, 0xc2, 0x68, 0xa0, 0x6a, 0xb2, 0x60, 0xc2, 0x69, 0xa0, 0x69, 0xb2, 0x60, 0xc2, 0x7c, 0x10, 0x43, 0xa0, 0x63, 0xb3, 0x5f, 0x10,\r
+0x67, 0xb2, 0x84, 0xa2, 0x19, 0x6b, 0x6b, 0xeb, 0x6c, 0xec, 0x84, 0xc2, 0x85, 0xa2, 0x8c, 0xeb, 0x65, 0xc2, 0x6f, 0x10, 0x63, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x80, 0xf0,\r
+0x1d, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x5f, 0xb2, 0x80, 0x18, 0x8f, 0x2e, 0x00, 0xc2, 0x00, 0x68, 0x80, 0xf0, 0x13, 0x2a, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x8f, 0x10, 0x43, 0xa0,\r
+0x00, 0x6c, 0x01, 0x22, 0x01, 0x6c, 0x80, 0x18, 0x6e, 0x34, 0x00, 0x65, 0x52, 0x10, 0x24, 0xa0, 0x63, 0xa0, 0x1f, 0x6a, 0x4c, 0xe9, 0x55, 0xb2, 0x01, 0x23, 0x01, 0x6b, 0x20, 0xf0, 0x6e, 0xc2,\r
+0x02, 0x6a, 0x04, 0xd2, 0x52, 0xb2, 0x05, 0xd2, 0x50, 0xb3, 0x20, 0xf0, 0x4e, 0xa3, 0x05, 0x6c, 0xfa, 0x6d, 0x44, 0xf2, 0x06, 0x6e, 0x41, 0xf5, 0x10, 0x6f, 0x06, 0xd2, 0x20, 0x18, 0xa3, 0x30,\r
+0x07, 0xd1, 0x0c, 0x21, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x1f, 0x6b, 0x4c, 0xeb, 0x05, 0x23, 0x2e, 0xeb, 0x03, 0x2b, 0x45, 0xb2, 0x20, 0xf0, 0x2f, 0xc2, 0x85, 0xa0, 0x43, 0xb3,\r
+0x07, 0x6a, 0x8c, 0xea, 0xa3, 0xa3, 0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0x1f, 0x10, 0x63, 0xa0, 0x00, 0x6a, 0x01, 0x23, 0x01, 0x6a, 0x3d, 0xb3, 0x40, 0xc3,\r
+0x18, 0x10, 0x42, 0xa0, 0x15, 0x72, 0x54, 0x61, 0x3b, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x10, 0x6e, 0x73, 0xa0, 0x39, 0xb2, 0x40, 0xf1, 0x7a, 0xc2, 0x74, 0xa0, 0x40, 0xf1, 0x7b, 0xc2,\r
+0x75, 0xa0, 0x40, 0xf1, 0x7c, 0xc2, 0x76, 0xa0, 0x40, 0xf1, 0x7d, 0xc2, 0x77, 0xa0, 0x40, 0xf1, 0x7e, 0xc2, 0x00, 0x6d, 0x3e, 0x10, 0x42, 0xa0, 0x12, 0x72, 0x3a, 0x61, 0x30, 0xb4, 0xa3, 0x40,\r
+0x00, 0x18, 0x0d, 0x33, 0x0d, 0x6e, 0x50, 0xa0, 0x2c, 0xb1, 0xc0, 0xf1, 0x40, 0xc1, 0x51, 0xa0, 0xc0, 0xf1, 0x41, 0xc1, 0x52, 0xa0, 0xc0, 0xf1, 0x42, 0xc1, 0x53, 0xa0, 0xc0, 0xf1, 0x43, 0xc1,\r
+0x54, 0xa0, 0x80, 0xf1, 0x43, 0xc1, 0xe5, 0x17, 0x42, 0xa0, 0x12, 0x72, 0x21, 0x61, 0x25, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x0d, 0x6e, 0x50, 0xa0, 0x20, 0xb1, 0xc0, 0xf1, 0x44, 0xc1,\r
+0x51, 0xa0, 0xc0, 0xf1, 0x45, 0xc1, 0x52, 0xa0, 0xc0, 0xf1, 0x46, 0xc1, 0x53, 0xa0, 0xc0, 0xf1, 0x47, 0xc1, 0x54, 0xa0, 0x80, 0xf1, 0x52, 0xc1, 0xcc, 0x17, 0x01, 0x68, 0x0d, 0x93, 0x00, 0x6a,\r
+0x00, 0xc3, 0x40, 0xc1, 0x00, 0x6a, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x12, 0x6d, 0x00, 0x18, 0x8d, 0x8f, 0x80, 0xa8, 0x01, 0x6a, 0xf5, 0x17, 0x1c, 0x96, 0x11, 0x80,\r
+0xcc, 0x07, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0xb8, 0x51, 0x11, 0x80,\r
+0x18, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x09, 0x96, 0x11, 0x80, 0x86, 0x01, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xd0, 0x01, 0x11, 0x80,\r
+0xdf, 0x01, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x16, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x21, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c,\r
+0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x0f, 0xb2, 0x60, 0x9a, 0x24, 0x6a, 0x05, 0x6c, 0x58, 0xeb, 0x0d, 0xb3, 0xfa, 0x6d, 0xc3, 0xf7, 0x03, 0x6e, 0x01, 0xf0, 0x0c, 0x6f,\r
+0x12, 0xea, 0x49, 0xe3, 0x0a, 0xb3, 0x63, 0xda, 0x00, 0x6a, 0x0a, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65,\r
+0x18, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x59, 0xcc, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0f, 0xb0, 0x60, 0xa0, 0x07, 0x6a,\r
+0x6c, 0xea, 0x14, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c, 0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x08, 0xb2, 0x60, 0x9a, 0x24, 0x6a,\r
+0x58, 0xeb, 0x07, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x18, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80,\r
+0x39, 0xcc, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x19, 0xb2, 0xa0, 0x9a, 0x19, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x26, 0x22, 0x18, 0xb2, 0x80, 0xa2, 0x07, 0x6a, 0x8c, 0xea, 0x21, 0x22,\r
+0x16, 0xb2, 0x41, 0xaa, 0x80, 0xf4, 0x40, 0x32, 0x80, 0xf5, 0x42, 0x32, 0xac, 0xea, 0x19, 0x22, 0x40, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x13, 0x22, 0x40, 0x6a, 0x4c, 0xec,\r
+0x04, 0x2c, 0x80, 0x18, 0x89, 0x35, 0x00, 0x65, 0x0c, 0x10, 0x00, 0x6d, 0x0c, 0xb4, 0x4c, 0xeb, 0xa0, 0xcc, 0x04, 0x23, 0x80, 0x18, 0xa5, 0x35, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x4a, 0x24,\r
+0x01, 0x6c, 0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x2c, 0x00, 0x00, 0xb5, 0x1c, 0x96, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80,\r
+0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x40, 0xac, 0x03, 0xf0, 0x03, 0x6b, 0x04, 0x67, 0x4e, 0xeb, 0x25, 0x67, 0x1c, 0x2b, 0x2f, 0xb2, 0x02, 0x6c, 0xc0, 0xf1, 0x6a, 0xc2, 0xc0, 0xf1,\r
+0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0x2c, 0xb3, 0x80, 0xa3, 0x01, 0x4c, 0x80, 0xc3, 0x03, 0x6b, 0x60, 0xf1, 0x60, 0xc2, 0x00, 0x18, 0x2e, 0xaa, 0x03, 0x6c, 0x28, 0xb3, 0x80, 0xa3, 0x05, 0x6a,\r
+0x4b, 0xea, 0x8c, 0xea, 0x09, 0x6c, 0x8b, 0xec, 0x8c, 0xea, 0x40, 0xc3, 0x3a, 0x10, 0xff, 0xf5, 0x10, 0x72, 0x0f, 0x61, 0x43, 0xa4, 0x22, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0x6d, 0xe2, 0x60, 0x9b,\r
+0x04, 0xd4, 0x20, 0xb4, 0x05, 0xd4, 0x06, 0xd2, 0x07, 0xd3, 0x04, 0x6c, 0x63, 0xf5, 0x0f, 0x6e, 0x1c, 0x10, 0xff, 0xf5, 0x11, 0x72, 0x25, 0x61, 0x47, 0xa4, 0x66, 0xa4, 0xfa, 0x6d, 0x40, 0x32,\r
+0x6d, 0xea, 0x65, 0xa4, 0x40, 0x32, 0x63, 0xf5, 0x1b, 0x6e, 0x6d, 0xea, 0x64, 0xa4, 0x40, 0x32, 0x83, 0xa4, 0x6d, 0xea, 0x12, 0xb3, 0x6d, 0xe4, 0x40, 0xdb, 0x02, 0x6b, 0x04, 0xd3, 0x11, 0xb3,\r
+0x05, 0xd3, 0x63, 0xa0, 0x07, 0xd2, 0x04, 0x6c, 0x06, 0xd3, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0x80, 0xa8, 0x00, 0x6d, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x66, 0x6a,\r
+0x40, 0xc1, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x30, 0x3b, 0x11, 0x80, 0x00, 0xa0, 0x00, 0xb0,\r
+0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x62, 0xa4, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x0b, 0x22, 0x1d, 0xb2, 0xa1, 0xa2, 0x0c, 0x6a, 0xac, 0xea, 0x0c, 0x72,\r
+0x09, 0x60, 0x7f, 0x6a, 0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x02, 0x10, 0x21, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x42, 0xc4, 0x62, 0xa4, 0xa0, 0x6a, 0x4c, 0xeb, 0x0e, 0x23, 0x14, 0xb4, 0x96, 0xac,\r
+0x14, 0xb5, 0x01, 0x6e, 0x82, 0x34, 0x96, 0x34, 0x40, 0x9d, 0xcc, 0xec, 0x12, 0xb6, 0x80, 0x34, 0x80, 0x34, 0xcc, 0xea, 0x8d, 0xea, 0x40, 0xdd, 0x0c, 0xb2, 0x80, 0xa2, 0x1e, 0x6a, 0x8c, 0xea,\r
+0x02, 0x72, 0x0e, 0x61, 0x0d, 0xb2, 0x40, 0xa2, 0x0b, 0x22, 0x0d, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x02, 0x61, 0x00, 0x6c, 0x02, 0x23, 0x04, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0xbe, 0x33, 0x00, 0x65,\r
+0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x44, 0x20, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x5c, 0xa0, 0x00, 0xb0, 0xff, 0xff, 0xfe, 0xff, 0x1d, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80,\r
+0xfd, 0x63, 0x05, 0x62, 0xff, 0x6e, 0x8c, 0xee, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0,\r
+0xff, 0xf7, 0x1f, 0x69, 0x04, 0x67, 0x2c, 0xe8, 0xd0, 0x67, 0xac, 0xe9, 0x21, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x80, 0x18, 0x38, 0x36, 0x01, 0x6c, 0x41, 0x6c, 0x01, 0x6d, 0x00, 0x18,\r
+0x4d, 0xa6, 0x20, 0x6e, 0x46, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x10, 0x6e, 0x47, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6e, 0xd1, 0x67, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6,\r
+0x43, 0x6c, 0x80, 0x18, 0x38, 0x36, 0x00, 0x6c, 0x02, 0x6a, 0x04, 0xd2, 0x01, 0x6c, 0x09, 0xb2, 0xfa, 0x6d, 0xc3, 0xf1, 0x06, 0x6e, 0xa4, 0xf3, 0x0d, 0x6f, 0x06, 0xd0, 0x07, 0xd1, 0x20, 0x18,\r
+0xa3, 0x30, 0x05, 0xd2, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x68, 0x18, 0xb4, 0x04, 0x32,\r
+0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c, 0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a,\r
+0x4c, 0xe8, 0x1e, 0x58, 0xeb, 0x61, 0x00, 0x68, 0x0e, 0xb4, 0x04, 0x32, 0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c,\r
+0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x22, 0x58, 0xeb, 0x61, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xb0, 0xee, 0x10, 0x80,\r
+0xec, 0xee, 0x10, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x22, 0x67, 0x10, 0xf0, 0x00, 0x6e, 0x0c, 0xe9,\r
+0xcb, 0xee, 0x2d, 0xee, 0x0c, 0xee, 0x0e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x24, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xd1, 0x67, 0x0e, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6,\r
+0x04, 0xd2, 0x04, 0x92, 0xe1, 0xf7, 0x1f, 0x6b, 0x09, 0x97, 0x4c, 0xeb, 0x43, 0x67, 0x0c, 0xea, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0,\r
+0x00, 0x69, 0xe0, 0xf1, 0x18, 0x68, 0x1c, 0xb2, 0x80, 0x6b, 0x6b, 0xeb, 0x90, 0x67, 0x60, 0xc2, 0x00, 0x18, 0x10, 0x23, 0x04, 0x05, 0xbd, 0x67, 0x90, 0xa5, 0x18, 0xb2, 0x2d, 0xe2, 0x01, 0x49,\r
+0x80, 0xc3, 0x01, 0x48, 0xff, 0xf7, 0x1f, 0x6b, 0x06, 0x59, 0x6c, 0xe8, 0xec, 0x61, 0x00, 0x6b, 0x66, 0xc2, 0x68, 0xc2, 0x67, 0xc2, 0x12, 0xb3, 0xe0, 0xf1, 0x85, 0xa3, 0x01, 0x6b, 0x6c, 0xec,\r
+0x0c, 0x2c, 0x84, 0xa2, 0xff, 0x6d, 0xff, 0x4c, 0xac, 0xec, 0x1f, 0x5c, 0x06, 0x60, 0x83, 0x82, 0x00, 0x54, 0x03, 0x60, 0x66, 0xc2, 0x67, 0xc2, 0x68, 0xc2, 0x08, 0xb2, 0x66, 0xa2, 0x04, 0x23,\r
+0x64, 0xa2, 0x07, 0xb2, 0x80, 0xf1, 0x61, 0xc2, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x13, 0xa0, 0x00, 0xb0, 0x0c, 0x96, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80,\r
+0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x68, 0x24, 0x67, 0x04, 0x32, 0x49, 0xe1, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x29, 0x60, 0x1e, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x0c, 0xf0,\r
+0x00, 0x72, 0x07, 0x61, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x00, 0x18, 0x3f, 0x1c, 0x80, 0xaa, 0x18, 0x10, 0x04, 0xf0, 0x00, 0x72, 0x0b, 0x61, 0xff, 0x6c, 0x8c, 0xeb, 0x40, 0x6a, 0x67, 0x33,\r
+0x4d, 0xeb, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x6c, 0xec, 0x01, 0x6d, 0x07, 0x10, 0x0d, 0x2a, 0x41, 0x40, 0x44, 0x32, 0xff, 0x6c, 0x49, 0xe1, 0x6c, 0xec, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6,\r
+0xc0, 0xaa, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0xd1, 0x17, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d,\r
+0x20, 0x6b, 0x4d, 0xeb, 0xff, 0xf7, 0x1f, 0x6e, 0x6c, 0xee, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x04, 0x6c, 0x00, 0x18, 0x3f, 0x1c, 0x50, 0x6c, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d,\r
+0x05, 0x97, 0x1f, 0x6b, 0x6c, 0xea, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0xff, 0x68, 0x00, 0x6e, 0x01, 0x6d, 0x8c, 0xe8, 0x00, 0x18, 0x4d, 0xa6,\r
+0x40, 0x6c, 0x5a, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x6c, 0xe9, 0xff, 0xf7, 0x1e, 0x6e, 0x6c, 0xea,\r
+0x5a, 0x6c, 0x01, 0x6d, 0x2c, 0xee, 0x08, 0xd2, 0x00, 0x18, 0x4d, 0xa6, 0x09, 0xd3, 0x08, 0x92, 0x09, 0x93, 0x03, 0x6e, 0x4d, 0xee, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x5c, 0x6c,\r
+0x4c, 0xb4, 0x80, 0x18, 0xb0, 0x36, 0x00, 0x65, 0x80, 0x18, 0xcd, 0x36, 0x00, 0x65, 0x08, 0x5a, 0x05, 0x61, 0x02, 0x6c, 0x00, 0x6d, 0x1d, 0xf6, 0x00, 0x6e, 0x04, 0x10, 0x02, 0x6c, 0x00, 0x6d,\r
+0x19, 0xf6, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x43, 0xb4, 0x80, 0x18, 0xb0, 0x36, 0x00, 0x65, 0x06, 0x20, 0x90, 0x67, 0x00, 0x18, 0x44, 0x1c, 0x00, 0x68, 0x70, 0x67, 0x23, 0x10,\r
+0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x41, 0x6c, 0x38, 0xf0, 0x03, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x18, 0x3f, 0x1c, 0x0a, 0x6c, 0x00, 0x68, 0x7e, 0x6c,\r
+0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x00, 0x6b, 0x4c, 0xeb, 0x02, 0x23, 0x00, 0x6b, 0x0a, 0x10, 0x00, 0x18, 0x44, 0x1c, 0x0a, 0x6c, 0x01, 0x48, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xe8,\r
+0x64, 0x58, 0xed, 0x61, 0x01, 0x6b, 0x2d, 0xb4, 0x80, 0x18, 0xb0, 0x36, 0x09, 0xd3, 0x5a, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xd1, 0x67, 0x08, 0x96, 0x5c, 0x6c, 0x00, 0x18, 0x4d, 0xa6,\r
+0x01, 0x6d, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x7e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x40, 0x6c, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x08, 0xd2,\r
+0x09, 0x93, 0x09, 0x23, 0x21, 0x6c, 0x08, 0xf2, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x07, 0x10, 0x21, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7,\r
+0x1f, 0x69, 0x4c, 0xe9, 0x16, 0xb3, 0x01, 0x6a, 0x04, 0x6c, 0xfa, 0x6d, 0xa3, 0xf1, 0x08, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd3, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x04, 0xd2,\r
+0x09, 0x93, 0x02, 0x6a, 0x04, 0xd2, 0x05, 0xd3, 0x08, 0x93, 0xff, 0xf7, 0x1f, 0x6a, 0x05, 0x6c, 0x6c, 0xea, 0xfa, 0x6d, 0xa3, 0xf1, 0x09, 0x6e, 0x44, 0xf5, 0x18, 0x6f, 0x06, 0xd1, 0x20, 0x18,\r
+0xa3, 0x30, 0x07, 0xd2, 0x51, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x70, 0xef, 0x10, 0x80, 0x90, 0xef, 0x10, 0x80, 0x10, 0xf0, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80,\r
+0xf5, 0x63, 0x15, 0x62, 0x14, 0xd1, 0x13, 0xd0, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x3f, 0x6c, 0x00, 0x6d, 0xff, 0x69, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, 0x2c, 0xea, 0xff, 0xf7,\r
+0x1f, 0x6b, 0x6c, 0xe8, 0x0c, 0xd2, 0x0c, 0x95, 0x02, 0x30, 0x01, 0x6a, 0x2c, 0xe8, 0x82, 0x67, 0xd0, 0x67, 0xe2, 0x67, 0x11, 0xd3, 0x80, 0x18, 0xdb, 0x36, 0x04, 0xd2, 0x0c, 0x95, 0x03, 0x6a,\r
+0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0xdb, 0x36, 0x04, 0xd2, 0x42, 0x34, 0x1f, 0x6d, 0x8a, 0x34, 0x56, 0x32, 0xac, 0xec, 0xac, 0xea, 0x0c, 0x95, 0x03, 0x6e, 0x0b, 0xd4, 0x04, 0xd6,\r
+0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0xdb, 0x36, 0x0a, 0xd2, 0x42, 0x37, 0x1f, 0x6c, 0xea, 0x37, 0x8c, 0xef, 0x09, 0xd7, 0x56, 0x35, 0x8c, 0xed, 0x0b, 0x96, 0x09, 0x94, 0x08, 0xd5,\r
+0x2c, 0xed, 0x2c, 0xee, 0x2c, 0xec, 0x0d, 0xd5, 0x0a, 0x97, 0x97, 0xe6, 0x10, 0xd6, 0x0d, 0x96, 0x2c, 0xef, 0x0e, 0xd4, 0xd3, 0xe7, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x98, 0xec,\r
+0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x11, 0x93, 0x0f, 0xd7, 0x12, 0xec, 0xb8, 0xed, 0x12, 0xed, 0xb1, 0xe4, 0x6c, 0xec, 0x11, 0x5c, 0x09, 0x60, 0x09, 0x94, 0x0b, 0x95, 0x08, 0x96,\r
+0x0a, 0x97, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xe1, 0xe6, 0x50, 0x10, 0x0c, 0x95, 0xd0, 0x67, 0x03, 0x6a, 0x00, 0x6c, 0x0f, 0x6f, 0x11, 0xd3, 0x80, 0x18, 0xdb, 0x36, 0x04, 0xd2, 0x42, 0x34,\r
+0x1f, 0x6d, 0x8a, 0x34, 0xac, 0xec, 0x10, 0x96, 0xe4, 0x67, 0x2c, 0xef, 0x56, 0x30, 0xac, 0xe8, 0xf7, 0xe6, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x0d, 0x65, 0x0f, 0x95, 0x0c, 0xe9,\r
+0x11, 0x93, 0x3b, 0xe5, 0x00, 0xf6, 0xc0, 0x36, 0x00, 0xf6, 0xc3, 0x36, 0xd8, 0xee, 0xa8, 0x67, 0x12, 0xee, 0xb8, 0xed, 0x12, 0xed, 0xb9, 0xe6, 0x0e, 0x95, 0x6c, 0xee, 0x11, 0x5e, 0xff, 0xe5,\r
+0x0d, 0x95, 0x00, 0xf6, 0xe0, 0x37, 0x00, 0xf6, 0xe3, 0x37, 0x27, 0xe5, 0x00, 0xf6, 0x20, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0x12, 0xed, 0xf8, 0xef, 0x12, 0xef, 0xf5, 0xe5, 0x6c, 0xed,\r
+0x09, 0x60, 0xc3, 0xed, 0x0d, 0x61, 0x0b, 0x97, 0xe5, 0xe4, 0x0a, 0x94, 0x27, 0x31, 0x6c, 0xe9, 0x81, 0xe0, 0x0c, 0x10, 0x11, 0x5d, 0x04, 0x61, 0x00, 0x6c, 0x11, 0x68, 0x10, 0x69, 0x09, 0x10,\r
+0x09, 0x95, 0x08, 0x96, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xc1, 0xe0, 0x07, 0x30, 0x6c, 0xe8, 0x01, 0x6c, 0x1f, 0x6b, 0x4c, 0xeb, 0x08, 0x24, 0x10, 0xf0, 0x00, 0x6a, 0x4b, 0xea, 0x4d, 0xeb,\r
+0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x11, 0x10, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x11, 0xd3, 0x46, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6e, 0x00, 0x6c,\r
+0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x11, 0x93, 0x20, 0x31, 0x28, 0x31, 0x14, 0x30, 0x2d, 0xe8, 0x6d, 0xe8, 0x00, 0x36, 0xc0, 0x36, 0xc3, 0x36, 0xff, 0xf7, 0x1f, 0x6a, 0xc3, 0x36,\r
+0x4c, 0xee, 0x21, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x21, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, 0x02, 0x6b, 0x04, 0xd3,\r
+0x01, 0x6c, 0x09, 0xb3, 0xfa, 0x6d, 0x63, 0xf2, 0x0a, 0x6e, 0xa4, 0xf3, 0x0d, 0x6f, 0x06, 0xd0, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x15, 0x97, 0x14, 0x91, 0x13, 0x90, 0x00, 0xef,\r
+0x0b, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x8c, 0xb3, 0xc0, 0xf1, 0x90, 0xa3, 0x05, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x9d, 0x67, 0x20, 0xf0,\r
+0x50, 0xc4, 0xc0, 0xf1, 0x50, 0xc3, 0x00, 0x18, 0x29, 0xa8, 0x01, 0x68, 0x2c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x2c, 0xea, 0xc2, 0x67, 0x0d, 0xee, 0x2c, 0x6c,\r
+0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x30, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x2c, 0xea, 0xc2, 0x67, 0x30, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x0d, 0xee, 0x7a, 0xb4, 0x00, 0x6d,\r
+0x00, 0x18, 0x94, 0xa8, 0x5e, 0x6e, 0x79, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x32, 0x6e, 0x80, 0x18, 0x79, 0x36, 0x00, 0x65, 0x62, 0x67, 0x02, 0x6c, 0x75, 0xb2, 0xfa, 0x6d, 0xc3, 0xf2,\r
+0x12, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x06, 0xd3, 0x0e, 0xd3, 0x04, 0xd0, 0x20, 0x18, 0xa3, 0x30, 0x05, 0xd2, 0x0e, 0x93, 0x8a, 0x4b, 0x6c, 0xe9, 0x10, 0x59, 0x07, 0x60, 0x04, 0xeb, 0x70, 0x67,\r
+0x30, 0xf4, 0x01, 0x6a, 0x4c, 0xeb, 0x6b, 0xb4, 0x01, 0x2b, 0x6b, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x22, 0x6e, 0x30, 0x6e, 0x69, 0xb4, 0x00, 0x18, 0x94, 0xa8, 0x00, 0x6d, 0x2c, 0x6c,\r
+0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0x69, 0xc2, 0x67, 0x2b, 0xe9, 0x2c, 0xee, 0x2c, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x30, 0x6c, 0x00, 0x18,\r
+0xab, 0xa5, 0x00, 0x6d, 0x0c, 0xea, 0xc2, 0x67, 0x30, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x2c, 0xee, 0x10, 0x6c, 0x08, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x11, 0x6c,\r
+0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x3d, 0x6e, 0x12, 0x6c, 0x33, 0xf7, 0x16, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x18, 0x6c, 0x69, 0xf6, 0x0c, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d,\r
+0x4f, 0xb2, 0x00, 0x9a, 0x4f, 0xb2, 0x4c, 0xe8, 0x46, 0xb2, 0xe0, 0xf1, 0x63, 0xa2, 0xff, 0x73, 0x03, 0x60, 0x04, 0x6a, 0x6c, 0xea, 0x16, 0x2a, 0x4b, 0xb3, 0x81, 0xa3, 0x0c, 0x6a, 0x8c, 0xea,\r
+0x04, 0x72, 0x13, 0x61, 0x01, 0x6a, 0x04, 0xd2, 0x41, 0xb2, 0x03, 0x6b, 0x05, 0xd2, 0x8a, 0x32, 0x6c, 0xea, 0x83, 0x67, 0xfa, 0x6d, 0x03, 0xf3, 0x13, 0x6e, 0xa4, 0xf3, 0x0c, 0x6f, 0x20, 0x18,\r
+0xa3, 0x30, 0x06, 0xd2, 0x1e, 0xf0, 0x02, 0x6a, 0x01, 0x10, 0x40, 0xb2, 0x35, 0xb3, 0xe0, 0xf1, 0x83, 0xa3, 0x0d, 0xea, 0xff, 0x74, 0x05, 0x60, 0x08, 0x6b, 0x8c, 0xeb, 0x02, 0x23, 0x3c, 0xb3,\r
+0x6c, 0xea, 0x37, 0xb3, 0x80, 0x18, 0x5d, 0x36, 0x40, 0xdb, 0x00, 0x18, 0x1b, 0xa7, 0x00, 0x65, 0x00, 0x18, 0xd2, 0xa6, 0x00, 0x65, 0x00, 0x18, 0x1e, 0xa4, 0x00, 0x65, 0x35, 0xb2, 0x40, 0x9a,\r
+0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x33, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x33, 0xb3, 0x63, 0xda, 0x01, 0x6b, 0x32, 0xb2, 0x60, 0xc2, 0x06, 0x6a, 0x04, 0xd2, 0x24, 0xb2, 0x05, 0xd2,\r
+0x30, 0xb0, 0x46, 0xa0, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x41, 0xa0, 0x43, 0xf3, 0x04, 0x6e, 0xa4, 0xf3, 0x11, 0x6f, 0x07, 0xd2, 0x40, 0xa0, 0x08, 0xd2, 0x43, 0xa0, 0x09, 0xd2, 0x42, 0xa0,\r
+0x0a, 0xd2, 0x44, 0xa0, 0x20, 0x18, 0xa3, 0x30, 0x0b, 0xd2, 0x47, 0xa0, 0x11, 0x22, 0x48, 0xa0, 0x0f, 0x22, 0x83, 0xa0, 0xa1, 0xa0, 0x42, 0xa0, 0x60, 0xa0, 0x80, 0x34, 0xa0, 0x35, 0x51, 0xe4,\r
+0x75, 0xe5, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xec, 0x80, 0x18, 0x3e, 0x36, 0x4c, 0xed, 0x03, 0x10, 0x80, 0x18, 0x40, 0x37, 0x00, 0x65, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x02, 0x6e,\r
+0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x10, 0x6e, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x00, 0xef, 0x0a, 0x63, 0x00, 0x65,\r
+0x4c, 0x00, 0x11, 0x80, 0x40, 0x02, 0x11, 0x80, 0x64, 0xed, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x0c, 0xee, 0x10, 0x80, 0xc8, 0xed, 0x10, 0x80, 0x50, 0xee, 0x10, 0x80, 0xac, 0xa0, 0x00, 0xb0,\r
+0x00, 0x00, 0xef, 0xff, 0x44, 0x20, 0x11, 0x80, 0x01, 0xf0, 0x10, 0x00, 0xff, 0xff, 0xef, 0xff, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80, 0x22, 0x1b, 0x11, 0x80,\r
+0x0c, 0x96, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5b, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x03, 0x23, 0x20, 0xf0, 0x4f, 0xa2, 0x26, 0x10, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea,\r
+0x41, 0x72, 0x0f, 0x61, 0x00, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0xa4, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x62, 0x33, 0x72, 0x33, 0x00, 0x6a, 0x16, 0x23, 0x80, 0x18, 0xcd, 0x36, 0x00, 0x65,\r
+0x12, 0x10, 0xa0, 0xf1, 0x1a, 0x6c, 0x10, 0xf0, 0x0f, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x4b, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x42, 0x32, 0x3f, 0x6b, 0x6c, 0xea,\r
+0x46, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x47, 0xb3, 0x80, 0xf1, 0x81, 0xa3, 0x7f, 0x22, 0x46, 0xb5, 0xa0, 0xa5, 0x7c, 0x2d, 0x8b, 0xe2, 0x00, 0xf6, 0x40, 0x32, 0x00, 0xf6, 0x43, 0x32, 0x04, 0xd2,\r
+0x42, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0x5e, 0x2a, 0x80, 0xf1, 0x40, 0xa3, 0x5b, 0x22, 0x80, 0xf1, 0x43, 0xa3, 0x03, 0x2a, 0x01, 0x6a, 0x80, 0xf1, 0x43, 0xc3, 0x3d, 0xb2, 0x00, 0x82, 0x39, 0xb2,\r
+0x80, 0xf1, 0x43, 0xa2, 0x04, 0x93, 0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x9c, 0xa6, 0x12, 0xec, 0x32, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x05, 0x2b, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea,\r
+0x41, 0x72, 0x40, 0x61, 0x32, 0xb2, 0x40, 0x82, 0x4e, 0xe8, 0x3c, 0x20, 0x31, 0xb2, 0x60, 0xa2, 0x07, 0x5b, 0x02, 0x61, 0x06, 0x6b, 0x60, 0xc2, 0x2e, 0xb2, 0xa0, 0xa2, 0x27, 0xb2, 0x63, 0xa2,\r
+0x07, 0x6c, 0x72, 0x36, 0x8c, 0xee, 0xc2, 0xed, 0x06, 0x60, 0x8c, 0xed, 0x88, 0x4c, 0xb0, 0x35, 0x6c, 0xec, 0xad, 0xec, 0x83, 0xc2, 0x21, 0xb2, 0x43, 0xa2, 0x07, 0x6b, 0x02, 0x6c, 0x52, 0x32,\r
+0x6c, 0xea, 0x61, 0x42, 0x8b, 0xec, 0x8c, 0xeb, 0x23, 0xb4, 0x20, 0xf1, 0x16, 0x4b, 0xff, 0xf7, 0x1f, 0x68, 0x8d, 0xe3, 0x20, 0xab, 0x01, 0x6b, 0x4c, 0xeb, 0x6c, 0x33, 0x02, 0x6c, 0x00, 0x6d,\r
+0x0c, 0xe9, 0x00, 0x18, 0xab, 0xa5, 0x27, 0xeb, 0x1f, 0xf7, 0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x0c, 0xe9, 0x6c, 0xea, 0x20, 0x31, 0x0c, 0xe9, 0xc2, 0x67, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x18,\r
+0x4d, 0xa6, 0x2d, 0xee, 0x0f, 0xb2, 0x80, 0xf1, 0x71, 0xa2, 0x10, 0x23, 0x80, 0xf1, 0x72, 0xa2, 0x03, 0x2b, 0x01, 0x6b, 0x80, 0xf1, 0x72, 0xc2, 0x0a, 0xb2, 0x80, 0xf1, 0x52, 0xa2, 0x04, 0x93,\r
+0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x3e, 0xa8, 0x12, 0xec, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xba, 0x01, 0x00, 0xb6,\r
+0x4c, 0x00, 0x11, 0x80, 0x09, 0x96, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x25, 0x1b, 0x11, 0x80, 0x78, 0x04, 0x11, 0x80, 0x00, 0x00, 0x00, 0xb6, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0,\r
+0xff, 0xf7, 0x1f, 0x69, 0x02, 0x74, 0x0e, 0xd4, 0x0f, 0xd5, 0x11, 0xd7, 0xcc, 0xe9, 0x1d, 0x61, 0x2b, 0xb2, 0x61, 0xa2, 0x0c, 0x6a, 0x6c, 0xea, 0x0c, 0x72, 0x17, 0x61, 0x00, 0x6a, 0x29, 0xb3,\r
+0x60, 0x9b, 0xc0, 0xf7, 0x62, 0x33, 0x11, 0x23, 0x27, 0xb3, 0x01, 0x4a, 0x43, 0xeb, 0xf7, 0x60, 0x00, 0x6a, 0x26, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0xc2, 0xf4, 0x12, 0x6e, 0xe1, 0xf3, 0x00, 0x6f,\r
+0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x21, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x28, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x60, 0xa0, 0x08, 0xd2, 0x40, 0x6a,\r
+0x6c, 0xea, 0x07, 0x22, 0x00, 0x6b, 0x1b, 0xb2, 0x60, 0xca, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x16, 0x10, 0x19, 0xb4, 0xa0, 0xa4, 0x19, 0xb2, 0x04, 0x6b, 0xac, 0xeb, 0x40, 0x9a, 0x09, 0x23,\r
+0x40, 0xf7, 0x42, 0x33, 0xa6, 0x32, 0x6e, 0xea, 0x01, 0x6b, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x10, 0x13, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x00, 0x1c,\r
+0x7a, 0x1b, 0x08, 0x94, 0x11, 0x97, 0x0e, 0x94, 0x0f, 0x95, 0x00, 0x18, 0x3e, 0x20, 0xd1, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x00, 0x65, 0x44, 0x20, 0x11, 0x80,\r
+0x1c, 0xa3, 0x00, 0xb0, 0xa0, 0x86, 0x01, 0x00, 0xc8, 0xe7, 0x04, 0x80, 0x18, 0x96, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80, 0x1c, 0x96, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0xd2, 0x06, 0x11, 0x80,\r
+0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x02, 0x67, 0x0f, 0xb2, 0x60, 0x9a, 0x0f, 0xb2, 0x00, 0x6c, 0x6e, 0xea, 0x02, 0x2a, 0x0e, 0xb2, 0x80, 0x9a, 0x0e, 0xb3,\r
+0x82, 0x34, 0x82, 0x34, 0x40, 0x9b, 0xff, 0xf7, 0x1f, 0x6d, 0x80, 0x34, 0xac, 0xea, 0x80, 0x34, 0x8d, 0xea, 0x40, 0xdb, 0x00, 0x18, 0xfd, 0x25, 0x00, 0x6c, 0x00, 0x1c, 0x7a, 0x1b, 0x90, 0x67,\r
+0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, 0x64, 0x8b, 0x10, 0x80, 0x30, 0x00, 0x00, 0xb5, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x44, 0x67,\r
+0x80, 0x9c, 0x3f, 0x6b, 0xff, 0x6e, 0x8c, 0xeb, 0x30, 0x73, 0x80, 0xf0, 0x00, 0x61, 0x62, 0xa2, 0x02, 0x6c, 0xa8, 0x43, 0xea, 0x4d, 0xa3, 0xec, 0x5e, 0x61, 0xa4, 0xa2, 0x83, 0xa2, 0x05, 0x5d,\r
+0x68, 0x60, 0x04, 0x0e, 0xa4, 0x35, 0xb5, 0xe6, 0xa0, 0x8d, 0xb9, 0xe6, 0x00, 0xee, 0x00, 0x65, 0x0f, 0x00, 0x91, 0x01, 0x0b, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x63, 0xb4, 0x29, 0x10, 0x1e, 0x73,\r
+0x18, 0x61, 0x00, 0x6b, 0xc0, 0xf2, 0x0c, 0x6d, 0xb8, 0xeb, 0x60, 0xb6, 0x12, 0xed, 0xd5, 0xe5, 0xe0, 0xf0, 0xe3, 0xa5, 0x5e, 0xb6, 0x8e, 0xef, 0x04, 0x2f, 0x40, 0xf2, 0x88, 0x45, 0xa0, 0xde,\r
+0x16, 0x10, 0x00, 0x6d, 0xa0, 0xde, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x0a, 0x5b, 0xea, 0x61, 0x40, 0x10, 0x57, 0xb3, 0x80, 0x9b, 0x3d, 0x24, 0x40, 0xf2, 0x08, 0x4c, 0x08, 0x10, 0x0a, 0x6b,\r
+0x78, 0xec, 0x54, 0xb3, 0x12, 0xec, 0x71, 0xe4, 0x02, 0x10, 0x53, 0xb4, 0x01, 0x10, 0x31, 0x24, 0x62, 0xa2, 0x1e, 0x73, 0x0a, 0x61, 0x62, 0xa4, 0xc1, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36,\r
+0x6d, 0xee, 0x60, 0xa4, 0x6d, 0xee, 0x63, 0xa4, 0x0b, 0x10, 0x1f, 0x73, 0x0e, 0x61, 0x66, 0xa4, 0xc5, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36, 0x6d, 0xee, 0x64, 0xa4, 0x6d, 0xee, 0x67, 0xa4,\r
+0x00, 0xf6, 0x60, 0x33, 0x6d, 0xee, 0x04, 0x6b, 0x16, 0x10, 0xc9, 0xa4, 0x68, 0xa4, 0xc0, 0x36, 0x6d, 0xee, 0x02, 0x6b, 0x10, 0x10, 0x0d, 0x73, 0x04, 0x61, 0x01, 0x6b, 0x3f, 0xb2, 0x60, 0xc2,\r
+0x68, 0x10, 0x0c, 0x6c, 0x8e, 0xeb, 0x65, 0x2b, 0x3c, 0xb4, 0xa0, 0xa4, 0x02, 0x25, 0x60, 0xc4, 0x60, 0x10, 0x00, 0x6b, 0xc3, 0x67, 0x81, 0xa2, 0x70, 0x33, 0x63, 0xc2, 0x10, 0x6b, 0x6b, 0xeb,\r
+0x8c, 0xeb, 0x61, 0xc2, 0xa0, 0x9a, 0x00, 0x18, 0xa5, 0x2e, 0x02, 0x6c, 0x54, 0x10, 0x23, 0x73, 0x52, 0x60, 0x11, 0x73, 0x30, 0x61, 0xa1, 0x9a, 0x82, 0x32, 0x42, 0x32, 0xcc, 0xea, 0x1c, 0x22,\r
+0xa2, 0x32, 0xcc, 0xea, 0x34, 0x5a, 0x07, 0x61, 0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x06, 0xf2, 0x00, 0x6a, 0x4d, 0xed, 0xa2, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x14, 0x5a, 0x07, 0x60,\r
+0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x02, 0xf4, 0x00, 0x6a, 0x4d, 0xed, 0x00, 0xf6, 0x82, 0x33, 0x23, 0xb2, 0x60, 0xc2, 0x02, 0x10, 0x21, 0xb3, 0x40, 0xc3, 0x20, 0xb2, 0x40, 0xa2,\r
+0xff, 0x6b, 0xff, 0x4a, 0x6c, 0xea, 0x0e, 0x5a, 0x26, 0x60, 0x01, 0x6b, 0x1d, 0xb2, 0x00, 0x18, 0x4d, 0xf4, 0x60, 0xc2, 0x20, 0x10, 0x1b, 0x73, 0x1c, 0x61, 0x82, 0x34, 0x82, 0x34, 0xcc, 0xec,\r
+0x03, 0x2c, 0x00, 0xf2, 0x00, 0x68, 0x02, 0x10, 0x20, 0xf2, 0x00, 0x68, 0xa0, 0xf1, 0x06, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0xb0, 0x67, 0x01, 0x6a, 0x04, 0xd2, 0x04, 0x6c, 0x12, 0xb2, 0xfa, 0x6d,\r
+0x22, 0xf4, 0x18, 0x6e, 0xa1, 0xf1, 0x14, 0x6f, 0x05, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd0, 0x02, 0x10, 0x00, 0x6a, 0x01, 0x10, 0x01, 0x6a, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63,\r
+0x0a, 0xb4, 0x66, 0x17, 0x24, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x6c, 0x07, 0x11, 0x80, 0x78, 0x51, 0x11, 0x80, 0x54, 0x4d, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0x66, 0x07, 0x11, 0x80,\r
+0x1e, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x78, 0x4d, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0xff, 0x6d, 0x00, 0x18, 0x93, 0x8c, 0xcc, 0xed, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65,\r
+0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf3, 0x0a, 0x72, 0x04, 0x61, 0x00, 0x18, 0xcb, 0xed, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x58, 0xf5, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63,\r
+0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x15, 0x3a, 0x00, 0x65, 0x0c, 0xb2, 0x20, 0xf0, 0x55, 0xa2, 0x05, 0x2a, 0x80, 0xf1, 0x10, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x6d, 0x08, 0xb2, 0x40, 0x9a,\r
+0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x06, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x3c, 0x95, 0x11, 0x80, 0x90, 0x04, 0x11, 0x80,\r
+0xb8, 0x8b, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x44, 0xac, 0x04, 0x67, 0x01, 0x72, 0x1f, 0x61, 0x20, 0x9c, 0x02, 0x6a, 0x04, 0xd2, 0x21, 0xb2,\r
+0x05, 0xd2, 0x06, 0xd1, 0x41, 0x9c, 0xfa, 0x6d, 0x04, 0x6c, 0xe1, 0xf2, 0x1a, 0x6e, 0x41, 0xf5, 0x0b, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x3f, 0x6a, 0x2c, 0xea, 0x30, 0x72, 0x27, 0x61,\r
+0x41, 0xa8, 0xff, 0x6b, 0x6c, 0xea, 0x23, 0x2a, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, 0x1c, 0x10, 0x17, 0xb2, 0x20, 0xa2, 0x19, 0x29, 0x02, 0x6a, 0x04, 0xd2,\r
+0x10, 0xb2, 0x05, 0xd2, 0x40, 0x9c, 0xfa, 0x6d, 0x21, 0xf3, 0x1c, 0x6e, 0x06, 0xd2, 0x41, 0x9c, 0x41, 0xf5, 0x0c, 0x6f, 0x05, 0x6c, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0e, 0xb2, 0x40, 0xa2,\r
+0x06, 0x22, 0x40, 0xa0, 0x30, 0x72, 0x03, 0x60, 0x0c, 0xb2, 0x20, 0xda, 0x03, 0x10, 0x00, 0x18, 0x15, 0x31, 0x90, 0x67, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65,\r
+0xc8, 0xe7, 0x04, 0x80, 0x54, 0x8b, 0x10, 0x80, 0x5c, 0x8b, 0x10, 0x80, 0x68, 0x8b, 0x10, 0x80, 0x67, 0x07, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0x68, 0x07, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62,\r
+0x00, 0x18, 0xfc, 0xba, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd0, 0x00, 0x18, 0x79, 0xbb, 0x04, 0x67, 0x44, 0xa8, 0x20, 0xf3, 0x01, 0x72, 0x4b, 0x61,\r
+0x28, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x03, 0x72, 0x46, 0x61, 0x27, 0xb2, 0x40, 0xaa, 0x01, 0x72, 0x13, 0x61, 0x26, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x0f, 0x61, 0x25, 0xb2, 0x60, 0xaa, 0xff, 0xf7,\r
+0x1f, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0x4c, 0xeb, 0x06, 0x23, 0xff, 0xf6, 0x1f, 0x6d, 0xac, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x1e, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x2b, 0x61,\r
+0x1d, 0xb2, 0x40, 0xa2, 0x28, 0x2a, 0x09, 0x6a, 0x04, 0xd2, 0x1c, 0xb2, 0x05, 0xd2, 0x1c, 0xb2, 0x80, 0xf2, 0x7e, 0xa2, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd3, 0x80, 0xf2, 0x7f, 0xa2, 0x81, 0xf2,\r
+0x0e, 0x6e, 0xc1, 0xf3, 0x19, 0x6f, 0x07, 0xd3, 0xa0, 0xf2, 0x60, 0xa2, 0x08, 0xd3, 0xa0, 0xf2, 0x61, 0xa2, 0x09, 0xd3, 0xa0, 0xf2, 0x62, 0xa2, 0x0a, 0xd3, 0xa0, 0xf2, 0x63, 0xa2, 0x0b, 0xd3,\r
+0xa0, 0xf2, 0x68, 0xa2, 0x0c, 0xd3, 0xa0, 0xf2, 0x66, 0xaa, 0x0d, 0xd3, 0xa0, 0xf2, 0x44, 0xaa, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x11, 0x97, 0x10, 0x90, 0x00, 0xef, 0x09, 0x63, 0x00, 0x65,\r
+0x2c, 0x52, 0x11, 0x80, 0x40, 0x1a, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0xac, 0x00, 0x00, 0xb6, 0xe8, 0x39, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x20, 0x56, 0x11, 0x80,\r
+0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf1, 0x14, 0x6b, 0x6e, 0xea, 0x04, 0x2a, 0x60, 0xac, 0x05, 0xb5, 0x6d, 0xe5, 0x40, 0xc3, 0x00, 0x18, 0xde, 0x5c, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef,\r
+0x03, 0x63, 0x00, 0x65, 0xd8, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x03, 0x8e, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0x20, 0xf1,\r
+0x0c, 0x72, 0x0d, 0x61, 0x40, 0x9c, 0x40, 0xaa, 0x01, 0xf4, 0x03, 0x72, 0x08, 0x61, 0x08, 0xb3, 0xc0, 0xf0, 0xaa, 0xab, 0x08, 0xf0, 0x00, 0x6a, 0xad, 0xea, 0xc0, 0xf0, 0x4a, 0xcb, 0x00, 0x18,\r
+0x5f, 0x5d, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0x44, 0xac, 0x60, 0xf2, 0x04, 0x68, 0x4e, 0xe8,\r
+0x2f, 0x28, 0x71, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0xc0, 0xf0, 0x13, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x00, 0x18, 0xe8, 0x58, 0x22, 0x67, 0x6c, 0xb3, 0xc0, 0xf0, 0x8a, 0xab, 0x08, 0xf0,\r
+0x01, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0xc0, 0xf0, 0x4a, 0xcb, 0x69, 0xb2, 0x00, 0xc2, 0x69, 0xb3, 0x69, 0xb2, 0x00, 0xc2, 0x00, 0xcb, 0x00, 0x6a, 0x68, 0xb3, 0x40, 0xc3, 0x68, 0xb3, 0x40, 0xc3,\r
+0x01, 0x6b, 0x68, 0xb2, 0x60, 0xc2, 0x80, 0x18, 0x23, 0x29, 0x03, 0x6c, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x20, 0x18, 0xf1, 0x25, 0x00, 0x65, 0x00, 0x1c, 0x7a, 0x1b, 0x91, 0x67, 0xac, 0x10,\r
+0x80, 0xf4, 0x00, 0x72, 0xa0, 0xf0, 0x05, 0x61, 0x00, 0x9c, 0x64, 0xa0, 0xab, 0xa8, 0x66, 0x32, 0x13, 0x72, 0x18, 0xd5, 0x05, 0x60, 0x18, 0x72, 0x03, 0x60, 0x17, 0x72, 0x80, 0xf0, 0x05, 0x61,\r
+0xa4, 0xa4, 0x21, 0x9c, 0x66, 0x33, 0xba, 0xc0, 0x16, 0x04, 0x00, 0x18, 0x44, 0x97, 0x19, 0xd3, 0x19, 0x93, 0x7f, 0x73, 0x04, 0x60, 0x00, 0x6c, 0xe1, 0xf4, 0x16, 0x6f, 0x03, 0x10, 0x85, 0xa0,\r
+0x01, 0xf4, 0x16, 0x6f, 0x10, 0x6d, 0x44, 0xa0, 0x04, 0xd5, 0x4f, 0xb5, 0x05, 0xd5, 0x16, 0x95, 0x07, 0xd3, 0x08, 0xd4, 0x06, 0xd5, 0x99, 0xa0, 0xa2, 0x67, 0x0a, 0xd1, 0x09, 0xd4, 0x01, 0x6c,\r
+0x8c, 0xed, 0x0b, 0xd5, 0xab, 0xa8, 0xe0, 0xf7, 0x18, 0x6e, 0x0c, 0xd5, 0x47, 0xb5, 0x25, 0xe5, 0xa4, 0xa1, 0x0e, 0xd2, 0xac, 0xec, 0x0d, 0xd4, 0x45, 0xa0, 0x04, 0x6c, 0xfa, 0x6d, 0x0f, 0xd2,\r
+0x46, 0xa0, 0x10, 0xd2, 0x47, 0xa0, 0x11, 0xd2, 0x48, 0xa0, 0x12, 0xd2, 0x49, 0xa0, 0x13, 0xd2, 0x4a, 0xa0, 0x14, 0xd2, 0x4b, 0xa0, 0x19, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x15, 0xd2, 0x18, 0x92,\r
+0x19, 0x93, 0xff, 0x72, 0x3c, 0x60, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x38, 0xb2, 0x12, 0xe9, 0x25, 0xe2, 0xe0, 0xf0, 0x46, 0xa1, 0x01, 0x72, 0x32, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x0b, 0x72,\r
+0x11, 0x61, 0x34, 0xb2, 0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x00, 0xf2, 0x0f, 0xa1, 0x01, 0x6a, 0x4e, 0xe8, 0x41, 0x28, 0x8b, 0x99, 0x00, 0x18, 0xb8, 0x1c, 0x00, 0x6d, 0x00, 0xf2,\r
+0x0f, 0xc1, 0x3a, 0x10, 0x18, 0x94, 0xb0, 0x67, 0x00, 0x18, 0x58, 0xe2, 0x19, 0xd3, 0x19, 0x93, 0x17, 0x73, 0x05, 0x61, 0x18, 0x95, 0x80, 0x18, 0x08, 0x2f, 0x90, 0x67, 0x10, 0x10, 0x13, 0x73,\r
+0x05, 0x61, 0x18, 0x95, 0x20, 0x18, 0x05, 0x04, 0x90, 0x67, 0x09, 0x10, 0x18, 0x73, 0x07, 0x61, 0x12, 0x6a, 0xc0, 0xf0, 0x48, 0xc1, 0x18, 0x95, 0x20, 0x18, 0x58, 0x01, 0x90, 0x67, 0x1d, 0xb2,\r
+0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x17, 0x10, 0x23, 0x72, 0x12, 0x61, 0x18, 0x93, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xeb, 0x16, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x60, 0xf2, 0x6e, 0xa2,\r
+0xff, 0x73, 0x07, 0x61, 0x60, 0xf2, 0x6d, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x05, 0x6b, 0x60, 0xf2, 0x6e, 0xc2, 0x20, 0x18, 0x43, 0x24, 0x00, 0x65, 0x1d, 0x97, 0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef,\r
+0x0f, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80,\r
+0x08, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x9c, 0x48, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x01, 0x6b, 0x6b, 0xeb,\r
+0x25, 0xb2, 0x60, 0xda, 0x00, 0x68, 0x0e, 0x10, 0x0c, 0x6b, 0x78, 0xe8, 0x12, 0xeb, 0x49, 0xe3, 0x62, 0x9a, 0x07, 0x23, 0x20, 0x18, 0x9c, 0x32, 0x81, 0x9a, 0x03, 0x22, 0x1e, 0xb2, 0x00, 0xda,\r
+0x06, 0x10, 0x01, 0x48, 0x1d, 0xb2, 0x80, 0xf0, 0x64, 0xa2, 0x02, 0xeb, 0xed, 0x60, 0x1c, 0xb3, 0x1c, 0xb2, 0x60, 0xda, 0x1c, 0xb3, 0x7c, 0x4b, 0x1c, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x04, 0x22,\r
+0x1b, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x1a, 0xb2, 0x40, 0xa2, 0xff, 0x72, 0x07, 0x61, 0x19, 0xb2, 0x40, 0xaa, 0x04, 0x2a, 0x00, 0x18, 0x74, 0x39, 0x00, 0x65, 0x01, 0x10, 0x00, 0x6a,\r
+0x0d, 0xb3, 0x60, 0x9b, 0x81, 0x43, 0x07, 0x2c, 0x14, 0xb3, 0x60, 0x9b, 0xc7, 0x23, 0xc6, 0x2a, 0x40, 0xeb, 0x00, 0x65, 0xc3, 0x17, 0x0c, 0x68, 0x18, 0xeb, 0x08, 0xb2, 0x04, 0x01, 0xb1, 0x67,\r
+0x12, 0xe8, 0x41, 0xe0, 0x20, 0x18, 0xa3, 0x32, 0x81, 0x98, 0xb8, 0x2a, 0x40, 0x98, 0x40, 0xea, 0x91, 0x67, 0xb4, 0x17, 0x2c, 0x8a, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01,\r
+0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0x6e, 0x04, 0x11, 0x80, 0x0e, 0x19, 0x11, 0x80, 0x9c, 0x86, 0x11, 0x80, 0xf6, 0x63, 0x13, 0x62,\r
+0x12, 0xd1, 0x11, 0xd0, 0x09, 0x6a, 0x04, 0xd2, 0x31, 0xb2, 0x05, 0xd2, 0x31, 0xb2, 0x40, 0xaa, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x30, 0xb2, 0x40, 0xaa, 0x20, 0xf6, 0x12, 0x6e, 0xa1, 0xf3,\r
+0x16, 0x6f, 0x07, 0xd2, 0x2d, 0xb2, 0x40, 0x9a, 0x08, 0xd2, 0x2d, 0xb2, 0x40, 0xf0, 0x61, 0xa2, 0x09, 0xd3, 0x40, 0xf0, 0x60, 0xa2, 0x0a, 0xd3, 0x20, 0xf0, 0x7f, 0xa2, 0x0b, 0xd3, 0x20, 0xf0,\r
+0x7e, 0xa2, 0x0c, 0xd3, 0x20, 0xf0, 0x7d, 0xa2, 0x0d, 0xd3, 0x20, 0xf0, 0x5c, 0xa2, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x04, 0xf7, 0x10, 0x6d, 0x00, 0x18, 0xcb, 0x31, 0x01, 0x6c, 0x21, 0xb2,\r
+0x60, 0x9a, 0x21, 0xb2, 0x6e, 0xea, 0x11, 0x2a, 0x20, 0xb1, 0x60, 0x99, 0x20, 0xb2, 0x21, 0xb0, 0x6c, 0xea, 0x4e, 0xe8, 0x0a, 0x28, 0x00, 0xf6, 0x62, 0x33, 0x1f, 0xb2, 0x60, 0xc2, 0x3f, 0xf4,\r
+0x00, 0x6c, 0x00, 0x18, 0x8d, 0x8f, 0x00, 0x6d, 0x00, 0xd9, 0x1c, 0xb2, 0x80, 0x9a, 0x1c, 0xb3, 0x8e, 0xeb, 0x01, 0x2b, 0x60, 0xda, 0x1b, 0xb2, 0x80, 0x9a, 0x1b, 0xb3, 0x8e, 0xeb, 0x01, 0x2b,\r
+0x60, 0xda, 0x11, 0xb3, 0x0f, 0xb2, 0x60, 0xda, 0x18, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x62, 0xda, 0x63, 0xda, 0x00, 0x1c, 0x43, 0x1b, 0x64, 0xda, 0x80, 0x18, 0xb5, 0x3a, 0x00, 0x65,\r
+0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x00, 0xef, 0x0a, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0x44, 0x00, 0x11, 0x80, 0x46, 0x00, 0x11, 0x80, 0x68, 0x21, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80,\r
+0x58, 0x8b, 0x10, 0x80, 0xef, 0xbe, 0x23, 0x87, 0x5c, 0x8b, 0x10, 0x80, 0xff, 0xff, 0xff, 0x00, 0xee, 0xff, 0xc0, 0x00, 0x80, 0x07, 0x11, 0x80, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23,\r
+0x68, 0x8b, 0x10, 0x80, 0x58, 0x3b, 0x7a, 0x93, 0xd0, 0x74, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x14, 0xb2, 0x14, 0xb3, 0x63, 0xda, 0x14, 0xb3, 0x72, 0xda,\r
+0x14, 0xb3, 0x75, 0xda, 0x14, 0xb3, 0x69, 0xda, 0x14, 0xb3, 0x6c, 0xda, 0x14, 0xb3, 0x6f, 0xda, 0x14, 0xb3, 0x66, 0xda, 0x14, 0xb3, 0x7b, 0xda, 0x14, 0xb3, 0x60, 0xda, 0x14, 0xb3, 0x80, 0x18,\r
+0x95, 0x28, 0x78, 0xda, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x00, 0x6b, 0x13, 0xb2, 0x80, 0x18, 0xe7, 0x3a, 0x60, 0xc2, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4d, 0xe6, 0x10, 0x80,\r
+0xe8, 0x1d, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0x69, 0xce, 0x10, 0x80, 0xd1, 0xe8, 0x10, 0x80, 0x99, 0xe8, 0x10, 0x80, 0x89, 0xe8, 0x10, 0x80, 0x61, 0xe8, 0x10, 0x80, 0x8d, 0xe7, 0x10, 0x80,\r
+0x7d, 0xe7, 0x10, 0x80, 0xc9, 0xe6, 0x10, 0x80, 0x81, 0xe6, 0x10, 0x80, 0x61, 0xe6, 0x10, 0x80, 0x19, 0xe3, 0x10, 0x80, 0x64, 0x2f, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0x04, 0x0b, 0x0f, 0x04,\r
+0x0a, 0x0e, 0x08, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x1b, 0x00, 0xb7, 0x00, 0x53, 0x01, 0x36, 0x00, 0x6f, 0x01, 0xa7, 0x02, 0x53, 0x00, 0x28, 0x02, 0xfd, 0x03, 0x25, 0x00, 0x07, 0x04, 0x05, 0x01,\r
+0x00, 0x00, 0x00, 0x00, 0x74, 0x41, 0x01, 0x10, 0xac, 0x80, 0x01, 0xf0, 0x0a, 0x22, 0x62, 0x02, 0x4e, 0x22, 0x9a, 0x06, 0x50, 0x22, 0x9a, 0x06, 0x34, 0x21, 0xf5, 0xff, 0x36, 0x21, 0xff, 0xfe,\r
+0x18, 0x20, 0x0f, 0x69, 0x34, 0x20, 0x55, 0x22, 0x38, 0x20, 0xa8, 0xc0, 0x25, 0x00, 0x00, 0x72, 0x26, 0x00, 0x00, 0x72, 0x3d, 0x00, 0x00, 0xfe, 0x2e, 0x00, 0x95, 0xa7, 0x32, 0x00, 0x95, 0xa7,\r
+0x22, 0x00, 0x00, 0x84, 0x27, 0x00, 0xa0, 0x6a, 0x28, 0x00, 0xa0, 0x6a, 0x29, 0x00, 0x03, 0x22, 0x2a, 0x00, 0x01, 0x20, 0x2b, 0x00, 0xc9, 0xad, 0x2f, 0x00, 0xc9, 0xad, 0x33, 0x00, 0x00, 0xc0,\r
+0x37, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x2a, 0x08, 0x32, 0x00, 0x64, 0x04, 0x33, 0x00, 0x42, 0x40,\r
+0x34, 0x00, 0xcc, 0x27, 0x35, 0x00, 0xd0, 0x48, 0x36, 0x00, 0x00, 0x40, 0x37, 0x00, 0x10, 0x05, 0x38, 0x00, 0x0c, 0x00, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0, 0x2b, 0x00, 0x43, 0x00,\r
+0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x4a, 0x08, 0x32, 0x00, 0x64, 0x04,\r
+0x33, 0x00, 0x84, 0xf8, 0x34, 0x00, 0x7e, 0x11, 0x35, 0x00, 0xd0, 0xf8, 0x37, 0x00, 0x90, 0x05, 0x38, 0x00, 0x08, 0x00, 0x36, 0x00, 0x00, 0x40, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0,\r
+0x2b, 0x00, 0x43, 0x00, 0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x10, 0x3f, 0x00, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00,\r
+0x1c, 0x00, 0x21, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x35, 0x00, 0xd0, 0x4e, 0x0e, 0x00, 0xe2, 0x51, 0x24, 0x00, 0x01, 0x00, 0x00, 0x60, 0x64, 0x00, 0x0e, 0x00, 0xe2, 0xd1,\r
+0x35, 0x00, 0xd0, 0x48, 0x0e, 0x00, 0xe2, 0x51, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3c, 0x00, 0x15, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10,\r
+0x11, 0x00, 0x30, 0x00, 0x12, 0x00, 0x00, 0x04, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x9b, 0x7d, 0x13, 0x00, 0x0e, 0x60, 0x13, 0x00, 0x9e, 0x5c, 0x13, 0x00, 0x0a, 0x30,\r
+0x13, 0x00, 0xf8, 0x2f, 0x13, 0x00, 0xc5, 0x1f, 0x13, 0x00, 0x90, 0x00, 0x19, 0x00, 0x9b, 0x7d, 0x19, 0x00, 0x0e, 0x60, 0x19, 0x00, 0x9e, 0x5c, 0x19, 0x00, 0x0a, 0x30, 0x19, 0x00, 0xf8, 0x2f,\r
+0x19, 0x00, 0xc5, 0x1f, 0x19, 0x00, 0x90, 0x00, 0xff, 0xff, 0xff, 0xff, 0x15, 0x00, 0x40, 0x00, 0x15, 0x00, 0xc0, 0x20, 0x15, 0x00, 0xc0, 0x41, 0x15, 0x00, 0xc0, 0x68, 0x15, 0x00, 0xc0, 0x89,\r
+0x15, 0x00, 0xc0, 0xb0, 0x15, 0x00, 0xc0, 0xd1, 0x15, 0x00, 0xc0, 0xf3, 0x1a, 0x00, 0x40, 0x00, 0x1a, 0x00, 0xc0, 0x20, 0x1a, 0x00, 0xc0, 0x41, 0x1a, 0x00, 0xc0, 0x68, 0x1a, 0x00, 0xc0, 0x89,\r
+0x1a, 0x00, 0xc0, 0xb0, 0x1a, 0x00, 0xc0, 0xd1, 0x1a, 0x00, 0xc0, 0xf3, 0xff, 0xff, 0xff, 0xff, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x28, 0x2b, 0x2e, 0x6b, 0x6e, 0x8b, 0x8e, 0xce, 0xee, 0xee, 0xee,\r
+0xf7, 0xf7, 0xf9, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0d, 0x17, 0x18, 0x19, 0x19, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0x19, 0x19, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\r
+0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0xc2, 0x10, 0x00, 0x00, 0x30, 0x11, 0x00, 0x3b, 0x00, 0x12, 0x00, 0xfc, 0xe4,\r
+0x18, 0x00, 0xf8, 0x39, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf4, 0x01, 0x00, 0x20, 0x01, 0x00,\r
+0x02, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x20, 0x00, 0x48, 0x42, 0x20, 0x00, 0x01, 0x44, 0x20, 0x00, 0x48, 0x46, 0x20, 0x00, 0x81, 0x48, 0x20, 0x00, 0x00, 0x4a, 0x20, 0x00, 0xf8,\r
+0x4c, 0x20, 0x00, 0x00, 0x4e, 0x20, 0xd8, 0x00, 0x50, 0x20, 0x90, 0xcc, 0x52, 0x20, 0x00, 0x18, 0x54, 0x20, 0x10, 0x8c, 0x56, 0x20, 0x00, 0xe0, 0x58, 0x20, 0x00, 0x50, 0x5a, 0x20, 0x00, 0x80,\r
+0x5c, 0x20, 0x00, 0x20, 0x5e, 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x0e, 0x20, 0x01, 0x00, 0x02, 0x20, 0x60, 0xc0, 0x00, 0x60, 0x0a, 0x00, 0x02, 0x20, 0x20, 0xc0, 0x00, 0x60, 0x0a, 0x00,\r
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x20, 0x00, 0x0c, 0x20, 0x10, 0x00, 0x0e, 0x20, 0x00, 0x80,\r
+0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x11, 0x00, 0x3c, 0x00, 0x12, 0x00, 0x02, 0x87, 0x18, 0x00, 0x04, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4e, 0xfb, 0x71, 0x4c, 0x30, 0x00, 0x00, 0x62, 0xd5, 0x3d, 0x80\r
 };\r
-\r
-//CheckSum = 0x6379\r
+/* CheckSum = 0x078b */\r
 \r
 \r
 const u8 Rtl8723BFwMPImgArray[Rtl8723BMPImgArrayLength] = {\r
index 6eae5d8d638116c3913075f4111a44e5d8511335..1b19513a804453e806a32ae922e74f7797b4d68b 100755 (executable)
@@ -24,7 +24,7 @@
 \r
 #ifdef CONFIG_MP_INCLUDED\r
 #define Rtl8723BMPImgArrayLength 18396\r
-#define Rtl8723BFwBTImgArrayLength 19752\r
+#define Rtl8723BFwBTImgArrayLength 20564\r
 \r
 #define Rtl8723B_PHYREG_Array_MPLength 4\r
 \r
index b8a663203afb5f2c0c92aeac1552d7ae8a8996a0..a7d6e5156d7080936272604dfaaf104b19b4491f 100755 (executable)
 * \r
 ******************************************************************************/\r
 \r
-//#include "Mp_Precomp.h"\r
+\r
 #include "../odm_precomp.h"\r
 \r
 #if (RTL8723B_SUPPORT == 1)\r
 static BOOLEAN\r
-CheckCondition(\r
-    const u4Byte  Condition,\r
-    const u4Byte  Hex\r
+CheckPositive(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
     )\r
 {\r
-    u4Byte _board     = (Hex & 0x000000FF);\r
-    u4Byte _interface = (Hex & 0x0000FF00) >> 8;\r
-    u4Byte _platform  = (Hex & 0x00FF0000) >> 16;\r
-    u4Byte cond = Condition;\r
-\r
-    if ( Condition == 0xCDCDCDCD )\r
-        return TRUE;\r
-\r
-    cond = Condition & 0x000000FF;\r
-    if ( (_board != cond) && (cond != 0xFF) )\r
-        return FALSE;\r
-\r
-    cond = Condition & 0x0000FF00;\r
-    cond = cond >> 8;\r
-    if ( ((_interface & cond) == 0) && (cond != 0x07) )\r
-        return FALSE;\r
-\r
-    cond = Condition & 0x00FF0000;\r
-    cond = cond >> 16;\r
-    if ( ((_platform & cond) == 0) && (cond != 0x0F) )\r
+    u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
+                           ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
+                           ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
+                           ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
+                           ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
+\r
+       u4Byte    cond1   = Condition1, cond2 = Condition2;\r
+       u4Byte    driver1 = pDM_Odm->CutVersion       << 24 |  \r
+                               pDM_Odm->SupportPlatform  << 16 | \r
+                               pDM_Odm->PackageType      << 12 | \r
+                               pDM_Odm->SupportInterface << 8  |\r
+                               _BoardType;\r
+\r
+       u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
+                               pDM_Odm->TypeGPA  <<  8 | \r
+                               pDM_Odm->TypeALNA << 16 | \r
+                               pDM_Odm->TypeAPA  << 24; \r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
+\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
+                ("     (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
+\r
+\r
+       //============== Value Defined Check ===============//\r
+       //QFN Type [15:12] and Cut Version [27:24] need to do value check\r
+       \r
+       if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
+               return FALSE;\r
+       if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
+               return FALSE;           \r
+\r
+       //=============== Bit Defined Check ================//\r
+    // We don't care [31:28] and [23:20]\r
+    //\r
+       cond1   &= 0x000F0FFF; \r
+       driver1 &= 0x000F0FFF; \r
+\r
+    if ((cond1 & driver1) == cond1) \r
+    {\r
+        u4Byte bitMask = 0;\r
+        if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE\r
+            return TRUE;\r
+\r
+        if ((cond1 & BIT0) != 0) //GLNA\r
+            bitMask |= 0x000000FF;\r
+        if ((cond1 & BIT1) != 0) //GPA\r
+            bitMask |= 0x0000FF00;\r
+        if ((cond1 & BIT2) != 0) //ALNA\r
+            bitMask |= 0x00FF0000;\r
+        if ((cond1 & BIT3) != 0) //APA\r
+            bitMask |= 0xFF000000;\r
+\r
+        if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched\r
+            return TRUE;\r
+        else\r
+            return FALSE;\r
+    }\r
+    else \r
+    {\r
         return FALSE;\r
+    }\r
+}\r
+static BOOLEAN\r
+CheckNegative(\r
+    IN  PDM_ODM_T     pDM_Odm,\r
+    IN  const u4Byte  Condition1,\r
+    IN  const u4Byte  Condition2\r
+    )\r
+{\r
     return TRUE;\r
 }\r
 \r
-\r
 /******************************************************************************\r
 *                           RadioA.TXT\r
 ******************************************************************************/\r
@@ -81,14 +135,30 @@ u4Byte Array_MP_8723B_RadioA[] = {
                0x01E, 0x00000000,\r
                0x0DF, 0x00000780,\r
                0x050, 0x00067435,\r
+       0x80002000,0x00000000,0x40000000,0x00000000,\r
+               0x051, 0x0006B10E,\r
+       0x90003000,0x00000000,0x40000000,0x00000000,\r
+               0x051, 0x0006B10E,\r
+       0x90004000,0x00000000,0x40000000,0x00000000,\r
+               0x051, 0x0006B10E,\r
+       0xA0000000,0x00000000,\r
                0x051, 0x0006B04E,\r
+       0xB0000000,0x00000000,\r
                0x052, 0x000007D2,\r
                0x053, 0x00000000,\r
                0x054, 0x00050400,\r
                0x055, 0x0004026E,\r
                0x0DD, 0x0000004C,\r
                0x070, 0x00067435,\r
+       0x80002000,0x00000000,0x40000000,0x00000000,\r
+               0x071, 0x0006B10E,\r
+       0x90003000,0x00000000,0x40000000,0x00000000,\r
+               0x071, 0x0006B10E,\r
+       0x90004000,0x00000000,0x40000000,0x00000000,\r
+               0x071, 0x0006B10E,\r
+       0xA0000000,0x00000000,\r
                0x071, 0x0006B04E,\r
+       0xB0000000,0x00000000,\r
                0x072, 0x000007D2,\r
                0x073, 0x00000000,\r
                0x074, 0x00050400,\r
@@ -161,7 +231,6 @@ u4Byte Array_MP_8723B_RadioA[] = {
                0x0A3, 0x00008000,\r
                0x0A4, 0x00048D80,\r
                0x0A5, 0x00068000,\r
-               0x000, 0x00033D80,\r
                0x0ED, 0x00000002,\r
                0x0EF, 0x00000002,\r
                0x056, 0x00000032,\r
@@ -175,75 +244,80 @@ ODM_ReadAndConfig_MP_8723B_RadioA(
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
-       #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\r
-\r
-       u4Byte     hex         = 0;\r
-       u4Byte     i           = 0;\r
-       u2Byte     count       = 0;\r
-       pu4Byte    ptr_array   = NULL;\r
-       u1Byte     platform    = pDM_Odm->SupportPlatform;\r
-       u1Byte     _interface   = pDM_Odm->SupportInterface;\r
-       u1Byte     board       = pDM_Odm->BoardType;  \r
-       u4Byte     ArrayLen    = sizeof(Array_MP_8723B_RadioA)/sizeof(u4Byte);\r
-       pu4Byte    Array       = Array_MP_8723B_RadioA;\r
-\r
-\r
-       hex += board;\r
-       hex += _interface << 8;\r
-       hex += platform << 16;\r
-       hex += 0xFF000000;\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_RadioA, hex = 0x%X\n", hex));\r
-\r
-       for (i = 0; i < ArrayLen; i += 2 )\r
-       {\r
-           u4Byte v1 = Array[i];\r
-           u4Byte v2 = Array[i+1];\r
+    u4Byte     i         = 0;\r
+    u4Byte     ArrayLen    = sizeof(Array_MP_8723B_RadioA)/sizeof(u4Byte);\r
+    pu4Byte    Array       = Array_MP_8723B_RadioA;\r
        \r
-           // This (offset, data) pair meets the condition.\r
-           if ( v1 < 0xCDCDCDCD )\r
-           {\r
-                   odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
-                   continue;\r
-               }\r
-               else\r
-               { // This line is the start line of branch.\r
-                   if ( !CheckCondition(Array[i], hex) )\r
-                   { // Discard the following (offset, data) pairs.\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       i -= 2; // prevent from for-loop += 2\r
-                   }\r
-                   else // Configure matched pairs and skip to end of if-else.\r
-                   {\r
-                       READ_NEXT_PAIR(v1, v2, i);\r
-                       while (v2 != 0xDEAD && \r
-                              v2 != 0xCDEF && \r
-                              v2 != 0xCDCD && i < ArrayLen -2)\r
-                       {\r
-                               odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-\r
-                       while (v2 != 0xDEAD && i < ArrayLen -2)\r
-                       {\r
-                           READ_NEXT_PAIR(v1, v2, i);\r
-                       }\r
-                       \r
-                   }\r
-               }       \r
-       }\r
+    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_RadioA\n"));\r
+\r
+    for (i = 0; i < ArrayLen; i += 2 )\r
+    {\r
+        u4Byte v1 = Array[i];\r
+        u4Byte v2 = Array[i+1];\r
+    \r
+        // This (offset, data) pair doesn't care the condition.\r
+        if ( v1 < 0x40000000 )\r
+        {\r
+           odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
+           continue;\r
+        }\r
+        else\r
+        {   // This line is the beginning of branch.\r
+            BOOLEAN bMatched = TRUE;\r
+            u1Byte  cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+\r
+            if (cCond == COND_ELSE) { // ELSE, ENDIF\r
+                bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) { \r
+                bMatched = FALSE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            } else {\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+                if ( ! CheckNegative(pDM_Odm, v1, v2) )\r
+                    bMatched = FALSE;\r
+                else\r
+                    bMatched = TRUE;\r
+                READ_NEXT_PAIR(v1, v2, i);\r
+            }\r
+\r
+            if ( bMatched == FALSE )\r
+            {   // Condition isn't matched. Discard the following (offset, data) pairs.\r
+                while (v1 < 0x40000000 && i < ArrayLen -2)\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+\r
+                i -= 2; // prevent from for-loop += 2\r
+            }\r
+            else // Configure matched pairs and skip to end of if-else.\r
+            {\r
+                while (v1 < 0x40000000 && i < ArrayLen-2) {\r
+                    odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                }\r
+\r
+                // Keeps reading until ENDIF.\r
+                cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                while (cCond != COND_ENDIF && i < ArrayLen-2) {\r
+                    READ_NEXT_PAIR(v1, v2, i);\r
+                    cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
+                }\r
+            }\r
+        } \r
+    }\r
+}\r
 \r
+u4Byte\r
+ODM_GetVersion_MP_8723B_RadioA(void)\r
+{\r
+          return 11;\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_AP.TXT\r
 ******************************************************************************/\r
 \r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8723B[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 1, 2, 2, 3, 4, 5, 5, 6,  6,  7,  7,  8,  8,  9,  9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
        {0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
@@ -272,15 +346,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2,
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE);\r
@@ -297,12 +373,14 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_PCIE.TXT\r
 ******************************************************************************/\r
 \r
+#if DEV_BUS_TYPE == RT_PCI_INTERFACE\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8723B[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 1, 2, 2, 3, 4, 5, 5, 6,  6,  7,  7,  8,  8,  9,  9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
        {0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
@@ -331,15 +409,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2,
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if DEV_BUS_TYPE == RT_PCI_INTERFACE\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE);\r
@@ -356,12 +436,14 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_SDIO.TXT\r
 ******************************************************************************/\r
 \r
+#if DEV_BUS_TYPE == RT_SDIO_INTERFACE\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 1, 2, 2, 3, 4, 5, 5, 6,  6,  7,  7,  8,  8,  9,  9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
        {0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
@@ -383,22 +465,24 @@ u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZ
        {0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21},\r
 };\r
 u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B[]    = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  8,  8,  9,  9, 10, 10, 11, 12, 13, 14, 15};\r
-u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B[]    = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
+u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B[]    = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5,  6,  6,  7,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B[]    = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  8,  8,  9,  9, 10, 10, 11, 12, 13, 14, 15};\r
-u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B[]    = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
+u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B[]    = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5,  6,  6,  7,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if DEV_BUS_TYPE == RT_SDIO_INTERFACE\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE);\r
@@ -415,12 +499,14 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_USB.TXT\r
 ******************************************************************************/\r
 \r
+#if DEV_BUS_TYPE == RT_USB_INTERFACE\r
 u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8723B[][DELTA_SWINGIDX_SIZE] = {\r
        {0, 1, 1, 2, 2, 3, 4, 5, 5, 6,  6,  7,  7,  8,  8,  9,  9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
        {0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},\r
@@ -449,15 +535,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2
 u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
 u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,  8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15};\r
+#endif\r
 \r
 void\r
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB(\r
        IN   PDM_ODM_T  pDM_Odm\r
        )\r
 {\r
+#if DEV_BUS_TYPE == RT_USB_INTERFACE\r
        PODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
 \r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));\r
 \r
 \r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE);\r
@@ -474,6 +562,7 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB(
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE*3);\r
        ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE*3);\r
+#endif\r
 }\r
 \r
 /******************************************************************************\r
@@ -487,25 +576,25 @@ pu1Byte Array_MP_8723B_TXPWR_LMT[] = {
        "FCC", "2.4G", "20M", "CCK", "1T", "02", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "02", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "03", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "03", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "04", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "04", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "05", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "05", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "06", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "06", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "07", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "07", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "08", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "08", "32",\r
-       "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", \r
+       "FCC", "2.4G", "20M", "CCK", "1T", "09", "32", \r
        "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", \r
        "MKK", "2.4G", "20M", "CCK", "1T", "09", "32",\r
        "FCC", "2.4G", "20M", "CCK", "1T", "10", "32", \r
@@ -529,25 +618,25 @@ pu1Byte Array_MP_8723B_TXPWR_LMT[] = {
        "FCC", "2.4G", "20M", "OFDM", "1T", "02", "28", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32",\r
-       "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", \r
+       "FCC", "2.4G", "20M", "OFDM", "1T", "09", "32", \r
        "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", \r
        "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32",\r
        "FCC", "2.4G", "20M", "OFDM", "1T", "10", "28", \r
@@ -571,25 +660,25 @@ pu1Byte Array_MP_8723B_TXPWR_LMT[] = {
        "FCC", "2.4G", "20M", "HT", "1T", "02", "26", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "02", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "03", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "03", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "03", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "04", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "04", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "04", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "05", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "05", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "05", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "06", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "06", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "06", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "07", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "07", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "07", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "08", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "08", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "08", "32",\r
-       "FCC", "2.4G", "20M", "HT", "1T", "09", "34", \r
+       "FCC", "2.4G", "20M", "HT", "1T", "09", "32", \r
        "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", \r
        "MKK", "2.4G", "20M", "HT", "1T", "09", "32",\r
        "FCC", "2.4G", "20M", "HT", "1T", "10", "26", \r
@@ -670,10 +759,10 @@ pu1Byte Array_MP_8723B_TXPWR_LMT[] = {
        "FCC", "2.4G", "40M", "HT", "1T", "07", "32", \r
        "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", \r
        "MKK", "2.4G", "40M", "HT", "1T", "07", "32",\r
-       "FCC", "2.4G", "40M", "HT", "1T", "08", "32", \r
+       "FCC", "2.4G", "40M", "HT", "1T", "08", "26", \r
        "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", \r
        "MKK", "2.4G", "40M", "HT", "1T", "08", "32",\r
-       "FCC", "2.4G", "40M", "HT", "1T", "09", "32", \r
+       "FCC", "2.4G", "40M", "HT", "1T", "09", "26", \r
        "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", \r
        "MKK", "2.4G", "40M", "HT", "1T", "09", "32",\r
        "FCC", "2.4G", "40M", "HT", "1T", "10", "26", \r
@@ -744,8 +833,7 @@ ODM_ReadAndConfig_MP_8723B_TXPWR_LMT(
        u4Byte     ArrayLen    = sizeof(Array_MP_8723B_TXPWR_LMT)/sizeof(pu1Byte);\r
        pu1Byte    *Array      = Array_MP_8723B_TXPWR_LMT;\r
 \r
-\r
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_TXPWR_LMT\n"));\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_TXPWR_LMT\n"));\r
 \r
        for (i = 0; i < ArrayLen; i += 7 )\r
        {\r
index d9f1b8bff15a3349c27e9302372e6a609b4b91e6..aee0ae470a637aab962aaa8c952fff001c7eebba 100755 (executable)
@@ -22,7 +22,6 @@
 #ifndef __INC_MP_RF_HW_IMG_8723B_H\r
 #define __INC_MP_RF_HW_IMG_8723B_H\r
 \r
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);\r
 \r
 /******************************************************************************\r
 *                           RadioA.TXT\r
@@ -32,6 +31,7 @@ void
 ODM_ReadAndConfig_MP_8723B_RadioA( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_RadioA(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_AP.TXT\r
@@ -41,6 +41,7 @@ void
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_AP(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_PCIE.TXT\r
@@ -50,6 +51,7 @@ void
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_PCIE(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_SDIO.TXT\r
@@ -59,6 +61,7 @@ void
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_SDIO(void);\r
 \r
 /******************************************************************************\r
 *                           TxPowerTrack_USB.TXT\r
@@ -68,6 +71,7 @@ void
 ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_USB(void);\r
 \r
 /******************************************************************************\r
 *                           TXPWR_LMT.TXT\r
@@ -77,6 +81,7 @@ void
 ODM_ReadAndConfig_MP_8723B_TXPWR_LMT( // TC: Test Chip, MP: MP Chip\r
        IN   PDM_ODM_T  pDM_Odm\r
 );\r
+u4Byte ODM_GetVersion_MP_8723B_TXPWR_LMT(void);\r
 \r
 #endif\r
 #endif // end of HWIMG_SUPPORT\r
index 5be6e57738a62b7a377a78ba1627de4ea615ab3a..cdec248fc85990dc65015fba9c30af23d2718520 100755 (executable)
@@ -82,7 +82,7 @@ void setIqkMatrix_8723B(
                        IqkResult_Y = IqkResult_Y | 0xFFFFFC00;\r
                ele_C = ((IqkResult_Y * ele_D)>>8)&0x000003FF;\r
 \r
-               if (RFPath == ODM_RF_PATH_A)\r
+               //if (RFPath == ODM_RF_PATH_A)\r
                switch (RFPath)\r
                {\r
                case ODM_RF_PATH_A:\r
@@ -175,6 +175,7 @@ void DoIQK_8723B(
        u1Byte          Threshold\r
        )\r
 {\r
+#if 0 // mark by Lucas@SD4 20140128, suggested by Allen@SD3\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        PADAPTER                Adapter = pDM_Odm->Adapter;\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
@@ -197,9 +198,9 @@ void DoIQK_8723B(
 \r
        pDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue;\r
 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
-       PHY_IQCalibrate_8723B(pDM_Odm, FALSE);\r
+       PHY_IQCalibrate_8723B(pDM_Odm, FALSE, FALSE);\r
 #else\r
-       PHY_IQCalibrate_8723B(Adapter, FALSE);\r
+       PHY_IQCalibrate_8723B(Adapter, FALSE, FALSE);\r
 #endif\r
        \r
 #if(DM_ODM_SUPPORT_TYPE  & ODM_WIN)\r
@@ -213,6 +214,7 @@ void DoIQK_8723B(
        PlatformReleaseMutex(&pHalData->mxChnlBwControl);\r
 #endif\r
 #endif\r
+#endif // #if 0\r
 }\r
 \r
 /*-----------------------------------------------------------------------------\r
@@ -324,7 +326,7 @@ ODM_TxPwrTrackSetPwr_8723B(
                        pwr += pDM_Odm->RFCalibrateInfo.PowerIndexOffset[RFPath];\r
                        PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pwr);\r
                        TxAGC = (pwr<<16)|(pwr<<8)|(pwr);\r
-                       PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, TxAGC);\r
+                       PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, TxAGC);\r
                        ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("ODM_TxPwrTrackSetPwr8723B: CCK Tx-rf(A) Power = 0x%x\n", TxAGC));\r
 \r
                        pwr = PHY_QueryBBReg(Adapter, rTxAGC_A_Rate18_06, 0xFF);\r
@@ -358,12 +360,12 @@ ODM_TxPwrTrackSetPwr_8723B(
                // Adjust BB swing by OFDM IQ matrix\r
                if (Final_OFDM_Swing_Index >= PwrTrackingLimit_OFDM)\r
                        Final_OFDM_Swing_Index = PwrTrackingLimit_OFDM;\r
-               else if (Final_OFDM_Swing_Index < 0)\r
+               else if (Final_OFDM_Swing_Index <= 0)\r
                        Final_OFDM_Swing_Index = 0;\r
 \r
                if (Final_CCK_Swing_Index >= CCK_TABLE_SIZE)\r
                        Final_CCK_Swing_Index = CCK_TABLE_SIZE-1;\r
-               else if (pDM_Odm->BbSwingIdxCck < 0)\r
+               else if (pDM_Odm->BbSwingIdxCck <= 0)\r
                        Final_CCK_Swing_Index = 0;\r
 \r
                setIqkMatrix_8723B(pDM_Odm, Final_OFDM_Swing_Index, RFPath, \r
@@ -398,7 +400,7 @@ ODM_TxPwrTrackSetPwr_8723B(
                                ("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n", \r
                                PwrTrackingLimit_OFDM, pDM_Odm->Remnant_OFDMSwingIdx[RFPath]));\r
                }\r
-               else if (Final_OFDM_Swing_Index < 0)\r
+               else if (Final_OFDM_Swing_Index <= 0)\r
                {\r
                        pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index;\r
 \r
@@ -445,7 +447,7 @@ ODM_TxPwrTrackSetPwr_8723B(
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
                                ("******Path_A CCK Over Limit , PwrTrackingLimit_CCK = %d , pDM_Odm->Remnant_CCKSwingIdx  = %d \n", PwrTrackingLimit_CCK, pDM_Odm->Remnant_CCKSwingIdx));\r
                }\r
-               else if(Final_CCK_Swing_Index < 0)        // Lowest CCK Index = 0\r
+               else if(Final_CCK_Swing_Index <= 0)       // Lowest CCK Index = 0\r
                {\r
                        pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index;\r
                        setCCKFilterCoefficient(pDM_Odm, 0);\r
@@ -560,11 +562,13 @@ phy_PathA_IQK_8723B(
 #else\r
        IN      PADAPTER        pAdapter,\r
 #endif\r
-       IN      BOOLEAN         configPathB\r
+       IN      BOOLEAN         configPathB,\r
+       IN      u1Byte          RF_Path\r
        )\r
 {\r
-       u4Byte regEAC, regE94, regE9C, tmp/*, regEA4*/;\r
+       u4Byte regEAC, regE94, regE9C, tmp, Path_SEL_BB /*, regEA4*/;\r
        u1Byte result = 0x00;\r
+\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter); \r
        #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
@@ -574,18 +578,19 @@ phy_PathA_IQK_8723B(
        PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
        #endif\r
 #endif \r
+\r
+\r
+       // Save RF Path \r
+       Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);\r
+\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A IQK!\n"));\r
 \r
        //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
-\r
-       //switch to path A\r
-       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\r
-//     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xdffe0 ); \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
        //      enable path A PA in TXIQK mode\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);\r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x20000 );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0003f );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xc7f87 );\r
        //      disable path B PA in TXIQK mode\r
@@ -603,7 +608,7 @@ phy_PathA_IQK_8723B(
        ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);\r
 //     ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x8214010a);\r
-       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821403ea);\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821303ea);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);\r
@@ -613,7 +618,18 @@ phy_PathA_IQK_8723B(
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x00462911);\r
 \r
        //enter IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
+\r
+       //Ant switch\r
+       if (configPathB || (RF_Path == 0))\r
+               // wifi switch to S1\r
+               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\r
+       else\r
+               // wifi switch to S0\r
+               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+\r
+       //GNT_BT = 0\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);\r
 \r
        //One shot, path A LOK & IQK\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n"));\r
@@ -625,8 +641,13 @@ phy_PathA_IQK_8723B(
        //PlatformStallExecution(IQK_DELAY_TIME_8723B*1000);\r
        ODM_delay_ms(IQK_DELAY_TIME_8723B);\r
 \r
+       //restore Ant Path\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);\r
+       //GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);\r
+\r
        //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
 \r
        // Check failed\r
@@ -640,7 +661,7 @@ phy_PathA_IQK_8723B(
        ODM_GetBBReg(pDM_Odm, 0xe90, bMaskDWord), ODM_GetBBReg(pDM_Odm, 0xe98, bMaskDWord)));\r
 \r
 \r
-//Allen 20131125\r
+       //Allen 20131125\r
        tmp=(regE9C & 0x03FF0000)>>16;\r
     if ((tmp & 0x200)> 0)\r
                tmp = 0x400 - tmp;\r
@@ -677,10 +698,11 @@ phy_PathA_RxIQK8723B(
 #else\r
        IN      PADAPTER        pAdapter,\r
 #endif\r
-       IN      BOOLEAN         configPathB\r
+       IN      BOOLEAN         configPathB,\r
+       IN      u1Byte          RF_Path\r
        )\r
 {\r
-       u4Byte regEAC, regE94, regE9C, regEA4, u4tmp,tmp;\r
+       u4Byte regEAC, regE94, regE9C, regEA4, u4tmp,tmp, Path_SEL_BB;\r
        u1Byte result = 0x00;\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
@@ -693,24 +715,23 @@ phy_PathA_RxIQK8723B(
 #endif \r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Rx IQK!\n"));\r
 \r
-       //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
-\r
-       //switch to path A\r
-       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\r
+       // Save RF Path \r
+       Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord); \r
 \r
+       //leave IQK mode\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A RX IQK:Get TXIMR setting\n"));\r
        //1 Get TXIMR setting\r
        //modify RXIQK mode table\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n"));\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);\r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);\r
        //LNA2 off, PA on for Dcut\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7);\r
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0);  \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
        \r
        //IQK setting\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);\r
@@ -723,7 +744,7 @@ phy_PathA_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);\r
 \r
 //     ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f);\r
-       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160ff0);\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82130ff0);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);    \r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);\r
@@ -733,7 +754,18 @@ phy_PathA_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911);\r
 \r
        //enter IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
+\r
+       //Ant switch\r
+       if (configPathB || (RF_Path == 0))\r
+               // wifi switch to S1\r
+               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\r
+       else\r
+               // wifi switch to S0\r
+               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+\r
+       //GNT_BT = 0\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);\r
 \r
        //One shot, path A LOK & IQK\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n"));\r
@@ -744,9 +776,14 @@ phy_PathA_RxIQK8723B(
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_8723B));\r
        //PlatformStallExecution(IQK_DELAY_TIME_8723B*1000);\r
        ODM_delay_ms(IQK_DELAY_TIME_8723B);\r
-       \r
+\r
+       //restore Ant Path\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);\r
+       //GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);\r
+\r
        //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
        // Check failed\r
        regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);\r
@@ -785,9 +822,9 @@ phy_PathA_RxIQK8723B(
 \r
        //modify RXIQK mode table\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table 2!\n"));\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);              \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                      \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);                            \r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000 );  \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f ); \r
        //LAN2 on, PA off for Dcut\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7d77 ); \r
@@ -809,7 +846,7 @@ phy_PathA_RxIQK8723B(
 \r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82110000);\r
 //     ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x281604c2);\r
-       ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2816001f);    \r
+       ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2813001f);\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);\r
 \r
@@ -818,7 +855,18 @@ phy_PathA_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a8d1);\r
 \r
        //enter IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
+\r
+       //Ant switch\r
+       if (configPathB || (RF_Path == 0))\r
+               // wifi switch to S1\r
+               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\r
+       else\r
+               // wifi switch to S0\r
+               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+\r
+       //GNT_BT = 0\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);\r
 \r
        //One shot, path A LOK & IQK\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n"));\r
@@ -830,8 +878,13 @@ phy_PathA_RxIQK8723B(
        //PlatformStallExecution(IQK_DELAY_TIME_8723B*1000);\r
        ODM_delay_ms(IQK_DELAY_TIME_8723B);\r
 \r
+       //restore Ant Path\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);\r
+       //GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);\r
+\r
     //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
        // Check failed\r
        regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);\r
@@ -844,7 +897,7 @@ phy_PathA_RxIQK8723B(
 \r
        //      PA/PAD controlled by 0x0\r
        //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0x780 );\r
 \r
 #if 0  \r
@@ -864,8 +917,8 @@ phy_PathA_RxIQK8723B(
        if(!(regEAC & BIT27) &&         //if Tx is OK, check whether Rx is OK\r
                (((regEA4 & 0x03FF0000)>>16) != 0x132) &&\r
                (((regEAC & 0x03FF0000)>>16) != 0x36)&&         \r
-                       (((regEA4 & 0x03FF0000)>>16) <0x110) &&\r
-                       (((regEA4 & 0x03FF0000)>>16) >0xf0) &&\r
+                       (((regEA4 & 0x03FF0000)>>16) < 0x110) &&\r
+                       (((regEA4 & 0x03FF0000)>>16) > 0xf0) &&\r
                        (tmp <0xf))\r
                result |= 0x02;\r
        else                                                    //if Tx not OK, ignore Rx\r
@@ -886,7 +939,7 @@ phy_PathB_IQK_8723B(
 #endif\r
        )\r
 {\r
-       u4Byte regEAC, regE94, regE9C, tmp/*, regEC4, regECC*/;\r
+       u4Byte regEAC, regE94, regE9C, tmp, Path_SEL_BB/*, regEC4, regECC, Path_SEL_BB*/;\r
        u1Byte  result = 0x00;\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
@@ -899,12 +952,11 @@ phy_PathB_IQK_8723B(
 #endif \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path B IQK!\n"));\r
 \r
-    //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+       // Save RF Path\r
+       Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);\r
 \r
-       //switch to path B\r
-       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
-//     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0 ); \r
+    //leave IQK mode\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
        //      in TXIQK mode\r
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1 );\r
@@ -913,7 +965,7 @@ phy_PathB_IQK_8723B(
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xc7f87 );\r
        //      enable path B PA in TXIQK mode\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1);\r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x40fc1);\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30fc1);\r
 \r
 \r
 \r
@@ -928,9 +980,8 @@ phy_PathB_IQK_8723B(
        ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);\r
        \r
-\r
 //     ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82140114);\r
-       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821403ea);\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821303ea);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);\r
@@ -939,9 +990,15 @@ phy_PathB_IQK_8723B(
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n"));\r
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x00462911);\r
 \r
-\r
        //enter IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);      \r
+\r
+       //switch to path B\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+//     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0);\r
+\r
+       //GNT_BT = 0\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);\r
 \r
        //One shot, path B LOK & IQK\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n"));\r
@@ -953,8 +1010,13 @@ phy_PathB_IQK_8723B(
        //PlatformStallExecution(IQK_DELAY_TIME_88E*1000);\r
        ODM_delay_ms(IQK_DELAY_TIME_8723B);\r
 \r
+       //restore Ant Path\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);\r
+       //GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);\r
+\r
     //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x948 = 0x%x\n", ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord)));\r
        \r
@@ -969,7 +1031,7 @@ phy_PathB_IQK_8723B(
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n", \r
                ODM_GetBBReg(pDM_Odm, 0xe90, bMaskDWord), ODM_GetBBReg(pDM_Odm, 0xe98, bMaskDWord)));\r
 \r
-//Allen 20131125\r
+       //Allen 20131125\r
        tmp=(regE9C & 0x03FF0000)>>16;\r
     if ((tmp & 0x200)> 0)\r
                tmp = 0x400 - tmp;\r
@@ -1008,7 +1070,7 @@ phy_PathB_RxIQK8723B(
        IN      BOOLEAN         configPathB\r
        )\r
 {\r
-       u4Byte regE94, regE9C, regEA4, regEAC, u4tmp, tmp;\r
+       u4Byte regE94, regE9C, regEA4, regEAC, u4tmp, tmp, Path_SEL_BB;\r
        u1Byte result = 0x00;\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
@@ -1021,8 +1083,10 @@ phy_PathB_RxIQK8723B(
 #endif \r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Rx IQK!\n"));\r
 \r
+       // Save RF Path\r
+       Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);\r
     //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
        //switch to path B\r
        ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
@@ -1032,12 +1096,12 @@ phy_PathB_RxIQK8723B(
        //modify RXIQK mode table\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n"));\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1 );\r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000 );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f );\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7 );\r
        //open PA S1 & SMIXER\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1 );\r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x60fed ); \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30fcd );\r
        \r
 \r
        //IQK setting\r
@@ -1052,7 +1116,7 @@ phy_PathB_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);\r
 \r
 //     ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f );\r
-       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160ff0);\r
+       ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82130ff0);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);    \r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);\r
@@ -1062,7 +1126,15 @@ phy_PathB_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911);\r
 \r
     //enter IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
+\r
+       //switch to path B\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+//     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0);\r
+\r
+       //GNT_BT = 0\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);\r
+\r
        //One shot, path B TXIQK @ RXIQK\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n"));\r
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);\r
@@ -1073,9 +1145,14 @@ phy_PathB_RxIQK8723B(
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_88E));\r
        //PlatformStallExecution(IQK_DELAY_TIME_88E*1000);\r
        ODM_delay_ms(IQK_DELAY_TIME_8723B);\r
-       \r
+\r
+       //restore Ant Path\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);\r
+       //GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);\r
+\r
     //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
        // Check failed\r
        regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);\r
@@ -1116,16 +1193,16 @@ phy_PathB_RxIQK8723B(
 \r
        //modify RXIQK mode table\r
        //<20121009, Kordan> RF Mode = 3\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);                             \r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);  \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f); \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7d77); \r
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0);   \r
 \r
        //open PA S1 & close SMIXER\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1); \r
-       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x60fbd); \r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30ebd);\r
 \r
        //PA, PAD setting\r
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0xf80);\r
@@ -1144,7 +1221,7 @@ phy_PathB_RxIQK8723B(
 \r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82110000);\r
 //     ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x281604c2);    \r
-       ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2816001f);    \r
+       ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2813001f);\r
        ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);\r
        ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);\r
 \r
@@ -1153,7 +1230,14 @@ phy_PathB_RxIQK8723B(
        ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a8d1);\r
 \r
     //enter IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
+\r
+       //switch to path B\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\r
+//     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0);\r
+\r
+       //GNT_BT = 0\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);\r
 \r
        //One shot, path B LOK & IQK\r
 //     ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n"));\r
@@ -1165,8 +1249,13 @@ phy_PathB_RxIQK8723B(
        //PlatformStallExecution(IQK_DELAY_TIME_88E*1000);\r
        ODM_delay_ms(IQK_DELAY_TIME_8723B);\r
 \r
+       //restore Ant Path\r
+       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);\r
+       //GNT_BT = 1\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);\r
+\r
     //leave IQK mode\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
        // Check failed\r
        regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);\r
@@ -1180,7 +1269,7 @@ phy_PathB_RxIQK8723B(
 \r
        //      PA/PAD controlled by 0x0\r
        //leave IQK mode\r
-//     ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+//     ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x00000000);\r
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xdf, bRFRegOffsetMask, 0x180 );\r
 \r
 \r
@@ -1695,12 +1784,12 @@ _PHY_PathAStandBy8723B(
 #endif \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path-A standby mode!\n"));\r
 \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x0);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x0);\r
 //Allen\r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bMaskDWord, 0x10000);\r
        //ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x00010000);\r
 //\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);\r
 }\r
 \r
 VOID\r
@@ -1870,7 +1959,8 @@ phy_IQCalibrate_8723B(
 #endif\r
        IN      s4Byte          result[][8],\r
        IN      u1Byte          t,\r
-       IN      BOOLEAN         is2T\r
+       IN      BOOLEAN         is2T,\r
+       IN      u1Byte          RF_Path\r
        )\r
 {\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
@@ -1984,7 +2074,7 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
 #endif\r
 \r
        //save RF path for 8723B\r
-               Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);\r
+//     Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);\r
 //     Path_SEL_RF = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff);\r
        \r
        //MAC settings\r
@@ -2032,7 +2122,7 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
 \r
 //RX IQ calibration setting for 8723B D cut large current issue when leaving IPS\r
 \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);       \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);\r
     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);\r
     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);\r
@@ -2053,12 +2143,16 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
 \r
        for(i = 0 ; i < retryCount ; i++){\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
-               PathAOK = phy_PathA_IQK_8723B(pAdapter, is2T);\r
+               PathAOK = phy_PathA_IQK_8723B(pAdapter, is2T, RF_Path);\r
 #else\r
-               PathAOK = phy_PathA_IQK_8723B(pDM_Odm, is2T);\r
+               PathAOK = phy_PathA_IQK_8723B(pDM_Odm, is2T, RF_Path);\r
 #endif\r
 //             if(PathAOK == 0x03){\r
                if(PathAOK == 0x01){\r
+                       // Path A Tx IQK Success\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
+                       pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x8, bRFRegOffsetMask);\r
+\r
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Tx IQK Success!!\n"));\r
                                result[t][0] = (ODM_GetBBReg(pDM_Odm, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
                                result[t][1] = (ODM_GetBBReg(pDM_Odm, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
@@ -2081,9 +2175,9 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
 \r
        for(i = 0 ; i < retryCount ; i++){\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
-               PathAOK = phy_PathA_RxIQK8723B(pAdapter, is2T);\r
+               PathAOK = phy_PathA_RxIQK8723B(pAdapter, is2T, RF_Path);\r
 #else\r
-               PathAOK = phy_PathA_RxIQK8723B(pDM_Odm, is2T);\r
+               PathAOK = phy_PathA_RxIQK8723B(pDM_Odm, is2T, RF_Path);\r
 #endif\r
                if(PathAOK == 0x03){\r
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path A Rx IQK Success!!\n"));\r
@@ -2133,6 +2227,10 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
 #endif\r
 //             if(PathBOK == 0x03){\r
                if(PathBOK == 0x01){\r
+                       // Path B Tx IQK Success\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
+                       pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_B] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x8, bRFRegOffsetMask);\r
+\r
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Tx IQK Success!!\n"));\r
                                result[t][4] = (ODM_GetBBReg(pDM_Odm, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
                                result[t][5] = (ODM_GetBBReg(pDM_Odm, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
@@ -2184,7 +2282,7 @@ for(i = 0 ; i < retryCount ; i++){
 \r
        //Back to BB mode, load original value\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:Back to BB mode, load original value!\n"));\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);\r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0);\r
 \r
        if(t!=0)\r
        {\r
@@ -2217,7 +2315,7 @@ for(i = 0 ; i < retryCount ; i++){
 \r
 \r
                //Reload RF path\r
-               ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);\r
+//             ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);\r
 //             ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff, Path_SEL_RF);\r
        \r
                //Allen initial gain 0xc50\r
@@ -2306,6 +2404,12 @@ phy_LCCalibrate_8723B(
 \r
        ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFFE0); // LDO OFF\r
 \r
+       // Channel 10 LC calibration issue for 8723bs with 26M xtal\r
+       if(pDM_Odm->SupportInterface == ODM_ITRF_SDIO && pDM_Odm->PackageType >= 0x2)\r
+       {\r
+               ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal);\r
+       }\r
+\r
        //Restore original situation\r
        if((tmpReg&0x70) != 0)  //Deal with contisuous TX case \r
        {  \r
@@ -2537,7 +2641,7 @@ phy_APCalibrate_8723B(
                        }       \r
                        \r
                        //page-B1\r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
                \r
                        //path A\r
                        offset = rPdp_AntA;\r
@@ -2548,7 +2652,7 @@ phy_APCalibrate_8723B(
                                \r
                                offset += 0x04;\r
                        }                               \r
-                       ODM_SetBBReg(pDM_Odm,  rFPGA0_IQK, bMaskDWord, 0x00000000);                                             \r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                                                      \r
                }\r
                else if(path == ODM_RF_PATH_B)\r
                {\r
@@ -2581,7 +2685,7 @@ phy_APCalibrate_8723B(
                        }       \r
                        \r
                        //page-B1\r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
                        \r
                        //path B\r
                        offset = 0xb60;\r
@@ -2592,7 +2696,7 @@ phy_APCalibrate_8723B(
                                \r
                                offset += 0x04;\r
                        }                               \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);                                                       \r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0);                                                     \r
                }\r
        \r
                //save RF default value\r
@@ -2714,7 +2818,7 @@ phy_APCalibrate_8723B(
                        i = 0;\r
                        do\r
                        {\r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);\r
                                {\r
                                        ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]);              \r
                                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord)));\r
@@ -2724,7 +2828,7 @@ phy_APCalibrate_8723B(
 \r
                                        ODM_delay_ms(20);\r
                                }\r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
 \r
                                if(path == ODM_RF_PATH_A)\r
                                        tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000);\r
@@ -2816,8 +2920,8 @@ phy_APCalibrate_8723B(
 \r
 \r
 \r
-//IQK version:V2.4    20131209\r
-//fix D cut IQK huge current issue when BT is busy\r
+//IQK version:V2.5    20140123\r
+//IQK is controlled by Is2ant, RF path\r
 VOID\r
 PHY_IQCalibrate_8723B(\r
 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
@@ -2825,7 +2929,10 @@ PHY_IQCalibrate_8723B(
 #else\r
        IN      PADAPTER        pAdapter,\r
 #endif\r
-       IN      BOOLEAN         bReCovery\r
+       IN      BOOLEAN         bReCovery,\r
+       IN BOOLEAN      bRestore,\r
+       IN BOOLEAN      Is2ant, //false:1ant, true:2-ant\r
+       IN u1Byte       RF_Path //0:S1, 1:S0\r
        )\r
 {\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
@@ -2858,9 +2965,10 @@ PHY_IQCalibrate_8723B(
                                        rOFDM0_XATxIQImbalance,         rOFDM0_XBTxIQImbalance, \r
                                        rOFDM0_XCTxAFE,                         rOFDM0_XDTxAFE, \r
                                        rOFDM0_RxIQExtAnta};\r
-       u4Byte                  Path_SEL_BB = 0;                                \r
-//     u4Byte                  Path_SEL_BB = 0, Path_SEL_RF = 0; \r
-       \r
+//     u4Byte                  Path_SEL_BB = 0;\r
+       u4Byte                  GNT_BT_default;\r
+       u4Byte                  StartTime; \r
+       s4Byte                  ProgressingTime;\r
 \r
 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE) )\r
        if (ODM_CheckPowerStatus(pAdapter) == FALSE)\r
@@ -2910,7 +3018,54 @@ PHY_IQCalibrate_8723B(
        pDM_Odm->RFCalibrateInfo.bIQKInProgress = TRUE;\r
        ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK);\r
 \r
-       \r
+       if (bRestore) {\r
+               u4Byte offset, data;\r
+               u1Byte path, bResult = SUCCESS;\r
+               PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
+\r
+               //#define PATH_S0       1 // RF_PATH_B\r
+               //#define PATH_S1       0 // RF_PATH_A\r
+\r
+               path = (ODM_GetBBReg(pDM_Odm,rS0S1_PathSwitch,bMaskByte0)==0x00) ? ODM_RF_PATH_A : ODM_RF_PATH_B;\r
+\r
+               // Restore TX IQK\r
+               for (i = 0; i < 3; ++i) {\r
+                       offset = pRFCalibrateInfo->TxIQC_8723B[path][i][0];\r
+                       data = pRFCalibrateInfo->TxIQC_8723B[path][i][1];\r
+                       if ((offset==0) || (data==0)) {\r
+                               DBG_871X("%s =>path:%s Restore TX IQK result failed \n",__FUNCTION__,(path==ODM_RF_PATH_A)?"A":"B");\r
+                               bResult = FAIL;\r
+                               break;\r
+                       }\r
+                       //RT_TRACE(_module_mp_, _drv_notice_,("Switch to S1 TxIQC(offset, data) = (0x%X, 0x%X)\n", offset, data));\r
+                       ODM_SetBBReg(pDM_Odm,offset, bMaskDWord, data);\r
+               }\r
+\r
+               // Restore RX IQK\r
+               for (i = 0; i < 2; ++i) {\r
+                       offset = pRFCalibrateInfo->RxIQC_8723B[path][i][0];\r
+                       data = pRFCalibrateInfo->RxIQC_8723B[path][i][1];\r
+                       if ((offset==0) || (data==0)) {\r
+                               DBG_871X("%s =>path:%s  Restore RX IQK result failed \n",__FUNCTION__,(path==ODM_RF_PATH_A)?"A":"B");\r
+                               bResult = FAIL;\r
+                               break;\r
+                       }\r
+                       //RT_TRACE(_module_mp_, _drv_notice_,("Switch to S1 RxIQC (offset, data) = (0x%X, 0x%X)\n", offset, data));\r
+                       ODM_SetBBReg(pDM_Odm,offset, bMaskDWord, data);\r
+               }\r
+\r
+               if (pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A] ==0) {\r
+                       DBG_871X("%s => Restore Path-A TxLOK result failed \n",__FUNCTION__);\r
+                       bResult = FAIL;\r
+               } else {\r
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXM_IDAC, bRFRegOffsetMask, pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A]);  \r
+                       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_TXM_IDAC, bRFRegOffsetMask, pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_B]);  \r
+               }\r
+\r
+               if (bResult == SUCCESS)\r
+                       return;\r
+       }\r
+\r
 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\r
        if(bReCovery)\r
 #else//for ODM_WIN\r
@@ -2925,16 +3080,18 @@ PHY_IQCalibrate_8723B(
 #endif\r
                return;         \r
        }\r
+       StartTime = ODM_GetCurrentTime( pDM_Odm);\r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK:Start!!!\n"));\r
 \r
-\r
+       //save default GNT_BT\r
+       GNT_BT_default = ODM_GetBBReg(pDM_Odm, 0x764, bMaskDWord);\r
        // Save RF Path \r
-       Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord); \r
+//     Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);\r
 //     Path_SEL_RF = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff);\r
 \r
     //set GNT_BT=0, pause BT traffic\r
-    ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0); \r
-    ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x1); \r
+//     ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0);\r
+//     ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x1);\r
 \r
 \r
        for(i = 0; i < 8; i++)\r
@@ -2955,15 +3112,11 @@ PHY_IQCalibrate_8723B(
        for (i=0; i<3; i++)\r
        {\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
-\r
-\r
-               phy_IQCalibrate_8723B(pAdapter, result, i, TRUE);\r
-               \r
+               phy_IQCalibrate_8723B(pAdapter, result, i, Is2ant, RF_Path);\r
 #else\r
-               phy_IQCalibrate_8723B(pDM_Odm, result, i, TRUE);\r
-#endif                 \r
-               \r
-               \r
+               phy_IQCalibrate_8723B(pDM_Odm, result, i, Is2ant, RF_Path);\r
+#endif\r
+\r
                if(i == 1)\r
                {\r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
@@ -3101,20 +3254,38 @@ PHY_IQCalibrate_8723B(
        _PHY_SaveADDARegisters8723B(pDM_Odm, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup_recover, IQK_BB_REG_NUM);\r
 #endif \r
 \r
+       //restore GNT_BT\r
+       ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, GNT_BT_default);\r
        // Restore RF Path\r
-       ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);\r
+//     ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);\r
 //     ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff, Path_SEL_RF);\r
 \r
+       //Resotr RX mode table parameter\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1 );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xe6177 );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1 );\r
+       ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x300bd );\r
+\r
        //set GNT_BT= HW control\r
-    ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0); \r
-    ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x0); \r
+//     ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0);\r
+//     ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x0);\r
 \r
+       if (Is2ant) {\r
+               if (RF_Path == 0x0)     //S1\r
+                       ODM_SetIQCbyRFpath(pDM_Odm, 0);\r
+               else    //S0\r
+                       ODM_SetIQCbyRFpath(pDM_Odm, 1);\r
+       }\r
 \r
        ODM_AcquireSpinLock(pDM_Odm, RT_IQK_SPINLOCK);\r
        pDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE;\r
        ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK);\r
 \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK finished\n"));\r
+       ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime);\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK ProgressingTime = %d\n", ProgressingTime));\r
        \r
 \r
 }\r
@@ -3127,6 +3298,8 @@ PHY_LCCalibrate_8723B(
 {\r
        BOOLEAN                 bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;\r
        u4Byte                  timeout = 2000, timecount = 0;\r
+       u4Byte                  StartTime; \r
+       s4Byte                  ProgressingTime;\r
        \r
 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
        PADAPTER        pAdapter = pDM_Odm->Adapter;\r
@@ -3163,7 +3336,8 @@ PHY_LCCalibrate_8723B(
        // 20120213<Kordan> Turn on when continuous Tx to pass lab testing. (required by Edlu)\r
        if(bSingleTone || bCarrierSuppression)\r
                return;\r
-\r
+       \r
+       StartTime = ODM_GetCurrentTime( pDM_Odm);\r
        while(*(pDM_Odm->pbScanInProcess) && timecount < timeout)\r
        {\r
                ODM_delay_ms(50);\r
@@ -3179,7 +3353,8 @@ PHY_LCCalibrate_8723B(
        pDM_Odm->RFCalibrateInfo.bLCKInProgress = FALSE;\r
 \r
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LCK:Finish!!!interface %d\n", pDM_Odm->InterfaceIndex));\r
-\r
+       ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime);\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("LCK ProgressingTime = %d\n", ProgressingTime));\r
 }\r
 \r
 VOID\r
@@ -3416,9 +3591,9 @@ phy_DigitalPredistortion8723B(
        // PA gain = 11 & PAD2 => tx_agc 10~0e\r
        // PA gain = 01 => tx_agc 0b~0d\r
        // PA gain = 00 => tx_agc 0a~00\r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);      \r
        ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);           \r
-       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
        //do inner loopback DPK 3 times \r
        for(i = 0; i < 3; i++)\r
@@ -3489,8 +3664,8 @@ phy_DigitalPredistortion8723B(
                {\r
                        ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098);\r
                \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
                        ODM_delay_ms(1);\r
                        ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0);\r
                        ODM_delay_ms(1);                        \r
@@ -3516,7 +3691,7 @@ phy_DigitalPredistortion8723B(
                ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84);\r
                ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87);\r
                ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000);\r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
 \r
                for(i=rPdp_AntA; i<=0xb3c; i+=4)\r
                {\r
@@ -3536,7 +3711,7 @@ phy_DigitalPredistortion8723B(
 \r
                //TX_AGC boundary\r
                ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);   \r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);                                      \r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                                              \r
        }\r
        else\r
        {\r
@@ -3555,9 +3730,9 @@ phy_DigitalPredistortion8723B(
                // PA gain = 11 & PAD2, => tx_agc 10 ~0e\r
                // PA gain = 01 => tx_agc 0b ~0d\r
                // PA gain = 00 => tx_agc 0a ~00\r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);      \r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);      \r
                ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);           \r
-               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);      \r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);              \r
 \r
                //do inner loopback DPK 3 times \r
                for(i = 0; i < 3; i++)\r
@@ -3628,8 +3803,8 @@ phy_DigitalPredistortion8723B(
                        {\r
                                ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098);               \r
                        \r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\r
-                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);\r
+                               ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);      \r
                                ODM_delay_ms(1);\r
                                ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0);               \r
                                ODM_delay_ms(1);        \r
@@ -3656,7 +3831,7 @@ phy_DigitalPredistortion8723B(
                        ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87);\r
                        ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000);\r
                        \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);\r
                        for(i=0xb60; i<=0xb9c; i+=4)\r
                        {\r
                                ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000);       \r
@@ -3675,7 +3850,7 @@ phy_DigitalPredistortion8723B(
                        \r
                        // tx_agc boundary\r
                        ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);   \r
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);                      \r
+                       ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);                              \r
                        \r
                }\r
                else\r
index f437bddba8e0cfa97ea2af45ca6ba2027a96ed6e..405310fae7b02014da0e5baefef2621d18fe4adc 100755 (executable)
@@ -57,7 +57,10 @@ PHY_IQCalibrate_8723B(
 #else\r
        IN PADAPTER     Adapter,\r
 #endif\r
-       IN      BOOLEAN         bReCovery);\r
+       IN BOOLEAN      bReCovery,\r
+       IN BOOLEAN      bRestore,\r
+       IN BOOLEAN      Is2ant,\r
+       IN u1Byte       RF_Path);\r
 \r
 VOID\r
 ODM_SetIQCbyRFpath(\r
index e2ae8a78017e1cc109de8789f19d9032469260f2..a81a00db834a0a3e22d229081c2fc170c7972f33 100755 (executable)
@@ -567,30 +567,6 @@ odm_CCKRSSI_8723B(
        return  rx_pwr_all;\r
 }\r
 \r
-s1Byte\r
-odm_RSSIOFDM_8723B(\r
-       IN      s1Byte  rx_pwr_new)\r
-{\r
-       s1Byte  rx_pwr_all=0;\r
-       \r
-       if(rx_pwr_new >=63)\r
-               rx_pwr_all      =rx_pwr_new -120+10;\r
-       else if(rx_pwr_all >=54)\r
-               rx_pwr_all=rx_pwr_new-120+6;\r
-       else if(rx_pwr_all >=43)\r
-               rx_pwr_all=rx_pwr_new-120+8;\r
-       else if(rx_pwr_all >=33)\r
-               rx_pwr_all=rx_pwr_new-120+8;\r
-       else if(rx_pwr_all >=23)\r
-               rx_pwr_all=rx_pwr_new-120+10;\r
-       else \r
-               rx_pwr_all=rx_pwr_new-120+7;\r
-\r
-\r
-       return rx_pwr_all;\r
-\r
-}\r
-\r
 #endif         // end if RTL8723B \r
 \r
 \r
index f544f21a3a8df8bb6526b44c67910e8296750e92..dd5da85e34ec2aa6be8327ad1ff051b6b4037a45 100755 (executable)
@@ -31,11 +31,6 @@ odm_CCKRSSI_8723B(
        IN              u1Byte  VGA_idx\r
        );\r
 \r
-s1Byte\r
-odm_RSSIOFDM_8723B(\r
-       IN      s1Byte  rx_pwr_new\r
-       );\r
-\r
 \r
 \r
 #endif\r
index 8ccd991b2a1c1a59ab585456003196d88b9e39b9..650b1b72205191c029fb5ae62467cda5ddcbf958 100755 (executable)
@@ -64,21 +64,22 @@ const char *const h2cStaString[] =
 
 const char *const ioStaString[] =
 {
-       "IO_STATUS_SUCCESS",
-       "IO_STATUS_FAIL_CANNOT_IO",
-       "IO_STATUS_FAIL_RF_OFF",
-       "IO_STATUS_FAIL_FW_READ_CLEAR_TIMEOUT",
-       "IO_STATUS_FAIL_WAIT_IO_EVENT_TIMEOUT",
-       "IO_STATUS_INVALID_LEN",
-       "IO_STATUS_IO_IDLE_QUEUE_EMPTY",
-       "IO_STATUS_IO_INSERT_WAIT_QUEUE_FAIL",
-       "IO_STATUS_UNKNOWN_FAIL",
-       "IO_STATUS_WRONG_LEVEL",
-       "IO_STATUS_H2C_STOPPED",
+       "success",
+       "can not IO",
+       "rf off",
+       "fw not read",
+       "wait io timeout",
+       "invalid len",
+       "idle Q empty",
+       "insert waitQ fail",
+       "unknown fail",
+       "wrong level",
+       "h2c stopped",
 };
 
 BTC_COEXIST GLBtCoexist;
 u8 GLBtcWiFiInScanState;
+u8 GLBtcWiFiInIQKState;
 
 u32 GLBtcDbgType[BTC_MSG_MAX];
 u8 GLBtcDbgBuf[BT_TMP_BUF_SIZE];
@@ -498,7 +499,7 @@ static u8 halbtcoutsrc_GetWifiScanAPNum(PADAPTER padapter)
        pmlmepriv = &padapter->mlmepriv;
        pmlmeext = &padapter->mlmeextpriv;
 
-       if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _FALSE) {
+       if (GLBtcWiFiInScanState == _FALSE) {
                if (pmlmeext->sitesurvey_res.bss_cnt > 0xFF)
                        scan_AP_num = 0xFF;
                else
@@ -628,6 +629,17 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf)
                                *pu8 = _FALSE;
                        break;
 
+               case BTC_GET_BL_WIFI_IS_IN_MP_MODE:
+                       if (padapter->registrypriv.mp_mode == 0)
+                       {
+                               *pu8 = _FALSE;
+                       }
+                       else
+                       {
+                               *pu8 = _TRUE;
+                       }
+                       break;
+
                case BTC_GET_BL_EXT_SWITCH:
                        *pu8 = _FALSE;
                        break;
@@ -765,6 +777,11 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
 
                case BTC_SET_BL_INC_SCAN_DEV_NUM:
                        pBtCoexist->btInfo.bIncreaseScanDevNum = *pu8;
+                       break;
+
+               case BTC_SET_BL_BT_TX_RX_MASK:
+                       pBtCoexist->btInfo.bBtTxRxMask = *pu8;
+                       break;
 
                // set some u8 type variables.
                case BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON:
@@ -876,7 +893,21 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
                        ret = _FALSE;
 #endif
                        break;
-
+               case BTC_SET_ACT_CTRL_8723B_ANT:
+#if 0
+                       {
+                               u1Byte  dataLen=*pU1Tmp;
+                               u1Byte  tmpBuf[20];
+                               if(dataLen)
+                               {
+                                       PlatformMoveMemory(&tmpBuf[0], pU1Tmp+1, dataLen);
+                               }
+                               BT_Set8723bAnt(Adapter, dataLen, &tmpBuf[0]);
+                       }
+#else
+                       ret = _FALSE;
+#endif
+                       break;
                //=====================
                default:
                        ret = _FALSE;
@@ -908,14 +939,24 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
                        CL_PRINTF(cliBuf);
                }
        }
-
+#else
+               for(i=0; i<IO_STATUS_MAX; i++)
+               {
+                       if(Adapter->ioComStr.ioH2cStatistics[i])
+                       {
+                               CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s] = %d", "H2C statistics", \
+                                       ioStaString[i], Adapter->ioComStr.ioH2cStatistics[i]);
+                               CL_PRINTF(cliBuf);
+                       }
+               }
+#endif
+#if 0
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "lastHMEBoxNum", \
                pHalData->LastHMEBoxNum);
        CL_PRINTF(cliBuf);
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "LastSuccessFwEid/FirstfailedFwEid", \
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "LastOkH2c/FirstFailH2c(fwNotRead)", \
                pHalData->lastSuccessH2cEid, pHalData->firstFailedH2cEid);
        CL_PRINTF(cliBuf);
-#endif
 
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "c2hIsr/c2hIntr/clr1AF/noRdy/noBuf", \
                pHalData->InterruptLog.nIMR_C2HCMD, DBG_Var.c2hInterruptCnt, DBG_Var.c2hClrReadC2hCnt,
@@ -925,12 +966,13 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "c2hPacket", \
                DBG_Var.c2hPacketCnt);
        CL_PRINTF(cliBuf);
-
+#endif
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Periodical/ DbgCtrl", \
                pBtCoexist->statistics.cntPeriodical, pBtCoexist->statistics.cntDbgCtrl);
        CL_PRINTF(cliBuf);
-       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "InitHw/InitCoexDm/", \
-               pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm);
+       CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "PowerOn/InitHw/InitCoexDm/RfStatus", \
+               pBtCoexist->statistics.cntPowerOn, pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm,
+               pBtCoexist->statistics.cntRfStatusNotify);
        CL_PRINTF(cliBuf);
        CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "Ips/Lps/Scan/Connect/Mstatus", \
                pBtCoexist->statistics.cntIpsNotify, pBtCoexist->statistics.cntLpsNotify,
@@ -1091,6 +1133,21 @@ void halbtcoutsrc_Write4Byte(void *pBtcContext, u32 RegAddr, u32 Data)
        rtw_write32(padapter, RegAddr, Data);
 }
 
+void halbtcoutsrc_WriteLocalReg1Byte(void *pBtcContext, u32 RegAddr, u8 Data)
+{
+       PBTC_COEXIST            pBtCoexist=(PBTC_COEXIST)pBtcContext;
+       PADAPTER                        Adapter=pBtCoexist->Adapter;
+
+       if(BTC_INTF_SDIO == pBtCoexist->chipInterface)
+       {
+               rtw_write8(Adapter, SDIO_LOCAL_BASE | RegAddr, Data);
+       }
+       else
+       {
+               rtw_write8(Adapter, RegAddr, Data);
+       }
+}
+
 void halbtcoutsrc_SetBbReg(void *pBtcContext, u32 RegAddr, u32 BitMask, u32 Data)
 {
        PBTC_COEXIST pBtCoexist;
@@ -1173,6 +1230,12 @@ void halbtcoutsrc_SetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr, u32 Data)
        }
 }
 
+u32 halbtcoutsrc_GetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr)
+{
+       /* To be implemented. Always return 0 temporarily */
+       return 0;
+}
+
 void halbtcoutsrc_FillH2cCmd(void *pBtcContext, u8 elementId, u32 cmdLen, u8 *pCmdBuffer)
 {
        PBTC_COEXIST pBtCoexist;
@@ -1241,20 +1304,47 @@ u8 halbtcoutsrc_UnderIps(PBTC_COEXIST pBtCoexist)
 //====================================
 //             Extern functions called by other module
 //====================================
+u8 EXhalbtcoutsrc_BindBtCoexWithAdapter(void *padapter)
+{
+       PBTC_COEXIST            pBtCoexist=&GLBtCoexist;
+       u1Byte  antNum=2, chipType;
+       
+       if(pBtCoexist->bBinded)
+               return _FALSE;
+       else
+               pBtCoexist->bBinded = _TRUE;
+
+       pBtCoexist->statistics.cntBind++;
+       
+       pBtCoexist->Adapter = padapter;
+       
+       pBtCoexist->stackInfo.bProfileNotified = _FALSE;
+
+       pBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;
+       pBtCoexist->btInfo.aggBufSize = 5;
+
+       pBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;
+
+#if 0
+       chipType = HALBT_GetBtChipType(Adapter);
+       EXhalbtcoutsrc_SetChipType(chipType);
+       antNum = HALBT_GetPgAntNum(Adapter);
+       EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);
+#endif
+       // set default antenna position to main  port
+       pBtCoexist->boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;    
+       
+       return _TRUE;
+}
+
 u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
 {
        PBTC_COEXIST pBtCoexist = &GLBtCoexist;
 
-
-       pBtCoexist->statistics.cntBind++;
+       //pBtCoexist->statistics.cntBind++;
 
        halbtcoutsrc_DbgInit();
 
-       if (pBtCoexist->bBinded)
-               return _FALSE;
-       else
-               pBtCoexist->bBinded = _TRUE;
-
 #ifdef CONFIG_PCI_HCI
        pBtCoexist->chipInterface = BTC_INTF_PCI;
 #elif defined(CONFIG_USB_HCI)
@@ -1265,12 +1355,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
        pBtCoexist->chipInterface = BTC_INTF_UNKNOWN;
 #endif
 
-       if (NULL == pBtCoexist->Adapter)
-       {
-               pBtCoexist->Adapter = padapter;
-       }
-
-       pBtCoexist->stackInfo.bProfileNotified = _FALSE;
+       EXhalbtcoutsrc_BindBtCoexWithAdapter(padapter);
 
        pBtCoexist->fBtcRead1Byte = halbtcoutsrc_Read1Byte;
        pBtCoexist->fBtcWrite1Byte = halbtcoutsrc_Write1Byte;
@@ -1279,6 +1364,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
        pBtCoexist->fBtcWrite2Byte = halbtcoutsrc_Write2Byte;
        pBtCoexist->fBtcRead4Byte = halbtcoutsrc_Read4Byte;
        pBtCoexist->fBtcWrite4Byte = halbtcoutsrc_Write4Byte;
+       pBtCoexist->fBtcWriteLocalReg1Byte = halbtcoutsrc_WriteLocalReg1Byte;
 
        pBtCoexist->fBtcSetBbReg = halbtcoutsrc_SetBbReg;
        pBtCoexist->fBtcGetBbReg = halbtcoutsrc_GetBbReg;
@@ -1286,27 +1372,41 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
        pBtCoexist->fBtcSetRfReg = halbtcoutsrc_SetRfReg;
        pBtCoexist->fBtcGetRfReg = halbtcoutsrc_GetRfReg;
 
-       pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;
-
        pBtCoexist->fBtcFillH2c = halbtcoutsrc_FillH2cCmd;
        pBtCoexist->fBtcDispDbgMsg = halbtcoutsrc_DisplayDbgMsg;
 
        pBtCoexist->fBtcGet = halbtcoutsrc_Get;
        pBtCoexist->fBtcSet = halbtcoutsrc_Set;
+       pBtCoexist->fBtcGetBtReg = halbtcoutsrc_GetBtReg;
+       pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;
 
-       pBtCoexist->cliBuf = GLBtcDbgBuf;
-
-       pBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;
-       pBtCoexist->btInfo.aggBufSize = 5;
-
-       pBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;
+       pBtCoexist->cliBuf = &GLBtcDbgBuf[0];
 
+       pBtCoexist->boardInfo.singleAntPath = 0;
+       
        GLBtcWiFiInScanState = _FALSE;
 
+       GLBtcWiFiInIQKState = _FALSE;
+
        return _TRUE;
 }
 
-void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist)
+void EXhalbtcoutsrc_PowerOnSetting(PBTC_COEXIST pBtCoexist)
+{
+       if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+
+       /* Power on setting function is only added in 8723B currently */
+       if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if (pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8723b2ant_PowerOnSetting(pBtCoexist);
+               else if (pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_PowerOnSetting(pBtCoexist);
+       }
+}
+
+void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist, u8 bWifiOnly)
 {
        if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
                return;
@@ -1316,45 +1416,45 @@ void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist)
        if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8821a2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8821a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8821a1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8821a1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8723b1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723b1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8723a2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8188c2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8188c2ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8192d2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8192d2ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8192e2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8192e2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8192e1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8192e1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
        else if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 2)
-                       EXhalbtc8812a2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8812a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
-                       EXhalbtc8812a1ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8812a1ant_InitHwConfig(pBtCoexist, bWifiOnly);
        }
 }
 
@@ -1871,6 +1971,32 @@ void EXhalbtcoutsrc_BtInfoNotify(PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length)
 //     halbtcoutsrc_NormalLowPower(pBtCoexist);
 }
 
+VOID
+EXhalbtcoutsrc_RfStatusNotify(
+       IN      PBTC_COEXIST            pBtCoexist,
+       IN      u1Byte                          type
+       )
+{
+       if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+               return;
+       pBtCoexist->statistics.cntRfStatusNotify++;
+       
+       if(IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
+       {
+       }
+       else if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+       {
+               if(pBtCoexist->boardInfo.btdmAntNum == 1)
+                       EXhalbtc8723b1ant_RfStatusNotify(pBtCoexist, type);
+       }       
+       else if(IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
+       {
+       }
+       else if(IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
+       {
+       }
+}
+
 void EXhalbtcoutsrc_StackOperationNotify(PBTC_COEXIST pBtCoexist, u8 type)
 {
 #if 0
@@ -1958,9 +2084,11 @@ void EXhalbtcoutsrc_HaltNotify(PBTC_COEXIST pBtCoexist)
                else if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8812a1ant_HaltNotify(pBtCoexist);
        }
+
+       pBtCoexist->bBinded = FALSE;
 }
 
-void EXhalbtcoutsrc_SwitchGntBt(PBTC_COEXIST pBtCoexist)
+void EXhalbtcoutsrc_SwitchBtTRxMask(PBTC_COEXIST pBtCoexist)
 {
        if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
        {
@@ -1989,11 +2117,15 @@ void EXhalbtcoutsrc_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8723b1ant_PnpNotify(pBtCoexist,pnpState);
+               else if(pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8723b2ant_PnpNotify(pBtCoexist,pnpState);
        }
        else if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
        {
                if (pBtCoexist->boardInfo.btdmAntNum == 1)
                        EXhalbtc8821a1ant_PnpNotify(pBtCoexist,pnpState);
+               else if(pBtCoexist->boardInfo.btdmAntNum == 2)
+                       EXhalbtc8821a2ant_PnpNotify(pBtCoexist,pnpState);
        }
        else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
        {
@@ -2022,7 +2154,7 @@ void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist)
                        pBtCoexist->bStopCoexDm = TRUE;
                        EXhalbtc8723b1ant_CoexDmReset(pBtCoexist);
                        EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_DETECTED, 2);
-                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+                       EXhalbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);
                        EXhalbtc8723b2ant_InitCoexDm(pBtCoexist);
                        pBtCoexist->bStopCoexDm = FALSE;
                }
@@ -2216,11 +2348,12 @@ void EXhalbtcoutsrc_SetBtPatchVersion(u16 btHciVersion, u16 btPatchVersion)
        pBtCoexist->btInfo.btHciVer = btHciVersion;
 }
 
+#if 0
 void EXhalbtcoutsrc_SetBtExist(u8 bBtExist)
 {
        GLBtCoexist.boardInfo.bBtExist = bBtExist;
 }
-
+#endif
 void EXhalbtcoutsrc_SetChipType(u8 chipType)
 {
        switch(chipType)
@@ -2256,7 +2389,7 @@ void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum)
        {
                GLBtCoexist.boardInfo.pgAntNum = antNum;
                GLBtCoexist.boardInfo.btdmAntNum = antNum;
-
+#if 0
                //The antenna position: Main (default) or Aux for pgAntNum=2 && btdmAntNum =1
                //The antenna position should be determined by auto-detect mechanism
                // The following is assumed to main, and those must be modified if y auto-detect mechanism is ready
@@ -2264,19 +2397,28 @@ void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum)
                        GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
                else
                        GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+#endif
        }
        else if (BT_COEX_ANT_TYPE_ANTDIV == type)
        {
                GLBtCoexist.boardInfo.btdmAntNum = antNum;
-               GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+               //GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;  
        }
        else if (BT_COEX_ANT_TYPE_DETECTED == type)
        {
                GLBtCoexist.boardInfo.btdmAntNum = antNum;
-               GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+               //GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
        }
 }
 
+//
+// Currently used by 8723b only, S0 or S1
+//
+void EXhalbtcoutsrc_SetSingleAntPath(u8 singleAntPath)
+{
+       GLBtCoexist.boardInfo.singleAntPath = singleAntPath;
+}
+
 void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist)
 {
        if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
@@ -2397,7 +2539,7 @@ void hal_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist)
        pHalData = GET_HAL_DATA(padapter);
        pHalData->bt_coexist.bBtExist = bBtExist;
 
-       EXhalbtcoutsrc_SetBtExist(bBtExist);
+       //EXhalbtcoutsrc_SetBtExist(bBtExist);
 }
 
 /*
@@ -2469,6 +2611,11 @@ u8 hal_btcoex_GetPgAntNum(PADAPTER padapter)
        return pHalData->bt_coexist.btTotalAntNum;
 }
 
+void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
+{
+       EXhalbtcoutsrc_SetSingleAntPath(singleAntPath);
+}
+
 u8 hal_btcoex_Initialize(PADAPTER padapter)
 {
        u8 ret1;
@@ -2482,7 +2629,12 @@ u8 hal_btcoex_Initialize(PADAPTER padapter)
        return ret2;
 }
 
-void hal_btcoex_InitHwConfig(PADAPTER padapter)
+void hal_btcoex_PowerOnSetting(PADAPTER padapter)
+{
+       EXhalbtcoutsrc_PowerOnSetting(&GLBtCoexist);
+}
+
+void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly)
 {
        if (!hal_btcoex_IsBtExist(padapter))
                return;
@@ -2496,7 +2648,7 @@ void hal_btcoex_InitHwConfig(PADAPTER padapter)
                halbt_InitHwConfig92D(padapter);
        }
 
-       EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist);
+       EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist, bWifiOnly);
        EXhalbtcoutsrc_InitCoexDm(&GLBtCoexist);
 }
 
@@ -2530,8 +2682,16 @@ void hal_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType)
        EXhalbtcoutsrc_SpecialPacketNotify(&GLBtCoexist, pktType);
 }
 
+void hal_btcoex_IQKNotify(PADAPTER padapter, u8 state)
+{
+       GLBtcWiFiInIQKState = state;
+}
+
 void hal_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf)
 {
+       if (GLBtcWiFiInIQKState == _TRUE)
+               return;
+       
        EXhalbtcoutsrc_BtInfoNotify(&GLBtCoexist, tmpBuf, length);
 }
 
@@ -2550,9 +2710,9 @@ void hal_btcoex_HaltNotify(PADAPTER padapter)
        EXhalbtcoutsrc_HaltNotify(&GLBtCoexist);
 }
 
-void hal_btcoex_SwitchGntBt(PADAPTER padapter)
+void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter)
 {
-       EXhalbtcoutsrc_SwitchGntBt(&GLBtCoexist);
+       EXhalbtcoutsrc_SwitchBtTRxMask(&GLBtCoexist);
 }
 
 void hal_btcoex_Hanlder(PADAPTER padapter)
index 141c5470a989b9dfe131b524cf06e71e1f889662..5c7dcebdfa8b31a5b447d8b04f40b2db8565294d 100755 (executable)
 #define _HAL_COM_C_
 
 #include <drv_types.h>
+#include "hal_com_h2c.h"
 
 #include "../hal/OUTSRC/odm_precomp.h"
 
+u8 rtw_hal_data_init(_adapter *padapter)
+{
+       if(is_primary_adapter(padapter))        //if(padapter->isprimary)
+       {
+               padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
+               padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
+               if(padapter->HalData == NULL){
+                       DBG_8192C("cant not alloc memory for HAL DATA \n");
+                       return _FAIL;
+               }
+       }       
+       return _SUCCESS;
+}
+
+void rtw_hal_data_deinit(_adapter *padapter)
+{      
+       if(is_primary_adapter(padapter))        //if(padapter->isprimary)
+       {
+               if (padapter->HalData) 
+               {
+                       #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+                       phy_free_filebuf(padapter);                             
+                       #endif          
+                       rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
+                       padapter->HalData = NULL;
+                       padapter->hal_data_sz = 0;
+               }       
+       }
+}
+
 
 void dump_chip_info(HAL_VERSION        ChipVersion)
 {
@@ -436,7 +467,7 @@ _TwoOutPipeMapping(
                
                //      BK,     BE,     VI,     VO,     BCN,    CMD,MGT,HIGH,HCCA 
                //{  0,         1,      0,      1,      0,      0,      0,      0,              0       };
-               //0:H, 1:N 
+               //0:ep_0 num, 1:ep_1 num 
                
                pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];//VO
                pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
@@ -454,7 +485,7 @@ _TwoOutPipeMapping(
                
                //BK,   BE,     VI,     VO,     BCN,    CMD,MGT,HIGH,HCCA 
                //{  1,         1,      0,      0,      0,      0,      0,      0,              0       };                      
-               //0:H, 1:N 
+               //0:ep_0 num, 1:ep_1 num
                
                pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
                pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
@@ -927,6 +958,14 @@ void hw_var_port_switch(_adapter *adapter)
                rtw_write8(adapter, REG_BSSID1+i, bssid[i]);
 
        /* write bcn ctl */
+#ifdef CONFIG_BT_COEXIST
+#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
+       // always enable port0 beacon function for PSTDMA
+       bcn_ctrl_1 |= EN_BCN_FUNCTION;
+       // always disable port1 beacon function for PSTDMA
+       bcn_ctrl &= ~EN_BCN_FUNCTION;
+#endif
+#endif
        rtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1);
        rtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl);
 
@@ -1011,6 +1050,58 @@ _func_enter_;
        case HW_VAR_PORT_SWITCH:
                hw_var_port_switch(adapter);
                break;
+       case HW_VAR_INIT_RTS_RATE:
+       {
+               u16 brate_cfg = *((u16*)val);
+               u8 rate_index = 0;
+               HAL_VERSION *hal_ver = &hal_data->VersionID;
+
+               if (IS_81XXC(*hal_ver) ||IS_92D(*hal_ver) || IS_8723_SERIES(*hal_ver) || IS_8188E(*hal_ver)) {
+
+                       while (brate_cfg > 0x1) {
+                               brate_cfg = (brate_cfg >> 1);
+                               rate_index++;
+                       }
+                       rtw_write8(adapter, REG_INIRTS_RATE_SEL, rate_index);
+               } else {
+                       rtw_warn_on(1);
+               }
+       }
+               break;
+       case HW_VAR_SEC_CFG:
+       {
+               #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
+               // enable tx enc and rx dec engine, and no key search for MC/BC
+               rtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);
+               #elif defined(DYNAMIC_CAMID_ALLOC)
+               u16 reg_scr;
+
+               reg_scr = rtw_read16(adapter, REG_SECCFG);
+               rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
+               #else
+               rtw_write8(adapter, REG_SECCFG, *((u8*)val));
+               #endif
+       }
+               break;
+       case HW_VAR_SEC_DK_CFG:
+       {
+               struct security_priv *sec = &adapter->securitypriv;
+               u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
+
+               if (val) /* Enable default key related setting */
+               {
+                       reg_scr |= SCR_TXBCUSEDK;
+                       if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
+                               reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
+               }
+               else /* Disable default key related setting */
+               {
+                       reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
+               }
+
+               rtw_write8(adapter, REG_SECCFG, reg_scr);
+       }
+               break;
        case HW_VAR_DM_FLAG:
                odm->SupportAbility = *((u32*)val);
                break;
@@ -1076,20 +1167,45 @@ _func_enter_;
 _func_exit_;
 }
 
+
+
+
 u8
 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
-{
+{      
        HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
        DM_ODM_T *odm = &(hal_data->odmpriv);
        u8 bResult = _SUCCESS;
 
        switch(variable) {
-       case HW_DEF_FA_CNT_DUMP:
+       case HW_DEF_FA_CNT_DUMP:                
+               //ODM_COMP_COMMON
                if(*((u8*)value))
                        odm->DebugComponents |= (ODM_COMP_DIG |ODM_COMP_FA_CNT);
                else
-                       odm->DebugComponents &= ~(ODM_COMP_DIG |ODM_COMP_FA_CNT);
+                       odm->DebugComponents &= ~(ODM_COMP_DIG |ODM_COMP_FA_CNT);               
                break;
+       case HAL_DEF_DBG_RX_INFO_DUMP:
+               {
+                       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(odm->FalseAlmCnt);
+                       pDIG_T  pDM_DigTable = &odm->DM_DigTable;
+
+                       DBG_871X("============ Rx Info dump ===================\n");
+                       DBG_871X("bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x \n",
+                               odm->bLinked, odm->RSSI_Min, pDM_DigTable->CurIGValue);
+                       DBG_871X("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n",     
+                               FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all);
+
+                       if(odm->bLinked){
+                               DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", 
+                                       HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);     
+
+                               #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+                               rtw_dump_raw_rssi_info(adapter);
+                               #endif
+                       }
+               }               
+               break;          
        case HW_DEF_ODM_DBG_FLAG:
                ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u8Byte*)value));
                break;
@@ -1133,6 +1249,12 @@ SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
                }
        }
                break;
+       case HAL_DEF_DBG_DUMP_RXPKT:
+               hal_data->bDumpRxPkt = *((u8*)value);
+               break;
+       case HAL_DEF_DBG_DUMP_TXPKT:
+               hal_data->bDumpTxPkt = *((u8*)value);
+               break;
        case HAL_DEF_ANT_DETECT:
                hal_data->AntDetection = *((u8 *)value);
                break;
@@ -1153,30 +1275,141 @@ GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
        u8 bResult = _SUCCESS;
 
        switch(variable) {
-       case HW_DEF_ODM_DBG_FLAG:
-               *((u8Byte*)value) = odm->DebugComponents;
-               break;
-       case HW_DEF_ODM_DBG_LEVEL:
-               *((u4Byte*)value) = odm->DebugLevel;
-               break;
-       case HAL_DEF_DBG_DM_FUNC:
-               *(( u32*)value) =hal_data->odmpriv.SupportAbility;
-               break;
-       case HAL_DEF_ANT_DETECT:
-               *((u8 *)value) = hal_data->AntDetection;
-               break;
-       case HAL_DEF_MACID_SLEEP:
-               *(u8*)value = _FALSE;
-               break;
-       default:
-               DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
-               bResult = _FAIL;
-               break;
+               case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
+                       {
+                               struct mlme_priv *pmlmepriv;
+                               struct sta_priv *pstapriv;
+                               struct sta_info *psta;
+
+                               pmlmepriv = &adapter->mlmepriv;
+                               pstapriv = &adapter->stapriv;
+                               psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
+                               if (psta)
+                               {
+                                       *((int*)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;     
+                               }
+                       }
+                       break;
+               case HW_DEF_ODM_DBG_FLAG:
+                       *((u8Byte*)value) = odm->DebugComponents;
+                       break;
+               case HW_DEF_ODM_DBG_LEVEL:
+                       *((u4Byte*)value) = odm->DebugLevel;
+                       break;
+               case HAL_DEF_DBG_DM_FUNC:
+                       *(( u32*)value) =hal_data->odmpriv.SupportAbility;
+                       break;
+               case HAL_DEF_DBG_DUMP_RXPKT:
+                       *((u8*)value) = hal_data->bDumpRxPkt;
+                       break;
+               case HAL_DEF_DBG_DUMP_TXPKT:
+                       *((u8*)value) = hal_data->bDumpTxPkt;
+                       break;
+               case HAL_DEF_ANT_DETECT:
+                       *((u8 *)value) = hal_data->AntDetection;
+                       break;
+               case HAL_DEF_MACID_SLEEP:
+                       *(u8*)value = _FALSE;
+                       break;
+               case HAL_DEF_TX_PAGE_SIZE:
+                       *(( u32*)value) = PAGE_SIZE_128;
+                       break;
+               default:
+                       DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
+                       bResult = _FAIL;
+                       break;
        }
 
        return bResult;
 }
 
+void GetHalODMVar(     
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       PVOID                                   pValue2)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T podmpriv = &pHalData->odmpriv;
+       switch(eVariable){
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               case HAL_ODM_NOISE_MONITOR:
+                       {
+                               u8 chan = *(u8*)pValue1;
+                               *(s16 *)pValue2 = pHalData->noise[chan];
+                               #ifdef DBG_NOISE_MONITOR
+                               DBG_8192C("### Noise monitor chan(%d)-noise:%d (dBm) ###\n",
+                                       chan,pHalData->noise[chan]);
+                               #endif                  
+                                               
+                       }
+                       break;
+#endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+               default:
+                       break;
+       }
+}
+
+void SetHalODMVar(
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       BOOLEAN                                 bSet)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
+       PDM_ODM_T podmpriv = &pHalData->odmpriv;
+       //_irqL irqL;
+       switch(eVariable){
+               case HAL_ODM_STA_INFO:
+                       {       
+                               struct sta_info *psta = (struct sta_info *)pValue1;                             
+                               if(bSet){
+                                       DBG_8192C("### Set STA_(%d) info ###\n",psta->mac_id);
+                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);
+                               }
+                               else{
+                                       DBG_8192C("### Clean STA_(%d) info ###\n",psta->mac_id);
+                                       //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
+                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
+                                       
+                                       //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
+                                   }
+                       }
+                       break;
+               case HAL_ODM_P2P_STATE:         
+                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
+                       break;
+               case HAL_ODM_WIFI_DISPLAY_STATE:
+                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
+                       break;
+               #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)              
+               case HAL_ODM_NOISE_MONITOR:
+                       {
+                               struct noise_info *pinfo = (struct noise_info *)pValue1;
+
+                               #ifdef DBG_NOISE_MONITOR
+                               DBG_8192C("### Noise monitor chan(%d)-bPauseDIG:%d,IGIValue:0x%02x,max_time:%d (ms) ###\n",
+                                       pinfo->chan,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);
+                               #endif
+                               
+                               pHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);                              
+                               DBG_871X("chan_%d, noise = %d (dBm)\n",pinfo->chan,pHalData->noise[pinfo->chan]);
+                               #ifdef DBG_NOISE_MONITOR
+                               DBG_871X("noise_a = %d, noise_b = %d  noise_all:%d \n", 
+                                       podmpriv->noise_level.noise[ODM_RF_PATH_A], 
+                                       podmpriv->noise_level.noise[ODM_RF_PATH_B],
+                                       podmpriv->noise_level.noise_all);                                               
+                               #endif
+                       }
+                       break;
+               #endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+
+               default:
+                       break;
+       }
+}      
+
+
 BOOLEAN 
 eqNByte(
        u8*     str1,
@@ -1438,3 +1671,540 @@ isAllSpaceOrTab(
        return size == NumOfSpaceAndTab;
 }
 
+
+void rtw_hal_check_rxfifo_full(_adapter *adapter)
+{
+       struct dvobj_priv *psdpriv = adapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(adapter);
+       int save_cnt=_FALSE;
+       
+       //switch counter to RX fifo
+       if(IS_81XXC(pHalData->VersionID) || IS_92D(pHalData->VersionID) 
+               || IS_8188E(pHalData->VersionID) || IS_8723_SERIES(pHalData->VersionID)
+               || IS_8812_SERIES(pHalData->VersionID) || IS_8821_SERIES(pHalData->VersionID))
+       {
+               rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0);
+               save_cnt = _TRUE;
+       }
+       else if(IS_8723B_SERIES(pHalData->VersionID) || IS_8192E(pHalData->VersionID))
+       {
+               //printk("8723b or 8192e , MAC_667 set 0xf0\n");
+               rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
+               save_cnt = _TRUE;
+       }
+       //todo: other chips 
+               
+       if(save_cnt)
+       {
+               //rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0);
+               pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
+               pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
+               pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
+       }
+}
+
+void linked_info_dump(_adapter *padapter,u8 benable)
+{                      
+       struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
+
+       if(padapter->bLinkInfoDump == benable)
+               return;
+       
+       DBG_871X("%s %s \n",__FUNCTION__,(benable)?"enable":"disable");
+                                                                               
+       if(benable){
+               #ifdef CONFIG_LPS
+               pwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;//keep org value
+               rtw_pm_set_lps(padapter,PS_MODE_ACTIVE);
+               #endif  
+                                                               
+               #ifdef CONFIG_IPS       
+               pwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;//keep org value
+               rtw_pm_set_ips(padapter,IPS_NONE);
+               #endif  
+       }
+       else{
+               #ifdef CONFIG_IPS               
+               rtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);
+               #endif // CONFIG_IPS
+
+               #ifdef CONFIG_LPS       
+               rtw_pm_set_lps(padapter, pwrctrlpriv->ips_org_mode);
+               #endif // CONFIG_LPS
+       }
+       padapter->bLinkInfoDump = benable ;     
+}
+
+#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+void rtw_get_raw_rssi_info(void *sel, _adapter *padapter)
+{
+       u8 isCCKrate,rf_path;
+       PHAL_DATA_TYPE  pHalData =  GET_HAL_DATA(padapter);
+       struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
+       
+       DBG_871X_SEL_NL(sel,"RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n", 
+                       HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
+       isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE;
+
+       if(isCCKrate)
+               psample_pkt_rssi->mimo_singal_strength[0] = psample_pkt_rssi->pwdball;
+               
+       for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)
+       {
+               DBG_871X_SEL_NL(sel,"RF_PATH_%d=>singal_strength:%d(%%),singal_quality:%d(%%)\n" 
+                       ,rf_path,psample_pkt_rssi->mimo_singal_strength[rf_path],psample_pkt_rssi->mimo_singal_quality[rf_path]);
+               
+               if(!isCCKrate){
+                       DBG_871X_SEL_NL(sel,"\trx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\n",
+                       psample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]);
+               }
+       }       
+}
+
+void rtw_dump_raw_rssi_info(_adapter *padapter)
+{
+       u8 isCCKrate,rf_path;
+       PHAL_DATA_TYPE  pHalData =  GET_HAL_DATA(padapter);
+       struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
+       DBG_871X("============ RAW Rx Info dump ===================\n");
+       DBG_871X("RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n", 
+                       HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all); 
+
+       isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE;
+
+       if(isCCKrate)
+               psample_pkt_rssi->mimo_singal_strength[0] = psample_pkt_rssi->pwdball;
+               
+       for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)
+       {
+               DBG_871X("RF_PATH_%d=>singal_strength:%d(%%),singal_quality:%d(%%)" 
+                       ,rf_path,psample_pkt_rssi->mimo_singal_strength[rf_path],psample_pkt_rssi->mimo_singal_quality[rf_path]);
+               
+               if(!isCCKrate){
+                       printk(",rx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\n",
+                       psample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]);
+               }else{
+                       printk("\n");   
+               }
+       }       
+}
+
+void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe) 
+{
+       u8 isCCKrate,rf_path;
+       PHAL_DATA_TYPE  pHalData =  GET_HAL_DATA(padapter);
+       struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
+
+       PODM_PHY_INFO_T pPhyInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info);
+       struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
+       
+       psample_pkt_rssi->data_rate = pattrib->data_rate;
+       isCCKrate = (pattrib->data_rate <= DESC_RATE11M)?TRUE :FALSE;
+       
+       psample_pkt_rssi->pwdball = pPhyInfo->RxPWDBAll;
+       psample_pkt_rssi->pwr_all = pPhyInfo->RecvSignalPower;
+
+       for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)
+       {               
+               psample_pkt_rssi->mimo_singal_strength[rf_path] = pPhyInfo->RxMIMOSignalStrength[rf_path];
+               psample_pkt_rssi->mimo_singal_quality[rf_path] = pPhyInfo->RxMIMOSignalQuality[rf_path];
+               if(!isCCKrate){
+                       psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
+                       psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];         
+               }
+       }
+}
+#endif
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8* pContent = pEEPROM->efuse_eeprom_data;
+       int index = 0;
+       u16 tx_index_offset = 0x0000;
+
+       switch(padapter->chip_type) {
+               case RTL8723B:
+                       tx_index_offset = EEPROM_TX_PWR_INX_8723B;
+               break;
+               case RTL8188E:
+                       tx_index_offset = EEPROM_TX_PWR_INX_88E;
+               break;
+               case RTL8192E:
+                       tx_index_offset = EEPROM_TX_PWR_INX_8192E;
+               break;
+               default:
+                       tx_index_offset = 0x0010;
+               break;
+       }
+       for (index = 0 ; index < 12 ; index++) {
+               if (pContent[tx_index_offset + index] == 0xFF) {
+                       return _FALSE;
+               } else {
+                       DBG_871X("0x%02x ,", pContent[EEPROM_TX_PWR_INX_88E+index]);
+               }
+       }
+       DBG_871X("\n");
+       return _TRUE;
+}
+
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) {
+
+       u8 val = 0;
+       u16 addr_offset = 0x0000;
+
+       switch(padapter->chip_type) {
+               case RTL8723B:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI) {
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+               case RTL8188E:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_88EU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_88ES;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_88EE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI) {
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+       }
+
+       if (addr_offset == 0x0000) {
+               DBG_871X("phy efuse MAC addr offset is 0!!\n");
+               return _FALSE;
+       } else {
+               rtw_efuse_map_read(padapter, addr_offset, 1, &val);
+       }
+
+       if (val == 0xFF) {
+               return _FALSE;
+       } else {
+               DBG_871X("phy efuse with valid MAC addr\n");
+               return _TRUE;
+       }
+}
+
+u32 Hal_readPGDataFromConfigFile(
+       PADAPTER        padapter,
+       struct file *fp)
+{
+       u32 i;
+       mm_segment_t fs;
+       u8 temp[3];
+       loff_t pos = 0;
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8      *PROMContent = pEEPROM->efuse_eeprom_data;
+
+       temp[2] = 0; // add end of string '\0'
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+
+       for (i = 0 ; i < HWSET_MAX_SIZE ; i++) {
+               vfs_read(fp, temp, 2, &pos);
+               PROMContent[i] = simple_strtoul(temp, NULL, 16);
+               if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {
+                       //Filter the lates space char.
+                       vfs_read(fp, temp, 1, &pos);
+                       if (strchr(temp, ' ') == NULL) {
+                               pos--;
+                               vfs_read(fp, temp, 2, &pos);
+                       }
+               } else {
+                       pos += 1; // Filter the space character
+               }
+       }
+
+       set_fs(fs);
+       pEEPROM->bloadfile_fail_flag = _FALSE;
+
+#ifdef CONFIG_DEBUG
+       DBG_871X("Efuse configure file:\n");
+       for (i=0; i<HWSET_MAX_SIZE; i++)
+       {
+               if (i % 16 == 0)
+                       printk("\n");
+
+               printk("%02X ", PROMContent[i]);
+       }
+       printk("\n");
+#endif
+
+       return _SUCCESS;
+}
+
+void Hal_ReadMACAddrFromFile(
+       PADAPTER                padapter,
+       struct file *fp)
+{
+       u32 i;
+       mm_segment_t fs;
+       u8 source_addr[18];
+       loff_t pos = 0;
+       u32     curtime = rtw_get_current_time();
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+       u8 *head, *end;
+
+       _rtw_memset(source_addr, 0, 18);
+       _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+
+       DBG_871X("wifi mac address:\n");
+       vfs_read(fp, source_addr, 18, &pos);
+       source_addr[17] = ':';
+
+       head = end = source_addr;
+       for (i=0; i<ETH_ALEN; i++) {
+               while (end && (*end != ':') )
+                       end++;
+
+               if (end && (*end == ':') )
+                       *end = '\0';
+
+               pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
+
+               if (end) {
+                       end++;
+                       head = end;
+               }
+       }
+
+       set_fs(fs);
+       pEEPROM->bloadmac_fail_flag = _FALSE;
+
+       if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+               get_random_bytes(pEEPROM->mac_addr, ETH_ALEN);
+               pEEPROM->mac_addr[0] = 0x00;
+               pEEPROM->mac_addr[1] = 0xe0;
+               pEEPROM->mac_addr[2] = 0x4c;
+#else
+               pEEPROM->mac_addr[0] = 0x00;
+               pEEPROM->mac_addr[1] = 0xe0;
+               pEEPROM->mac_addr[2] = 0x4c;
+               pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
+               pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+               pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+                DBG_871X("MAC Address from wifimac error is invalid, assign random MAC !!!\n");
+       }
+
+       DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+                       __func__, pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
+                       pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
+                       pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
+}
+
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) {
+       int i = 0;
+       u16 addr_offset = 0x0000;
+
+       switch(padapter->chip_type) {
+               case RTL8723B:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_8723BE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI){
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+               case RTL8188E:
+                       if (padapter->interface_type == RTW_USB) {
+                               addr_offset = EEPROM_MAC_ADDR_88EU;
+                               DBG_871X("%s: interface is USB\n", __func__);
+                       } else if (padapter->interface_type == RTW_SDIO) {
+                               addr_offset = EEPROM_MAC_ADDR_88ES;
+                               DBG_871X("%s: interface is SDIO\n", __func__);
+                       } else if (padapter->interface_type == RTW_PCIE) {
+                               addr_offset = EEPROM_MAC_ADDR_88EE;
+                               DBG_871X("%s: interface is PCIE\n", __func__);
+                       } else if (padapter->interface_type == RTW_GSPI){
+                               //addr_offset = EEPROM_MAC_ADDR_8723BS;
+                               DBG_871X("%s: interface is GSPI\n", __func__);
+                       }
+               break;
+       }
+
+       rtw_efuse_map_read(padapter, addr_offset, ETH_ALEN, mac_addr);
+
+       if (rtw_check_invalid_mac_address(mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+               get_random_bytes(mac_addr, ETH_ALEN);
+               mac_addr[0] = 0x00;
+               mac_addr[1] = 0xe0;
+               mac_addr[2] = 0x4c;
+#else
+               mac_addr[0] = 0x00;
+               mac_addr[1] = 0xe0;
+               mac_addr[2] = 0x4c;
+               mac_addr[3] = (u8)(curtime & 0xff) ;
+               mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+               mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+                DBG_871X("MAC Address from phy efuse error, assign random MAC !!!\n");
+       }
+
+       DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+                       __func__, mac_addr[0], mac_addr[1], mac_addr[2],
+                       mac_addr[3], mac_addr[4], mac_addr[5]);
+}
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
+#ifdef CONFIG_RF_GAIN_OFFSET
+u32 Array_kfreemap[] = { 
+0xf8,0xe,
+0xf6,0xc,
+0xf4,0xa,
+0xf2,0x8,
+0xf0,0x6,
+0xf3,0x4,
+0xf5,0x2,
+0xf7,0x0,
+0xf9,0x0,
+0xfc,0x0,
+};
+
+void rtw_bb_rf_gain_offset(_adapter *padapter)
+{
+       u8              value = padapter->eeprompriv.EEPROMRFGainOffset;
+       u8              tmp = 0x3e;
+       u32     res,i=0;
+       u4Byte     ArrayLen    = sizeof(Array_kfreemap)/sizeof(u32);
+       pu4Byte    Array           = Array_kfreemap;
+       u4Byte v1=0,v2=0,target=0; 
+       //DBG_871X("+%s value: 0x%02x+\n", __func__, value);
+#if defined(CONFIG_RTL8723A)
+       if (value & BIT0) {
+               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){
+                       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_CCK, 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_OFDM, RF_GAIN_OFFSET_MASK, res);
+               }
+               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");
+       }
+#elif defined(CONFIG_RTL8723B)
+       if (value & BIT4) {
+               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){
+                       res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
+                       res &= 0xfff87fff;
+                       DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
+                       //res &= 0xfff87fff;
+                       for (i = 0; i < ArrayLen; i += 2 )
+                       {
+                               v1 = Array[i];
+                               v2 = Array[i+1];
+                                if ( v1 == padapter->eeprompriv.EEPROMRFGainVal )
+                                {
+                                               DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
+                                               target=v2;
+                                               break;
+                                }
+                       }        
+                       DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target);
+                       PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
+
+                       //res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
+                       //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, 0x7f, 0xffffffff);
+                       DBG_871X("Offset RF Gain. After reg 0x7f=0x%08x\n",res);
+               }
+               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");
+       }
+
+#elif defined(CONFIG_RTL8188E)
+       if (value & BIT4) {
+               DBG_871X("8188ES Offset RF Gain.\n");
+               DBG_871X("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n",
+                               padapter->eeprompriv.EEPROMRFGainVal);
+
+               if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
+                       res = rtw_hal_read_rfreg(padapter, RF_PATH_A,
+                                       REG_RF_BB_GAIN_OFFSET, 0xffffffff);
+
+                       DBG_871X("Offset RF Gain. reg 0x55=0x%x\n",res);
+                       res &= 0xfff87fff;
+
+                       res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f) << 15;
+                       DBG_871X("Offset RF Gain. res=0x%x\n",res);
+
+                       rtw_hal_write_rfreg(padapter, RF_PATH_A,
+                                       REG_RF_BB_GAIN_OFFSET,
+                                       RF_GAIN_OFFSET_MASK, res);
+               } else {
+                       DBG_871X("Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\n",
+                                       padapter->eeprompriv.EEPROMRFGainVal);
+               }
+       } else {
+               DBG_871X("Using the default RF gain.\n");
+       }
+#else
+       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);
+       } else {
+               DBG_871X("Using the default RF gain.\n");
+       }
+#endif
+       
+}
+#endif //CONFIG_RF_GAIN_OFFSET
+
+
index c84020e88f85eae1861b67b7dc6995b403a6cbfa..30803a9a5b7e850b6949c395d0485aa7d83da511 100755 (executable)
@@ -404,7 +404,7 @@ PHY_GetRateSectionIndexOfTxPowerByRate(
                        case rTxAGC_A_Rate54_24:         index = 1;             break;
                        case rTxAGC_A_CCK1_Mcs32:        index = 6;             break;
                        case rTxAGC_B_CCK11_A_CCK2_11:
-                               if ( BitMask == 0xffffff00 )
+                               if ( BitMask == bMaskH3Bytes )
                                        index = 7;
                                else if ( BitMask == 0x000000ff )
                                        index = 15;
@@ -2341,7 +2341,7 @@ PHY_GetTxPowerIndex(
        u8      txPower = 0x3E;
 
        if (IS_HARDWARE_TYPE_8813A(pAdapter)) {
-//#if (RTL8813A_SUPPORT==1)
+//#if (RTL8814A_SUPPORT==1)
 //             txPower = PHY_GetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate );
 //#endif
        }
@@ -2378,7 +2378,7 @@ PHY_SetTxPowerIndex(
        )
 {
        if (IS_HARDWARE_TYPE_8813A(pAdapter)) {
-//#if (RTL8813A_SUPPORT==1)
+//#if (RTL8814A_SUPPORT==1)
 //             PHY_SetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate );
 //#endif
        }
@@ -2605,7 +2605,7 @@ phy_ConfigMACWithParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->mac_reg = rtw_zmalloc(rlen);
+                               pHalData->mac_reg = rtw_zvmalloc(rlen);
                                if(pHalData->mac_reg) {
                                        _rtw_memcpy(pHalData->mac_reg, pHalData->para_file_buf, rlen);
                                        pHalData->mac_reg_len = rlen;
@@ -2694,7 +2694,7 @@ phy_ConfigBBWithParaFile(
 
        _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
 
-       if ((*pBufLen == 0) && (pBuf == NULL))
+       if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL))
        {
                rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);
        
@@ -2704,7 +2704,7 @@ phy_ConfigBBWithParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pBuf = rtw_zmalloc(rlen);
+                               pBuf = rtw_zvmalloc(rlen);
                                if(pBuf) {
                                        _rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
                                        *pBufLen = rlen;
@@ -2717,10 +2717,6 @@ phy_ConfigBBWithParaFile(
                                                case CONFIG_BB_AGC_TAB:
                                                        pHalData->bb_agc_tab = pBuf;
                                                        break;
-                                               default:
-                                                       DBG_871X("Unknown ConfigType!! %d\r\n", ConfigType);
-                                                       rtw_mfree(pBuf, rlen);
-                                                       break;
                                        }
                                }
                                else {
@@ -2731,7 +2727,7 @@ phy_ConfigBBWithParaFile(
        }
        else
        {
-               if ((*pBufLen != 0) && (pBuf != NULL)) {
+               if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
                        _rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen);
                        rtStatus = _SUCCESS;
                }
@@ -2873,7 +2869,7 @@ phy_ParseBBPgParaFile(
        {
                if(!IsCommentString(szLine))
                {
-                       if( isAllSpaceOrTab( szLine, sizeof( szLine ) ) )
+                       if( isAllSpaceOrTab( szLine, sizeof( *szLine ) ) )
                                continue;
 
                        // Get header info (relative value or exact value)
@@ -3161,7 +3157,7 @@ phy_ConfigBBWithPgParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->bb_phy_reg_pg = rtw_zmalloc(rlen);
+                               pHalData->bb_phy_reg_pg = rtw_zvmalloc(rlen);
                                if(pHalData->bb_phy_reg_pg) {
                                        _rtw_memcpy(pHalData->bb_phy_reg_pg, pHalData->para_file_buf, rlen);
                                        pHalData->bb_phy_reg_pg_len = rlen;
@@ -3224,7 +3220,7 @@ phy_ConfigBBWithMpParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->bb_phy_reg_mp = rtw_zmalloc(rlen);
+                               pHalData->bb_phy_reg_mp = rtw_zvmalloc(rlen);
                                if(pHalData->bb_phy_reg_mp) {
                                        _rtw_memcpy(pHalData->bb_phy_reg_mp, pHalData->para_file_buf, rlen);
                                        pHalData->bb_phy_reg_mp_len = rlen;
@@ -3350,7 +3346,7 @@ PHY_ConfigRFWithParaFile(
 
        _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
 
-       if ((*pBufLen == 0) && (pBuf == NULL))
+       if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL))
        {
                rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);
 
@@ -3360,7 +3356,7 @@ PHY_ConfigRFWithParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pBuf = rtw_zmalloc(rlen);
+                               pBuf = rtw_zvmalloc(rlen);
                                if(pBuf) {
                                        _rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
                                        *pBufLen = rlen;
@@ -3373,10 +3369,6 @@ PHY_ConfigRFWithParaFile(
                                                case ODM_RF_PATH_B:
                                                        pHalData->rf_radio_b = pBuf;
                                                        break;
-                                               default:
-                                                       DBG_871X("Unknown eRFPath!! %d\r\n", eRFPath);
-                                                       rtw_mfree(pBuf, rlen);
-                                                       break;
                                        }
                                }
                                else {
@@ -3387,7 +3379,7 @@ PHY_ConfigRFWithParaFile(
        }
        else
        {
-               if ((*pBufLen != 0) && (pBuf != NULL)) {
+               if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
                        _rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen);
                        rtStatus = _SUCCESS;
                }
@@ -3642,7 +3634,7 @@ PHY_ConfigRFWithTxPwrTrackParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->rf_tx_pwr_track = rtw_zmalloc(rlen);
+                               pHalData->rf_tx_pwr_track = rtw_zvmalloc(rlen);
                                if(pHalData->rf_tx_pwr_track) {
                                        _rtw_memcpy(pHalData->rf_tx_pwr_track, pHalData->para_file_buf, rlen);
                                        pHalData->rf_tx_pwr_track_len = rlen;
@@ -4011,7 +4003,7 @@ PHY_ConfigRFWithPowerLimitTableParaFile(
                        if (rlen > 0)
                        {
                                rtStatus = _SUCCESS;
-                               pHalData->rf_tx_pwr_lmt = rtw_zmalloc(rlen);
+                               pHalData->rf_tx_pwr_lmt = rtw_zvmalloc(rlen);
                                if(pHalData->rf_tx_pwr_lmt) {
                                        _rtw_memcpy(pHalData->rf_tx_pwr_lmt, pHalData->para_file_buf, rlen);
                                        pHalData->rf_tx_pwr_lmt_len = rlen;
@@ -4045,6 +4037,30 @@ PHY_ConfigRFWithPowerLimitTableParaFile(
 
        return rtStatus;
 }
-#endif
 
+void phy_free_filebuf(_adapter *padapter)
+{
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(padapter);
+       
+       if(pHalData->mac_reg)
+               rtw_vmfree(pHalData->mac_reg, pHalData->mac_reg_len);
+       if(pHalData->bb_phy_reg)
+               rtw_vmfree(pHalData->bb_phy_reg, pHalData->bb_phy_reg_len);
+       if(pHalData->bb_agc_tab)
+               rtw_vmfree(pHalData->bb_agc_tab, pHalData->bb_agc_tab_len);
+       if(pHalData->bb_phy_reg_pg)
+               rtw_vmfree(pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);
+       if(pHalData->bb_phy_reg_mp)
+               rtw_vmfree(pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);
+       if(pHalData->rf_radio_a)
+               rtw_vmfree(pHalData->rf_radio_a, pHalData->rf_radio_a_len);
+       if(pHalData->rf_radio_b)
+               rtw_vmfree(pHalData->rf_radio_b, pHalData->rf_radio_b_len);
+       if(pHalData->rf_tx_pwr_track)
+               rtw_vmfree(pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);
+       if(pHalData->rf_tx_pwr_lmt)
+               rtw_vmfree(pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);       
+       
+}
 
+#endif
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_hci/hal_sdio.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/hal/hal_hci/hal_sdio.c
new file mode 100755 (executable)
index 0000000..1ee0a9d
--- /dev/null
@@ -0,0 +1,112 @@
+/******************************************************************************
+ *
+ * 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 _HAL_SDIO_C_
+
+#include <drv_types.h>
+#include <hal_data.h>
+
+u8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+
+       if(pHalData->SdioTxOQTMaxFreeSpace < 8 )
+               pHalData->SdioTxOQTMaxFreeSpace = 8;
+
+       return pHalData->SdioTxOQTMaxFreeSpace; 
+}
+
+u8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+
+       if ((pHalData->SdioTxFIFOFreePage[PageIdx]+pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) >= (RequiredPageNum))
+               return _TRUE;
+       else
+               return _FALSE;
+}
+
+void rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       u8      DedicatedPgNum = 0;
+       u8      RequiredPublicFreePgNum = 0;
+       //_irqL irql;
+
+       //_enter_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql);
+
+       DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
+       if (RequiredPageNum <= DedicatedPgNum) {
+               pHalData->SdioTxFIFOFreePage[PageIdx] -= RequiredPageNum;
+       } else {
+               pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
+               RequiredPublicFreePgNum = RequiredPageNum - DedicatedPgNum;
+               pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
+       }
+
+       //_exit_critical_bh(&pHalData->SdioTxFIFOFreePageLock, &irql);
+}
+
+void rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       u32     page_size;
+       u32     lenHQ, lenNQ, lenLQ;
+
+       rtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE,&page_size);
+
+       lenHQ = ((numHQ + numPubQ) >> 1) * page_size;
+       lenNQ = ((numNQ + numPubQ) >> 1) * page_size;
+       lenLQ = ((numLQ + numPubQ) >> 1) * page_size;
+
+       pHalData->sdio_tx_max_len[HI_QUEUE_IDX] = (lenHQ > MAX_XMITBUF_SZ)? MAX_XMITBUF_SZ:lenHQ;
+       pHalData->sdio_tx_max_len[MID_QUEUE_IDX] = (lenNQ > MAX_XMITBUF_SZ)? MAX_XMITBUF_SZ:lenNQ;
+       pHalData->sdio_tx_max_len[LOW_QUEUE_IDX] = (lenLQ > MAX_XMITBUF_SZ)? MAX_XMITBUF_SZ:lenLQ;
+}
+
+u32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx)
+{
+       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       u32     deviceId, max_len;
+       
+
+       deviceId = ffaddr2deviceId(pdvobjpriv, queue_idx);
+       switch (deviceId) {
+               case WLAN_TX_HIQ_DEVICE_ID:
+                       max_len = pHalData->sdio_tx_max_len[HI_QUEUE_IDX];
+                       break;
+
+               case WLAN_TX_MIQ_DEVICE_ID:
+                       max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
+                       break;
+
+               case WLAN_TX_LOQ_DEVICE_ID:
+                       max_len = pHalData->sdio_tx_max_len[LOW_QUEUE_IDX];
+                       break;
+
+               default:
+                       max_len = pHalData->sdio_tx_max_len[MID_QUEUE_IDX];
+                       break;
+       }
+
+       return max_len;
+}
+
+
index 6d222a38417baf5130c2d8f07cd7019d7535bdef..9bbacbec539d57e4b7fce1687c1fa3818f8fdf38 100755 (executable)
@@ -49,6 +49,9 @@ void rtw_hal_def_value_init(_adapter *padapter)
 }
 void   rtw_hal_free_data(_adapter *padapter)
 {
+       //free HAL Data         
+       rtw_hal_data_deinit(padapter);
+       
        if (is_primary_adapter(padapter))
                if(padapter->HalFunc.free_hal_data)
                        padapter->HalFunc.free_hal_data(padapter);
@@ -98,11 +101,11 @@ void rtw_hal_init_opmode(_adapter *padapter)
 
        fw_state = get_fwstate(pmlmepriv);
 
-       if (fw_state | WIFI_ADHOC_STATE) 
+       if (fw_state & WIFI_ADHOC_STATE) 
                networkType = Ndis802_11IBSS;
-       else if (fw_state | WIFI_STATION_STATE)
+       else if (fw_state & WIFI_STATION_STATE)
                networkType = Ndis802_11Infrastructure;
-       else if (fw_state | WIFI_AP_STATE)
+       else if (fw_state & WIFI_AP_STATE)
                networkType = Ndis802_11APMode;
        else
                return;
@@ -153,26 +156,29 @@ uint       rtw_hal_init(_adapter *padapter)
 
                rtw_hal_init_opmode(padapter);
 
-               for (i = 0; i<dvobj->iface_nums; i++) {
-                       padapter = dvobj->padapters[i];
-                       padapter->hw_init_completed = _TRUE;
-               }
+               for (i = 0; i<dvobj->iface_nums; i++)
+                       dvobj->padapters[i]->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);
+
+               for (i = 0; i<dvobj->iface_nums; i++)
+                       rtw_sec_restore_wep_key(dvobj->padapters[i]);
 
                rtw_led_control(padapter, LED_CTL_POWER_ON);
 
                init_hw_mlme_ext(padapter);
+               
+#ifdef CONFIG_RF_GAIN_OFFSET
+               rtw_bb_rf_gain_offset(padapter);
+#endif //CONFIG_RF_GAIN_OFFSET
+
        }
        else{
-               for (i = 0; i<dvobj->iface_nums; i++) {
-                       padapter = dvobj->padapters[i];
-                       padapter->hw_init_completed = _FALSE;
-               }
+               for (i = 0; i<dvobj->iface_nums; i++)
+                       dvobj->padapters[i]->hw_init_completed = _FALSE;
                DBG_871X("rtw_hal_init: hal__init fail\n");
        }
 
@@ -246,10 +252,10 @@ void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID p
        if(padapter->HalFunc.SetHalODMVarHandler)
                padapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
 }
-void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet)
+void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2)
 {
        if(padapter->HalFunc.GetHalODMVarHandler)
-               padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
+               padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,pValue2);
 }
 
 void rtw_hal_enable_interrupt(_adapter *padapter)
index e0b56836b143584fc7e4d0af8cc6f73e179294c7..635a41985c2e206531680a513c4b248971319b1b 100755 (executable)
-/******************************************************************************\r
- *\r
- * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\r
- *\r
- * This program is free software; you can redistribute it and/or modify it\r
- * under the terms of version 2 of the GNU General Public License as\r
- * published by the Free Software Foundation.\r
- *\r
- * This program is distributed in the hope that it will be useful, but WITHOUT\r
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
- * more details.\r
- *\r
- * You should have received a copy of the GNU General Public License along with\r
- * this program; if not, write to the Free Software Foundation, Inc.,\r
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
- *\r
- *\r
- ******************************************************************************/\r
-#define _RTL8723B_CMD_C_\r
-\r
-#include <rtl8723b_hal.h>\r
-#include "hal_com_h2c.h"\r
-\r
-#define MAX_H2C_BOX_NUMS       4\r
-#define MESSAGE_BOX_SIZE               4\r
-\r
-#define RTL8723B_MAX_CMD_LEN   7\r
-#define RTL8723B_EX_MESSAGE_BOX_SIZE   4\r
-\r
-static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num)\r
-{\r
-       u8      read_down = _FALSE;\r
-       int     retry_cnts = 100;\r
-\r
-       u8 valid;\r
-\r
-       //DBG_8192C(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtw_read8(padapter,REG_HMETFR),msgbox_num);\r
-\r
-       do{\r
-               valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num);\r
-               if(0 == valid ){\r
-                       read_down = _TRUE;\r
-               }\r
-#ifdef CONFIG_WOWLAN\r
-               else\r
-                       rtw_msleep_os(1);               \r
-#endif\r
-       }while( (!read_down) && (retry_cnts--));\r
-\r
-       return read_down;\r
-\r
-}\r
-\r
-\r
-/*****************************************\r
-* H2C Msg format :\r
-*| 31 - 8              |7-5    | 4 - 0 |\r
-*| h2c_msg     |Class  |CMD_ID |\r
-*| 31-0                                                |\r
-*| Ext msg                                     |\r
-*\r
-******************************************/\r
-s32 FillH2CCmd8723B(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)\r
-{\r
-       u8 bcmd_down = _FALSE;\r
-       s32 retry_cnts = 100;\r
-       u8 h2c_box_num;\r
-       u32     msgbox_addr;\r
-       u32 msgbox_ex_addr=0;\r
-       PHAL_DATA_TYPE pHalData;\r
-       u32     h2c_cmd = 0;\r
-       u32     h2c_cmd_ex = 0;\r
-       s32 ret = _FAIL;\r
-       struct dvobj_priv *psdpriv = padapter->dvobj;\r
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\r
-_func_enter_;\r
-\r
-       padapter = GET_PRIMARY_ADAPTER(padapter);\r
-       pHalData = GET_HAL_DATA(padapter);\r
-#ifdef DBG_CHECK_FW_PS_STATE\r
-#ifdef DBG_CHECK_FW_PS_STATE_H2C\r
-       if(rtw_fw_ps_state(padapter) == _FAIL)\r
-       {\r
-               DBG_871X("%s: h2c doesn't leave 32k ElementID=%02x \n", __FUNCTION__, ElementID);\r
-               pdbgpriv->dbg_h2c_leave32k_fail_cnt++;\r
-       }\r
-\r
-       //DBG_871X("H2C ElementID=%02x , pHalData->LastHMEBoxNum=%02x\n", ElementID, pHalData->LastHMEBoxNum);\r
-#endif //DBG_CHECK_FW_PS_STATE_H2C\r
-#endif //DBG_CHECK_FW_PS_STATE\r
-       _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);\r
-\r
-       if (!pCmdBuffer) {\r
-               goto exit;\r
-       }\r
-       if(CmdLen > RTL8723B_MAX_CMD_LEN) {\r
-               goto exit;\r
-       }\r
-       if (padapter->bSurpriseRemoved == _TRUE)\r
-               goto exit;\r
-\r
-       //pay attention to if  race condition happened in  H2C cmd setting.\r
-       do{\r
-               h2c_box_num = pHalData->LastHMEBoxNum;\r
-\r
-               if(!_is_fw_read_cmd_down(padapter, h2c_box_num)){\r
-                       DBG_8192C(" fw read cmd failed...\n");\r
-#ifdef DBG_CHECK_FW_PS_STATE\r
-                       DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n", rtw_read32(padapter, 0x1c0), rtw_read32(padapter, 0x1c4)\r
-                               , rtw_read32(padapter, 0x1c8), rtw_read32(padapter, 0x1cc));\r
-#endif //DBG_CHECK_FW_PS_STATE\r
-                       //DBG_8192C(" 0x1c0: 0x%8x\n", rtw_read32(padapter, 0x1c0));\r
-                       //DBG_8192C(" 0x1c4: 0x%8x\n", rtw_read32(padapter, 0x1c4));\r
-                       goto exit;\r
-               }\r
-\r
-               if(CmdLen<=3)\r
-               {\r
-                       _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen );\r
-               }\r
-               else{\r
-                       _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, 3);\r
-                       _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3, CmdLen-3);\r
-//                     *(u8*)(&h2c_cmd) |= BIT(7);\r
-               }\r
-\r
-               *(u8*)(&h2c_cmd) |= ElementID;\r
-\r
-               if(CmdLen>3){\r
-                       msgbox_ex_addr = REG_HMEBOX_EXT0_8723B + (h2c_box_num *RTL8723B_EX_MESSAGE_BOX_SIZE);\r
-                       h2c_cmd_ex = le32_to_cpu( h2c_cmd_ex );\r
-                       rtw_write32(padapter, msgbox_ex_addr, h2c_cmd_ex);\r
-               }\r
-               msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE);\r
-               h2c_cmd = le32_to_cpu( h2c_cmd );\r
-               rtw_write32(padapter,msgbox_addr, h2c_cmd);\r
-\r
-               bcmd_down = _TRUE;\r
-\r
-               //DBG_8192C("MSG_BOX:%d, CmdLen(%d), CmdID(0x%x), reg:0x%x =>h2c_cmd:0x%.8x, reg:0x%x =>h2c_cmd_ex:0x%.8x\n"\r
-               //      ,pHalData->LastHMEBoxNum , CmdLen, ElementID, msgbox_addr, h2c_cmd, msgbox_ex_addr, h2c_cmd_ex);\r
-\r
-               pHalData->LastHMEBoxNum = (h2c_box_num+1) % MAX_H2C_BOX_NUMS;\r
-\r
-       }while((!bcmd_down) && (retry_cnts--));\r
-\r
-       ret = _SUCCESS;\r
-\r
-exit:\r
-\r
-       _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);     \r
-\r
-_func_exit_;\r
-\r
-       return ret;\r
-}\r
-\r
-static void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength)\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                                     *fctrl;\r
-       u32                                     rate_len, pktlen;\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       WLAN_BSSID_EX           *cur_network = &(pmlmeinfo->network);\r
-       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
-\r
-\r
-       //DBG_871X("%s\n", __FUNCTION__);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\r
-\r
-       fctrl = &(pwlanhdr->frame_ctl);\r
-       *(fctrl) = 0;\r
-\r
-       _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);\r
-\r
-       SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);\r
-       //pmlmeext->mgnt_seq++;\r
-       SetFrameSubType(pframe, WIFI_BEACON);\r
-\r
-       pframe += sizeof(struct rtw_ieee80211_hdr_3addr);\r
-       pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\r
-\r
-       //timestamp will be inserted by hardware\r
-       pframe += 8;\r
-       pktlen += 8;\r
-\r
-       // beacon interval: 2 bytes\r
-       _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);\r
-\r
-       pframe += 2;\r
-       pktlen += 2;\r
-\r
-       // capability info: 2 bytes\r
-       _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\r
-\r
-       pframe += 2;\r
-       pktlen += 2;\r
-\r
-       if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\r
-       {\r
-               //DBG_871X("ie len=%d\n", cur_network->IELength);\r
-               pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs);\r
-               _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen);\r
-\r
-               goto _ConstructBeacon;\r
-       }\r
-\r
-       //below for ad-hoc mode\r
-\r
-       // SSID\r
-       pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);\r
-\r
-       // supported rates...\r
-       rate_len = rtw_get_rateset_len(cur_network->SupportedRates);\r
-       pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);\r
-\r
-       // DS parameter set\r
-       pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);\r
-\r
-       if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\r
-       {\r
-               u32 ATIMWindow;\r
-               // IBSS Parameter Set...\r
-               //ATIMWindow = cur->Configuration.ATIMWindow;\r
-               ATIMWindow = 0;\r
-               pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);\r
-       }\r
-\r
-\r
-       //todo: ERP IE\r
-\r
-\r
-       // EXTERNDED SUPPORTED RATE\r
-       if (rate_len > 8)\r
-       {\r
-               pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);\r
-       }\r
-\r
-\r
-       //todo:HT for adhoc\r
-\r
-_ConstructBeacon:\r
-\r
-       if ((pktlen + TXDESC_SIZE) > 512)\r
-       {\r
-               DBG_871X("beacon frame too large\n");\r
-               return;\r
-       }\r
-\r
-       *pLength = pktlen;\r
-\r
-       //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen);\r
-\r
-}\r
-\r
-static void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength)\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                                     *fctrl;\r
-       u32                                     pktlen;\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-\r
-       //DBG_871X("%s\n", __FUNCTION__);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\r
-\r
-       // Frame control.\r
-       fctrl = &(pwlanhdr->frame_ctl);\r
-       *(fctrl) = 0;\r
-       SetPwrMgt(fctrl);\r
-       SetFrameSubType(pframe, WIFI_PSPOLL);\r
-\r
-       // AID.\r
-       SetDuration(pframe, (pmlmeinfo->aid | 0xc000));\r
-\r
-       // BSSID.\r
-       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-\r
-       // TA.\r
-       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-\r
-       *pLength = 16;\r
-}\r
-\r
-static void ConstructNullFunctionData(\r
-       PADAPTER padapter,\r
-       u8              *pframe,\r
-       u32             *pLength,\r
-       u8              *StaAddr,\r
-       u8              bQoS,\r
-       u8              AC,\r
-       u8              bEosp,\r
-       u8              bForcePowerSave)\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                                             *fctrl;\r
-       u32                                             pktlen;\r
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;\r
-       struct wlan_network             *cur_network = &pmlmepriv->cur_network;\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-\r
-\r
-       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\r
-\r
-       fctrl = &pwlanhdr->frame_ctl;\r
-       *(fctrl) = 0;\r
-       if (bForcePowerSave)\r
-       {\r
-               SetPwrMgt(fctrl);\r
-       }\r
-\r
-       switch(cur_network->network.InfrastructureMode)\r
-       {\r
-               case Ndis802_11Infrastructure:\r
-                       SetToDs(fctrl);\r
-                       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-                       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-                       _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN);\r
-                       break;\r
-               case Ndis802_11APMode:\r
-                       SetFrDs(fctrl);\r
-                       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\r
-                       _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-                       _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-                       break;\r
-               case Ndis802_11IBSS:\r
-               default:\r
-                       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\r
-                       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-                       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-                       break;\r
-       }\r
-\r
-       SetSeqNum(pwlanhdr, 0);\r
-\r
-       if (bQoS == _TRUE) {\r
-               struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;\r
-\r
-               SetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\r
-\r
-               pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;\r
-               SetPriority(&pwlanqoshdr->qc, AC);\r
-               SetEOSP(&pwlanqoshdr->qc, bEosp);\r
-\r
-               pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\r
-       } else {\r
-               SetFrameSubType(pframe, WIFI_DATA_NULL);\r
-\r
-               pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\r
-       }\r
-\r
-       *pLength = pktlen;\r
-}\r
-\r
-\r
-#ifdef CONFIG_WOWLAN   \r
-//\r
-// Description:\r
-//     Construct the ARP response packet to support ARP offload.\r
-//\r
-static void ConstructARPResponse(\r
-       PADAPTER padapter,\r
-       u8                      *pframe,\r
-       u32                     *pLength,\r
-       u8                      *pIPAddress\r
-       )\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                                             *fctrl;\r
-       u32                                             pktlen;\r
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;\r
-       struct wlan_network             *cur_network = &pmlmepriv->cur_network;\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       struct security_priv *psecuritypriv = &padapter->securitypriv;\r
-       static u8                       ARPLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06};\r
-       u8                              *pARPRspPkt = pframe;\r
-       //for TKIP Cal MIC\r
-       u8                              *payload = pframe;\r
-       u8                      EncryptionHeadOverhead = 0;\r
-       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\r
-\r
-       fctrl = &pwlanhdr->frame_ctl;\r
-       *(fctrl) = 0;\r
-\r
-       //-------------------------------------------------------------------------\r
-       // MAC Header.\r
-       //-------------------------------------------------------------------------\r
-       SetFrameType(fctrl, WIFI_DATA);\r
-       //SetFrameSubType(fctrl, 0);\r
-       SetToDs(fctrl);\r
-       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-\r
-       SetSeqNum(pwlanhdr, 0);\r
-       SetDuration(pwlanhdr, 0);\r
-       //SET_80211_HDR_FRAME_CONTROL(pARPRspPkt, 0);\r
-       //SET_80211_HDR_TYPE_AND_SUBTYPE(pARPRspPkt, Type_Data);\r
-       //SET_80211_HDR_TO_DS(pARPRspPkt, 1);\r
-       //SET_80211_HDR_ADDRESS1(pARPRspPkt, pMgntInfo->Bssid);\r
-       //SET_80211_HDR_ADDRESS2(pARPRspPkt, Adapter->CurrentAddress);\r
-       //SET_80211_HDR_ADDRESS3(pARPRspPkt, pMgntInfo->Bssid);\r
-\r
-       //SET_80211_HDR_DURATION(pARPRspPkt, 0);\r
-       //SET_80211_HDR_FRAGMENT_SEQUENCE(pARPRspPkt, 0);\r
-#ifdef CONFIG_WAPI_SUPPORT\r
-       *pLength = sMacHdrLng;\r
-#else\r
-       *pLength = 24;\r
-#endif\r
-\r
-//YJ,del,120503\r
-#if 0\r
-       //-------------------------------------------------------------------------\r
-       // Qos Header: leave space for it if necessary.\r
-       //-------------------------------------------------------------------------\r
-       if(pStaQos->CurrentQosMode > QOS_DISABLE)\r
-       {\r
-               SET_80211_HDR_QOS_EN(pARPRspPkt, 1);\r
-               PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng);\r
-               *pLength += sQoSCtlLng;\r
-       }\r
-#endif\r
-       //-------------------------------------------------------------------------\r
-       // Security Header: leave space for it if necessary.\r
-       //-------------------------------------------------------------------------\r
-\r
-#if 1\r
-       switch (psecuritypriv->dot11PrivacyAlgrthm)\r
-       {\r
-               case _WEP40_:\r
-               case _WEP104_:\r
-                       EncryptionHeadOverhead = 4;\r
-                       break;\r
-               case _TKIP_:\r
-                       EncryptionHeadOverhead = 8;     \r
-                       break;                  \r
-               case _AES_:\r
-                       EncryptionHeadOverhead = 8;\r
-                       break;\r
-#ifdef CONFIG_WAPI_SUPPORT\r
-               case _SMS4_:\r
-                       EncryptionHeadOverhead = 18;\r
-                       break;\r
-#endif                 \r
-               default:\r
-                       EncryptionHeadOverhead = 0;\r
-       }\r
-       \r
-       if(EncryptionHeadOverhead > 0)\r
-       {\r
-               _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);\r
-               *pLength += EncryptionHeadOverhead;\r
-               //SET_80211_HDR_WEP(pARPRspPkt, 1);  //Suggested by CCW.\r
-               SetPrivacy(fctrl);\r
-       }       \r
-#endif\r
-       //-------------------------------------------------------------------------\r
-       // Frame Body.\r
-       //-------------------------------------------------------------------------\r
-       pARPRspPkt =  (u8*)(pframe+ *pLength);\r
-       payload = pARPRspPkt; //Get Payload pointer\r
-       // LLC header\r
-       _rtw_memcpy(pARPRspPkt, ARPLLCHeader, 8);       \r
-       *pLength += 8;\r
-\r
-       // ARP element\r
-       pARPRspPkt += 8;\r
-       SET_ARP_PKT_HW(pARPRspPkt, 0x0100);\r
-       SET_ARP_PKT_PROTOCOL(pARPRspPkt, 0x0008);       // IP protocol\r
-       SET_ARP_PKT_HW_ADDR_LEN(pARPRspPkt, 6);\r
-       SET_ARP_PKT_PROTOCOL_ADDR_LEN(pARPRspPkt, 4);\r
-       SET_ARP_PKT_OPERATION(pARPRspPkt, 0x0200); // ARP response\r
-       SET_ARP_PKT_SENDER_MAC_ADDR(pARPRspPkt, myid(&(padapter->eeprompriv)));\r
-       SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress);\r
-#ifdef CONFIG_ARP_KEEP_ALIVE\r
-       if (rtw_gw_addr_query(padapter)==0) {\r
-               SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, pmlmepriv->gw_mac_addr);\r
-               SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pmlmepriv->gw_ip);\r
-       }\r
-       else\r
-#endif\r
-       {\r
-               SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, get_my_bssid(&(pmlmeinfo->network)));\r
-               SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pIPAddress);\r
-               DBG_871X("%s Target Mac Addr:" MAC_FMT "\n", __FUNCTION__, MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));\r
-               DBG_871X("%s Target IP Addr" IP_FMT "\n", __FUNCTION__, IP_ARG(pIPAddress));\r
-       }\r
-       \r
-       *pLength += 28;\r
-\r
-       if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_)\r
-       {\r
-               u8      mic[8];\r
-               struct mic_data micdata;\r
-               struct sta_info *psta = NULL;\r
-               u8      priority[4]={0x0,0x0,0x0,0x0};\r
-               u8      null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};\r
-\r
-               DBG_871X("%s(): Add MIC\n",__FUNCTION__);\r
-\r
-               psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(&(pmlmeinfo->network)));\r
-               if (psta != NULL) {\r
-                       if(_rtw_memcmp(&psta->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){\r
-                               DBG_871X("%s(): STA dot11tkiptxmickey==0\n",__FUNCTION__);\r
-                       }\r
-                       //start to calculate the mic code\r
-                       rtw_secmicsetkey(&micdata, &psta->dot11tkiptxmickey.skey[0]);\r
-               }\r
-\r
-               rtw_secmicappend(&micdata, pwlanhdr->addr3, 6);  //DA\r
-\r
-               rtw_secmicappend(&micdata, pwlanhdr->addr2, 6); //SA\r
-\r
-               priority[0]=0;\r
-               rtw_secmicappend(&micdata, &priority[0], 4);\r
-\r
-               rtw_secmicappend(&micdata, payload, 36); //payload length = 8 + 28\r
-\r
-               rtw_secgetmic(&micdata,&(mic[0]));\r
-\r
-               pARPRspPkt += 28;\r
-               _rtw_memcpy(pARPRspPkt, &(mic[0]),8);\r
-\r
-               *pLength += 8;\r
-       }\r
-}\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-static void ConstructPnoInfo(\r
-       PADAPTER padapter,\r
-       u8                      *pframe,\r
-       u32                     *pLength\r
-       )\r
-{\r
-\r
-       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\r
-\r
-       u8      *pPnoInfoPkt = pframe;\r
-       pPnoInfoPkt =  (u8*)(pframe+ *pLength);\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 4);\r
-\r
-       *pLength+=4;\r
-       pPnoInfoPkt += 4;\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 4);\r
-\r
-       *pLength+=4;\r
-       pPnoInfoPkt += 4;\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_iterations, 4);\r
-\r
-       *pLength+=4;\r
-       pPnoInfoPkt += 4;\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->slow_scan_period, 4);\r
-\r
-       *pLength+=4;\r
-       pPnoInfoPkt += 4;\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_length,\r
-                       MAX_PNO_LIST_COUNT);\r
-\r
-       *pLength+=MAX_PNO_LIST_COUNT;\r
-       pPnoInfoPkt += MAX_PNO_LIST_COUNT;\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_chiper_info,\r
-                       MAX_PNO_LIST_COUNT);\r
-\r
-       *pLength+=MAX_PNO_LIST_COUNT;\r
-       pPnoInfoPkt += MAX_PNO_LIST_COUNT;\r
-       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_channel_info,\r
-                       MAX_PNO_LIST_COUNT);\r
-\r
-       *pLength+=MAX_PNO_LIST_COUNT;\r
-       pPnoInfoPkt += MAX_PNO_LIST_COUNT;\r
-}\r
-\r
-static void ConstructSSIDList(\r
-       PADAPTER padapter,\r
-       u8                      *pframe,\r
-       u32                     *pLength\r
-       )\r
-{\r
-       int i = 0;\r
-       u8      *pSSIDListPkt = pframe;\r
-       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\r
-\r
-       pSSIDListPkt =  (u8*)(pframe+ *pLength);\r
-\r
-       for(i = 0; i < pwrctl->pnlo_info->ssid_num ; i++) {\r
-               _rtw_memcpy(pSSIDListPkt, &pwrctl->pno_ssid_list->node[i].SSID,\r
-                       pwrctl->pnlo_info->ssid_length[i]);\r
-\r
-               *pLength += WLAN_SSID_MAXLEN;\r
-               pSSIDListPkt += WLAN_SSID_MAXLEN;\r
-       }\r
-}\r
-\r
-static void ConstructScanInfo(\r
-       PADAPTER padapter,\r
-       u8                      *pframe,\r
-       u32                     *pLength\r
-       )\r
-{\r
-       int i = 0;\r
-       u8      *pScanInfoPkt = pframe;\r
-       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\r
-\r
-       pScanInfoPkt =  (u8*)(pframe+ *pLength);\r
-\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->channel_num, 1);\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_ch, 1);\r
-\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_bw, 1);\r
-\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_40_offset, 1);\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_80_offset, 1);\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->periodScan, 1);\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->period_scan_time, 1);\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->enableRFE, 1);\r
-\r
-       *pLength+=1;\r
-       pScanInfoPkt += 1;\r
-       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->rfe_type, 8);\r
-\r
-       *pLength+=8;\r
-       pScanInfoPkt += 8;\r
-\r
-       for(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i ++) {\r
-               _rtw_memcpy(pScanInfoPkt,\r
-                       &pwrctl->pscan_info->ssid_channel_info[i], 4);\r
-               *pLength+=4;\r
-               pScanInfoPkt += 4;\r
-       }\r
-}\r
-#endif\r
-\r
-#ifdef CONFIG_GTK_OL\r
-static void ConstructGTKResponse(\r
-       PADAPTER padapter,\r
-       u8                      *pframe,\r
-       u32                     *pLength\r
-       )\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                                             *fctrl;\r
-       u32                                             pktlen;\r
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;\r
-       struct wlan_network             *cur_network = &pmlmepriv->cur_network;\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       struct security_priv *psecuritypriv = &padapter->securitypriv;\r
-       static u8                       LLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E};\r
-       static u8                       GTKbody_a[11] ={0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B};\r
-       u8                              *pGTKRspPkt = pframe;\r
-       u8                      EncryptionHeadOverhead = 0;\r
-       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\r
-\r
-       fctrl = &pwlanhdr->frame_ctl;\r
-       *(fctrl) = 0;\r
-\r
-       //-------------------------------------------------------------------------\r
-       // MAC Header.\r
-       //-------------------------------------------------------------------------\r
-       SetFrameType(fctrl, WIFI_DATA);\r
-       //SetFrameSubType(fctrl, 0);\r
-       SetToDs(fctrl);\r
-       _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\r
-\r
-       SetSeqNum(pwlanhdr, 0);\r
-       SetDuration(pwlanhdr, 0);\r
-\r
-#ifdef CONFIG_WAPI_SUPPORT\r
-       *pLength = sMacHdrLng;\r
-#else\r
-       *pLength = 24;\r
-#endif //CONFIG_WAPI_SUPPORT\r
-\r
-//YJ,del,120503\r
-#if 0\r
-       //-------------------------------------------------------------------------\r
-       // Qos Header: leave space for it if necessary.\r
-       //-------------------------------------------------------------------------\r
-       if(pStaQos->CurrentQosMode > QOS_DISABLE)\r
-       {\r
-               SET_80211_HDR_QOS_EN(pGTKRspPkt, 1);\r
-               PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng);\r
-               *pLength += sQoSCtlLng;\r
-       }\r
-#endif //0\r
-       //-------------------------------------------------------------------------\r
-       // Security Header: leave space for it if necessary.\r
-       //-------------------------------------------------------------------------\r
-\r
-#if 1\r
-       switch (psecuritypriv->dot11PrivacyAlgrthm)\r
-       {\r
-               case _WEP40_:\r
-               case _WEP104_:\r
-                       EncryptionHeadOverhead = 4;\r
-                       break;\r
-               case _TKIP_:\r
-                       EncryptionHeadOverhead = 8;     \r
-                       break;                  \r
-               case _AES_:\r
-                       EncryptionHeadOverhead = 8;\r
-                       break;\r
-#ifdef CONFIG_WAPI_SUPPORT\r
-               case _SMS4_:\r
-                       EncryptionHeadOverhead = 18;\r
-                       break;\r
-#endif //CONFIG_WAPI_SUPPORT\r
-               default:\r
-                       EncryptionHeadOverhead = 0;\r
-       }\r
-       \r
-       if(EncryptionHeadOverhead > 0)\r
-       {\r
-               _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);\r
-               *pLength += EncryptionHeadOverhead;\r
-               //SET_80211_HDR_WEP(pGTKRspPkt, 1);  //Suggested by CCW.\r
-               //GTK's privacy bit is done by FW\r
-               //SetPrivacy(fctrl);\r
-       }       \r
-#endif //1\r
-       //-------------------------------------------------------------------------\r
-       // Frame Body.\r
-       //-------------------------------------------------------------------------\r
-       pGTKRspPkt =  (u8*)(pframe+ *pLength); \r
-       // LLC header\r
-       _rtw_memcpy(pGTKRspPkt, LLCHeader, 8);  \r
-       *pLength += 8;\r
-\r
-       // GTK element\r
-       pGTKRspPkt += 8;\r
-       \r
-       //GTK frame body after LLC, part 1\r
-       _rtw_memcpy(pGTKRspPkt, GTKbody_a, 11); \r
-       *pLength += 11;\r
-       pGTKRspPkt += 11;\r
-       //GTK frame body after LLC, part 2\r
-       _rtw_memset(&(pframe[*pLength]), 0, 88);\r
-       *pLength += 88;\r
-       pGTKRspPkt += 88;\r
-\r
-}\r
-#endif //CONFIG_GTK_OL\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength)\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                             *fctrl;\r
-       u32                             pktlen;\r
-       unsigned char                   *mac;\r
-       unsigned char                   bssrate[NumRates];\r
-       struct xmit_priv                *pxmitpriv = &(padapter->xmitpriv);\r
-       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       int     bssrate_len = 0;\r
-       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\r
-       mac = myid(&(padapter->eeprompriv));\r
-\r
-       fctrl = &(pwlanhdr->frame_ctl);\r
-       *(fctrl) = 0;\r
-\r
-       //broadcast probe request frame\r
-       _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);\r
-\r
-       _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\r
-\r
-       SetSeqNum(pwlanhdr, 0);\r
-       SetFrameSubType(pframe, WIFI_PROBEREQ);\r
-\r
-       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\r
-       pframe += pktlen;\r
-\r
-       pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);\r
-\r
-       get_rate_set(padapter, bssrate, &bssrate_len);\r
-\r
-       if (bssrate_len > 8)\r
-       {\r
-               pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &pktlen);\r
-               pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &pktlen);\r
-       }\r
-       else\r
-       {\r
-               pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &pktlen);\r
-       }\r
-\r
-       *pLength = pktlen;\r
-}\r
-#endif //CONFIG_PNO_SUPPORT\r
-#endif //CONFIG_WOWLAN\r
-\r
-static void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID)\r
-{\r
-       struct rtw_ieee80211_hdr        *pwlanhdr;\r
-       u16                                     *fctrl;\r
-       u8                                      *mac, *bssid;\r
-       u32                                     pktlen;\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       WLAN_BSSID_EX           *cur_network = &(pmlmeinfo->network);\r
-\r
-\r
-       //DBG_871X("%s\n", __FUNCTION__);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\r
-\r
-       mac = myid(&(padapter->eeprompriv));\r
-       bssid = cur_network->MacAddress;\r
-\r
-       fctrl = &(pwlanhdr->frame_ctl);\r
-       *(fctrl) = 0;\r
-       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN);\r
-\r
-       SetSeqNum(pwlanhdr, 0);\r
-       SetFrameSubType(fctrl, WIFI_PROBERSP);\r
-\r
-       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\r
-       pframe += pktlen;\r
-\r
-       if(cur_network->IELength>MAX_IE_SZ)\r
-               return;\r
-\r
-       _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\r
-       pframe += cur_network->IELength;\r
-       pktlen += cur_network->IELength;\r
-\r
-       *pLength = pktlen;\r
-}\r
-\r
-// To check if reserved page content is destroyed by beacon beacuse beacon is too large.\r
-// 2010.06.23. Added by tynli.\r
-VOID\r
-CheckFwRsvdPageContent(\r
-       IN      PADAPTER                Adapter\r
-)\r
-{\r
-       HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(Adapter);\r
-       u32     MaxBcnPageNum;\r
-\r
-       if(pHalData->FwRsvdPageStartOffset != 0)\r
-       {\r
-               /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize);\r
-               RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset),\r
-                       ("CheckFwRsvdPageContent(): The reserved page content has been"\\r
-                       "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!",\r
-                       MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/\r
-       }\r
-}\r
-\r
-static void rtl8723b_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)\r
-{\r
-       u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};\r
-\r
-       DBG_871X("8723BRsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\n",  \r
-               rsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll,\r
-               rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull,\r
-               rsvdpageloc->LocBTQosNull);\r
-\r
-       SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp);\r
-       SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll);\r
-       SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData);\r
-       SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull);\r
-       SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull);\r
-       \r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CRsvdPageParm:", u1H2CRsvdPageParm, H2C_RSVDPAGE_LOC_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm);\r
-}\r
-\r
-static void rtl8723b_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)\r
-{\r
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\r
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;\r
-       u8      res = 0, count = 0;\r
-#ifdef CONFIG_WOWLAN   \r
-       u8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};\r
-\r
-       DBG_871X("8723BAOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\n",  \r
-                       rsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp,\r
-                       rsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp,\r
-                       rsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq,\r
-                       rsvdpageloc->LocNetList);\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-       DBG_871X("NLO_INFO=%d\n", rsvdpageloc->LocPNOInfo);\r
-#endif\r
-       if (check_fwstate(pmlmepriv, _FW_LINKED)) {\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo);\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp);\r
-       //SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv);\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp);\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo);\r
-#ifdef CONFIG_GTK_OL\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM);\r
-#endif // CONFIG_GTK_OL\r
-       } else {\r
-#ifdef CONFIG_PNO_SUPPORT\r
-               if(!pwrpriv->pno_in_resume) {\r
-                       SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocPNOInfo);\r
-               }\r
-#endif\r
-       }\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CAoacRsvdPageParm:", u1H2CAoacRsvdPageParm, H2C_AOAC_RSVDPAGE_LOC_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm);\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-       if (!check_fwstate(pmlmepriv, WIFI_AP_STATE) &&\r
-                       !check_fwstate(pmlmepriv, _FW_LINKED) &&\r
-                       pwrpriv->pno_in_resume == _FALSE) {\r
-\r
-               res = rtw_read8(padapter, 0x1b8);\r
-               while(res == 0 && count < 25) {\r
-                       DBG_871X("[%d] FW loc_NLOInfo: %d\n", count, res);\r
-                       res = rtw_read8(padapter, 0x1b8);\r
-                       count++;\r
-                       rtw_msleep_os(2);\r
-               }\r
-       }\r
-#endif // CONFIG_PNO_SUPPORT\r
-#endif // CONFIG_WOWLAN\r
-}\r
-\r
-#ifdef CONFIG_AP_WOWLAN\r
-static void rtl8723b_set_ap_wow_rsvdpage_cmd(PADAPTER padapter,\r
-               PRSVDPAGE_LOC rsvdpageloc)\r
-{\r
-       struct  pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\r
-       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;\r
-       u8      res = 0, count = 0, header = 0;\r
-       u8 rsvdparm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};\r
-\r
-       header = rtw_read8(padapter, REG_BCNQ_BDNY);\r
-\r
-       DBG_871X("%s: beacon: %d, probeRsp: %d, header:0x%02x\n", __func__,\r
-                       rsvdpageloc->LocApOffloadBCN,\r
-                       rsvdpageloc->LocProbeRsp,\r
-                       header);\r
-\r
-       SET_8723B_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(rsvdparm,\r
-                       rsvdpageloc->LocApOffloadBCN + header);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_BCN_RSVDPAGE,\r
-                       H2C_BCN_RSVDPAGE_LEN, rsvdparm);\r
-\r
-       rtw_msleep_os(10);\r
-\r
-       _rtw_memset(&rsvdparm, 0, sizeof(rsvdparm));\r
-\r
-       SET_8723B_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(\r
-                       rsvdparm,\r
-                       rsvdpageloc->LocProbeRsp + header);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_PROBERSP_RSVDPAGE,\r
-                       H2C_PROBERSP_RSVDPAGE_LEN, rsvdparm);\r
-\r
-       rtw_msleep_os(10);\r
-}\r
-#endif //CONFIG_AP_WOWLAN\r
-\r
-void rtl8723b_set_FwMediaStatusRpt_cmd(PADAPTER        padapter, u8 mstatus, u8 macid)\r
-{\r
-       u8 u1H2CMediaStatusRptParm[H2C_MEDIA_STATUS_RPT_LEN]={0};\r
-       u8 macid_end = 0;\r
-\r
-       DBG_871X("%s(): mstatus = %d macid=%d\n", __func__, mstatus, macid);\r
-\r
-       SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(u1H2CMediaStatusRptParm, mstatus);\r
-       SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(u1H2CMediaStatusRptParm, 0);\r
-       SET_8723B_H2CCMD_MSRRPT_PARM_MACID(u1H2CMediaStatusRptParm, macid);\r
-       SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(u1H2CMediaStatusRptParm, macid_end);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CMediaStatusRptParm:", u1H2CMediaStatusRptParm, H2C_MEDIA_STATUS_RPT_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_MEDIA_STATUS_RPT, H2C_MEDIA_STATUS_RPT_LEN, u1H2CMediaStatusRptParm);\r
-}\r
-\r
-static void rtl8723b_set_FwKeepAlive_cmd(PADAPTER padapter, u8 benable, u8 pkt_type)\r
-{\r
-       u8 u1H2CKeepAliveParm[H2C_KEEP_ALIVE_CTRL_LEN]={0};\r
-       u8 adopt = 1, check_period = 5;\r
-\r
-       DBG_871X("%s(): benable = %d\n", __func__, benable);\r
-       SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(u1H2CKeepAliveParm, benable);\r
-       SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(u1H2CKeepAliveParm, adopt);\r
-       SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(u1H2CKeepAliveParm, pkt_type);\r
-       SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(u1H2CKeepAliveParm, check_period);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CKeepAliveParm:", u1H2CKeepAliveParm, H2C_KEEP_ALIVE_CTRL_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_KEEP_ALIVE, H2C_KEEP_ALIVE_CTRL_LEN, u1H2CKeepAliveParm);\r
-}\r
-\r
-static void rtl8723b_set_FwDisconDecision_cmd(PADAPTER padapter, u8 benable)\r
-{\r
-       u8 u1H2CDisconDecisionParm[H2C_DISCON_DECISION_LEN]={0};\r
-       u8 adopt = 1, check_period = 10, trypkt_num = 0;\r
-\r
-       DBG_871X("%s(): benable = %d\n", __func__, benable);\r
-       SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(u1H2CDisconDecisionParm, benable);\r
-       SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(u1H2CDisconDecisionParm, adopt);\r
-       SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(u1H2CDisconDecisionParm, check_period);\r
-       SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(u1H2CDisconDecisionParm, trypkt_num);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CDisconDecisionParm:", u1H2CDisconDecisionParm, H2C_DISCON_DECISION_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_DISCON_DECISION, H2C_DISCON_DECISION_LEN, u1H2CDisconDecisionParm);\r
-}\r
-\r
-void rtl8723b_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask)\r
-{\r
-       u8 u1H2CMacIdConfigParm[H2C_MACID_CFG_LEN]={0};\r
-\r
-       DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x\n", __func__, mac_id, raid, bw, mask);\r
-       \r
-_func_enter_;\r
-\r
-       SET_8723B_H2CCMD_MACID_CFG_MACID(u1H2CMacIdConfigParm, mac_id);\r
-       SET_8723B_H2CCMD_MACID_CFG_RAID(u1H2CMacIdConfigParm, raid);\r
-       SET_8723B_H2CCMD_MACID_CFG_SGI_EN(u1H2CMacIdConfigParm, (sgi)? 1:0);\r
-       SET_8723B_H2CCMD_MACID_CFG_BW(u1H2CMacIdConfigParm, bw);\r
-       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK0(u1H2CMacIdConfigParm, (u8)(mask & 0x000000ff));\r
-       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK1(u1H2CMacIdConfigParm, (u8)((mask & 0x0000ff00) >>8));\r
-       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK2(u1H2CMacIdConfigParm, (u8)((mask & 0x00ff0000) >> 16));\r
-       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK3(u1H2CMacIdConfigParm, (u8)((mask & 0xff000000) >> 24));\r
-       \r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CMacIdConfigParm:", u1H2CMacIdConfigParm, H2C_MACID_CFG_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_MACID_CFG, H2C_MACID_CFG_LEN, u1H2CMacIdConfigParm);\r
-\r
-_func_exit_;\r
-}\r
-\r
-void rtl8723b_set_FwRssiSetting_cmd(_adapter*padapter, u8 *param)\r
-{\r
-       u8 u1H2CRssiSettingParm[H2C_RSSI_SETTING_LEN]={0};\r
-       u8 mac_id = *param;\r
-       u8 rssi = *(param+2);\r
-       u8 uldl_state = 0;\r
-\r
-_func_enter_;\r
-       //DBG_871X("%s(): param=%.2x-%.2x-%.2x\n", __func__, *param, *(param+1), *(param+2));\r
-       //DBG_871X("%s(): mac_id=%d rssi=%d\n", __func__, mac_id, rssi);\r
-\r
-       SET_8723B_H2CCMD_RSSI_SETTING_MACID(u1H2CRssiSettingParm, mac_id);\r
-       SET_8723B_H2CCMD_RSSI_SETTING_RSSI(u1H2CRssiSettingParm, rssi);\r
-       SET_8723B_H2CCMD_RSSI_SETTING_ULDL_STATE(u1H2CRssiSettingParm, uldl_state);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_notice_, "u1H2CRssiSettingParm:", u1H2CRssiSettingParm, H2C_RSSI_SETTING_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_RSSI_SETTING, H2C_RSSI_SETTING_LEN, u1H2CRssiSettingParm);\r
-\r
-_func_exit_;\r
-}\r
-\r
-void rtl8723b_set_FwAPReqRPT_cmd(PADAPTER padapter, u32 need_ack)\r
-{\r
-       u8 u1H2CApReqRptParm[H2C_AP_REQ_TXRPT_LEN]={0};\r
-       u8 macid1 = 1, macid2 = 0;\r
-\r
-       DBG_871X("%s(): need_ack = %d\n", __func__, need_ack);\r
-\r
-       SET_8723B_H2CCMD_APREQRPT_PARM_MACID1(u1H2CApReqRptParm, macid1);\r
-       SET_8723B_H2CCMD_APREQRPT_PARM_MACID2(u1H2CApReqRptParm, macid2);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CApReqRptParm:", u1H2CApReqRptParm, H2C_AP_REQ_TXRPT_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_AP_REQ_TXRPT, H2C_AP_REQ_TXRPT_LEN, u1H2CApReqRptParm);\r
-}\r
-\r
-void rtl8723b_set_FwPwrMode_cmd(PADAPTER padapter, u8 psmode)\r
-{\r
-       int i;\r
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\r
-       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;\r
-       u8 u1H2CPwrModeParm[H2C_PWRMODE_LEN]={0};\r
-       u8 PowerState=0, awake_intvl = 1, byte5 = 0, rlbm = 0;\r
-       struct wifidirect_info *wdinfo = &(padapter->wdinfo);\r
-\r
-_func_enter_;\r
-\r
-       if(pwrpriv->dtim > 0)\r
-               DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d, dtim=%d\n", __func__, psmode, pwrpriv->smart_ps, pwrpriv->dtim);\r
-       else\r
-               DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d\n", __func__, psmode, pwrpriv->smart_ps);\r
-\r
-#ifdef CONFIG_WOWLAN\r
-       if(psmode == PS_MODE_DTIM)  //For WOWLAN LPS, DTIM = (awake_intvl - 1)\r
-       {\r
-#ifdef CONFIG_PLATFORM_ARM_SUN8I\r
-               awake_intvl = 4;//DTIM=3\r
-#else\r
-               awake_intvl = 3;//DTIM=2\r
-#endif\r
-               rlbm = 2;\r
-       }\r
-       else\r
-#endif //CONFIG_WOWLAN\r
-       {\r
-               if(pwrpriv->dtim > 0 && pwrpriv->dtim < 16)\r
-                       awake_intvl = pwrpriv->dtim+1;//DTIM = (awake_intvl - 1)\r
-               else\r
-#ifdef CONFIG_PLATFORM_ARM_SUN8I\r
-                       awake_intvl = 4;//DTIM=3\r
-#else\r
-                       awake_intvl = 3;//DTIM=2\r
-#endif\r
-\r
-               rlbm = 2;\r
-       }       \r
-\r
-\r
-       if (!rtw_p2p_chk_state(wdinfo, P2P_STATE_NONE)) {\r
-               awake_intvl = 2;\r
-               rlbm = 2;\r
-       }\r
-\r
-       if(padapter->registrypriv.wifi_spec==1)\r
-       {\r
-               awake_intvl = 2;\r
-               rlbm = 2;\r
-       }\r
-\r
-       if (psmode > 0)\r
-       {\r
-#ifdef CONFIG_BT_COEXIST\r
-               if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)\r
-               {\r
-                       PowerState = rtw_btcoex_RpwmVal(padapter);\r
-                       byte5 = rtw_btcoex_LpsVal(padapter);\r
-\r
-                       if ((rlbm == 2) && (byte5 & BIT(4)))\r
-                       {\r
-                               // Keep awake interval to 1 to prevent from\r
-                               // decreasing coex performance\r
-                               awake_intvl = 2;\r
-                               rlbm = 2;\r
-                       }\r
-               }\r
-               else\r
-#endif // CONFIG_BT_COEXIST\r
-               {\r
-                       PowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00)\r
-                       byte5 = 0x40;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               PowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00)\r
-               byte5 = 0x40;\r
-       }\r
-\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_MODE(u1H2CPwrModeParm, (psmode>0)?1:0);\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CPwrModeParm, pwrpriv->smart_ps);\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(u1H2CPwrModeParm, rlbm);\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CPwrModeParm, awake_intvl);\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CPwrModeParm, padapter->registrypriv.uapsd_enable);\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CPwrModeParm, PowerState);\r
-       SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(u1H2CPwrModeParm, byte5);\r
-#ifdef CONFIG_LPS_LCLK\r
-       if(psmode != PS_MODE_ACTIVE)\r
-       {\r
-               if(pmlmeext ->adaptive_tsf_done == _FALSE && pmlmeext->bcn_cnt>0)\r
-               {\r
-                       u8 ratio_20_delay, ratio_80_delay;\r
-\r
-                       //byte 6 for adaptive_early_32k\r
-                       //[0:3] = DrvBcnEarly  (ms) , [4:7] = DrvBcnTimeOut  (ms)\r
-                       // 20% for DrvBcnEarly, 80% for DrvBcnTimeOut\r
-                       ratio_20_delay = 0;\r
-                       ratio_80_delay = 0;\r
-                       pmlmeext->DrvBcnEarly = 0xff;\r
-                       pmlmeext->DrvBcnTimeOut = 0xff;\r
-\r
-                       DBG_871X("%s(): bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt);\r
-\r
-                       for(i=0; i<9; i++)\r
-                       {\r
-                               pmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) /pmlmeext->bcn_cnt;\r
-\r
-                               DBG_871X("%s(): bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d] = %d\n", __func__, i, pmlmeext->bcn_delay_cnt[i]\r
-                                       ,i ,pmlmeext->bcn_delay_ratio[i]);\r
-       \r
-                               ratio_20_delay += pmlmeext->bcn_delay_ratio[i];\r
-                               ratio_80_delay += pmlmeext->bcn_delay_ratio[i];\r
-\r
-                               if(ratio_20_delay > 20 && pmlmeext->DrvBcnEarly == 0xff)\r
-                               {\r
-                                       pmlmeext->DrvBcnEarly = i;\r
-                                       DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);\r
-                               }       \r
-\r
-                               if(ratio_80_delay > 80 && pmlmeext->DrvBcnTimeOut == 0xff)\r
-                               {\r
-                                       pmlmeext->DrvBcnTimeOut = i;\r
-                                       DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);\r
-                               }\r
-\r
-                               //reset adaptive_early_32k cnt\r
-                               pmlmeext->bcn_delay_cnt[i] = 0;\r
-                               pmlmeext->bcn_delay_ratio[i] = 0;\r
-                       \r
-                       }\r
-\r
-                       pmlmeext->bcn_cnt = 0;\r
-                       pmlmeext ->adaptive_tsf_done = _TRUE;\r
-\r
-               }\r
-               else\r
-               {\r
-                       DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);\r
-                       DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);\r
-               }\r
-\r
-/* offload to FW if fw version > v15.10\r
-               pmlmeext->DrvBcnEarly=0;\r
-               pmlmeext->DrvBcnTimeOut=7;\r
-\r
-               if((pmlmeext->DrvBcnEarly!=0Xff) && (pmlmeext->DrvBcnTimeOut!=0xff))\r
-                       u1H2CPwrModeParm[H2C_PWRMODE_LEN-1] = BIT(0) | ((pmlmeext->DrvBcnEarly<<1)&0x0E) |((pmlmeext->DrvBcnTimeOut<<4)&0xf0) ;\r
-*/\r
-\r
-       }\r
-#endif\r
-\r
-#ifdef CONFIG_BT_COEXIST\r
-       rtw_btcoex_RecordPwrMode(padapter, u1H2CPwrModeParm, H2C_PWRMODE_LEN);\r
-#endif // CONFIG_BT_COEXIST\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CPwrModeParm:", u1H2CPwrModeParm, H2C_PWRMODE_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_SET_PWR_MODE, H2C_PWRMODE_LEN, u1H2CPwrModeParm);\r
-_func_exit_;\r
-}\r
-\r
-void rtl8723b_set_FwPsTuneParam_cmd(PADAPTER padapter)\r
-{\r
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\r
-       u8 u1H2CPsTuneParm[H2C_PSTUNEPARAM_LEN]={0};\r
-       u8 bcn_to_limit = 10; //10 * 100 * awakeinterval (ms)\r
-       u8 dtim_timeout = 5; //ms //wait broadcast data timer\r
-       u8 ps_timeout = 20;  //ms //Keep awake when tx\r
-       u8 dtim_period = 3; \r
-\r
-_func_enter_;\r
-       //DBG_871X("%s(): FW LPS mode = %d\n", __func__, psmode);\r
-\r
-       SET_8723B_H2CCMD_PSTUNE_PARM_BCN_TO_LIMIT(u1H2CPsTuneParm, bcn_to_limit);\r
-       SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_TIMEOUT(u1H2CPsTuneParm, dtim_timeout);\r
-       SET_8723B_H2CCMD_PSTUNE_PARM_PS_TIMEOUT(u1H2CPsTuneParm, ps_timeout);\r
-       SET_8723B_H2CCMD_PSTUNE_PARM_ADOPT(u1H2CPsTuneParm, 1);\r
-       SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_PERIOD(u1H2CPsTuneParm, dtim_period);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CPsTuneParm:", u1H2CPsTuneParm, H2C_PSTUNEPARAM_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_PS_TUNING_PARA, H2C_PSTUNEPARAM_LEN, u1H2CPsTuneParm);\r
-_func_exit_;\r
-}\r
-\r
-void rtl8723b_set_FwBtMpOper_cmd(PADAPTER padapter, u8 idx, u8 ver, u8 reqnum, u8 *param)\r
-{\r
-       u8 u1H2CBtMpOperParm[H2C_BTMP_OPER_LEN]={0};\r
-\r
-_func_enter_;\r
-\r
-       DBG_8192C("%s: idx=%d ver=%d reqnum=%d param1=0x%02x param2=0x%02x\n", __FUNCTION__, idx, ver, reqnum, param[0], param[1]);\r
-\r
-       SET_8723B_H2CCMD_BT_MPOPER_VER(u1H2CBtMpOperParm, ver);\r
-       SET_8723B_H2CCMD_BT_MPOPER_REQNUM(u1H2CBtMpOperParm, reqnum);\r
-       SET_8723B_H2CCMD_BT_MPOPER_IDX(u1H2CBtMpOperParm, idx);\r
-       SET_8723B_H2CCMD_BT_MPOPER_PARAM1(u1H2CBtMpOperParm, param[0]);\r
-       SET_8723B_H2CCMD_BT_MPOPER_PARAM2(u1H2CBtMpOperParm, param[1]);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CBtMpOperParm:", u1H2CBtMpOperParm, H2C_BTMP_OPER_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_BT_MP_OPER, H2C_BTMP_OPER_LEN, u1H2CBtMpOperParm);\r
-_func_exit_;\r
-}\r
-\r
-void rtl8723b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param)\r
-{\r
-       //u8 cmd_param; //BIT0:enable, BIT1:NoConnect32k\r
-\r
-       DBG_871X("%s()\n", __func__);\r
-\r
-       cmd_param = cmd_param;\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_FWLPS_IN_IPS_, 1, &cmd_param);\r
-\r
-}\r
-\r
-#ifdef CONFIG_WOWLAN\r
-static void rtl8723b_set_FwWoWlanCtrl_Cmd(PADAPTER padapter, u8 bFuncEn)\r
-{\r
-       struct security_priv *psecpriv = &padapter->securitypriv;\r
-       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);\r
-       u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};\r
-       u8 discont_wake = 1, gpionum = 0, gpio_dur = 0, hw_unicast = 0, gpio_pulse_cnt=100;\r
-       u8 sdio_wakeup_enable = 1;\r
-       u8 gpio_high_active = 0; //0: low active, 1: high active\r
-       u8 magic_pkt = 0;\r
-       \r
-#ifdef CONFIG_GPIO_WAKEUP\r
-       gpionum = WAKEUP_GPIO_IDX;\r
-       sdio_wakeup_enable = 0;\r
-#endif\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-       if (!ppwrpriv->wowlan_pno_enable) {\r
-               magic_pkt = 1;\r
-       }\r
-#endif\r
-\r
-       if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)\r
-               hw_unicast = 1;\r
-\r
-       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);\r
-\r
-       SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, bFuncEn);\r
-       SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0);\r
-       SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt);\r
-       SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast);\r
-       SET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0);\r
-       SET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active);\r
-       SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake); \r
-       SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum);\r
-       SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable);\r
-       SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur);\r
-       //SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1);\r
-       SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 0x09);\r
-       \r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CWoWlanCtrlParm:", u1H2CWoWlanCtrlParm, H2C_WOWLAN_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_WOWLAN, H2C_WOWLAN_LEN, u1H2CWoWlanCtrlParm);\r
-}\r
-\r
-static void rtl8723b_set_FwRemoteWakeCtrl_Cmd(PADAPTER padapter, u8 benable)\r
-{\r
-       u8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0};\r
-       struct security_priv* psecuritypriv=&(padapter->securitypriv);\r
-       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);\r
-       u8 res = 0, count = 0;\r
-\r
-       DBG_871X("%s(): Enable=%d\n", __func__, benable);\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-       SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);\r
-       SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, benable);\r
-#endif\r
-\r
-       if (!ppwrpriv->wowlan_pno_enable) {\r
-       SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);\r
-       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 1);\r
-#ifdef CONFIG_GTK_OL\r
-       if(psecuritypriv->binstallKCK_KEK == _TRUE && psecuritypriv->dot11PrivacyAlgrthm == _AES_)\r
-       {\r
-               SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 1);\r
-       }\r
-       else\r
-       {\r
-               DBG_871X("no kck or security is not AES\n");\r
-               SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 0);\r
-       }\r
-#endif //CONFIG_GTK_OL\r
-\r
-       SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(u1H2CRemoteWakeCtrlParm, 1);\r
-\r
-               if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) || (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_))\r
-               {\r
-                       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(u1H2CRemoteWakeCtrlParm, 0);\r
-               }\r
-               else\r
-               {\r
-                       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(u1H2CRemoteWakeCtrlParm, 1);\r
-               }\r
-       }\r
-exit:\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CRemoteWakeCtrlParm:", u1H2CRemoteWakeCtrlParm, H2C_REMOTE_WAKE_CTRL_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_REMOTE_WAKE_CTRL,\r
-               H2C_REMOTE_WAKE_CTRL_LEN, u1H2CRemoteWakeCtrlParm);\r
-#ifdef CONFIG_PNO_SUPPORT\r
-       if (ppwrpriv->wowlan_pno_enable && ppwrpriv->pno_in_resume == _FALSE) {\r
-               res = rtw_read8(padapter, REG_PNO_STATUS);\r
-               DBG_871X("cmd: 0x81 REG_PNO_STATUS: 0x%02x\n", res);\r
-               while(!(res&BIT(7)) && count < 25) {\r
-                       DBG_871X("[%d] cmd: 0x81 REG_PNO_STATUS: 0x%02x\n", count, res);\r
-                       res = rtw_read8(padapter, REG_PNO_STATUS);\r
-                       count++;\r
-                       rtw_msleep_os(2);\r
-               }\r
-               DBG_871X("cmd: 0x81 REG_PNO_STATUS: 0x%02x\n", res);\r
-       }\r
-#endif //CONFIG_PNO_SUPPORT\r
-}\r
-\r
-static void rtl8723b_set_FwAOACGlobalInfo_Cmd(PADAPTER padapter,  u8 group_alg, u8 pairwise_alg)\r
-{\r
-       u8 u1H2CAOACGlobalInfoParm[H2C_AOAC_GLOBAL_INFO_LEN]={0};\r
-\r
-       DBG_871X("%s(): group_alg=%d pairwise_alg=%d\n", __func__, group_alg, pairwise_alg);\r
-\r
-       SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(u1H2CAOACGlobalInfoParm, pairwise_alg);\r
-       SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(u1H2CAOACGlobalInfoParm, group_alg);\r
-       \r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CAOACGlobalInfoParm:", u1H2CAOACGlobalInfoParm, H2C_AOAC_GLOBAL_INFO_LEN);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_AOAC_GLOBAL_INFO, H2C_AOAC_GLOBAL_INFO_LEN, u1H2CAOACGlobalInfoParm);\r
-}\r
-\r
-#ifdef CONFIG_PNO_SUPPORT\r
-static void rtl8723b_set_FwScanOffloadInfo_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc, u8 enable)\r
-{\r
-       u8 u1H2CScanOffloadInfoParm[H2C_SCAN_OFFLOAD_CTRL_LEN]={0};\r
-       u8 res = 0, count = 0;\r
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\r
-\r
-       DBG_871X("%s: loc_probe_packet:%d, loc_scan_info: %d loc_ssid_info:%d\n", \r
-               __func__, rsvdpageloc->LocProbePacket, rsvdpageloc->LocScanInfo, rsvdpageloc->LocSSIDInfo);\r
-\r
-       SET_H2CCMD_AOAC_NLO_FUN_EN(u1H2CScanOffloadInfoParm, enable);\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(u1H2CScanOffloadInfoParm, rsvdpageloc->LocScanInfo);\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(u1H2CScanOffloadInfoParm, rsvdpageloc->LocProbePacket);\r
-       SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(u1H2CScanOffloadInfoParm, rsvdpageloc->LocSSIDInfo);\r
-\r
-       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CScanOffloadInfoParm:", u1H2CScanOffloadInfoParm, H2C_SCAN_OFFLOAD_CTRL_LEN);\r
-       FillH2CCmd8723B(padapter, H2C_8723B_D0_SCAN_OFFLOAD_INFO, H2C_SCAN_OFFLOAD_CTRL_LEN, u1H2CScanOffloadInfoParm);\r
-\r
-       if (pwrpriv->pno_in_resume == _FALSE) {\r
-               res = rtw_read8(padapter, 0x1b9);\r
-               while( res == 0 && count < 25) {\r
-                       DBG_871X("[%d] 0x1b9 0x%02x\n", count, res);\r
-                       res = rtw_read8(padapter, 0x1b9);\r
-                       DBG_871X("[%d] 0x1c4: 0x%08x 0x1cc:0x%08x\n",\r
-                               count, rtw_read32(padapter, 0x1c4), rtw_read32(padapter, 0x1cc));\r
-                       rtw_msleep_os(2);\r
-                       count++;\r
-               }\r
-               count = 0;\r
-               res = rtw_read8(padapter, 0x1b9);\r
-               while( res != 0x77 && count < 50) {\r
-                       DBG_871X("[%d] 0x1b9 0x%02x\n", count, res);\r
-                       res = rtw_read8(padapter, 0x1b9);\r
-                       DBG_871X("[%d] 0x1c4: 0x%08x 0x1cc:0x%08x\n",\r
-                               count, rtw_read32(padapter, 0x1c4), rtw_read32(padapter, 0x1cc));\r
-                       rtw_msleep_os(2);\r
-                       count++;\r
-               }\r
-               DBG_871X("0x1b9: 0x%02x\n", res);\r
-       }\r
-}\r
-#endif //CONFIG_PNO_SUPPORT\r
-\r
-#if 0\r
-void dump_TX_FIFO(_adapter* padapter){\r
-       int i;\r
-       u8 val = 0 ;\r
-       u8 base = 0;\r
-       u32 addr = 0;\r
-\r
-       DBG_871X("+%s+\n", __func__);\r
-       val = rtw_read8(padapter, 0x106);\r
-       rtw_write8(padapter, 0x106, 0x69);\r
-       DBG_871X("0x106: 0x%02x\n", val);\r
-       base = rtw_read8(padapter, 0x209);\r
-       DBG_871X("0x209: 0x%02x\n", base);\r
-\r
-       DBG_871X("beacon:\n");\r
-       addr = ((base)*128)/8;\r
-       for (i = 0 ; i < 32 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-\r
-       DBG_871X("probe_response:\n");\r
-       addr = ((base + 2)*128)/8;\r
-       for (i = 0 ; i < 48 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-#if 0\r
-       DBG_871X("GTK Info:\n");\r
-       addr = ((base + 8)*128)/8;\r
-       for (i = 0 ; i < 4 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-\r
-       DBG_871X("GTK Rsp:\n");\r
-       addr = ((base + 9)*128)/8;\r
-       for (i = 0 ; i < 32 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-#endif\r
-#if 0\r
-       DBG_871X("probe request:\n");\r
-       addr = ((base + 6)*128)/8;\r
-       for (i = 0 ; i < 16 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-\r
-       DBG_871X("PNO_INFO:\n");\r
-       addr = ((base + 7)*128)/8;\r
-       for (i = 0 ; i < 16 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-\r
-       DBG_871X("SSID_INFO:\n");\r
-       addr = ((base + 8)*128)/8;\r
-       for (i = 0 ; i < 16 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-\r
-       DBG_871X("SCAN_INFO:\n");\r
-       addr = ((base + 9)*128)/8;\r
-       for (i = 0 ; i < 16 ; i+=2) {\r
-               rtw_write32(padapter, 0x140, addr + i);\r
-               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-               rtw_write32(padapter, 0x140, addr + i + 1);\r
-               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\r
-       }\r
-#endif\r
-       rtw_write8(padapter, 0x106, val);\r
-       DBG_871X("-%s-\n", __func__);\r
-}\r
-#endif\r
-\r
-static void rtl8723b_set_FwWoWlanRelated_cmd(_adapter* padapter, u8 enable)\r
-{\r
-       struct security_priv *psecpriv = &padapter->securitypriv;\r
-       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);\r
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
-       struct sta_info *psta = NULL;\r
-       u8      pkt_type = 0;\r
-       \r
-       DBG_871X_LEVEL(_drv_always_, "+%s()+: enable=%d\n", __func__, enable);\r
-_func_enter_;\r
-       if(enable)\r
-       {\r
-               rtl8723b_set_FwAOACGlobalInfo_Cmd(padapter, psecpriv->dot118021XGrpPrivacy, psecpriv->dot11PrivacyAlgrthm);\r
-\r
-               rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);      //RT_MEDIA_CONNECT will confuse in the future\r
-\r
-               if(!(ppwrpriv->wowlan_pno_enable))\r
-               {\r
-                       psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(pmlmepriv));\r
-                       if (psta != NULL)\r
-                               rtl8723b_set_FwMediaStatusRpt_cmd(padapter, RT_MEDIA_CONNECT, psta->mac_id);\r
-               }       \r
-               else\r
-                       DBG_871X("%s(): Disconnected, no FwMediaStatusRpt CONNECT\n",__FUNCTION__);\r
-\r
-               rtw_msleep_os(2);\r
-\r
-               if(!(ppwrpriv->wowlan_pno_enable)) {\r
-               rtl8723b_set_FwDisconDecision_cmd(padapter, enable);\r
-               rtw_msleep_os(2);\r
-               \r
-                       if ((psecpriv->dot11PrivacyAlgrthm != _WEP40_) || (psecpriv->dot11PrivacyAlgrthm != _WEP104_))\r
-                               pkt_type = 1;\r
-                       rtl8723b_set_FwKeepAlive_cmd(padapter, enable, pkt_type);\r
-               rtw_msleep_os(2);\r
-               }\r
-\r
-               rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable);\r
-               rtw_msleep_os(2);\r
-\r
-               rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable);\r
-       }\r
-       else\r
-       {\r
-#if 0\r
-               dump_TX_FIFO(padapter);\r
-#endif\r
-               rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable);\r
-               rtw_msleep_os(2);                       \r
-               rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable);\r
-       }\r
-       \r
-_func_exit_;\r
-       DBG_871X_LEVEL(_drv_always_, "-%s()-\n", __func__);\r
-       return ;\r
-}\r
-\r
-void rtl8723b_set_wowlan_cmd(_adapter* padapter, u8 enable)\r
-{\r
-       rtl8723b_set_FwWoWlanRelated_cmd(padapter, enable);\r
-}\r
-#endif //CONFIG_WOWLAN\r
-\r
-#ifdef CONFIG_AP_WOWLAN\r
-static void rtl8723b_set_FwAPWoWlanCtrl_Cmd(PADAPTER padapter, u8 bFuncEn)\r
-{\r
-       u8 u1H2CAPWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};\r
-       u8 discont_wake = 1, gpionum = 0, gpio_dur = 0;\r
-       u8 gpio_high_active = 1; //0: low active, 1: high active\r
-       u8 gpio_pulse = bFuncEn;\r
-#ifdef CONFIG_GPIO_WAKEUP\r
-       gpionum = WAKEUP_GPIO_IDX;\r
-#endif\r
-\r
-       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);\r
-\r
-       if (bFuncEn)\r
-               gpio_dur = 16;\r
-       else\r
-               gpio_dur = 0;\r
-\r
-       SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_INDEX(u1H2CAPWoWlanCtrlParm,\r
-                       gpionum);\r
-       SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_PLUS(u1H2CAPWoWlanCtrlParm,\r
-                       gpio_pulse);\r
-       SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_HIGH_ACTIVE(u1H2CAPWoWlanCtrlParm,\r
-                       gpio_high_active);\r
-       SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_EN(u1H2CAPWoWlanCtrlParm,\r
-                       bFuncEn);\r
-       SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_DURATION(u1H2CAPWoWlanCtrlParm,\r
-                       gpio_dur);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_AP_WOW_GPIO_CTRL,\r
-                       H2C_AP_WOW_GPIO_CTRL_LEN, u1H2CAPWoWlanCtrlParm);\r
-}\r
-\r
-static void rtl8723b_set_Fw_AP_Offload_Cmd(PADAPTER padapter, u8 bFuncEn)\r
-{\r
-       u8 u1H2CAPOffloadCtrlParm[H2C_WOWLAN_LEN]={0};\r
-\r
-       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);\r
-\r
-       SET_8723B_H2CCMD_AP_WOWLAN_EN(u1H2CAPOffloadCtrlParm, bFuncEn);\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_AP_OFFLOAD,\r
-                       H2C_AP_OFFLOAD_LEN, u1H2CAPOffloadCtrlParm);\r
-}\r
-\r
-static void rtl8723b_set_AP_FwWoWlan_cmd(_adapter* padapter, u8 enable)\r
-{\r
-       struct security_priv *psecpriv = &padapter->securitypriv;\r
-       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);\r
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
-       struct sta_info *psta = NULL;\r
-       u8      pkt_type = 0;\r
-\r
-       DBG_871X_LEVEL(_drv_always_, "+%s()+: enable=%d\n", __func__, enable);\r
-_func_enter_;\r
-       if (enable) {\r
-               rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);\r
-               issue_beacon(padapter, 0);\r
-       }\r
-#if 0\r
-       else\r
-\r
-               dump_TX_FIFO(padapter);\r
-#endif\r
-       rtl8723b_set_FwAPWoWlanCtrl_Cmd(padapter, enable);\r
-       rtw_msleep_os(10);\r
-       rtl8723b_set_Fw_AP_Offload_Cmd(padapter, enable);\r
-       rtw_msleep_os(10);\r
-_func_exit_;\r
-       DBG_871X_LEVEL(_drv_always_, "-%s()-\n", __func__);\r
-       return ;\r
-}\r
-\r
-void rtl8723b_set_ap_wowlan_cmd(_adapter* padapter, u8 enable)\r
-{\r
-       rtl8723b_set_AP_FwWoWlan_cmd(padapter, enable);\r
-}\r
-#endif //CONFIG_AP_WOWLAN\r
-\r
-static s32 rtl8723b_set_FwLowPwrLps_cmd(PADAPTER padapter, u8 enable)\r
-{\r
-       //TODO\r
-       return _FALSE;  \r
-}\r
-\r
-//\r
-// Description: Fill the reserved packets that FW will use to RSVD page.\r
-//                     Now we just send 4 types packet to rsvd page.\r
-//                     (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp.\r
-//     Input:\r
-//         bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw,\r
-//                                             so we need to set the packet length to total lengh.\r
-//                           TRUE: At the second time, we should send the first packet (default:beacon)\r
-//                                             to Hw again and set the lengh in descriptor to the real beacon lengh.\r
-// 2009.10.15 by tynli.\r
-static void rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)\r
-{\r
-       PHAL_DATA_TYPE pHalData;\r
-       struct xmit_frame       *pcmdframe;     \r
-       struct pkt_attrib       *pattrib;\r
-       struct xmit_priv        *pxmitpriv;\r
-       struct mlme_ext_priv    *pmlmeext;\r
-       struct mlme_ext_info    *pmlmeinfo;\r
-       struct pwrctrl_priv *pwrctl;\r
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;\r
-       u32     BeaconLength=0, ProbeRspLength=0, PSPollLength=0;\r
-       u32     NullDataLength=0, QosNullLength=0, BTQosNullLength=0;\r
-       u32     ProbeReqLength=0;\r
-       u8      *ReservedPagePacket;\r
-       u8      TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;\r
-       u8      TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;\r
-       u16     BufIndex, PageSize = 128;\r
-       u32     TotalPacketLen, MaxRsvdPageBufSize=0;\r
-       RSVDPAGE_LOC    RsvdPageLoc;\r
-#ifdef CONFIG_WOWLAN   \r
-       u32     ARPLegnth = 0, GTKLegnth = 0, PNOLength = 0, ScanInfoLength = 0;\r
-       u32     SSIDLegnth = 0;\r
-       struct security_priv *psecuritypriv = &padapter->securitypriv; //added by xx\r
-       u8 currentip[4];\r
-       u8 cur_dot11txpn[8];\r
-#ifdef CONFIG_GTK_OL\r
-       struct sta_priv *pstapriv = &padapter->stapriv;\r
-       struct sta_info * psta;\r
-       u8 kek[RTW_KEK_LEN];\r
-       u8 kck[RTW_KCK_LEN];\r
-#endif\r
-#endif\r
-#ifdef DBG_CONFIG_ERROR_DETECT\r
-       struct sreset_priv *psrtpriv;\r
-#endif // DBG_CONFIG_ERROR_DETECT\r
-\r
-       //DBG_871X("%s---->\n", __FUNCTION__);\r
-\r
-       pHalData = GET_HAL_DATA(padapter);\r
-#ifdef DBG_CONFIG_ERROR_DETECT\r
-       psrtpriv = &pHalData->srestpriv;\r
-#endif\r
-       pxmitpriv = &padapter->xmitpriv;\r
-       pmlmeext = &padapter->mlmeextpriv;\r
-       pmlmeinfo = &pmlmeext->mlmext_info;\r
-       pwrctl = adapter_to_pwrctl(padapter);\r
-\r
-       RsvdPageNum = BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B;\r
-       MaxRsvdPageBufSize = RsvdPageNum*PageSize;\r
-\r
-       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);\r
-       if (pcmdframe == NULL) {\r
-               DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);\r
-               return;\r
-       }\r
-\r
-       ReservedPagePacket = pcmdframe->buf_addr;\r
-       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));\r
-\r
-       //3 (1) beacon\r
-       BufIndex = TxDescOffset;\r
-       ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength);\r
-\r
-       // When we count the first page size, we need to reserve description size for the RSVD\r
-       // packet, it will be filled in front of the packet in TXPKTBUF.\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);\r
-       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware\r
-       if (CurtPktPageNum == 1)\r
-       {\r
-               CurtPktPageNum += 1;\r
-       }\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //3 (2) ps-poll\r
-       RsvdPageLoc.LocPsPoll = TotalPageNum;\r
-       ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength);\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE, _FALSE);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PS-POLL %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + PSPollLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //3 (3) null data\r
-       RsvdPageLoc.LocNullData = TotalPageNum;\r
-       ConstructNullFunctionData(\r
-               padapter,\r
-               &ReservedPagePacket[BufIndex],\r
-               &NullDataLength,\r
-               get_my_bssid(&pmlmeinfo->network),\r
-               _FALSE, 0, 0, _FALSE);\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength, _FALSE, _FALSE, _FALSE);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: NULL DATA %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (NullDataLength+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + NullDataLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-#if 0\r
-       //3 (4) probe response\r
-       RsvdPageLoc.LocProbeRsp = TotalPageNum;\r
-       ConstructProbeRsp(\r
-               padapter,\r
-               &ReservedPagePacket[BufIndex],\r
-               &ProbeRspLength,\r
-               get_my_bssid(&pmlmeinfo->network),\r
-               _FALSE);\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE, _FALSE, _FALSE);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (ProbeRspLength+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + ProbeRspLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-#endif\r
-\r
-       //3 (5) Qos null data\r
-       RsvdPageLoc.LocQosNull = TotalPageNum;\r
-       ConstructNullFunctionData(\r
-               padapter,\r
-               &ReservedPagePacket[BufIndex],\r
-               &QosNullLength,\r
-               get_my_bssid(&pmlmeinfo->network),\r
-               _TRUE, 0, 0, _FALSE);\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE, _FALSE);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (QosNullLength+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + QosNullLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //3 (6) BT Qos null data\r
-       RsvdPageLoc.LocBTQosNull = TotalPageNum;\r
-       ConstructNullFunctionData(\r
-               padapter,\r
-               &ReservedPagePacket[BufIndex],\r
-               &BTQosNullLength,\r
-               get_my_bssid(&pmlmeinfo->network),\r
-               _TRUE, 0, 0, _FALSE);\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE, _FALSE);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: BT QOS NULL DATA %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (BTQosNullLength+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BTQosNullLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-#ifdef CONFIG_WOWLAN\r
-       if (check_fwstate(pmlmepriv, _FW_LINKED)) {\r
-       //if (pwrctl->wowlan_mode == _TRUE) {\r
-               //BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //3(7) ARP RSP\r
-       rtw_get_current_ip_address(padapter, currentip);\r
-       RsvdPageLoc.LocArpRsp= TotalPageNum;\r
-#ifdef DBG_CONFIG_ERROR_DETECT\r
-       if(psrtpriv->silent_reset_inprogress == _FALSE)\r
-#endif //DBG_CONFIG_ERROR_DETECT\r
-       {\r
-       ConstructARPResponse(\r
-               padapter, \r
-               &ReservedPagePacket[BufIndex],\r
-               &ARPLegnth,\r
-               currentip\r
-               );\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ARPLegnth, _FALSE, _FALSE, _TRUE);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: ARP RSP %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (ARPLegnth+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + ARPLegnth);\r
-       }\r
-#ifdef DBG_CONFIG_ERROR_DETECT\r
-       else\r
-               CurtPktPageNum = (u8)PageNum_128(128);\r
-#endif //DBG_CONFIG_ERROR_DETECT\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //3(8) SEC IV\r
-       rtw_get_sec_iv(padapter, cur_dot11txpn, get_my_bssid(&pmlmeinfo->network));\r
-       RsvdPageLoc.LocRemoteCtrlInfo = TotalPageNum;\r
-       _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen, cur_dot11txpn, _AES_IV_LEN_);\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: SEC IV %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], _AES_IV_LEN_);\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(_AES_IV_LEN_);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-       \r
-#ifdef CONFIG_GTK_OL\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //if the ap staion info. exists, get the kek, kck from staion info.\r
-       psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
-       if (psta == NULL) \r
-       {\r
-               _rtw_memset(kek, 0, RTW_KEK_LEN);\r
-               _rtw_memset(kck, 0, RTW_KCK_LEN);\r
-               DBG_8192C("%s, KEK, KCK download rsvd page all zero \n", __func__);\r
-       }\r
-       else\r
-       {\r
-               _rtw_memcpy(kek, psta->kek, RTW_KEK_LEN);\r
-               _rtw_memcpy(kck, psta->kck, RTW_KCK_LEN);\r
-       }\r
-       \r
-       //3(9) KEK, KCK\r
-       RsvdPageLoc.LocGTKInfo = TotalPageNum;\r
-       _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen, kck, RTW_KCK_LEN);\r
-       _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+RTW_KCK_LEN, kek, RTW_KEK_LEN);\r
-       \r
-#if 0\r
-       {\r
-               int i;\r
-               printk("\ntoFW KCK: ");\r
-               for(i=0;i<16; i++)\r
-                       printk(" %02x ", kck[i]);\r
-               printk("\ntoFW KEK: ");\r
-               for(i=0;i<16; i++)\r
-                       printk(" %02x ", kek[i]);\r
-               printk("\n");\r
-       }\r
-#endif\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: KEK KCK %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //3(10) GTK Response\r
-       RsvdPageLoc.LocGTKRsp= TotalPageNum;\r
-       ConstructGTKResponse(\r
-               padapter, \r
-               &ReservedPagePacket[BufIndex],\r
-               &GTKLegnth\r
-               );\r
-\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], GTKLegnth, _FALSE, _FALSE, _TRUE);\r
-#if 0\r
-       {\r
-               int gj;\r
-               printk("123GTK pkt=> \n");\r
-               for(gj=0; gj < GTKLegnth+TxDescLen; gj++) {\r
-                       printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);\r
-                       if ((gj + 1)%16==0)\r
-                               printk("\n");\r
-               }\r
-               printk(" <=end\n");\r
-       }\r
-#endif\r
-\r
-       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: GTK RSP %p %d\n", \r
-       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (TxDescLen + GTKLegnth));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + GTKLegnth);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //below page is empty for GTK extension memory\r
-       //3(11) GTK EXT MEM\r
-       RsvdPageLoc.LocGTKEXTMEM= TotalPageNum;\r
-\r
-       CurtPktPageNum = 2;\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       TotalPacketLen = BufIndex-TxDescLen + 256; //extension memory for FW\r
-#else\r
-       TotalPacketLen = BufIndex-TxDescLen + sizeof (union pn48); //IV len\r
-#endif //CONFIG_GTK_OL\r
-       } else\r
-#endif //CONFIG_WOWLAN\r
-       {\r
-#ifdef CONFIG_PNO_SUPPORT\r
-               if (pwrctl->pno_in_resume == _FALSE) {\r
-                       //Probe Request\r
-                       RsvdPageLoc.LocProbePacket = TotalPageNum;\r
-                       ConstructProbeReq(\r
-                               padapter,\r
-                               &ReservedPagePacket[BufIndex],\r
-                               &ProbeReqLength);\r
-\r
-                       rtl8723b_fill_fake_txdesc(padapter,\r
-                               &ReservedPagePacket[BufIndex-TxDescLen],\r
-                               ProbeReqLength, _FALSE, _FALSE, _FALSE);\r
-#ifdef CONFIG_PNO_SET_DEBUG\r
-       {\r
-                       int gj;\r
-                       printk("probe req pkt=> \n");\r
-                       for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {\r
-                               printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]);\r
-                               if ((gj + 1)%8==0)\r
-                                       printk("\n");\r
-                       }\r
-                       printk(" <=end\n");\r
-       }\r
-#endif\r
-                       CurtPktPageNum =\r
-                               (u8)PageNum_128(TxDescLen + ProbeReqLength);\r
-\r
-                       TotalPageNum += CurtPktPageNum;\r
-\r
-                       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-                       //PNO INFO Page\r
-                       RsvdPageLoc.LocPNOInfo = TotalPageNum;\r
-                       ConstructPnoInfo(padapter, &ReservedPagePacket[BufIndex -TxDescLen], &PNOLength);\r
-#ifdef CONFIG_PNO_SET_DEBUG\r
-       {\r
-                       int gj;\r
-                       printk("PNO pkt=> \n");\r
-                       for(gj=0; gj < PNOLength; gj++) {\r
-                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen +gj]);\r
-                               if ((gj + 1)%8==0)\r
-                                       printk("\n");\r
-                       }\r
-                       printk(" <=end\n");\r
-       }\r
-#endif\r
-\r
-                       CurtPktPageNum = (u8)PageNum_128(PNOLength);\r
-                       TotalPageNum += CurtPktPageNum;\r
-                       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-                       //SSID List Page\r
-                       RsvdPageLoc.LocSSIDInfo = TotalPageNum;\r
-                       ConstructSSIDList(padapter, &ReservedPagePacket[BufIndex-TxDescLen], &SSIDLegnth);\r
-#ifdef CONFIG_PNO_SET_DEBUG\r
-       {\r
-                       int gj;\r
-                       printk("SSID list pkt=> \n");\r
-                       for(gj=0; gj < SSIDLegnth; gj++) {\r
-                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);\r
-                               if ((gj + 1)%8==0)\r
-                                       printk("\n");\r
-                       }\r
-                       printk(" <=end\n");\r
-       }\r
-#endif\r
-                       CurtPktPageNum = (u8)PageNum_128(SSIDLegnth);\r
-                       TotalPageNum += CurtPktPageNum;\r
-                       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-                       //Scan Info Page\r
-                       RsvdPageLoc.LocScanInfo = TotalPageNum;\r
-                       ConstructScanInfo(padapter, &ReservedPagePacket[BufIndex-TxDescLen], &ScanInfoLength);\r
-#ifdef CONFIG_PNO_SET_DEBUG\r
-       {\r
-                       int gj;\r
-                       printk("Scan info pkt=> \n");\r
-                       for(gj=0; gj < ScanInfoLength; gj++) {\r
-                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);\r
-                               if ((gj + 1)%8==0)\r
-                                       printk("\n");\r
-                       }\r
-                       printk(" <=end\n");\r
-       }\r
-#endif\r
-                       CurtPktPageNum = (u8)PageNum_128(ScanInfoLength);\r
-                       TotalPageNum += CurtPktPageNum;\r
-                       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-                       TotalPacketLen = BufIndex + ScanInfoLength;\r
-               } else {\r
-               TotalPacketLen = BufIndex + BTQosNullLength;\r
-       }\r
-#else //CONFIG_PNO_SUPPORT\r
-               TotalPacketLen = BufIndex + BTQosNullLength;\r
-#endif\r
-       }\r
-\r
-       if(TotalPacketLen > MaxRsvdPageBufSize)\r
-       {\r
-               DBG_871X("%s(): ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",__FUNCTION__,\r
-                       TotalPacketLen,MaxRsvdPageBufSize);\r
-               goto error;\r
-       }\r
-       else\r
-       {\r
-               // update attribute\r
-               pattrib = &pcmdframe->attrib;\r
-               update_mgntframe_attrib(padapter, pattrib);\r
-               pattrib->qsel = 0x10;\r
-               pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;\r
-#ifdef CONFIG_PCI_HCI\r
-               dump_mgntframe(padapter, pcmdframe);\r
-#else\r
-               dump_mgntframe_and_wait(padapter, pcmdframe, 100);\r
-#endif\r
-       }\r
-\r
-       DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum);\r
-       if(check_fwstate(pmlmepriv, _FW_LINKED)) {\r
-       rtl8723b_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc);\r
-               rtl8723b_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);\r
-       } else {\r
-               rtl8723b_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);\r
-#ifdef CONFIG_PNO_SUPPORT\r
-               if(pwrctl->pno_in_resume)\r
-                       rtl8723b_set_FwScanOffloadInfo_cmd(padapter,\r
-                                       &RsvdPageLoc, 0);\r
-               else\r
-                       rtl8723b_set_FwScanOffloadInfo_cmd(padapter,\r
-                                       &RsvdPageLoc, 1);\r
-#endif\r
-       }\r
-       return;\r
-\r
-error:\r
-\r
-       rtw_free_xmitframe(pxmitpriv, pcmdframe);\r
-}\r
-\r
-#ifdef CONFIG_AP_WOWLAN\r
-//\r
-//Description: Fill the reserved packets that FW will use to RSVD page.\r
-//Now we just send 2 types packet to rsvd page. (1)Beacon, (2)ProbeRsp.\r
-//\r
-//Input: bDLFinished   \r
-//\r
-//FALSE: At the first time we will send all the packets as a large packet to Hw,\r
-//      so we need to set the packet length to total lengh.\r
-//\r
-//TRUE: At the second time, we should send the first packet (default:beacon)\r
-//     to Hw again and set the lengh in descriptor to the real beacon lengh.\r
-// 2009.10.15 by tynli.\r
-static void rtl8723b_set_AP_FwRsvdPagePkt(PADAPTER padapter,\r
-               BOOLEAN bDLFinished)\r
-{\r
-       PHAL_DATA_TYPE pHalData;\r
-       struct xmit_frame       *pcmdframe;\r
-       struct pkt_attrib       *pattrib;\r
-       struct xmit_priv        *pxmitpriv;\r
-       struct mlme_ext_priv    *pmlmeext;\r
-       struct mlme_ext_info    *pmlmeinfo;\r
-       struct pwrctrl_priv *pwrctl;\r
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;\r
-       u32     BeaconLength=0, ProbeRspLength=0;\r
-       u8      *ReservedPagePacket;\r
-       u8      TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;\r
-       u8      TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;\r
-       u16     BufIndex, PageSize = 128;\r
-       u32     TotalPacketLen = 0, MaxRsvdPageBufSize=0;\r
-       RSVDPAGE_LOC    RsvdPageLoc;\r
-#ifdef DBG_CONFIG_ERROR_DETECT\r
-       struct sreset_priv *psrtpriv;\r
-#endif // DBG_CONFIG_ERROR_DETECT\r
-\r
-       //DBG_871X("%s---->\n", __FUNCTION__);\r
-\r
-       pHalData = GET_HAL_DATA(padapter);\r
-#ifdef DBG_CONFIG_ERROR_DETECT\r
-       psrtpriv = &pHalData->srestpriv;\r
-#endif\r
-       pxmitpriv = &padapter->xmitpriv;\r
-       pmlmeext = &padapter->mlmeextpriv;\r
-       pmlmeinfo = &pmlmeext->mlmext_info;\r
-       pwrctl = adapter_to_pwrctl(padapter);\r
-\r
-       RsvdPageNum = BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B;\r
-       MaxRsvdPageBufSize = RsvdPageNum*PageSize;\r
-\r
-       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);\r
-       if (pcmdframe == NULL) {\r
-               DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);\r
-               return;\r
-       }\r
-\r
-       ReservedPagePacket = pcmdframe->buf_addr;\r
-       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));\r
-\r
-       //3 (1) beacon\r
-       BufIndex = TxDescOffset;\r
-       ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength);\r
-\r
-       // When we count the first page size, we need to reserve description size for the RSVD\r
-       // packet, it will be filled in front of the packet in TXPKTBUF.\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);\r
-       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware\r
-       if (CurtPktPageNum == 1)\r
-       {\r
-               CurtPktPageNum += 1;\r
-       }\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       //2 (4) probe response\r
-       RsvdPageLoc.LocProbeRsp = TotalPageNum;\r
-       ConstructProbeRsp(\r
-               padapter,\r
-               &ReservedPagePacket[BufIndex],\r
-               &ProbeRspLength,\r
-               get_my_bssid(&pmlmeinfo->network),\r
-               _FALSE);\r
-       rtl8723b_fill_fake_txdesc(padapter,\r
-                       &ReservedPagePacket[BufIndex-TxDescLen],\r
-                       ProbeRspLength,\r
-                       _FALSE, _FALSE, _FALSE);\r
-\r
-       DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n",\r
-               __func__, &ReservedPagePacket[BufIndex-TxDescLen],\r
-               (ProbeRspLength+TxDescLen));\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + ProbeRspLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       TotalPacketLen = BufIndex + ProbeRspLength;\r
-\r
-       if (TotalPacketLen > MaxRsvdPageBufSize) {\r
-               DBG_871X("%s(): ERROR: The rsvd page size is not enough \\r
-                               !!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",\r
-                               __func__, TotalPacketLen,MaxRsvdPageBufSize);\r
-               goto error;\r
-       } else {\r
-               // update attribute\r
-               pattrib = &pcmdframe->attrib;\r
-               update_mgntframe_attrib(padapter, pattrib);\r
-               pattrib->qsel = 0x10;\r
-               pattrib->pktlen = TotalPacketLen - TxDescOffset;\r
-               pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;\r
-#ifdef CONFIG_PCI_HCI\r
-               dump_mgntframe(padapter, pcmdframe);\r
-#else\r
-               dump_mgntframe_and_wait(padapter, pcmdframe, 100);\r
-#endif\r
-       }\r
-\r
-       DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum);\r
-       rtl8723b_set_ap_wow_rsvdpage_cmd(padapter, &RsvdPageLoc);\r
-\r
-       return;\r
-error:\r
-       rtw_free_xmitframe(pxmitpriv, pcmdframe);\r
-}\r
-#endif //CONFIG_AP_WOWLAN\r
-\r
-void rtl8723b_download_rsvd_page(PADAPTER padapter, u8 mstatus)\r
-{\r
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);\r
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\r
-       BOOLEAN         bcn_valid = _FALSE;\r
-       u8      DLBcnCount=0;\r
-       u32 poll = 0;\r
-       u8 val8;\r
-\r
-_func_enter_;\r
-\r
-       DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d mstatus(%x)\n",\r
-               FUNC_ADPT_ARG(padapter), get_iface_type(padapter), mstatus);\r
-\r
-       if(mstatus == RT_MEDIA_CONNECT)\r
-       {\r
-               BOOLEAN bRecover = _FALSE;\r
-               u8 v8;\r
-\r
-               // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.\r
-               // Suggested by filen. Added by tynli.\r
-               rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));\r
-\r
-               // set REG_CR bit 8\r
-               v8 = rtw_read8(padapter, REG_CR+1);\r
-               v8 |= BIT(0); // ENSWBCN\r
-               rtw_write8(padapter,  REG_CR+1, v8);\r
-\r
-               // Disable Hw protection for a time which revserd for Hw sending beacon.\r
-               // Fix download reserved page packet fail that access collision with the protection time.\r
-               // 2010.05.11. Added by tynli.\r
-               val8 = rtw_read8(padapter, REG_BCN_CTRL);\r
-               val8 &= ~BIT(3);\r
-               val8 |= BIT(4);\r
-               rtw_write8(padapter, REG_BCN_CTRL, val8);\r
-\r
-               // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\r
-               if (pHalData->RegFwHwTxQCtrl & BIT(6))\r
-                       bRecover = _TRUE;\r
-\r
-               // To tell Hw the packet is not a real beacon frame.\r
-               rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6));\r
-               pHalData->RegFwHwTxQCtrl &= ~BIT(6);\r
-\r
-               // Clear beacon valid check bit.\r
-               rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\r
-               rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);\r
-\r
-               DLBcnCount = 0;\r
-               poll = 0;\r
-               do\r
-               {\r
-#ifdef CONFIG_AP_WOWLAN\r
-                       if (pwrpriv->wowlan_ap_mode)\r
-                               rtl8723b_set_AP_FwRsvdPagePkt(padapter, 0);\r
-                       else\r
-                               rtl8723b_set_FwRsvdPagePkt(padapter, 0);\r
-#else\r
-                       // download rsvd page.\r
-                       rtl8723b_set_FwRsvdPagePkt(padapter, 0);\r
-#endif\r
-                       DLBcnCount++;\r
-                       do\r
-                       {\r
-                               rtw_yield_os();\r
-                               //rtw_mdelay_os(10);\r
-                               // check rsvd page download OK.\r
-                               rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));\r
-                               poll++;\r
-                       } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);\r
-                       \r
-               }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);\r
-\r
-               if(padapter->bSurpriseRemoved || padapter->bDriverStopped)\r
-               {\r
-               }\r
-               else if(!bcn_valid)\r
-                       DBG_871X(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n",\r
-                               ADPT_ARG(padapter) ,DLBcnCount, poll);\r
-               else {\r
-                       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\r
-                       pwrctl->fw_psmode_iface_id = padapter->iface_id;\r
-                       DBG_871X(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n",\r
-                               ADPT_ARG(padapter), DLBcnCount, poll);\r
-               }\r
-\r
-               // 2010.05.11. Added by tynli.\r
-               val8 = rtw_read8(padapter, REG_BCN_CTRL);\r
-               val8 |= BIT(3);\r
-               val8 &= ~BIT(4);\r
-               rtw_write8(padapter, REG_BCN_CTRL, val8);\r
-\r
-               // To make sure that if there exists an adapter which would like to send beacon.\r
-               // If exists, the origianl value of 0x422[6] will be 1, we should check this to\r
-               // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause\r
-               // the beacon cannot be sent by HW.\r
-               // 2010.06.23. Added by tynli.\r
-               if(bRecover)\r
-               {\r
-                       rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6));\r
-                       pHalData->RegFwHwTxQCtrl |= BIT(6);\r
-               }\r
-\r
-               // Clear CR[8] or beacon packet will not be send to TxBuf anymore.\r
-               v8 = rtw_read8(padapter, REG_CR+1);\r
-               v8 &= ~BIT(0); // ~ENSWBCN\r
-               rtw_write8(padapter, REG_CR+1, v8);\r
-       }\r
-\r
-_func_exit_;\r
-}\r
-\r
-void rtl8723b_set_rssi_cmd(_adapter*padapter, u8 *param)\r
-{\r
-       rtl8723b_set_FwRssiSetting_cmd(padapter, param);\r
-}\r
-\r
-void rtl8723b_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus)\r
-{\r
-       struct sta_info *psta = NULL;\r
-       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);\r
-       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
-\r
-       if(mstatus == 1)\r
-               rtl8723b_download_rsvd_page(padapter, RT_MEDIA_CONNECT);\r
-}\r
-\r
-//arg[0] = macid\r
-//arg[1] = raid\r
-//arg[2] = shortGIrate\r
-//arg[3] = init_rate\r
-void rtl8723b_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level)\r
-{\r
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
-       struct mlme_ext_priv    *pmlmeext = &pAdapter->mlmeextpriv;\r
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\r
-       struct sta_info *psta;\r
-       u8 mac_id = arg[0];\r
-       u8 raid = arg[1];\r
-       u8 shortGI = arg[2];\r
-       u8 bw;\r
-       u32 mask = bitmap&0x0FFFFFFF;\r
-\r
-       psta = pmlmeinfo->FW_sta_info[mac_id].psta;\r
-       if(psta == NULL)\r
-       {\r
-               return;\r
-       }\r
-\r
-       bw = psta->bw_mode;\r
-\r
-       if(rssi_level != DM_RATR_STA_INIT)\r
-               mask = ODM_Get_Rate_Bitmap(&pHalData->odmpriv, mac_id, mask, rssi_level);               \r
-\r
-       DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x\n", __func__, mac_id, raid, bw, mask);\r
-       rtl8723b_set_FwMacIdConfig_cmd(pAdapter, mac_id, raid, bw, shortGI, mask);\r
-}\r
-\r
-#if 0\r
-void rtl8723b_fw_try_ap_cmd(PADAPTER padapter, u32 need_ack)\r
-{\r
-       rtl8723b_set_FwAPReqRPT_cmd(padapter, need_ack);\r
-}\r
-#endif\r
-\r
-#ifdef CONFIG_BT_COEXIST\r
-static void ConstructBtNullFunctionData(\r
-       PADAPTER padapter,\r
-       u8 *pframe,\r
-       u32 *pLength,\r
-       u8 *StaAddr,\r
-       u8 bQoS,\r
-       u8 AC,\r
-       u8 bEosp,\r
-       u8 bForcePowerSave)\r
-{\r
-       struct rtw_ieee80211_hdr *pwlanhdr;\r
-       u16 *fctrl;\r
-       u32 pktlen;\r
-       struct mlme_ext_priv *pmlmeext;\r
-       struct mlme_ext_info *pmlmeinfo;\r
-       u8 bssid[ETH_ALEN];\r
-\r
-\r
-       DBG_871X("+" FUNC_ADPT_FMT ": qos=%d eosp=%d ps=%d\n",\r
-               FUNC_ADPT_ARG(padapter), bQoS, bEosp, bForcePowerSave);\r
-\r
-       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\r
-       pmlmeext = &padapter->mlmeextpriv;\r
-       pmlmeinfo = &pmlmeext->mlmext_info;\r
-\r
-       if (NULL == StaAddr)\r
-       {\r
-               _rtw_memcpy(bssid, myid(&padapter->eeprompriv), ETH_ALEN);\r
-               StaAddr = bssid;\r
-       }\r
-\r
-       fctrl = &pwlanhdr->frame_ctl;\r
-       *fctrl = 0;\r
-       if (bForcePowerSave)\r
-               SetPwrMgt(fctrl);\r
-\r
-       SetFrDs(fctrl);\r
-       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);\r
-       _rtw_memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN);\r
-\r
-       SetDuration(pwlanhdr, 0);\r
-       SetSeqNum(pwlanhdr, 0);\r
-\r
-       if (bQoS == _TRUE)\r
-       {\r
-               struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;\r
-\r
-               SetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\r
-\r
-               pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;\r
-               SetPriority(&pwlanqoshdr->qc, AC);\r
-               SetEOSP(&pwlanqoshdr->qc, bEosp);\r
-\r
-               pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\r
-       }\r
-       else\r
-       {\r
-               SetFrameSubType(pframe, WIFI_DATA_NULL);\r
-\r
-               pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\r
-       }\r
-\r
-       *pLength = pktlen;\r
-}\r
-\r
-static void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter)\r
-{\r
-       PHAL_DATA_TYPE pHalData;\r
-       struct xmit_frame *pcmdframe;   \r
-       struct pkt_attrib *pattrib;\r
-       struct xmit_priv *pxmitpriv;\r
-       struct mlme_ext_priv *pmlmeext;\r
-       struct mlme_ext_info *pmlmeinfo;\r
-       u32     BeaconLength = 0;\r
-       u32     BTQosNullLength = 0;\r
-       u8 *ReservedPagePacket;\r
-       u8 TxDescLen, TxDescOffset;\r
-       u8 TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;\r
-       u16     BufIndex, PageSize;\r
-       u32     TotalPacketLen, MaxRsvdPageBufSize=0;\r
-       RSVDPAGE_LOC RsvdPageLoc;\r
-\r
-\r
-//     DBG_8192C("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));\r
-\r
-       pHalData = GET_HAL_DATA(padapter);\r
-       pxmitpriv = &padapter->xmitpriv;\r
-       pmlmeext = &padapter->mlmeextpriv;\r
-       pmlmeinfo = &pmlmeext->mlmext_info;\r
-       TxDescLen = TXDESC_SIZE;\r
-       TxDescOffset = TXDESC_OFFSET;\r
-       PageSize = PAGE_SIZE_TX_8723B;\r
-\r
-       RsvdPageNum = BCNQ_PAGE_NUM_8723B;\r
-       MaxRsvdPageBufSize = RsvdPageNum*PageSize;\r
-\r
-       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);\r
-       if (pcmdframe == NULL) {\r
-               DBG_8192C("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);\r
-               return;\r
-       }\r
-\r
-       ReservedPagePacket = pcmdframe->buf_addr;\r
-       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));\r
-\r
-       //3 (1) beacon\r
-       BufIndex = TxDescOffset;\r
-       ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength);\r
-\r
-       // When we count the first page size, we need to reserve description size for the RSVD\r
-       // packet, it will be filled in front of the packet in TXPKTBUF.\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);\r
-       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware\r
-       if (CurtPktPageNum == 1)\r
-       {\r
-               CurtPktPageNum += 1;\r
-       }\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       BufIndex += (CurtPktPageNum*PageSize);\r
-\r
-       // Jump to lastest page\r
-       if (BufIndex < (MaxRsvdPageBufSize - PageSize))\r
-       {\r
-               BufIndex = TxDescOffset + (MaxRsvdPageBufSize - PageSize);\r
-               TotalPageNum = BCNQ_PAGE_NUM_8723B - 1;\r
-       }\r
-\r
-       //3 (6) BT Qos null data\r
-       RsvdPageLoc.LocBTQosNull = TotalPageNum;\r
-       ConstructBtNullFunctionData(\r
-               padapter,\r
-               &ReservedPagePacket[BufIndex],\r
-               &BTQosNullLength,\r
-               NULL,\r
-               _TRUE, 0, 0, _FALSE);\r
-       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE, _FALSE);\r
-\r
-       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BTQosNullLength);\r
-\r
-       TotalPageNum += CurtPktPageNum;\r
-\r
-       TotalPacketLen = BufIndex + BTQosNullLength;\r
-       if (TotalPacketLen > MaxRsvdPageBufSize)\r
-       {\r
-               DBG_8192C(FUNC_ADPT_FMT ": ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",\r
-                       FUNC_ADPT_ARG(padapter), TotalPacketLen, MaxRsvdPageBufSize);\r
-               goto error;\r
-       }\r
-\r
-       // update attribute\r
-       pattrib = &pcmdframe->attrib;\r
-       update_mgntframe_attrib(padapter, pattrib);\r
-       pattrib->qsel = 0x10;\r
-       pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;\r
-#ifdef CONFIG_PCI_HCI\r
-       dump_mgntframe(padapter, pcmdframe);\r
-#else\r
-       dump_mgntframe_and_wait(padapter, pcmdframe, 100);\r
-#endif\r
-\r
-//     DBG_8192C(FUNC_ADPT_FMT ": Set RSVD page location to Fw, TotalPacketLen(%d), TotalPageNum(%d)\n",\r
-//             FUNC_ADPT_ARG(padapter), TotalPacketLen, TotalPageNum);\r
-       rtl8723b_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc);\r
-       rtl8723b_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);\r
-\r
-       return;\r
-\r
-error:\r
-       rtw_free_xmitframe(pxmitpriv, pcmdframe);\r
-}\r
-\r
-void rtl8723b_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter)\r
-{\r
-       PHAL_DATA_TYPE pHalData;\r
-       struct mlme_ext_priv *pmlmeext;\r
-       struct mlme_ext_info *pmlmeinfo;\r
-       u8 bRecover = _FALSE;\r
-       u8 bcn_valid = _FALSE;\r
-       u8 DLBcnCount = 0;\r
-       u32 poll = 0;\r
-       u8 val8;\r
-\r
-\r
-       DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d fw_state=0x%08X\n",\r
-               FUNC_ADPT_ARG(padapter), get_iface_type(padapter), get_fwstate(&padapter->mlmepriv));\r
-\r
-#ifdef CONFIG_DEBUG\r
-       if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _FALSE)\r
-       {\r
-               DBG_8192C(FUNC_ADPT_FMT ": [WARNING] not in AP mode!!\n",\r
-                       FUNC_ADPT_ARG(padapter));\r
-       }\r
-#endif // CONFIG_DEBUG\r
-\r
-       pHalData = GET_HAL_DATA(padapter);\r
-       pmlmeext = &padapter->mlmeextpriv;\r
-       pmlmeinfo = &pmlmeext->mlmext_info;\r
-\r
-       // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.\r
-       // Suggested by filen. Added by tynli.\r
-       rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));\r
-       \r
-       // set REG_CR bit 8\r
-       val8 = rtw_read8(padapter, REG_CR+1);\r
-       val8 |= BIT(0); // ENSWBCN\r
-       rtw_write8(padapter,  REG_CR+1, val8);\r
-       \r
-       // Disable Hw protection for a time which revserd for Hw sending beacon.\r
-       // Fix download reserved page packet fail that access collision with the protection time.\r
-       // 2010.05.11. Added by tynli.\r
-       val8 = rtw_read8(padapter, REG_BCN_CTRL);\r
-       val8 &= ~BIT(3);\r
-       val8 |= BIT(4);\r
-       rtw_write8(padapter, REG_BCN_CTRL, val8);\r
-\r
-       // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\r
-       if (pHalData->RegFwHwTxQCtrl & BIT(6))\r
-               bRecover = _TRUE;\r
-\r
-       // To tell Hw the packet is not a real beacon frame.\r
-       pHalData->RegFwHwTxQCtrl &= ~BIT(6);\r
-       rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl);\r
-\r
-       // Clear beacon valid check bit.\r
-       rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\r
-       rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);\r
-\r
-       DLBcnCount = 0;\r
-       poll = 0;\r
-       do {\r
-               SetFwRsvdPagePkt_BTCoex(padapter);\r
-               DLBcnCount++;\r
-               do {\r
-                       rtw_yield_os();\r
-//                     rtw_mdelay_os(10);\r
-                       // check rsvd page download OK.\r
-                       rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, &bcn_valid);\r
-                       poll++;\r
-               } while (!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);\r
-       } while (!bcn_valid && (DLBcnCount<=100) && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);\r
-\r
-       if (_TRUE == bcn_valid)\r
-       {\r
-               struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\r
-               pwrctl->fw_psmode_iface_id = padapter->iface_id;\r
-               DBG_8192C(ADPT_FMT": DL RSVD page success! DLBcnCount:%d, poll:%d\n",\r
-                       ADPT_ARG(padapter), DLBcnCount, poll);\r
-       }\r
-       else\r
-       {\r
-               DBG_8192C(ADPT_FMT": DL RSVD page fail! DLBcnCount:%d, poll:%d\n",\r
-                       ADPT_ARG(padapter), DLBcnCount, poll);\r
-               DBG_8192C(ADPT_FMT": DL RSVD page fail! bSurpriseRemoved=%d\n",\r
-                       ADPT_ARG(padapter), padapter->bSurpriseRemoved);\r
-               DBG_8192C(ADPT_FMT": DL RSVD page fail! bDriverStopped=%d\n",\r
-                       ADPT_ARG(padapter), padapter->bDriverStopped);\r
-       }\r
-\r
-       // 2010.05.11. Added by tynli.\r
-       val8 = rtw_read8(padapter, REG_BCN_CTRL);\r
-       val8 |= BIT(3);\r
-       val8 &= ~BIT(4);\r
-       rtw_write8(padapter, REG_BCN_CTRL, val8);\r
-\r
-       // To make sure that if there exists an adapter which would like to send beacon.\r
-       // If exists, the origianl value of 0x422[6] will be 1, we should check this to\r
-       // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause\r
-       // the beacon cannot be sent by HW.\r
-       // 2010.06.23. Added by tynli.\r
-       if (bRecover)\r
-       {\r
-               pHalData->RegFwHwTxQCtrl |= BIT(6);\r
-               rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl);\r
-       }\r
-\r
-       // Clear CR[8] or beacon packet will not be send to TxBuf anymore.\r
-       val8 = rtw_read8(padapter, REG_CR+1);\r
-       val8 &= ~BIT(0); // ~ENSWBCN\r
-       rtw_write8(padapter, REG_CR+1, val8);\r
-}\r
-#endif // CONFIG_BT_COEXIST\r
-\r
-#ifdef CONFIG_P2P\r
-void rtl8723b_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state)\r
-{\r
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);\r
-       struct pwrctrl_priv             *pwrpriv = adapter_to_pwrctl(padapter);\r
-       struct wifidirect_info  *pwdinfo = &( padapter->wdinfo );\r
-       struct P2P_PS_Offload_t *p2p_ps_offload = (struct P2P_PS_Offload_t      *)(&pHalData->p2p_ps_offload);\r
-       u8      i;\r
-\r
-_func_enter_;\r
-\r
-#if 1\r
-       switch(p2p_ps_state)\r
-       {\r
-               case P2P_PS_DISABLE:\r
-                       DBG_8192C("P2P_PS_DISABLE \n");\r
-                       _rtw_memset(p2p_ps_offload, 0 ,1);\r
-                       break;\r
-               case P2P_PS_ENABLE:\r
-                       DBG_8192C("P2P_PS_ENABLE \n");\r
-                       // update CTWindow value.\r
-                       if( pwdinfo->ctwindow > 0 )\r
-                       {\r
-                               p2p_ps_offload->CTWindow_En = 1;\r
-                               rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow);\r
-                       }\r
-\r
-                       // hw only support 2 set of NoA\r
-                       for( i=0 ; i<pwdinfo->noa_num ; i++)\r
-                       {\r
-                               // To control the register setting for which NOA\r
-                               rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4));\r
-                               if(i == 0)\r
-                                       p2p_ps_offload->NoA0_En = 1;\r
-                               else\r
-                                       p2p_ps_offload->NoA1_En = 1;\r
-\r
-                               // config P2P NoA Descriptor Register\r
-                               //DBG_8192C("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]);\r
-                               rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]);\r
-\r
-                               //DBG_8192C("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]);\r
-                               rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]);\r
-\r
-                               //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]);\r
-                               rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]);\r
-\r
-                               //DBG_8192C("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]);\r
-                               rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]);\r
-                       }\r
-\r
-                       if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) )\r
-                       {\r
-                               // rst p2p circuit\r
-                               rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4));\r
-\r
-                               p2p_ps_offload->Offload_En = 1;\r
-\r
-                               if(pwdinfo->role == P2P_ROLE_GO)\r
-                               {\r
-                                       p2p_ps_offload->role= 1;\r
-                                       p2p_ps_offload->AllStaSleep = 0;\r
-                               }\r
-                               else\r
-                               {\r
-                                       p2p_ps_offload->role= 0;\r
-                               }\r
-\r
-                               p2p_ps_offload->discovery = 0;\r
-                       }\r
-                       break;\r
-               case P2P_PS_SCAN:\r
-                       DBG_8192C("P2P_PS_SCAN \n");\r
-                       p2p_ps_offload->discovery = 1;\r
-                       break;\r
-               case P2P_PS_SCAN_DONE:\r
-                       DBG_8192C("P2P_PS_SCAN_DONE \n");\r
-                       p2p_ps_offload->discovery = 0;\r
-                       pwdinfo->p2p_ps_state = P2P_PS_ENABLE;\r
-                       break;\r
-               default:\r
-                       break;\r
-       }\r
-\r
-       FillH2CCmd8723B(padapter, H2C_8723B_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);\r
-#endif\r
-\r
-_func_exit_;\r
-\r
-}\r
-#endif //CONFIG_P2P\r
-\r
-\r
-#ifdef CONFIG_TSF_RESET_OFFLOAD\r
-/*\r
-       ask FW to Reset sync register at Beacon early interrupt\r
-*/\r
-u8 rtl8723b_reset_tsf(_adapter *padapter, u8 reset_port )\r
-{\r
-       u8      buf[2];\r
-       u8      res=_SUCCESS;\r
-\r
-_func_enter_;\r
-       if (IFACE_PORT0==reset_port) {\r
-               buf[0] = 0x1; buf[1] = 0;\r
-\r
-       } else{\r
-               buf[0] = 0x0; buf[1] = 0x1;\r
-       }\r
-       FillH2CCmd8723B(padapter, H2C_8723B_RESET_TSF, 2, buf);\r
-_func_exit_;\r
-\r
-       return res;\r
-}\r
-#endif // CONFIG_TSF_RESET_OFFLOAD\r
-\r
+/******************************************************************************
+ *
+ * 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 _RTL8723B_CMD_C_
+
+#include <rtl8723b_hal.h>
+#include "hal_com_h2c.h"
+
+#define MAX_H2C_BOX_NUMS       4
+#define MESSAGE_BOX_SIZE               4
+
+#define RTL8723B_MAX_CMD_LEN   7
+#define RTL8723B_EX_MESSAGE_BOX_SIZE   4
+
+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;
+               }
+#ifdef CONFIG_WOWLAN
+               else
+                       rtw_msleep_os(1);               
+#endif
+       }while( (!read_down) && (retry_cnts--));
+
+       return read_down;
+
+}
+
+
+/*****************************************
+* H2C Msg format :
+*| 31 - 8              |7-5    | 4 - 0 |
+*| h2c_msg     |Class  |CMD_ID |
+*| 31-0                                                |
+*| Ext msg                                     |
+*
+******************************************/
+s32 FillH2CCmd8723B(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
+{
+       u8 h2c_box_num;
+       u32     msgbox_addr;
+       u32 msgbox_ex_addr=0;
+       PHAL_DATA_TYPE pHalData;
+       u32     h2c_cmd = 0;
+       u32     h2c_cmd_ex = 0;
+       s32 ret = _FAIL;
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+_func_enter_;
+
+       padapter = GET_PRIMARY_ADAPTER(padapter);
+       pHalData = GET_HAL_DATA(padapter);
+#ifdef DBG_CHECK_FW_PS_STATE
+#ifdef DBG_CHECK_FW_PS_STATE_H2C
+       if(rtw_fw_ps_state(padapter) == _FAIL)
+       {
+               DBG_871X("%s: h2c doesn't leave 32k ElementID=%02x \n", __FUNCTION__, ElementID);
+               pdbgpriv->dbg_h2c_leave32k_fail_cnt++;
+       }
+
+       //DBG_871X("H2C ElementID=%02x , pHalData->LastHMEBoxNum=%02x\n", ElementID, pHalData->LastHMEBoxNum);
+#endif //DBG_CHECK_FW_PS_STATE_H2C
+#endif //DBG_CHECK_FW_PS_STATE
+       _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);
+
+       if (!pCmdBuffer) {
+               goto exit;
+       }
+       if(CmdLen > RTL8723B_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");
+#ifdef DBG_CHECK_FW_PS_STATE
+                       DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n", rtw_read32(padapter, 0x1c0), rtw_read32(padapter, 0x1c4)
+                               , rtw_read32(padapter, 0x1c8), rtw_read32(padapter, 0x1cc));
+#endif //DBG_CHECK_FW_PS_STATE
+                       //DBG_8192C(" 0x1c0: 0x%8x\n", rtw_read32(padapter, 0x1c0));
+                       //DBG_8192C(" 0x1c4: 0x%8x\n", rtw_read32(padapter, 0x1c4));
+                       goto exit;
+               }
+
+               if(CmdLen<=3)
+               {
+                       _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen );
+               }
+               else{
+                       _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, 3);
+                       _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3, CmdLen-3);
+//                     *(u8*)(&h2c_cmd) |= BIT(7);
+               }
+
+               *(u8*)(&h2c_cmd) |= ElementID;
+
+               if(CmdLen>3){
+                       msgbox_ex_addr = REG_HMEBOX_EXT0_8723B + (h2c_box_num *RTL8723B_EX_MESSAGE_BOX_SIZE);
+                       h2c_cmd_ex = le32_to_cpu( h2c_cmd_ex );
+                       rtw_write32(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);
+
+               //DBG_8192C("MSG_BOX:%d, CmdLen(%d), CmdID(0x%x), reg:0x%x =>h2c_cmd:0x%.8x, reg:0x%x =>h2c_cmd_ex:0x%.8x\n"
+               //      ,pHalData->LastHMEBoxNum , CmdLen, ElementID, msgbox_addr, h2c_cmd, msgbox_ex_addr, h2c_cmd_ex);
+
+               pHalData->LastHMEBoxNum = (h2c_box_num+1) % MAX_H2C_BOX_NUMS;
+
+       }while(0);
+
+       ret = _SUCCESS;
+
+exit:
+
+       _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);     
+
+_func_exit_;
+
+       return ret;
+}
+
+static 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);
+
+}
+
+static 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;
+}
+
+static 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;
+}
+
+
+#ifdef CONFIG_WOWLAN   
+//
+// Description:
+//     Construct the ARP response packet to support ARP offload.
+//
+static void ConstructARPResponse(
+       PADAPTER padapter,
+       u8                      *pframe,
+       u32                     *pLength,
+       u8                      *pIPAddress
+       )
+{
+       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);
+       struct security_priv *psecuritypriv = &padapter->securitypriv;
+       static u8                       ARPLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06};
+       u8                              *pARPRspPkt = pframe;
+       //for TKIP Cal MIC
+       u8                              *payload = pframe;
+       u8                      EncryptionHeadOverhead = 0;
+       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
+
+       fctrl = &pwlanhdr->frame_ctl;
+       *(fctrl) = 0;
+
+       //-------------------------------------------------------------------------
+       // MAC Header.
+       //-------------------------------------------------------------------------
+       SetFrameType(fctrl, WIFI_DATA);
+       //SetFrameSubType(fctrl, 0);
+       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, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetDuration(pwlanhdr, 0);
+       //SET_80211_HDR_FRAME_CONTROL(pARPRspPkt, 0);
+       //SET_80211_HDR_TYPE_AND_SUBTYPE(pARPRspPkt, Type_Data);
+       //SET_80211_HDR_TO_DS(pARPRspPkt, 1);
+       //SET_80211_HDR_ADDRESS1(pARPRspPkt, pMgntInfo->Bssid);
+       //SET_80211_HDR_ADDRESS2(pARPRspPkt, Adapter->CurrentAddress);
+       //SET_80211_HDR_ADDRESS3(pARPRspPkt, pMgntInfo->Bssid);
+
+       //SET_80211_HDR_DURATION(pARPRspPkt, 0);
+       //SET_80211_HDR_FRAGMENT_SEQUENCE(pARPRspPkt, 0);
+#ifdef CONFIG_WAPI_SUPPORT
+       *pLength = sMacHdrLng;
+#else
+       *pLength = 24;
+#endif
+
+//YJ,del,120503
+#if 0
+       //-------------------------------------------------------------------------
+       // Qos Header: leave space for it if necessary.
+       //-------------------------------------------------------------------------
+       if(pStaQos->CurrentQosMode > QOS_DISABLE)
+       {
+               SET_80211_HDR_QOS_EN(pARPRspPkt, 1);
+               PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng);
+               *pLength += sQoSCtlLng;
+       }
+#endif
+       //-------------------------------------------------------------------------
+       // Security Header: leave space for it if necessary.
+       //-------------------------------------------------------------------------
+
+#if 1
+       switch (psecuritypriv->dot11PrivacyAlgrthm)
+       {
+               case _WEP40_:
+               case _WEP104_:
+                       EncryptionHeadOverhead = 4;
+                       break;
+               case _TKIP_:
+                       EncryptionHeadOverhead = 8;     
+                       break;                  
+               case _AES_:
+                       EncryptionHeadOverhead = 8;
+                       break;
+#ifdef CONFIG_WAPI_SUPPORT
+               case _SMS4_:
+                       EncryptionHeadOverhead = 18;
+                       break;
+#endif                 
+               default:
+                       EncryptionHeadOverhead = 0;
+       }
+       
+       if(EncryptionHeadOverhead > 0)
+       {
+               _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);
+               *pLength += EncryptionHeadOverhead;
+               //SET_80211_HDR_WEP(pARPRspPkt, 1);  //Suggested by CCW.
+               SetPrivacy(fctrl);
+       }       
+#endif
+       //-------------------------------------------------------------------------
+       // Frame Body.
+       //-------------------------------------------------------------------------
+       pARPRspPkt =  (u8*)(pframe+ *pLength);
+       payload = pARPRspPkt; //Get Payload pointer
+       // LLC header
+       _rtw_memcpy(pARPRspPkt, ARPLLCHeader, 8);       
+       *pLength += 8;
+
+       // ARP element
+       pARPRspPkt += 8;
+       SET_ARP_PKT_HW(pARPRspPkt, 0x0100);
+       SET_ARP_PKT_PROTOCOL(pARPRspPkt, 0x0008);       // IP protocol
+       SET_ARP_PKT_HW_ADDR_LEN(pARPRspPkt, 6);
+       SET_ARP_PKT_PROTOCOL_ADDR_LEN(pARPRspPkt, 4);
+       SET_ARP_PKT_OPERATION(pARPRspPkt, 0x0200); // ARP response
+       SET_ARP_PKT_SENDER_MAC_ADDR(pARPRspPkt, myid(&(padapter->eeprompriv)));
+       SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress);
+#ifdef CONFIG_ARP_KEEP_ALIVE
+       if (rtw_gw_addr_query(padapter)==0) {
+               SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, pmlmepriv->gw_mac_addr);
+               SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pmlmepriv->gw_ip);
+       }
+       else
+#endif
+       {
+               SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, get_my_bssid(&(pmlmeinfo->network)));
+               SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pIPAddress);
+               DBG_871X("%s Target Mac Addr:" MAC_FMT "\n", __FUNCTION__, MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));
+               DBG_871X("%s Target IP Addr" IP_FMT "\n", __FUNCTION__, IP_ARG(pIPAddress));
+       }
+       
+       *pLength += 28;
+
+       if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_)
+       {
+               u8      mic[8];
+               struct mic_data micdata;
+               struct sta_info *psta = NULL;
+               u8      priority[4]={0x0,0x0,0x0,0x0};
+               u8      null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
+
+               DBG_871X("%s(): Add MIC\n",__FUNCTION__);
+
+               psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(&(pmlmeinfo->network)));
+               if (psta != NULL) {
+                       if(_rtw_memcmp(&psta->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){
+                               DBG_871X("%s(): STA dot11tkiptxmickey==0\n",__FUNCTION__);
+                       }
+                       //start to calculate the mic code
+                       rtw_secmicsetkey(&micdata, &psta->dot11tkiptxmickey.skey[0]);
+               }
+
+               rtw_secmicappend(&micdata, pwlanhdr->addr3, 6);  //DA
+
+               rtw_secmicappend(&micdata, pwlanhdr->addr2, 6); //SA
+
+               priority[0]=0;
+               rtw_secmicappend(&micdata, &priority[0], 4);
+
+               rtw_secmicappend(&micdata, payload, 36); //payload length = 8 + 28
+
+               rtw_secgetmic(&micdata,&(mic[0]));
+
+               pARPRspPkt += 28;
+               _rtw_memcpy(pARPRspPkt, &(mic[0]),8);
+
+               *pLength += 8;
+       }
+}
+
+#ifdef CONFIG_PNO_SUPPORT
+static void ConstructPnoInfo(
+       PADAPTER padapter,
+       u8                      *pframe,
+       u32                     *pLength
+       )
+{
+
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+
+       u8      *pPnoInfoPkt = pframe;
+       pPnoInfoPkt =  (u8*)(pframe+ *pLength);
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 4);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 4);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_iterations, 4);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->slow_scan_period, 4);
+
+       *pLength+=4;
+       pPnoInfoPkt += 4;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_length,
+                       MAX_PNO_LIST_COUNT);
+
+       *pLength+=MAX_PNO_LIST_COUNT;
+       pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_cipher_info,
+                       MAX_PNO_LIST_COUNT);
+
+       *pLength+=MAX_PNO_LIST_COUNT;
+       pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+       _rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_channel_info,
+                       MAX_PNO_LIST_COUNT);
+
+       *pLength+=MAX_PNO_LIST_COUNT;
+       pPnoInfoPkt += MAX_PNO_LIST_COUNT;
+}
+
+static void ConstructSSIDList(
+       PADAPTER padapter,
+       u8                      *pframe,
+       u32                     *pLength
+       )
+{
+       int i = 0;
+       u8      *pSSIDListPkt = pframe;
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+
+       pSSIDListPkt =  (u8*)(pframe+ *pLength);
+
+       for(i = 0; i < pwrctl->pnlo_info->ssid_num ; i++) {
+               _rtw_memcpy(pSSIDListPkt, &pwrctl->pno_ssid_list->node[i].SSID,
+                       pwrctl->pnlo_info->ssid_length[i]);
+
+               *pLength += WLAN_SSID_MAXLEN;
+               pSSIDListPkt += WLAN_SSID_MAXLEN;
+       }
+}
+
+static void ConstructScanInfo(
+       PADAPTER padapter,
+       u8                      *pframe,
+       u32                     *pLength
+       )
+{
+       int i = 0;
+       u8      *pScanInfoPkt = pframe;
+       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+
+       pScanInfoPkt =  (u8*)(pframe+ *pLength);
+
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->channel_num, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_ch, 1);
+
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_bw, 1);
+
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_40_offset, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_80_offset, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->periodScan, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->period_scan_time, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->enableRFE, 1);
+
+       *pLength+=1;
+       pScanInfoPkt += 1;
+       _rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->rfe_type, 8);
+
+       *pLength+=8;
+       pScanInfoPkt += 8;
+
+       for(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i ++) {
+               _rtw_memcpy(pScanInfoPkt,
+                       &pwrctl->pscan_info->ssid_channel_info[i], 4);
+               *pLength+=4;
+               pScanInfoPkt += 4;
+       }
+}
+#endif
+
+#ifdef CONFIG_GTK_OL
+static void ConstructGTKResponse(
+       PADAPTER padapter,
+       u8                      *pframe,
+       u32                     *pLength
+       )
+{
+       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);
+       struct security_priv *psecuritypriv = &padapter->securitypriv;
+       static u8                       LLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E};
+       static u8                       GTKbody_a[11] ={0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B};
+       u8                              *pGTKRspPkt = pframe;
+       u8                      EncryptionHeadOverhead = 0;
+       //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
+
+       fctrl = &pwlanhdr->frame_ctl;
+       *(fctrl) = 0;
+
+       //-------------------------------------------------------------------------
+       // MAC Header.
+       //-------------------------------------------------------------------------
+       SetFrameType(fctrl, WIFI_DATA);
+       //SetFrameSubType(fctrl, 0);
+       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, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetDuration(pwlanhdr, 0);
+
+#ifdef CONFIG_WAPI_SUPPORT
+       *pLength = sMacHdrLng;
+#else
+       *pLength = 24;
+#endif //CONFIG_WAPI_SUPPORT
+
+//YJ,del,120503
+#if 0
+       //-------------------------------------------------------------------------
+       // Qos Header: leave space for it if necessary.
+       //-------------------------------------------------------------------------
+       if(pStaQos->CurrentQosMode > QOS_DISABLE)
+       {
+               SET_80211_HDR_QOS_EN(pGTKRspPkt, 1);
+               PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng);
+               *pLength += sQoSCtlLng;
+       }
+#endif //0
+       //-------------------------------------------------------------------------
+       // Security Header: leave space for it if necessary.
+       //-------------------------------------------------------------------------
+
+#if 1
+       switch (psecuritypriv->dot11PrivacyAlgrthm)
+       {
+               case _WEP40_:
+               case _WEP104_:
+                       EncryptionHeadOverhead = 4;
+                       break;
+               case _TKIP_:
+                       EncryptionHeadOverhead = 8;     
+                       break;                  
+               case _AES_:
+                       EncryptionHeadOverhead = 8;
+                       break;
+#ifdef CONFIG_WAPI_SUPPORT
+               case _SMS4_:
+                       EncryptionHeadOverhead = 18;
+                       break;
+#endif //CONFIG_WAPI_SUPPORT
+               default:
+                       EncryptionHeadOverhead = 0;
+       }
+       
+       if(EncryptionHeadOverhead > 0)
+       {
+               _rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);
+               *pLength += EncryptionHeadOverhead;
+               //SET_80211_HDR_WEP(pGTKRspPkt, 1);  //Suggested by CCW.
+               //GTK's privacy bit is done by FW
+               //SetPrivacy(fctrl);
+       }       
+#endif //1
+       //-------------------------------------------------------------------------
+       // Frame Body.
+       //-------------------------------------------------------------------------
+       pGTKRspPkt =  (u8*)(pframe+ *pLength); 
+       // LLC header
+       _rtw_memcpy(pGTKRspPkt, LLCHeader, 8);  
+       *pLength += 8;
+
+       // GTK element
+       pGTKRspPkt += 8;
+       
+       //GTK frame body after LLC, part 1
+       _rtw_memcpy(pGTKRspPkt, GTKbody_a, 11); 
+       *pLength += 11;
+       pGTKRspPkt += 11;
+       //GTK frame body after LLC, part 2
+       _rtw_memset(&(pframe[*pLength]), 0, 88);
+       *pLength += 88;
+       pGTKRspPkt += 88;
+
+}
+#endif //CONFIG_GTK_OL
+
+#ifdef CONFIG_PNO_SUPPORT
+static void ConstructProbeReq(_adapter *padapter, u8 *pframe, u32 *pLength)
+{
+       struct rtw_ieee80211_hdr        *pwlanhdr;
+       u16                             *fctrl;
+       u32                             pktlen;
+       unsigned char                   *mac;
+       unsigned char                   bssrate[NumRates];
+       struct xmit_priv                *pxmitpriv = &(padapter->xmitpriv);
+       struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       int     bssrate_len = 0;
+       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+       pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
+       mac = myid(&(padapter->eeprompriv));
+
+       fctrl = &(pwlanhdr->frame_ctl);
+       *(fctrl) = 0;
+
+       //broadcast probe request frame
+       _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);
+
+       _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
+
+       SetSeqNum(pwlanhdr, 0);
+       SetFrameSubType(pframe, WIFI_PROBEREQ);
+
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+       pframe += pktlen;
+
+       pframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);
+
+       get_rate_set(padapter, bssrate, &bssrate_len);
+
+       if (bssrate_len > 8)
+       {
+               pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &pktlen);
+               pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &pktlen);
+       }
+       else
+       {
+               pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &pktlen);
+       }
+
+       *pLength = pktlen;
+}
+#endif //CONFIG_PNO_SUPPORT
+#endif //CONFIG_WOWLAN
+
+static 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);
+#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+       u8 *pwps_ie;
+       uint wps_ielen;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+#ifdef CONFIG_P2P
+       struct wifidirect_info  *pwdinfo = &(padapter->wdinfo);
+#ifdef CONFIG_WFD
+       u32                             wfdielen = 0;
+#endif //CONFIG_WFD
+#endif //CONFIG_P2P
+
+
+       //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);
+
+       DBG_871X("%s FW Mac Addr:" MAC_FMT "\n", __FUNCTION__, MAC_ARG(mac));
+       DBG_871X("%s FW IP Addr" IP_FMT "\n", __FUNCTION__, IP_ARG(StaAddr));
+
+       SetSeqNum(pwlanhdr, 0);
+       SetFrameSubType(fctrl, WIFI_PROBERSP);
+
+       pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);
+       pframe += pktlen;
+
+       if(cur_network->IELength>MAX_IE_SZ)
+               return;
+
+       pwps_ie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_,
+                       cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen);
+       
+       //inerset & update wps_probe_resp_ie
+       if ((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0)) {
+               uint wps_offset, remainder_ielen;
+               u8 *premainder_ie;
+       
+               wps_offset = (uint)(pwps_ie - cur_network->IEs);
+
+               premainder_ie = pwps_ie + wps_ielen;
+       
+               remainder_ielen = cur_network->IELength - wps_offset - wps_ielen;
+       
+               _rtw_memcpy(pframe, cur_network->IEs, wps_offset);
+               pframe += wps_offset;
+               pktlen += wps_offset;
+       
+               wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len
+               if ((wps_offset+wps_ielen+2)<=MAX_IE_SZ) {
+                       _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2);
+                       pframe += wps_ielen+2;
+                       pktlen += wps_ielen+2;
+               }
+       
+               if ((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) {
+                       _rtw_memcpy(pframe, premainder_ie, remainder_ielen);
+                       pframe += remainder_ielen;
+                       pktlen += remainder_ielen;
+               }
+       } else {
+               _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);
+               pframe += cur_network->IELength;
+               pktlen += cur_network->IELength;
+       }
+       
+       /* retrieve SSID IE from cur_network->Ssid */
+       {
+               u8 *ssid_ie;
+               sint ssid_ielen;
+               sint ssid_ielen_diff;
+               u8 buf[MAX_IE_SZ];
+               u8 *ies = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
+       
+               ssid_ie = rtw_get_ie(ies+_FIXED_IE_LENGTH_, _SSID_IE_, &ssid_ielen,
+                                       (pframe-ies)-_FIXED_IE_LENGTH_);
+       
+               ssid_ielen_diff = cur_network->Ssid.SsidLength - ssid_ielen;
+       
+               if (ssid_ie &&  cur_network->Ssid.SsidLength) {
+                       uint remainder_ielen;
+                       u8 *remainder_ie;
+                       remainder_ie = ssid_ie+2;
+                       remainder_ielen = (pframe-remainder_ie);
+
+                       if (remainder_ielen > MAX_IE_SZ) {
+                               DBG_871X_LEVEL(_drv_warning_, FUNC_ADPT_FMT" remainder_ielen > MAX_IE_SZ\n", FUNC_ADPT_ARG(padapter));
+                               remainder_ielen = MAX_IE_SZ;
+                       }
+       
+                       _rtw_memcpy(buf, remainder_ie, remainder_ielen);
+                       _rtw_memcpy(remainder_ie+ssid_ielen_diff, buf, remainder_ielen);
+                       *(ssid_ie+1) = cur_network->Ssid.SsidLength;
+                       _rtw_memcpy(ssid_ie+2, cur_network->Ssid.Ssid, cur_network->Ssid.SsidLength);
+                       pframe += ssid_ielen_diff;
+                       pktlen += ssid_ielen_diff;
+               }
+       }
+       
+#ifdef CONFIG_P2P
+       if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) /*&& is_valid_p2p_probereq*/)
+       {
+               u32 len;
+#ifdef CONFIG_IOCTL_CFG80211
+               if(adapter_wdev_data(padapter)->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;
+                       if(pmlmepriv->p2p_go_probe_resp_ie && len>0)
+                               _rtw_memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie, len);
+               }
+               else
+#endif //CONFIG_IOCTL_CFG80211
+               {
+                       len = build_probe_resp_p2p_ie(pwdinfo, pframe);
+               }
+       
+               pframe += len;
+               pktlen += len;
+                       
+#ifdef CONFIG_WFD
+#ifdef CONFIG_IOCTL_CFG80211
+               if(_TRUE == pwdinfo->wfd_info->wfd_enable)
+#endif //CONFIG_IOCTL_CFG80211
+               {
+                       len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
+               }
+#ifdef CONFIG_IOCTL_CFG80211
+               else
+               {       
+                       len = 0;
+                       if(pmlmepriv->wfd_probe_resp_ie && pmlmepriv->wfd_probe_resp_ie_len>0)
+                       {
+                               len = pmlmepriv->wfd_probe_resp_ie_len;
+                               _rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, len); 
+                       }       
+               }
+#endif //CONFIG_IOCTL_CFG80211         
+               pframe += len;
+               pktlen += len;
+#endif //CONFIG_WFD
+       
+       }
+#endif //CONFIG_P2P
+       
+       *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));*/
+       }
+}
+
+static void rtl8723b_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
+{
+       u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};
+
+       DBG_871X("8723BRsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\n",  
+               rsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll,
+               rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull,
+               rsvdpageloc->LocBTQosNull);
+
+       SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp);
+       SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll);
+       SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData);
+       SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull);
+       SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull);
+       
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CRsvdPageParm:", u1H2CRsvdPageParm, H2C_RSVDPAGE_LOC_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm);
+}
+
+static void rtl8723b_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)
+{
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       u8      res = 0, count = 0;
+#ifdef CONFIG_WOWLAN   
+       u8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};
+
+       DBG_871X("8723BAOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\n",  
+                       rsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp,
+                       rsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp,
+                       rsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq,
+                       rsvdpageloc->LocNetList);
+
+       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo);
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp);
+               //SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv);
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp);
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo);
+#ifdef CONFIG_GTK_OL
+               SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM);
+#endif // CONFIG_GTK_OL
+               RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CAoacRsvdPageParm:", u1H2CAoacRsvdPageParm, H2C_AOAC_RSVDPAGE_LOC_LEN);
+               FillH2CCmd8723B(padapter, H2C_8723B_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm);
+       } else {
+#ifdef CONFIG_PNO_SUPPORT
+               if(!pwrpriv->pno_in_resume) {
+                       DBG_871X("NLO_INFO=%d\n", rsvdpageloc->LocPNOInfo);
+                       _rtw_memset(&u1H2CAoacRsvdPageParm, 0, sizeof(u1H2CAoacRsvdPageParm));
+                       SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocPNOInfo);
+                       FillH2CCmd8723B(padapter, H2C_AOAC_RSVDPAGE3, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm);
+                       rtw_msleep_os(10);
+               }
+#endif
+       }
+
+#endif // CONFIG_WOWLAN
+}
+
+#ifdef CONFIG_AP_WOWLAN
+static void rtl8723b_set_ap_wow_rsvdpage_cmd(PADAPTER padapter,
+               PRSVDPAGE_LOC rsvdpageloc)
+{
+       struct  pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       struct  mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       u8      res = 0, count = 0, header = 0;
+       u8 rsvdparm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};
+
+       header = rtw_read8(padapter, REG_BCNQ_BDNY);
+
+       DBG_871X("%s: beacon: %d, probeRsp: %d, header:0x%02x\n", __func__,
+                       rsvdpageloc->LocApOffloadBCN,
+                       rsvdpageloc->LocProbeRsp,
+                       header);
+
+       SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(rsvdparm,
+                       rsvdpageloc->LocApOffloadBCN + header);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_BCN_RSVDPAGE,
+                       H2C_BCN_RSVDPAGE_LEN, rsvdparm);
+
+       rtw_msleep_os(10);
+
+       _rtw_memset(&rsvdparm, 0, sizeof(rsvdparm));
+
+       SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(
+                       rsvdparm,
+                       rsvdpageloc->LocProbeRsp + header);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_PROBERSP_RSVDPAGE,
+                       H2C_PROBERSP_RSVDPAGE_LEN, rsvdparm);
+
+       rtw_msleep_os(10);
+}
+#endif //CONFIG_AP_WOWLAN
+
+void rtl8723b_set_FwMediaStatusRpt_cmd(PADAPTER        padapter, u8 mstatus, u8 macid)
+{
+       u8 u1H2CMediaStatusRptParm[H2C_MEDIA_STATUS_RPT_LEN]={0};
+       u8 macid_end = 0;
+
+       DBG_871X("%s(): mstatus = %d macid=%d\n", __func__, mstatus, macid);
+
+       SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(u1H2CMediaStatusRptParm, mstatus);
+       SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(u1H2CMediaStatusRptParm, 0);
+       SET_8723B_H2CCMD_MSRRPT_PARM_MACID(u1H2CMediaStatusRptParm, macid);
+       SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(u1H2CMediaStatusRptParm, macid_end);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CMediaStatusRptParm:", u1H2CMediaStatusRptParm, H2C_MEDIA_STATUS_RPT_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_MEDIA_STATUS_RPT, H2C_MEDIA_STATUS_RPT_LEN, u1H2CMediaStatusRptParm);
+}
+
+static void rtl8723b_set_FwKeepAlive_cmd(PADAPTER padapter, u8 benable, u8 pkt_type)
+{
+       u8 u1H2CKeepAliveParm[H2C_KEEP_ALIVE_CTRL_LEN]={0};
+       u8 adopt = 1, check_period = 5;
+
+       DBG_871X("%s(): benable = %d\n", __func__, benable);
+       SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(u1H2CKeepAliveParm, benable);
+       SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(u1H2CKeepAliveParm, adopt);
+       SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(u1H2CKeepAliveParm, pkt_type);
+       SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(u1H2CKeepAliveParm, check_period);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CKeepAliveParm:", u1H2CKeepAliveParm, H2C_KEEP_ALIVE_CTRL_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_KEEP_ALIVE, H2C_KEEP_ALIVE_CTRL_LEN, u1H2CKeepAliveParm);
+}
+
+static void rtl8723b_set_FwDisconDecision_cmd(PADAPTER padapter, u8 benable)
+{
+       u8 u1H2CDisconDecisionParm[H2C_DISCON_DECISION_LEN]={0};
+       u8 adopt = 1, check_period = 10, trypkt_num = 0;
+
+       DBG_871X("%s(): benable = %d\n", __func__, benable);
+       SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(u1H2CDisconDecisionParm, benable);
+       SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(u1H2CDisconDecisionParm, adopt);
+       SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(u1H2CDisconDecisionParm, check_period);
+       SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(u1H2CDisconDecisionParm, trypkt_num);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CDisconDecisionParm:", u1H2CDisconDecisionParm, H2C_DISCON_DECISION_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_DISCON_DECISION, H2C_DISCON_DECISION_LEN, u1H2CDisconDecisionParm);
+}
+
+void rtl8723b_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask)
+{
+       u8 u1H2CMacIdConfigParm[H2C_MACID_CFG_LEN]={0};
+
+       DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x\n", __func__, mac_id, raid, bw, mask);
+       
+_func_enter_;
+
+       SET_8723B_H2CCMD_MACID_CFG_MACID(u1H2CMacIdConfigParm, mac_id);
+       SET_8723B_H2CCMD_MACID_CFG_RAID(u1H2CMacIdConfigParm, raid);
+       SET_8723B_H2CCMD_MACID_CFG_SGI_EN(u1H2CMacIdConfigParm, (sgi)? 1:0);
+       SET_8723B_H2CCMD_MACID_CFG_BW(u1H2CMacIdConfigParm, bw);
+       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK0(u1H2CMacIdConfigParm, (u8)(mask & 0x000000ff));
+       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK1(u1H2CMacIdConfigParm, (u8)((mask & 0x0000ff00) >>8));
+       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK2(u1H2CMacIdConfigParm, (u8)((mask & 0x00ff0000) >> 16));
+       SET_8723B_H2CCMD_MACID_CFG_RATE_MASK3(u1H2CMacIdConfigParm, (u8)((mask & 0xff000000) >> 24));
+       
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CMacIdConfigParm:", u1H2CMacIdConfigParm, H2C_MACID_CFG_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_MACID_CFG, H2C_MACID_CFG_LEN, u1H2CMacIdConfigParm);
+
+_func_exit_;
+}
+
+void rtl8723b_set_FwRssiSetting_cmd(_adapter*padapter, u8 *param)
+{
+       u8 u1H2CRssiSettingParm[H2C_RSSI_SETTING_LEN]={0};
+       u8 mac_id = *param;
+       u8 rssi = *(param+2);
+       u8 uldl_state = 0;
+
+_func_enter_;
+       //DBG_871X("%s(): param=%.2x-%.2x-%.2x\n", __func__, *param, *(param+1), *(param+2));
+       //DBG_871X("%s(): mac_id=%d rssi=%d\n", __func__, mac_id, rssi);
+
+       SET_8723B_H2CCMD_RSSI_SETTING_MACID(u1H2CRssiSettingParm, mac_id);
+       SET_8723B_H2CCMD_RSSI_SETTING_RSSI(u1H2CRssiSettingParm, rssi);
+       SET_8723B_H2CCMD_RSSI_SETTING_ULDL_STATE(u1H2CRssiSettingParm, uldl_state);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_notice_, "u1H2CRssiSettingParm:", u1H2CRssiSettingParm, H2C_RSSI_SETTING_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_RSSI_SETTING, H2C_RSSI_SETTING_LEN, u1H2CRssiSettingParm);
+
+_func_exit_;
+}
+
+void rtl8723b_set_FwAPReqRPT_cmd(PADAPTER padapter, u32 need_ack)
+{
+       u8 u1H2CApReqRptParm[H2C_AP_REQ_TXRPT_LEN]={0};
+       u8 macid1 = 1, macid2 = 0;
+
+       DBG_871X("%s(): need_ack = %d\n", __func__, need_ack);
+
+       SET_8723B_H2CCMD_APREQRPT_PARM_MACID1(u1H2CApReqRptParm, macid1);
+       SET_8723B_H2CCMD_APREQRPT_PARM_MACID2(u1H2CApReqRptParm, macid2);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CApReqRptParm:", u1H2CApReqRptParm, H2C_AP_REQ_TXRPT_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_AP_REQ_TXRPT, H2C_AP_REQ_TXRPT_LEN, u1H2CApReqRptParm);
+}
+
+void rtl8723b_set_FwPwrMode_cmd(PADAPTER padapter, u8 psmode)
+{
+       int i;
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       u8 u1H2CPwrModeParm[H2C_PWRMODE_LEN]={0};
+       u8 PowerState=0, awake_intvl = 1, byte5 = 0, rlbm = 0;
+       struct wifidirect_info *wdinfo = &(padapter->wdinfo);
+
+_func_enter_;
+
+       if(pwrpriv->dtim > 0)
+               DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d, dtim=%d\n", __func__, psmode, pwrpriv->smart_ps, pwrpriv->dtim);
+       else
+               DBG_871X("%s(): FW LPS mode = %d, SmartPS=%d\n", __func__, psmode, pwrpriv->smart_ps);
+
+#ifdef CONFIG_WOWLAN
+       if(psmode == PS_MODE_DTIM)  //For WOWLAN LPS, DTIM = (awake_intvl - 1)
+       {
+#ifdef CONFIG_PLATFORM_ARM_SUN8I
+               awake_intvl = 4;//DTIM=3
+#else
+               awake_intvl = 3;//DTIM=2
+#endif
+               rlbm = 2;
+       }
+       else
+#endif //CONFIG_WOWLAN
+       {
+               if(pwrpriv->dtim > 0 && pwrpriv->dtim < 16)
+                       awake_intvl = pwrpriv->dtim+1;//DTIM = (awake_intvl - 1)
+               else
+#ifdef CONFIG_PLATFORM_ARM_SUN8I
+                       awake_intvl = 4;//DTIM=3
+#else
+                       awake_intvl = 3;//DTIM=2
+#endif
+
+               rlbm = 2;
+       }       
+
+
+       if (!rtw_p2p_chk_state(wdinfo, P2P_STATE_NONE)) {
+               awake_intvl = 2;
+               rlbm = 2;
+       }
+
+       if(padapter->registrypriv.wifi_spec==1)
+       {
+               awake_intvl = 2;
+               rlbm = 2;
+       }
+
+       if (psmode > 0)
+       {
+#ifdef CONFIG_BT_COEXIST
+               if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)
+               {
+                       PowerState = rtw_btcoex_RpwmVal(padapter);
+                       byte5 = rtw_btcoex_LpsVal(padapter);
+
+                       if ((rlbm == 2) && (byte5 & BIT(4)))
+                       {
+                               // Keep awake interval to 1 to prevent from
+                               // decreasing coex performance
+                               awake_intvl = 2;
+                               rlbm = 2;
+                       }
+               }
+               else
+#endif // CONFIG_BT_COEXIST
+               {
+                       PowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00)
+                       byte5 = 0x40;
+               }
+       }
+       else
+       {
+               PowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00)
+               byte5 = 0x40;
+       }
+
+       SET_8723B_H2CCMD_PWRMODE_PARM_MODE(u1H2CPwrModeParm, (psmode>0)?1:0);
+       SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CPwrModeParm, pwrpriv->smart_ps);
+       SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(u1H2CPwrModeParm, rlbm);
+       SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CPwrModeParm, awake_intvl);
+       SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CPwrModeParm, padapter->registrypriv.uapsd_enable);
+       SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CPwrModeParm, PowerState);
+       SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(u1H2CPwrModeParm, byte5);
+#ifdef CONFIG_LPS_LCLK
+       if(psmode != PS_MODE_ACTIVE)
+       {
+               if(pmlmeext ->adaptive_tsf_done == _FALSE && pmlmeext->bcn_cnt>0)
+               {
+                       u8 ratio_20_delay, ratio_80_delay;
+
+                       //byte 6 for adaptive_early_32k
+                       //[0:3] = DrvBcnEarly  (ms) , [4:7] = DrvBcnTimeOut  (ms)
+                       // 20% for DrvBcnEarly, 80% for DrvBcnTimeOut
+                       ratio_20_delay = 0;
+                       ratio_80_delay = 0;
+                       pmlmeext->DrvBcnEarly = 0xff;
+                       pmlmeext->DrvBcnTimeOut = 0xff;
+
+                       DBG_871X("%s(): bcn_cnt = %d\n", __func__, pmlmeext->bcn_cnt);
+
+                       for(i=0; i<9; i++)
+                       {
+                               pmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) /pmlmeext->bcn_cnt;
+
+                               DBG_871X("%s(): bcn_delay_cnt[%d]=%d, bcn_delay_ratio[%d] = %d\n", __func__, i, pmlmeext->bcn_delay_cnt[i]
+                                       ,i ,pmlmeext->bcn_delay_ratio[i]);
+       
+                               ratio_20_delay += pmlmeext->bcn_delay_ratio[i];
+                               ratio_80_delay += pmlmeext->bcn_delay_ratio[i];
+
+                               if(ratio_20_delay > 20 && pmlmeext->DrvBcnEarly == 0xff)
+                               {
+                                       pmlmeext->DrvBcnEarly = i;
+                                       DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);
+                               }       
+
+                               if(ratio_80_delay > 80 && pmlmeext->DrvBcnTimeOut == 0xff)
+                               {
+                                       pmlmeext->DrvBcnTimeOut = i;
+                                       DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);
+                               }
+
+                               //reset adaptive_early_32k cnt
+                               pmlmeext->bcn_delay_cnt[i] = 0;
+                               pmlmeext->bcn_delay_ratio[i] = 0;
+                       
+                       }
+
+                       pmlmeext->bcn_cnt = 0;
+                       pmlmeext ->adaptive_tsf_done = _TRUE;
+
+               }
+               else
+               {
+                       DBG_871X("%s(): DrvBcnEarly = %d\n", __func__, pmlmeext->DrvBcnEarly);
+                       DBG_871X("%s(): DrvBcnTimeOut = %d\n", __func__, pmlmeext->DrvBcnTimeOut);
+               }
+
+/* offload to FW if fw version > v15.10
+               pmlmeext->DrvBcnEarly=0;
+               pmlmeext->DrvBcnTimeOut=7;
+
+               if((pmlmeext->DrvBcnEarly!=0Xff) && (pmlmeext->DrvBcnTimeOut!=0xff))
+                       u1H2CPwrModeParm[H2C_PWRMODE_LEN-1] = BIT(0) | ((pmlmeext->DrvBcnEarly<<1)&0x0E) |((pmlmeext->DrvBcnTimeOut<<4)&0xf0) ;
+*/
+
+       }
+#endif
+
+#ifdef CONFIG_BT_COEXIST
+       rtw_btcoex_RecordPwrMode(padapter, u1H2CPwrModeParm, H2C_PWRMODE_LEN);
+#endif // CONFIG_BT_COEXIST
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CPwrModeParm:", u1H2CPwrModeParm, H2C_PWRMODE_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_SET_PWR_MODE, H2C_PWRMODE_LEN, u1H2CPwrModeParm);
+_func_exit_;
+}
+
+void rtl8723b_set_FwPsTuneParam_cmd(PADAPTER padapter)
+{
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       u8 u1H2CPsTuneParm[H2C_PSTUNEPARAM_LEN]={0};
+       u8 bcn_to_limit = 10; //10 * 100 * awakeinterval (ms)
+       u8 dtim_timeout = 5; //ms //wait broadcast data timer
+       u8 ps_timeout = 20;  //ms //Keep awake when tx
+       u8 dtim_period = 3; 
+
+_func_enter_;
+       //DBG_871X("%s(): FW LPS mode = %d\n", __func__, psmode);
+
+       SET_8723B_H2CCMD_PSTUNE_PARM_BCN_TO_LIMIT(u1H2CPsTuneParm, bcn_to_limit);
+       SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_TIMEOUT(u1H2CPsTuneParm, dtim_timeout);
+       SET_8723B_H2CCMD_PSTUNE_PARM_PS_TIMEOUT(u1H2CPsTuneParm, ps_timeout);
+       SET_8723B_H2CCMD_PSTUNE_PARM_ADOPT(u1H2CPsTuneParm, 1);
+       SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_PERIOD(u1H2CPsTuneParm, dtim_period);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CPsTuneParm:", u1H2CPsTuneParm, H2C_PSTUNEPARAM_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_PS_TUNING_PARA, H2C_PSTUNEPARAM_LEN, u1H2CPsTuneParm);
+_func_exit_;
+}
+
+void rtl8723b_set_FwBtMpOper_cmd(PADAPTER padapter, u8 idx, u8 ver, u8 reqnum, u8 *param)
+{
+       u8 u1H2CBtMpOperParm[H2C_BTMP_OPER_LEN+1]={0};
+
+_func_enter_;
+
+       DBG_8192C("%s: idx=%d ver=%d reqnum=%d param1=0x%02x param2=0x%02x\n", __FUNCTION__, idx, ver, reqnum, param[0], param[1]);
+
+       SET_8723B_H2CCMD_BT_MPOPER_VER(u1H2CBtMpOperParm, ver);
+       SET_8723B_H2CCMD_BT_MPOPER_REQNUM(u1H2CBtMpOperParm, reqnum);
+       SET_8723B_H2CCMD_BT_MPOPER_IDX(u1H2CBtMpOperParm, idx);
+       SET_8723B_H2CCMD_BT_MPOPER_PARAM1(u1H2CBtMpOperParm, param[0]);
+       SET_8723B_H2CCMD_BT_MPOPER_PARAM2(u1H2CBtMpOperParm, param[1]);
+       SET_8723B_H2CCMD_BT_MPOPER_PARAM3(u1H2CBtMpOperParm, param[2]);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CBtMpOperParm:", u1H2CBtMpOperParm, H2C_BTMP_OPER_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_BT_MP_OPER, H2C_BTMP_OPER_LEN+1, u1H2CBtMpOperParm);
+_func_exit_;
+}
+
+void rtl8723b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param)
+{
+       //u8 cmd_param; //BIT0:enable, BIT1:NoConnect32k
+
+       DBG_871X("%s()\n", __func__);
+
+       cmd_param = cmd_param;
+
+       FillH2CCmd8723B(padapter, H2C_8723B_FWLPS_IN_IPS_, 1, &cmd_param);
+
+}
+
+#ifdef CONFIG_WOWLAN
+static void rtl8723b_set_FwWoWlanCtrl_Cmd(PADAPTER padapter, u8 bFuncEn)
+{
+       struct security_priv *psecpriv = &padapter->securitypriv;
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
+       u8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};
+       u8 discont_wake = 1, gpionum = 0, gpio_dur = 0, hw_unicast = 0, gpio_pulse_cnt=100;
+       u8 sdio_wakeup_enable = 1;
+       u8 gpio_high_active = 0; //0: low active, 1: high active
+       u8 magic_pkt = 0;
+       
+#ifdef CONFIG_GPIO_WAKEUP
+       gpionum = WAKEUP_GPIO_IDX;
+       sdio_wakeup_enable = 0;
+#endif
+
+#ifdef CONFIG_PNO_SUPPORT
+       if (!ppwrpriv->wowlan_pno_enable) {
+               magic_pkt = 1;
+       }
+#endif
+
+       if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)
+               hw_unicast = 1;
+
+       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);
+
+       SET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, bFuncEn);
+       SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, 0);
+       SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt);
+       SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast);
+       SET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0);
+       SET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active);
+       SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake); 
+       SET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum);
+       SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable);
+       SET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur);
+       //SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, 1);
+       SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, 0x09);
+       
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CWoWlanCtrlParm:", u1H2CWoWlanCtrlParm, H2C_WOWLAN_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_WOWLAN, H2C_WOWLAN_LEN, u1H2CWoWlanCtrlParm);
+}
+
+static void rtl8723b_set_FwRemoteWakeCtrl_Cmd(PADAPTER padapter, u8 benable)
+{
+       u8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0};
+       struct security_priv* psecuritypriv=&(padapter->securitypriv);
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
+       u8 res = 0, count = 0;
+
+       DBG_871X("%s(): Enable=%d\n", __func__, benable);
+
+       if (!ppwrpriv->wowlan_pno_enable) {
+       SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);
+       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 1);
+#ifdef CONFIG_GTK_OL
+               if (psecuritypriv->binstallKCK_KEK == _TRUE &&
+                               psecuritypriv->dot11PrivacyAlgrthm == _AES_) {
+               SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 1);
+               } else {
+               DBG_871X("no kck or security is not AES\n");
+               SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 0);
+       }
+#endif //CONFIG_GTK_OL
+
+       SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(u1H2CRemoteWakeCtrlParm, 1);
+
+               if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) ||
+                               (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_))
+               {
+                       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(u1H2CRemoteWakeCtrlParm, 0);
+               } else {
+                       SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(u1H2CRemoteWakeCtrlParm, 1);
+               }
+       }
+#ifdef CONFIG_PNO_SUPPORT
+       else {
+               SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);
+               SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, benable);
+       }
+#endif
+exit:
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CRemoteWakeCtrlParm:", u1H2CRemoteWakeCtrlParm, H2C_REMOTE_WAKE_CTRL_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_REMOTE_WAKE_CTRL,
+               H2C_REMOTE_WAKE_CTRL_LEN, u1H2CRemoteWakeCtrlParm);
+#ifdef CONFIG_PNO_SUPPORT
+       if (ppwrpriv->wowlan_pno_enable && ppwrpriv->pno_in_resume == _FALSE) {
+               res = rtw_read8(padapter, REG_PNO_STATUS);
+               DBG_871X("cmd: 0x81 REG_PNO_STATUS: 0x%02x\n", res);
+               while(!(res&BIT(7)) && count < 25) {
+                       DBG_871X("[%d] cmd: 0x81 REG_PNO_STATUS: 0x%02x\n", count, res);
+                       res = rtw_read8(padapter, REG_PNO_STATUS);
+                       count++;
+                       rtw_msleep_os(2);
+               }
+               DBG_871X("cmd: 0x81 REG_PNO_STATUS: 0x%02x\n", res);
+       }
+#endif //CONFIG_PNO_SUPPORT
+}
+
+static void rtl8723b_set_FwAOACGlobalInfo_Cmd(PADAPTER padapter,  u8 group_alg, u8 pairwise_alg)
+{
+       u8 u1H2CAOACGlobalInfoParm[H2C_AOAC_GLOBAL_INFO_LEN]={0};
+
+       DBG_871X("%s(): group_alg=%d pairwise_alg=%d\n", __func__, group_alg, pairwise_alg);
+
+       SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(u1H2CAOACGlobalInfoParm, pairwise_alg);
+       SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(u1H2CAOACGlobalInfoParm, group_alg);
+       
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CAOACGlobalInfoParm:", u1H2CAOACGlobalInfoParm, H2C_AOAC_GLOBAL_INFO_LEN);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_AOAC_GLOBAL_INFO, H2C_AOAC_GLOBAL_INFO_LEN, u1H2CAOACGlobalInfoParm);
+}
+
+#ifdef CONFIG_PNO_SUPPORT
+static void rtl8723b_set_FwScanOffloadInfo_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc, u8 enable)
+{
+       u8 u1H2CScanOffloadInfoParm[H2C_SCAN_OFFLOAD_CTRL_LEN]={0};
+       u8 res = 0, count = 0;
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+
+       DBG_871X("%s: loc_probe_packet:%d, loc_scan_info: %d loc_ssid_info:%d\n", 
+               __func__, rsvdpageloc->LocProbePacket, rsvdpageloc->LocScanInfo, rsvdpageloc->LocSSIDInfo);
+
+       SET_H2CCMD_AOAC_NLO_FUN_EN(u1H2CScanOffloadInfoParm, enable);
+       SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(u1H2CScanOffloadInfoParm, rsvdpageloc->LocScanInfo);
+       SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(u1H2CScanOffloadInfoParm, rsvdpageloc->LocProbePacket);
+       SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(u1H2CScanOffloadInfoParm, rsvdpageloc->LocSSIDInfo);
+
+       RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CScanOffloadInfoParm:", u1H2CScanOffloadInfoParm, H2C_SCAN_OFFLOAD_CTRL_LEN);
+       FillH2CCmd8723B(padapter, H2C_8723B_D0_SCAN_OFFLOAD_INFO, H2C_SCAN_OFFLOAD_CTRL_LEN, u1H2CScanOffloadInfoParm);
+
+       rtw_msleep_os(20);
+}
+#endif //CONFIG_PNO_SUPPORT
+
+#if 0
+void dump_TX_FIFO(_adapter* padapter){
+       int i;
+       u8 val = 0 ;
+       u8 base = 0;
+       u32 addr = 0;
+
+       DBG_871X("+%s+\n", __func__);
+       val = rtw_read8(padapter, 0x106);
+       rtw_write8(padapter, 0x106, 0x69);
+       DBG_871X("0x106: 0x%02x\n", val);
+       base = rtw_read8(padapter, 0x209);
+       DBG_871X("0x209: 0x%02x\n", base);
+
+       DBG_871X("beacon:\n");
+       addr = ((base)*128)/8;
+       for (i = 0 ; i < 32 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+
+       DBG_871X("probe_response:\n");
+       addr = ((base + 2)*128)/8;
+       for (i = 0 ; i < 48 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+#if 0
+       DBG_871X("GTK Info:\n");
+       addr = ((base + 8)*128)/8;
+       for (i = 0 ; i < 4 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+
+       DBG_871X("GTK Rsp:\n");
+       addr = ((base + 9)*128)/8;
+       for (i = 0 ; i < 32 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+#endif
+#if 0
+       DBG_871X("probe request:\n");
+       addr = ((base + 6)*128)/8;
+       for (i = 0 ; i < 16 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+
+       DBG_871X("PNO_INFO:\n");
+       addr = ((base + 7)*128)/8;
+       for (i = 0 ; i < 16 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+
+       DBG_871X("SSID_INFO:\n");
+       addr = ((base + 8)*128)/8;
+       for (i = 0 ; i < 16 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+
+       DBG_871X("SCAN_INFO:\n");
+       addr = ((base + 9)*128)/8;
+       for (i = 0 ; i < 16 ; i+=2) {
+               rtw_write32(padapter, 0x140, addr + i);
+               printk(" %08x %08x ", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+               rtw_write32(padapter, 0x140, addr + i + 1);
+               printk(" %08x %08x \n", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));
+       }
+#endif
+       rtw_write8(padapter, 0x106, val);
+       DBG_871X("-%s-\n", __func__);
+}
+#endif
+
+static void rtl8723b_set_FwWoWlanRelated_cmd(_adapter* padapter, u8 enable)
+{
+       struct security_priv *psecpriv = &padapter->securitypriv;
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct sta_info *psta = NULL;
+       u8      pkt_type = 0;
+       
+       DBG_871X_LEVEL(_drv_always_, "+%s()+: enable=%d\n", __func__, enable);
+_func_enter_;
+       if(enable)
+       {
+               rtl8723b_set_FwAOACGlobalInfo_Cmd(padapter, psecpriv->dot118021XGrpPrivacy, psecpriv->dot11PrivacyAlgrthm);
+
+               rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);      //RT_MEDIA_CONNECT will confuse in the future
+
+               if(!(ppwrpriv->wowlan_pno_enable))
+               {
+                       psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(pmlmepriv));
+                       if (psta != NULL)
+                               rtl8723b_set_FwMediaStatusRpt_cmd(padapter, RT_MEDIA_CONNECT, psta->mac_id);
+               }       
+               else
+                       DBG_871X("%s(): Disconnected, no FwMediaStatusRpt CONNECT\n",__FUNCTION__);
+
+               rtw_msleep_os(2);
+
+               if(!(ppwrpriv->wowlan_pno_enable)) {
+               rtl8723b_set_FwDisconDecision_cmd(padapter, enable);
+               rtw_msleep_os(2);
+               
+                       if ((psecpriv->dot11PrivacyAlgrthm != _WEP40_) || (psecpriv->dot11PrivacyAlgrthm != _WEP104_))
+                               pkt_type = 1;
+                       rtl8723b_set_FwKeepAlive_cmd(padapter, enable, pkt_type);
+               rtw_msleep_os(2);
+               }
+
+               rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable);
+               rtw_msleep_os(2);
+
+               rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable);
+       }
+       else
+       {
+#if 0
+               dump_TX_FIFO(padapter, 11, 128);
+#endif
+               rtl8723b_set_FwRemoteWakeCtrl_Cmd(padapter, enable);
+               rtw_msleep_os(2);                       
+               rtl8723b_set_FwWoWlanCtrl_Cmd(padapter, enable);
+       }
+       
+_func_exit_;
+       DBG_871X_LEVEL(_drv_always_, "-%s()-\n", __func__);
+       return ;
+}
+
+void rtl8723b_set_wowlan_cmd(_adapter* padapter, u8 enable)
+{
+       rtl8723b_set_FwWoWlanRelated_cmd(padapter, enable);
+}
+#endif //CONFIG_WOWLAN
+
+#ifdef CONFIG_AP_WOWLAN
+static void rtl8723b_set_FwAPWoWlanCtrl_Cmd(PADAPTER padapter, u8 bFuncEn)
+{
+       u8 u1H2CAPWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};
+       u8 discont_wake = 1, gpionum = 0, gpio_dur = 0;
+       u8 gpio_high_active = 1; //0: low active, 1: high active
+       u8 gpio_pulse = bFuncEn;
+#ifdef CONFIG_GPIO_WAKEUP
+       gpionum = WAKEUP_GPIO_IDX;
+#endif
+
+       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);
+
+       if (bFuncEn)
+               gpio_dur = 16;
+       else
+               gpio_dur = 0;
+
+       SET_H2CCMD_AP_WOW_GPIO_CTRL_INDEX(u1H2CAPWoWlanCtrlParm,
+                       gpionum);
+       SET_H2CCMD_AP_WOW_GPIO_CTRL_PLUS(u1H2CAPWoWlanCtrlParm,
+                       gpio_pulse);
+       SET_H2CCMD_AP_WOW_GPIO_CTRL_HIGH_ACTIVE(u1H2CAPWoWlanCtrlParm,
+                       gpio_high_active);
+       SET_H2CCMD_AP_WOW_GPIO_CTRL_EN(u1H2CAPWoWlanCtrlParm,
+                       bFuncEn);
+       SET_H2CCMD_AP_WOW_GPIO_CTRL_DURATION(u1H2CAPWoWlanCtrlParm,
+                       gpio_dur);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_AP_WOW_GPIO_CTRL,
+                       H2C_AP_WOW_GPIO_CTRL_LEN, u1H2CAPWoWlanCtrlParm);
+}
+
+static void rtl8723b_set_Fw_AP_Offload_Cmd(PADAPTER padapter, u8 bFuncEn)
+{
+       u8 u1H2CAPOffloadCtrlParm[H2C_WOWLAN_LEN]={0};
+
+       DBG_871X("%s(): bFuncEn=%d\n", __func__, bFuncEn);
+
+       SET_H2CCMD_AP_WOWLAN_EN(u1H2CAPOffloadCtrlParm, bFuncEn);
+
+       FillH2CCmd8723B(padapter, H2C_8723B_AP_OFFLOAD,
+                       H2C_AP_OFFLOAD_LEN, u1H2CAPOffloadCtrlParm);
+}
+
+static void rtl8723b_set_AP_FwWoWlan_cmd(_adapter* padapter, u8 enable)
+{
+       struct security_priv *psecpriv = &padapter->securitypriv;
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+       struct sta_info *psta = NULL;
+       u8      pkt_type = 0;
+       u8      res = 0;
+
+       DBG_871X_LEVEL(_drv_always_, "+%s()+: enable=%d\n", __func__, enable);
+_func_enter_;
+       if (enable) {
+#ifdef CONFIG_CONCURRENT_MODE
+               if (rtw_buddy_adapter_up(padapter) == _TRUE &&
+                       check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
+                               rtl8723b_set_FwJoinBssRpt_cmd(padapter->pbuddy_adapter, RT_MEDIA_CONNECT);
+                               issue_beacon(padapter->pbuddy_adapter, 0);
+               } else {
+               rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);
+               issue_beacon(padapter, 0);
+       }
+#else
+               rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);
+               issue_beacon(padapter, 0);
+#endif
+       }
+#if 0
+       else
+
+               dump_TX_FIFO(padapter);
+#endif
+       rtl8723b_set_FwAPWoWlanCtrl_Cmd(padapter, enable);
+       rtw_msleep_os(10);
+       rtl8723b_set_Fw_AP_Offload_Cmd(padapter, enable);
+       rtw_msleep_os(10);
+_func_exit_;
+       DBG_871X_LEVEL(_drv_always_, "-%s()-\n", __func__);
+       return ;
+}
+
+void rtl8723b_set_ap_wowlan_cmd(_adapter* padapter, u8 enable)
+{
+       rtl8723b_set_AP_FwWoWlan_cmd(padapter, enable);
+}
+#endif //CONFIG_AP_WOWLAN
+
+static s32 rtl8723b_set_FwLowPwrLps_cmd(PADAPTER padapter, u8 enable)
+{
+       //TODO
+       return _FALSE;  
+}
+
+//
+// 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 rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
+{
+       PHAL_DATA_TYPE pHalData;
+       struct xmit_frame       *pcmdframe;     
+       struct pkt_attrib       *pattrib;
+       struct xmit_priv        *pxmitpriv;
+       struct mlme_ext_priv    *pmlmeext;
+       struct mlme_ext_info    *pmlmeinfo;
+       struct pwrctrl_priv *pwrctl;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       u32     BeaconLength=0, ProbeRspLength=0, PSPollLength=0;
+       u32     NullDataLength=0, QosNullLength=0, BTQosNullLength=0;
+       u32     ProbeReqLength=0;
+       u8      *ReservedPagePacket;
+       u8      TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;
+       u8      TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;
+       u16     BufIndex, PageSize = 128;
+       u32     TotalPacketLen, MaxRsvdPageBufSize=0;
+       RSVDPAGE_LOC    RsvdPageLoc;
+#ifdef CONFIG_WOWLAN   
+       u32     ARPLegnth = 0, GTKLegnth = 0, PNOLength = 0, ScanInfoLength = 0;
+       u32     SSIDLegnth = 0;
+       struct security_priv *psecuritypriv = &padapter->securitypriv; //added by xx
+       u8 currentip[4];
+       u8 cur_dot11txpn[8];
+#ifdef CONFIG_GTK_OL
+       struct sta_priv *pstapriv = &padapter->stapriv;
+       struct sta_info * psta;
+       u8 kek[RTW_KEK_LEN];
+       u8 kck[RTW_KCK_LEN];
+#endif
+#endif
+#ifdef DBG_CONFIG_ERROR_DETECT
+       struct sreset_priv *psrtpriv;
+#endif // DBG_CONFIG_ERROR_DETECT
+
+       //DBG_871X("%s---->\n", __FUNCTION__);
+
+       pHalData = GET_HAL_DATA(padapter);
+#ifdef DBG_CONFIG_ERROR_DETECT
+       psrtpriv = &pHalData->srestpriv;
+#endif
+       pxmitpriv = &padapter->xmitpriv;
+       pmlmeext = &padapter->mlmeextpriv;
+       pmlmeinfo = &pmlmeext->mlmext_info;
+       pwrctl = adapter_to_pwrctl(padapter);
+
+       RsvdPageNum = BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B;
+       MaxRsvdPageBufSize = RsvdPageNum*PageSize;
+
+       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
+       if (pcmdframe == NULL) {
+               DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);
+               return;
+       }
+
+       ReservedPagePacket = pcmdframe->buf_addr;
+       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));
+
+       //3 (1) beacon
+       BufIndex = TxDescOffset;
+       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.
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);
+       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware
+       if (CurtPktPageNum == 1)
+       {
+               CurtPktPageNum += 1;
+       }
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //3 (2) ps-poll
+       RsvdPageLoc.LocPsPoll = TotalPageNum;
+       ConstructPSPoll(padapter, &ReservedPagePacket[BufIndex], &PSPollLength);
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE, _FALSE, _FALSE);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PS-POLL %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + PSPollLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //3 (3) null data
+       RsvdPageLoc.LocNullData = TotalPageNum;
+       ConstructNullFunctionData(
+               padapter,
+               &ReservedPagePacket[BufIndex],
+               &NullDataLength,
+               get_my_bssid(&pmlmeinfo->network),
+               _FALSE, 0, 0, _FALSE);
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], NullDataLength, _FALSE, _FALSE, _FALSE);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: NULL DATA %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (NullDataLength+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + NullDataLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+#if 0
+       //3 (4) probe response
+       RsvdPageLoc.LocProbeRsp = TotalPageNum;
+       ConstructProbeRsp(
+               padapter,
+               &ReservedPagePacket[BufIndex],
+               &ProbeRspLength,
+               get_my_bssid(&pmlmeinfo->network),
+               _FALSE);
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE, _FALSE, _FALSE);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (ProbeRspLength+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + ProbeRspLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+#endif
+
+       //3 (5) Qos null data
+       RsvdPageLoc.LocQosNull = TotalPageNum;
+       ConstructNullFunctionData(
+               padapter,
+               &ReservedPagePacket[BufIndex],
+               &QosNullLength,
+               get_my_bssid(&pmlmeinfo->network),
+               _TRUE, 0, 0, _FALSE);
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], QosNullLength, _FALSE, _FALSE, _FALSE);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (QosNullLength+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + QosNullLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //3 (6) BT Qos null data
+       RsvdPageLoc.LocBTQosNull = TotalPageNum;
+       ConstructNullFunctionData(
+               padapter,
+               &ReservedPagePacket[BufIndex],
+               &BTQosNullLength,
+               get_my_bssid(&pmlmeinfo->network),
+               _TRUE, 0, 0, _FALSE);
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE, _FALSE);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: BT QOS NULL DATA %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (BTQosNullLength+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BTQosNullLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+#ifdef CONFIG_WOWLAN
+       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+       //if (pwrctl->wowlan_mode == _TRUE) {
+               //BufIndex += (CurtPktPageNum*PageSize);
+
+       //3(7) ARP RSP
+       rtw_get_current_ip_address(padapter, currentip);
+       RsvdPageLoc.LocArpRsp= TotalPageNum;
+#ifdef DBG_CONFIG_ERROR_DETECT
+       if(psrtpriv->silent_reset_inprogress == _FALSE)
+#endif //DBG_CONFIG_ERROR_DETECT
+       {
+       ConstructARPResponse(
+               padapter, 
+               &ReservedPagePacket[BufIndex],
+               &ARPLegnth,
+               currentip
+               );
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], ARPLegnth, _FALSE, _FALSE, _TRUE);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: ARP RSP %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (ARPLegnth+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + ARPLegnth);
+       }
+#ifdef DBG_CONFIG_ERROR_DETECT
+       else
+               CurtPktPageNum = (u8)PageNum_128(128);
+#endif //DBG_CONFIG_ERROR_DETECT
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //3(8) SEC IV
+       rtw_get_sec_iv(padapter, cur_dot11txpn, get_my_bssid(&pmlmeinfo->network));
+       RsvdPageLoc.LocRemoteCtrlInfo = TotalPageNum;
+       _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen, cur_dot11txpn, _AES_IV_LEN_);
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: SEC IV %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], _AES_IV_LEN_);
+
+       CurtPktPageNum = (u8)PageNum_128(_AES_IV_LEN_);
+
+       TotalPageNum += CurtPktPageNum;
+       
+#ifdef CONFIG_GTK_OL
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //if the ap staion info. exists, get the kek, kck from staion info.
+       psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
+       if (psta == NULL) 
+       {
+               _rtw_memset(kek, 0, RTW_KEK_LEN);
+               _rtw_memset(kck, 0, RTW_KCK_LEN);
+               DBG_8192C("%s, KEK, KCK download rsvd page all zero \n", __func__);
+       }
+       else
+       {
+               _rtw_memcpy(kek, psta->kek, RTW_KEK_LEN);
+               _rtw_memcpy(kck, psta->kck, RTW_KCK_LEN);
+       }
+       
+       //3(9) KEK, KCK
+       RsvdPageLoc.LocGTKInfo = TotalPageNum;
+       _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen, kck, RTW_KCK_LEN);
+       _rtw_memcpy(ReservedPagePacket+BufIndex-TxDescLen+RTW_KCK_LEN, kek, RTW_KEK_LEN);
+       
+#if 0
+       {
+               int i;
+               printk("\ntoFW KCK: ");
+               for(i=0;i<16; i++)
+                       printk(" %02x ", kck[i]);
+               printk("\ntoFW KEK: ");
+               for(i=0;i<16; i++)
+                       printk(" %02x ", kek[i]);
+               printk("\n");
+       }
+#endif
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: KEK KCK %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + RTW_KCK_LEN + RTW_KEK_LEN);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //3(10) GTK Response
+       RsvdPageLoc.LocGTKRsp= TotalPageNum;
+       ConstructGTKResponse(
+               padapter, 
+               &ReservedPagePacket[BufIndex],
+               &GTKLegnth
+               );
+
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], GTKLegnth, _FALSE, _FALSE, _TRUE);
+#if 0
+       {
+               int gj;
+               printk("123GTK pkt=> \n");
+               for(gj=0; gj < GTKLegnth+TxDescLen; gj++) {
+                       printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
+                       if ((gj + 1)%16==0)
+                               printk("\n");
+               }
+               printk(" <=end\n");
+       }
+#endif
+
+       //DBG_871X("%s(): HW_VAR_SET_TX_CMD: GTK RSP %p %d\n", 
+       //      __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (TxDescLen + GTKLegnth));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + GTKLegnth);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //below page is empty for GTK extension memory
+       //3(11) GTK EXT MEM
+       RsvdPageLoc.LocGTKEXTMEM= TotalPageNum;
+
+       CurtPktPageNum = 2;
+
+       TotalPageNum += CurtPktPageNum;
+
+       TotalPacketLen = BufIndex-TxDescLen + 256; //extension memory for FW
+#else
+       TotalPacketLen = BufIndex-TxDescLen + sizeof (union pn48); //IV len
+#endif //CONFIG_GTK_OL
+       } else
+#endif //CONFIG_WOWLAN
+       {
+#ifdef CONFIG_PNO_SUPPORT
+               if (pwrctl->pno_in_resume == _FALSE && pwrctl->pno_inited == _TRUE) {
+                       //Probe Request
+                       RsvdPageLoc.LocProbePacket = TotalPageNum;
+                       ConstructProbeReq(
+                               padapter,
+                               &ReservedPagePacket[BufIndex],
+                               &ProbeReqLength);
+
+                       rtl8723b_fill_fake_txdesc(padapter,
+                               &ReservedPagePacket[BufIndex-TxDescLen],
+                               ProbeReqLength, _FALSE, _FALSE, _FALSE);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("probe req pkt=> \n");
+                       for(gj=0; gj < ProbeReqLength + TxDescLen; gj++) {
+                               printk(" %02x ",ReservedPagePacket[BufIndex- TxDescLen + gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+                       CurtPktPageNum =
+                               (u8)PageNum_128(TxDescLen + ProbeReqLength);
+
+                       TotalPageNum += CurtPktPageNum;
+
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       //PNO INFO Page
+                       RsvdPageLoc.LocPNOInfo = TotalPageNum;
+                       ConstructPnoInfo(padapter, &ReservedPagePacket[BufIndex -TxDescLen], &PNOLength);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("PNO pkt=> \n");
+                       for(gj=0; gj < PNOLength; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen +gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+
+                       CurtPktPageNum = (u8)PageNum_128(PNOLength);
+                       TotalPageNum += CurtPktPageNum;
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       //SSID List Page
+                       RsvdPageLoc.LocSSIDInfo = TotalPageNum;
+                       ConstructSSIDList(padapter, &ReservedPagePacket[BufIndex-TxDescLen], &SSIDLegnth);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("SSID list pkt=> \n");
+                       for(gj=0; gj < SSIDLegnth; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+                       CurtPktPageNum = (u8)PageNum_128(SSIDLegnth);
+                       TotalPageNum += CurtPktPageNum;
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       //Scan Info Page
+                       RsvdPageLoc.LocScanInfo = TotalPageNum;
+                       ConstructScanInfo(padapter, &ReservedPagePacket[BufIndex-TxDescLen], &ScanInfoLength);
+#ifdef CONFIG_PNO_SET_DEBUG
+       {
+                       int gj;
+                       printk("Scan info pkt=> \n");
+                       for(gj=0; gj < ScanInfoLength; gj++) {
+                               printk(" %02x ", ReservedPagePacket[BufIndex-TxDescLen+gj]);
+                               if ((gj + 1)%8==0)
+                                       printk("\n");
+                       }
+                       printk(" <=end\n");
+       }
+#endif
+                       CurtPktPageNum = (u8)PageNum_128(ScanInfoLength);
+                       TotalPageNum += CurtPktPageNum;
+                       BufIndex += (CurtPktPageNum*PageSize);
+
+                       TotalPacketLen = BufIndex + ScanInfoLength;
+               } else {
+               TotalPacketLen = BufIndex + BTQosNullLength;
+       }
+#else //CONFIG_PNO_SUPPORT
+               TotalPacketLen = BufIndex + BTQosNullLength;
+#endif
+       }
+
+       if(TotalPacketLen > MaxRsvdPageBufSize)
+       {
+               DBG_871X("%s(): ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",__FUNCTION__,
+                       TotalPacketLen,MaxRsvdPageBufSize);
+               goto error;
+       }
+       else
+       {
+               // update attribute
+               pattrib = &pcmdframe->attrib;
+               update_mgntframe_attrib(padapter, pattrib);
+               pattrib->qsel = 0x10;
+               pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
+#ifdef CONFIG_PCI_HCI
+               dump_mgntframe(padapter, pcmdframe);
+#else
+               dump_mgntframe_and_wait(padapter, pcmdframe, 100);
+#endif
+       }
+
+       DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum);
+       if(check_fwstate(pmlmepriv, _FW_LINKED)) {
+       rtl8723b_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc);
+               rtl8723b_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);
+       } else {
+               rtl8723b_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);
+#ifdef CONFIG_PNO_SUPPORT
+               if(pwrctl->pno_in_resume)
+                       rtl8723b_set_FwScanOffloadInfo_cmd(padapter,
+                                       &RsvdPageLoc, 0);
+               else
+                       rtl8723b_set_FwScanOffloadInfo_cmd(padapter,
+                                       &RsvdPageLoc, 1);
+#endif
+       }
+       return;
+
+error:
+
+       rtw_free_xmitframe(pxmitpriv, pcmdframe);
+}
+
+#ifdef CONFIG_AP_WOWLAN
+//
+//Description: Fill the reserved packets that FW will use to RSVD page.
+//Now we just send 2 types packet to rsvd page. (1)Beacon, (2)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 rtl8723b_set_AP_FwRsvdPagePkt(PADAPTER padapter,
+               BOOLEAN bDLFinished)
+{
+       PHAL_DATA_TYPE pHalData;
+       struct xmit_frame       *pcmdframe;
+       struct pkt_attrib       *pattrib;
+       struct xmit_priv        *pxmitpriv;
+       struct mlme_ext_priv    *pmlmeext;
+       struct mlme_ext_info    *pmlmeinfo;
+       struct pwrctrl_priv *pwrctl;
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       u32     BeaconLength=0, ProbeRspLength=0;
+       u8      *ReservedPagePacket;
+       u8      TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;
+       u8      TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;
+       u8      currentip[4];
+       u16     BufIndex, PageSize = 128;
+       u32     TotalPacketLen = 0, MaxRsvdPageBufSize=0;
+       RSVDPAGE_LOC    RsvdPageLoc;
+#ifdef DBG_CONFIG_ERROR_DETECT
+       struct sreset_priv *psrtpriv;
+#endif // DBG_CONFIG_ERROR_DETECT
+
+       //DBG_871X("%s---->\n", __FUNCTION__);
+       DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d\n",
+               FUNC_ADPT_ARG(padapter), get_iface_type(padapter));
+
+       pHalData = GET_HAL_DATA(padapter);
+#ifdef DBG_CONFIG_ERROR_DETECT
+       psrtpriv = &pHalData->srestpriv;
+#endif
+       pxmitpriv = &padapter->xmitpriv;
+       pmlmeext = &padapter->mlmeextpriv;
+       pmlmeinfo = &pmlmeext->mlmext_info;
+       pwrctl = adapter_to_pwrctl(padapter);
+
+       RsvdPageNum = BCNQ_PAGE_NUM_8723B + AP_WOWLAN_PAGE_NUM_8723B;
+       MaxRsvdPageBufSize = RsvdPageNum*PageSize;
+
+       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
+       if (pcmdframe == NULL) {
+               DBG_871X("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);
+               return;
+       }
+
+       ReservedPagePacket = pcmdframe->buf_addr;
+       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));
+
+       //3 (1) beacon
+       BufIndex = TxDescOffset;
+       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.
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);
+       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware
+       if (CurtPktPageNum == 1)
+       {
+               CurtPktPageNum += 1;
+       }
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       //2 (4) probe response
+       RsvdPageLoc.LocProbeRsp = TotalPageNum;
+
+       rtw_get_current_ip_address(padapter, currentip);
+
+       ConstructProbeRsp(
+               padapter,
+               &ReservedPagePacket[BufIndex],
+               &ProbeRspLength,
+               currentip,
+               _FALSE);
+       rtl8723b_fill_fake_txdesc(padapter,
+                       &ReservedPagePacket[BufIndex-TxDescLen],
+                       ProbeRspLength,
+                       _FALSE, _FALSE, _FALSE);
+
+       DBG_871X("%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\n",
+               __func__, &ReservedPagePacket[BufIndex-TxDescLen],
+               (ProbeRspLength+TxDescLen));
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + ProbeRspLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       TotalPacketLen = BufIndex + ProbeRspLength;
+
+       if (TotalPacketLen > MaxRsvdPageBufSize) {
+               DBG_871X("%s(): ERROR: The rsvd page size is not enough \
+                               !!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",
+                               __func__, TotalPacketLen,MaxRsvdPageBufSize);
+               goto error;
+       } else {
+               // update attribute
+               pattrib = &pcmdframe->attrib;
+               update_mgntframe_attrib(padapter, pattrib);
+               pattrib->qsel = 0x10;
+               pattrib->pktlen = TotalPacketLen - TxDescOffset;
+               pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
+#ifdef CONFIG_PCI_HCI
+               dump_mgntframe(padapter, pcmdframe);
+#else
+               dump_mgntframe_and_wait(padapter, pcmdframe, 100);
+#endif
+       }
+
+       DBG_871X("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum);
+       rtl8723b_set_ap_wow_rsvdpage_cmd(padapter, &RsvdPageLoc);
+
+       return;
+error:
+       rtw_free_xmitframe(pxmitpriv, pcmdframe);
+}
+#endif //CONFIG_AP_WOWLAN
+
+void rtl8723b_download_rsvd_page(PADAPTER padapter, u8 mstatus)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       BOOLEAN         bcn_valid = _FALSE;
+       u8      DLBcnCount=0;
+       u32 poll = 0;
+       u8 val8;
+
+_func_enter_;
+
+       DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d mstatus(%x)\n",
+               FUNC_ADPT_ARG(padapter), get_iface_type(padapter), mstatus);
+
+       if(mstatus == RT_MEDIA_CONNECT)
+       {
+               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));
+
+               // 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.
+               val8 = rtw_read8(padapter, REG_BCN_CTRL);
+               val8 &= ~EN_BCN_FUNCTION;
+               val8 |= DIS_TSF_UDT;
+               rtw_write8(padapter, REG_BCN_CTRL, val8);
+
+               // 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.
+               rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6));
+               pHalData->RegFwHwTxQCtrl &= ~BIT(6);
+
+               // Clear beacon valid check bit.
+               rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);
+               rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);
+
+               DLBcnCount = 0;
+               poll = 0;
+               do
+               {
+#ifdef CONFIG_AP_WOWLAN
+                       if (pwrpriv->wowlan_ap_mode)
+                               rtl8723b_set_AP_FwRsvdPagePkt(padapter, 0);
+                       else
+                               rtl8723b_set_FwRsvdPagePkt(padapter, 0);
+#else
+                       // download rsvd page.
+                       rtl8723b_set_FwRsvdPagePkt(padapter, 0);
+#endif
+                       DLBcnCount++;
+                       do
+                       {
+                               rtw_yield_os();
+                               //rtw_mdelay_os(10);
+                               // check rsvd page download OK.
+                               rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));
+                               poll++;
+                       } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);
+                       
+               }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);
+
+               if(padapter->bSurpriseRemoved || padapter->bDriverStopped)
+               {
+               }
+               else if(!bcn_valid)
+                       DBG_871X(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n",
+                               ADPT_ARG(padapter) ,DLBcnCount, poll);
+               else {
+                       struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+                       pwrctl->fw_psmode_iface_id = padapter->iface_id;
+                       DBG_871X(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n",
+                               ADPT_ARG(padapter), DLBcnCount, poll);
+               }
+
+               // 2010.05.11. Added by tynli.
+               val8 = rtw_read8(padapter, REG_BCN_CTRL);
+               val8 |= EN_BCN_FUNCTION;
+               val8 &= ~DIS_TSF_UDT;
+               rtw_write8(padapter, REG_BCN_CTRL, val8);
+
+               // 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);
+       }
+
+_func_exit_;
+}
+
+void rtl8723b_set_rssi_cmd(_adapter*padapter, u8 *param)
+{
+       rtl8723b_set_FwRssiSetting_cmd(padapter, param);
+}
+
+void rtl8723b_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus)
+{
+       struct sta_info *psta = NULL;
+       struct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
+
+       if(mstatus == 1)
+               rtl8723b_download_rsvd_page(padapter, RT_MEDIA_CONNECT);
+}
+
+//arg[0] = macid
+//arg[1] = raid
+//arg[2] = shortGIrate
+//arg[3] = init_rate
+void rtl8723b_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8* arg, u8 rssi_level)
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       struct mlme_ext_priv    *pmlmeext = &pAdapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct sta_info *psta;
+       u8 mac_id = arg[0];
+       u8 raid = arg[1];
+       u8 shortGI = arg[2];
+       u8 bw;
+       u32 mask = bitmap&0x0FFFFFFF;
+
+       psta = pmlmeinfo->FW_sta_info[mac_id].psta;
+       if(psta == NULL)
+       {
+               return;
+       }
+
+       bw = psta->bw_mode;
+
+       if(rssi_level != DM_RATR_STA_INIT)
+               mask = ODM_Get_Rate_Bitmap(&pHalData->odmpriv, mac_id, mask, rssi_level);               
+
+       DBG_871X("%s(): mac_id=%d raid=0x%x bw=%d mask=0x%x\n", __func__, mac_id, raid, bw, mask);
+       rtl8723b_set_FwMacIdConfig_cmd(pAdapter, mac_id, raid, bw, shortGI, mask);
+}
+
+#if 0
+void rtl8723b_fw_try_ap_cmd(PADAPTER padapter, u32 need_ack)
+{
+       rtl8723b_set_FwAPReqRPT_cmd(padapter, need_ack);
+}
+#endif
+
+#ifdef CONFIG_BT_COEXIST
+static void ConstructBtNullFunctionData(
+       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_ext_priv *pmlmeext;
+       struct mlme_ext_info *pmlmeinfo;
+       u8 bssid[ETH_ALEN];
+
+
+       DBG_871X("+" FUNC_ADPT_FMT ": qos=%d eosp=%d ps=%d\n",
+               FUNC_ADPT_ARG(padapter), bQoS, bEosp, bForcePowerSave);
+
+       pwlanhdr = (struct rtw_ieee80211_hdr*)pframe;
+       pmlmeext = &padapter->mlmeextpriv;
+       pmlmeinfo = &pmlmeext->mlmext_info;
+
+       if (NULL == StaAddr)
+       {
+               _rtw_memcpy(bssid, myid(&padapter->eeprompriv), ETH_ALEN);
+               StaAddr = bssid;
+       }
+
+       fctrl = &pwlanhdr->frame_ctl;
+       *fctrl = 0;
+       if (bForcePowerSave)
+               SetPwrMgt(fctrl);
+
+       SetFrDs(fctrl);
+       _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
+       _rtw_memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), ETH_ALEN);
+
+       SetDuration(pwlanhdr, 0);
+       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;
+}
+
+static void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter)
+{
+       PHAL_DATA_TYPE pHalData;
+       struct xmit_frame *pcmdframe;   
+       struct pkt_attrib *pattrib;
+       struct xmit_priv *pxmitpriv;
+       struct mlme_ext_priv *pmlmeext;
+       struct mlme_ext_info *pmlmeinfo;
+       u32     BeaconLength = 0;
+       u32     BTQosNullLength = 0;
+       u8 *ReservedPagePacket;
+       u8 TxDescLen, TxDescOffset;
+       u8 TotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;
+       u16     BufIndex, PageSize;
+       u32     TotalPacketLen, MaxRsvdPageBufSize=0;
+       RSVDPAGE_LOC RsvdPageLoc;
+
+
+//     DBG_8192C("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
+
+       pHalData = GET_HAL_DATA(padapter);
+       pxmitpriv = &padapter->xmitpriv;
+       pmlmeext = &padapter->mlmeextpriv;
+       pmlmeinfo = &pmlmeext->mlmext_info;
+       TxDescLen = TXDESC_SIZE;
+       TxDescOffset = TXDESC_OFFSET;
+       PageSize = PAGE_SIZE_TX_8723B;
+
+       RsvdPageNum = BCNQ_PAGE_NUM_8723B;
+       MaxRsvdPageBufSize = RsvdPageNum*PageSize;
+
+       pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
+       if (pcmdframe == NULL) {
+               DBG_8192C("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__);
+               return;
+       }
+
+       ReservedPagePacket = pcmdframe->buf_addr;
+       _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));
+
+       //3 (1) beacon
+       BufIndex = TxDescOffset;
+       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.
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BeaconLength);
+       //If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware
+       if (CurtPktPageNum == 1)
+       {
+               CurtPktPageNum += 1;
+       }
+       TotalPageNum += CurtPktPageNum;
+
+       BufIndex += (CurtPktPageNum*PageSize);
+
+       // Jump to lastest page
+       if (BufIndex < (MaxRsvdPageBufSize - PageSize))
+       {
+               BufIndex = TxDescOffset + (MaxRsvdPageBufSize - PageSize);
+               TotalPageNum = BCNQ_PAGE_NUM_8723B - 1;
+       }
+
+       //3 (6) BT Qos null data
+       RsvdPageLoc.LocBTQosNull = TotalPageNum;
+       ConstructBtNullFunctionData(
+               padapter,
+               &ReservedPagePacket[BufIndex],
+               &BTQosNullLength,
+               NULL,
+               _TRUE, 0, 0, _FALSE);
+       rtl8723b_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE, _FALSE);
+
+       CurtPktPageNum = (u8)PageNum_128(TxDescLen + BTQosNullLength);
+
+       TotalPageNum += CurtPktPageNum;
+
+       TotalPacketLen = BufIndex + BTQosNullLength;
+       if (TotalPacketLen > MaxRsvdPageBufSize)
+       {
+               DBG_8192C(FUNC_ADPT_FMT ": ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",
+                       FUNC_ADPT_ARG(padapter), TotalPacketLen, MaxRsvdPageBufSize);
+               goto error;
+       }
+
+       // update attribute
+       pattrib = &pcmdframe->attrib;
+       update_mgntframe_attrib(padapter, pattrib);
+       pattrib->qsel = 0x10;
+       pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;
+#ifdef CONFIG_PCI_HCI
+       dump_mgntframe(padapter, pcmdframe);
+#else
+       dump_mgntframe_and_wait(padapter, pcmdframe, 100);
+#endif
+
+//     DBG_8192C(FUNC_ADPT_FMT ": Set RSVD page location to Fw, TotalPacketLen(%d), TotalPageNum(%d)\n",
+//             FUNC_ADPT_ARG(padapter), TotalPacketLen, TotalPageNum);
+       rtl8723b_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc);
+       rtl8723b_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);
+
+       return;
+
+error:
+       rtw_free_xmitframe(pxmitpriv, pcmdframe);
+}
+
+void rtl8723b_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter)
+{
+       PHAL_DATA_TYPE pHalData;
+       struct mlme_ext_priv *pmlmeext;
+       struct mlme_ext_info *pmlmeinfo;
+       u8 bRecover = _FALSE;
+       u8 bcn_valid = _FALSE;
+       u8 DLBcnCount = 0;
+       u32 poll = 0;
+       u8 val8;
+
+
+       DBG_8192C("+" FUNC_ADPT_FMT ": iface_type=%d fw_state=0x%08X\n",
+               FUNC_ADPT_ARG(padapter), get_iface_type(padapter), get_fwstate(&padapter->mlmepriv));
+
+#ifdef CONFIG_DEBUG
+       if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _FALSE)
+       {
+               DBG_8192C(FUNC_ADPT_FMT ": [WARNING] not in AP mode!!\n",
+                       FUNC_ADPT_ARG(padapter));
+       }
+#endif // CONFIG_DEBUG
+
+       pHalData = GET_HAL_DATA(padapter);
+       pmlmeext = &padapter->mlmeextpriv;
+       pmlmeinfo = &pmlmeext->mlmext_info;
+
+       // 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));
+       
+       // set REG_CR bit 8
+       val8 = rtw_read8(padapter, REG_CR+1);
+       val8 |= BIT(0); // ENSWBCN
+       rtw_write8(padapter,  REG_CR+1, val8);
+       
+       // 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.
+       val8 = rtw_read8(padapter, REG_BCN_CTRL);
+       val8 &= ~EN_BCN_FUNCTION;
+       val8 |= DIS_TSF_UDT;
+       rtw_write8(padapter, REG_BCN_CTRL, val8);
+
+       // 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);
+
+       // Clear beacon valid check bit.
+       rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);
+       rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);
+
+       DLBcnCount = 0;
+       poll = 0;
+       do {
+               SetFwRsvdPagePkt_BTCoex(padapter);
+               DLBcnCount++;
+               do {
+                       rtw_yield_os();
+//                     rtw_mdelay_os(10);
+                       // check rsvd page download OK.
+                       rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, &bcn_valid);
+                       poll++;
+               } while (!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);
+       } while (!bcn_valid && (DLBcnCount<=100) && !padapter->bSurpriseRemoved && !padapter->bDriverStopped);
+
+       if (_TRUE == bcn_valid)
+       {
+               struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
+               pwrctl->fw_psmode_iface_id = padapter->iface_id;
+               DBG_8192C(ADPT_FMT": DL RSVD page success! DLBcnCount:%d, poll:%d\n",
+                       ADPT_ARG(padapter), DLBcnCount, poll);
+       }
+       else
+       {
+               DBG_8192C(ADPT_FMT": DL RSVD page fail! DLBcnCount:%d, poll:%d\n",
+                       ADPT_ARG(padapter), DLBcnCount, poll);
+               DBG_8192C(ADPT_FMT": DL RSVD page fail! bSurpriseRemoved=%d\n",
+                       ADPT_ARG(padapter), padapter->bSurpriseRemoved);
+               DBG_8192C(ADPT_FMT": DL RSVD page fail! bDriverStopped=%d\n",
+                       ADPT_ARG(padapter), padapter->bDriverStopped);
+       }
+
+       // 2010.05.11. Added by tynli.
+       val8 = rtw_read8(padapter, REG_BCN_CTRL);
+       val8 |= EN_BCN_FUNCTION;
+       val8 &= ~DIS_TSF_UDT;
+       rtw_write8(padapter, REG_BCN_CTRL, val8);
+
+       // 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);
+       }
+
+       // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
+       val8 = rtw_read8(padapter, REG_CR+1);
+       val8 &= ~BIT(0); // ~ENSWBCN
+       rtw_write8(padapter, REG_CR+1, val8);
+}
+#endif // CONFIG_BT_COEXIST
+
+#ifdef CONFIG_P2P
+void rtl8723b_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 = (struct P2P_PS_Offload_t      *)(&pHalData->p2p_ps_offload);
+       u8      i;
+
+_func_enter_;
+
+#if 1
+       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 ; i<pwdinfo->noa_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(pwdinfo->role == 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;
+       }
+
+       FillH2CCmd8723B(padapter, H2C_8723B_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
+#endif
+
+_func_exit_;
+
+}
+#endif //CONFIG_P2P
+
+
+#ifdef CONFIG_TSF_RESET_OFFLOAD
+/*
+       ask FW to Reset sync register at Beacon early interrupt
+*/
+u8 rtl8723b_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;
+       }
+       FillH2CCmd8723B(padapter, H2C_8723B_RESET_TSF, 2, buf);
+_func_exit_;
+
+       return res;
+}
+#endif // CONFIG_TSF_RESET_OFFLOAD
+
index 57139287ed8449823c654d42bcf3f4d69967e34a..df708ccfb6b26bd5fa9ed030cc665aa4214ff4eb 100755 (executable)
@@ -83,7 +83,7 @@ dm_CheckStatistics(
        rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );\r
 #endif\r
 }\r
-\r
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
 static void dm_CheckPbcGPIO(_adapter *padapter)\r
 {\r
        u8      tmp1byte;\r
@@ -131,26 +131,11 @@ static void dm_CheckPbcGPIO(_adapter *padapter)
                // Here we only set bPbcPressed to true\r
                // After trigger PBC, the variable will be set to false\r
                DBG_8192C("CheckPbcGPIO - PBC is pressed\n");\r
-\r
-#ifdef RTK_DMP_PLATFORM\r
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))\r
-               kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC);\r
-#else\r
-               kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC);\r
-#endif\r
-#else\r
-\r
-               if ( padapter->pid[0] == 0 )\r
-               {       //      0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver.\r
-                       return;\r
-               }\r
-\r
-#ifdef PLATFORM_LINUX\r
-               rtw_signal_process(padapter->pid[0], SIGUSR1);\r
-#endif\r
-#endif\r
+               rtw_request_wps_pbc_event(padapter);\r
        }\r
 }\r
+#endif //#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
+\r
 \r
 #ifdef CONFIG_PCI_HCI\r
 //\r
@@ -268,12 +253,12 @@ static void Init_ODM_ComInfo_8723b(PADAPTER       Adapter)
        //\r
        // Init Value\r
        //\r
-       _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm));\r
+       _rtw_memset(pDM_Odm,0,sizeof(*pDM_Odm));\r
 \r
        pDM_Odm->Adapter = Adapter;\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE);\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE\r
-\r
+       ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);\r
        ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);\r
 \r
        fab_ver = ODM_TSMC;\r
@@ -338,6 +323,7 @@ static void Update_ODM_ComInfo_8723b(PADAPTER       Adapter)
                | ODM_BB_RSSI_MONITOR\r
                | ODM_BB_CCK_PD\r
                | ODM_BB_PWR_SAVE\r
+               | ODM_BB_CFO_TRACKING\r
                | ODM_MAC_EDCA_TURBO\r
                | ODM_RF_TX_PWR_TRACK\r
                | ODM_RF_CALIBRATION\r
@@ -432,7 +418,9 @@ rtl8723b_InitHalDm(
        pdmpriv->InitDMFlag = pdmpriv->DMFlag;\r
 \r
        Update_ODM_ComInfo_8723b(Adapter);\r
-       ODM_DMInit(pDM_Odm);\r
+       \r
+       if (Adapter->registrypriv.mp_mode == 0)\r
+               ODM_DMInit(pDM_Odm);\r
 \r
 }\r
 \r
@@ -566,7 +554,7 @@ if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP p
                // Calculate Tx/Rx statistics.\r
                //\r
                dm_CheckStatistics(Adapter);\r
-\r
+               rtw_hal_check_rxfifo_full(Adapter);\r
                //\r
                // Dynamically switch RTS/CTS protection.\r
                //\r
@@ -587,26 +575,32 @@ if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP p
        {\r
                u8      bLinked=_FALSE;\r
                u8      bsta_state=_FALSE;\r
-               if(rtw_linked_check(Adapter))\r
-                       bLinked = _TRUE;\r
+               u8      bBtDisabled = _TRUE;\r
 \r
+               if(rtw_linked_check(Adapter)){                  \r
+                       bLinked = _TRUE;\r
+                       if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
+                               bsta_state = _TRUE;\r
+               }\r
+                       \r
 #ifdef CONFIG_CONCURRENT_MODE\r
-               if (pbuddy_adapter && rtw_linked_check(pbuddy_adapter))\r
+               if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){\r
                        bLinked = _TRUE;\r
+                       if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
+                               bsta_state = _TRUE;\r
+               }\r
 #endif //CONFIG_CONCURRENT_MODE\r
-               ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
 \r
-               if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
-                       bsta_state = _TRUE;\r
-#ifdef CONFIG_CONCURRENT_MODE\r
-               if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
-                       bsta_state = _TRUE;\r
-#endif //CONFIG_CONCURRENT_MODE        \r
+               ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
                ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\r
 \r
+               //FindMinimumRSSI_8723b(Adapter);\r
+               //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
 \r
-               FindMinimumRSSI_8723b(Adapter);\r
-               ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
+#ifdef CONFIG_BT_COEXIST\r
+               bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);\r
+#endif // CONFIG_BT_COEXIST\r
+               ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == _TRUE)?_FALSE:_TRUE));\r
 \r
                ODM_DMWatchdog(&pHalData->odmpriv);\r
        }\r
@@ -620,14 +614,10 @@ skip_dm:
                //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));\r
        //      dm_CheckRfCtrlGPIO(Adapter);\r
        //}\r
-\r
-#ifdef CONFIG_PCI_HCI\r
-       if(pHalData->bGpioHwWpsPbc)\r
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
+       dm_CheckPbcGPIO(Adapter);\r
 #endif\r
-       {\r
-               dm_CheckPbcGPIO(Adapter);                               // Add by hpfan 2008-03-11\r
-       }\r
-\r
+       return;\r
 }\r
 \r
 void rtl8723b_hal_dm_in_lps(PADAPTER padapter)\r
index 96a5129f86d1f442acc80d9e185db35a5ba19dab..ebfeccecc1c6ea29bbfcdf92b22cd46c2989ca69 100755 (executable)
@@ -78,6 +78,10 @@ _BlockWrite(
        u32                     remainSize_p1 = 0, remainSize_p2 = 0;
        u8                      *bufferPtr      = (u8*)buffer;
        u32                     i=0, offset=0;
+#ifdef CONFIG_PCI_HCI
+       u8                      remainFW[4] = {0, 0, 0, 0};
+       u8                      *p = NULL;
+#endif
 
 #ifdef CONFIG_USB_HCI
        blockSize_p1 = 254;
@@ -108,6 +112,25 @@ _BlockWrite(
                }
        }
 
+#ifdef CONFIG_PCI_HCI
+       p = (u8*)((u32*)(bufferPtr + blockCount_p1 * blockSize_p1));
+       if (remainSize_p1) {
+               switch (remainSize_p1) {
+               case 0:
+                       break;
+               case 3:
+                       remainFW[2]=*(p+2);
+               case 2:         
+                       remainFW[1]=*(p+1);
+               case 1:         
+                       remainFW[0]=*(p);
+                       ret = rtw_write32(padapter, (FW_8723B_START_ADDRESS + blockCount_p1 * blockSize_p1), 
+                                le32_to_cpu(*(u32*)remainFW)); 
+               }
+               return ret;
+       }
+#endif
+
        //3 Phase #2
        if (remainSize_p1)
        {
@@ -433,6 +456,14 @@ int _WriteBTFWtoTxPktBuf8723B(
 #else
        TotalPktLen = FwBufLen+pHalData->HWDescHeadLength;
 #endif
+
+       if((TotalPktLen+TXDESC_OFFSET) > MAX_CMDBUF_SZ)
+       {
+               DBG_871X(" WARNING %s => Total packet len = %d > MAX_CMDBUF_SZ:%d \n"
+                       ,__FUNCTION__,(TotalPktLen+TXDESC_OFFSET),MAX_CMDBUF_SZ);
+               return _FAIL;
+       }
+
        pGenBufReservedPagePacket = rtw_zmalloc(TotalPktLen);//GetGenTempBuffer (Adapter, TotalPktLen);
        if (!pGenBufReservedPagePacket)
                return _FAIL;
@@ -466,8 +497,8 @@ int _WriteBTFWtoTxPktBuf8723B(
        // Fix download reserved page packet fail that access collision with the protection time.
        // 2010.05.11. Added by tynli.
        val8 = rtw_read8(Adapter, REG_BCN_CTRL);
-       val8 &= ~BIT(3);
-       val8 |= BIT(4);
+       val8 &= ~EN_BCN_FUNCTION;
+       val8 |= DIS_TSF_UDT;
        rtw_write8(Adapter, REG_BCN_CTRL, val8);
 
 #if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE)
@@ -495,7 +526,7 @@ int _WriteBTFWtoTxPktBuf8723B(
        }
        
        // Init Tx boundary.
-       PlatformEFIOWrite1Byte(Adapter, REG_TDECTRL_8723B+1, (u1Byte)txpktbuf_bndy);    
+       PlatformEFIOWrite1Byte(Adapter, REG_DWBCN0_CTRL_8723B+1, (u1Byte)txpktbuf_bndy);        
 #endif
 
 
@@ -534,9 +565,9 @@ int _WriteBTFWtoTxPktBuf8723B(
                /*---------------------------------------------------------
                tx reserved_page_packet
                ----------------------------------------------------------*/
-                       if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) {
-                                               rtStatus = _FAIL;
-                                               goto exit;
+                       if ((pmgntframe = rtw_alloc_cmdxmitframe(pxmitpriv)) == NULL) {
+                                       rtStatus = _FAIL;
+                                       goto exit;
                        }
                        //update attribute
                        pattrib = &pmgntframe->attrib;
@@ -548,10 +579,14 @@ int _WriteBTFWtoTxPktBuf8723B(
                        //_rtw_memset(pmgntframe->buf_addr, 0, TotalPktLen+txdesc_size);
                        //pmgntframe->buf_addr = ReservedPagePacket ;
 
-               _rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen);
-               DBG_871X("[%d]===>TotalPktLen + TXDESC_OFFSET TotalPacketLen:%d \n", DLBcnCount, (FwBufLen + txdesc_offset));
-
-                    dump_mgntframe(Adapter, pmgntframe);
+                       _rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen);
+                       DBG_871X("[%d]===>TotalPktLen + TXDESC_OFFSET TotalPacketLen:%d \n", DLBcnCount, (FwBufLen + txdesc_offset));
+                       
+#ifdef CONFIG_PCI_HCI
+                       dump_mgntframe(Adapter, pmgntframe);
+#else
+                       dump_mgntframe_and_wait(Adapter, pmgntframe, 100);
+#endif
 
 #endif
 #if 1
@@ -675,17 +710,17 @@ _CheckWLANFwPatchBTFwReady(
        //---------------------------------------------------------
        do{
                u1bTmp = PlatformEFIORead1Byte(Adapter, REG_HMEBOX_DBG_0_8723B);
-               if(u1bTmp&BIT(7))
+               if((u1bTmp&BIT6) || (u1bTmp&BIT7))
                {
                        ret = _SUCCESS;
                        break;
                }
 
                count++;
-               RT_TRACE(_module_mp_, _drv_info_,("0x81=%x, wait for 50 ms (%d) times.\n",
+               RT_TRACE(_module_mp_, _drv_info_,("0x88=%x, wait for 50 ms (%d) times.\n",
                                        u1bTmp, count));
                rtw_msleep_os(50); // 50ms
-       }while(!(u1bTmp&BIT(7)) && count < 50);
+       }while(!((u1bTmp&BIT6) || (u1bTmp&BIT7)) && count < 50);
 
        RT_TRACE(_module_mp_, _drv_notice_,("_CheckWLANFwPatchBTFwReady():"
                                " Polling ready bit 0x88[7] for %d times.\n", count));
@@ -707,8 +742,8 @@ _CheckWLANFwPatchBTFwReady(
        }
 #endif
        u1bTmp = rtw_read8(Adapter, REG_BCN_CTRL);
-       u1bTmp |= BIT(3);
-       u1bTmp &= ~BIT(4);
+       u1bTmp |= EN_BCN_FUNCTION;
+       u1bTmp &= ~DIS_TSF_UDT;
        rtw_write8(Adapter, REG_BCN_CTRL, u1bTmp);
 
        // To make sure that if there exists an adapter which would like to send beacon.
@@ -725,15 +760,9 @@ _CheckWLANFwPatchBTFwReady(
 #endif
 
        // Clear CR[8] or beacon packet will not be send to TxBuf anymore.
-#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE)
-       u1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR+1);
-       PlatformEFIOWrite1Byte(Adapter, REG_CR+1, (u1bTmp&(~BIT0)));
-#else
-       // Remove for temparaily because of the code on v2002 is not sync to MERGE_TMEP for USB/SDIO.
-       // De not remove this part on MERGE_TEMP. by tynli.
-       //pHalData->RegCR_1 &= (~BIT0);
-       //PlatformEFIOWrite1Byte(Adapter,  REG_CR+1, pHalData->RegCR_1);
-#endif
+       u1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR_8723B+1);
+       PlatformEFIOWrite1Byte(Adapter, REG_CR_8723B+1, (u1bTmp&(~BIT0)));
+
        return ret;
 }
 
@@ -1157,7 +1186,7 @@ void rtl8723b_InitializeFirmwareVars(PADAPTER padapter)
 //     pHalData->H2CStopInsertQueue = _FALSE;
 }
 
-#ifdef CONFIG_WOWLAN
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 //===========================================
 
 //
@@ -1197,10 +1226,7 @@ SetFwRelatedForWoWLAN8723b(
 static void rtl8723b_free_hal_data(PADAPTER padapter)
 {
 _func_enter_;
-       if (padapter->HalData) {
-               rtw_mfree(padapter->HalData, sizeof(HAL_DATA_TYPE));
-               padapter->HalData = NULL;
-       }       
+
 _func_exit_;
 }
 
@@ -2825,7 +2851,7 @@ ReadChipVersion8723B(
        dump_chip_info(ChipVersion);
 #endif
        pHalData->VersionID = ChipVersion;
-       
+/*     // mark for chage to use efuse
        if( IS_B_CUT(ChipVersion) || IS_C_CUT(ChipVersion))
        {
                MSG_8192C(" IS_B/C_CUT SWR up 1 level !!!!!!!!!!!!!!!!!\n");
@@ -2834,6 +2860,7 @@ ReadChipVersion8723B(
        {
                MSG_8192C(" IS_D_CUT SKIP SWR !!!!!!!!!!!!!!!!!\n");
        }
+*/
        if (IS_1T2R(ChipVersion))
                pHalData->rf_type = RF_1T2R;
        else if (IS_2T2R(ChipVersion))
@@ -2855,9 +2882,17 @@ static void rtl8723b_read_chip_version(PADAPTER padapter)
 void rtl8723b_InitBeaconParameters(PADAPTER padapter)
 {
        PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
+       u16 val16;
+       u8 val8;
 
 
-       rtw_write16(padapter, REG_BCN_CTRL, 0x1010);
+       val8 = DIS_TSF_UDT;
+       val16 = val8 | (val8 << 8); // port0 and port1
+#ifdef CONFIG_BT_COEXIST
+       // Enable prot0 beacon function for PSTDMA
+       val16 |= EN_BCN_FUNCTION;
+#endif
+       rtw_write16(padapter, REG_BCN_CTRL, val16);
 
        // TODO: Remove these magic number
        rtw_write16(padapter, REG_TBTT_PROHIBIT, 0x6404);// ms
@@ -2980,11 +3015,9 @@ static void rtl8723b_SetBeaconRelatedRegisters(PADAPTER padapter)
 
        bcn_ctrl_reg = REG_BCN_CTRL;
 #ifdef CONFIG_CONCURRENT_MODE
-    if (padapter->iface_type == IFACE_PORT1)
-       {
+       if (padapter->iface_type == IFACE_PORT1)
                bcn_ctrl_reg = REG_BCN_CTRL_1;
-    }
-#endif 
+#endif
 
        //
        // ATIM window
@@ -3029,14 +3062,13 @@ void rtl8723b_GetHalODMVar(
        PADAPTER                                Adapter,
        HAL_ODM_VARIABLE                eVariable,
        PVOID                                   pValue1,
-       BOOLEAN                                 bSet)
+       PVOID                                   pValue2)
 {
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
        PDM_ODM_T podmpriv = &pHalData->odmpriv;
        switch(eVariable){
-               case HAL_ODM_STA_INFO:
-                       break;
                default:
+                       GetHalODMVar(Adapter,eVariable,pValue1,pValue2);
                        break;
        }
 }
@@ -3049,35 +3081,9 @@ void rtl8723b_SetHalODMVar(
 {
        HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
        PDM_ODM_T podmpriv = &pHalData->odmpriv;
-       switch(eVariable){
-               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);
-                               }
-                               else{
-                                       DBG_8192C("Clean STA_(%d) info\n",psta->mac_id);
-                                       ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
-                               }
-                       }
-                       break;
-               case HAL_ODM_P2P_STATE:
-                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
-                       break;
-               case HAL_ODM_WIFI_DISPLAY_STATE:
-                               ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
-                       break;
+       switch(eVariable){              
                default:
+                       SetHalODMVar(Adapter,eVariable,pValue1,bSet);
                        break;
        }
 }
@@ -3339,6 +3345,8 @@ void rtl8723b_init_default_value(PADAPTER padapter)
        pHalData = GET_HAL_DATA(padapter);
        pdmpriv = &pHalData->dmpriv;
 
+       padapter->registrypriv.wireless_mode = WIRELESS_11BG_24N;
+
        // init default value
        pHalData->fw_ractrl = _FALSE;
        pHalData->bIQKInitialized = _FALSE;
@@ -3937,7 +3945,7 @@ Hal_EEValueCheck(
                                u8      *pIn, *pOut;
                                pIn = (u8*)pInValue;
                                pOut = (u8*)pOutValue;
-                               if(*pIn >= 0 && *pIn <= 63)
+                               if(*pIn <= 63)
                                {
                                        *pOut = *pIn;
                                }
@@ -4193,27 +4201,76 @@ Hal_EfuseParseBTCoexistInfo_8723B(
                        pHalData->EEPROMBluetoothCoexist = _TRUE;
                else
                        pHalData->EEPROMBluetoothCoexist = _FALSE;
+
                pHalData->EEPROMBluetoothType = BT_RTL8723B;
 
-               // The following need to be checked with newer version of
-               // eeprom spec
                tempval = hwinfo[EEPROM_RF_BT_SETTING_8723B];
-               pHalData->EEPROMBluetoothAntNum = (tempval&0x1);                                        // bit [0]
+               if(tempval !=0xFF){
+                       pHalData->EEPROMBluetoothAntNum = tempval & BIT(0);
+                       #ifdef CONFIG_USB_HCI
+                       //if(padapter->interface_type == RTW_USB)
+                       pHalData->ant_path =ODM_RF_PATH_B;//s0
+                       #else //SDIO or PCIE
+                       // EFUSE_0xC3[6] == 0, S1(Main)-ODM_RF_PATH_A;
+                       // EFUSE_0xC3[6] == 1, S0(Aux)-ODM_RF_PATH_B
+                       pHalData->ant_path = (tempval & BIT(6))?ODM_RF_PATH_B:ODM_RF_PATH_A;
+                       #endif
+               }
+               else{
+                       pHalData->EEPROMBluetoothAntNum = Ant_x1;
+                       #ifdef CONFIG_USB_HCI
+                       pHalData->ant_path = ODM_RF_PATH_B;//s0
+                       #else
+                       pHalData->ant_path = ODM_RF_PATH_A;
+                       #endif                  
+               }
        }
        else
        {
                pHalData->EEPROMBluetoothCoexist = _FALSE;
                pHalData->EEPROMBluetoothType = BT_RTL8723B;
-               pHalData->EEPROMBluetoothAntNum = Ant_x2;
+               pHalData->EEPROMBluetoothAntNum = Ant_x1;
+               #ifdef CONFIG_USB_HCI
+               pHalData->ant_path = ODM_RF_PATH_B;//s0
+               #else
+               pHalData->ant_path = ODM_RF_PATH_A;
+               #endif
        }
 
 #ifdef CONFIG_BT_COEXIST
+       if (padapter->registrypriv.ant_num > 0) {
+               DBG_8192C("%s: Apply driver defined antenna number(%d) to replace origin(%d)\n",
+                       __FUNCTION__,
+                       padapter->registrypriv.ant_num,
+                       pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1);
+
+               switch (padapter->registrypriv.ant_num) {
+               case 1:
+                       pHalData->EEPROMBluetoothAntNum = Ant_x1;
+                       break;
+               case 2:
+                       pHalData->EEPROMBluetoothAntNum = Ant_x2;
+                       break;
+               default:
+                       DBG_8192C("%s: Discard invalid driver defined antenna number(%d)!\n",
+                               __FUNCTION__, padapter->registrypriv.ant_num);
+                       break;
+               }
+       }
+
        rtw_btcoex_SetBTCoexist(padapter, pHalData->EEPROMBluetoothCoexist);
        rtw_btcoex_SetChipType(padapter, pHalData->EEPROMBluetoothType);
-       rtw_btcoex_SetPGAntNum(padapter, pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1);
+       rtw_btcoex_SetPGAntNum(padapter, pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1); 
+       if (pHalData->EEPROMBluetoothAntNum == Ant_x1)
+       {
+               rtw_btcoex_SetSingleAntPath(padapter, pHalData->ant_path);
+       }
 #endif // CONFIG_BT_COEXIST
 
-       RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("%s(): EEPROMBluetoothCoexist=%d EEPROMBluetoothAntNum = %d\n", __func__, pHalData->EEPROMBluetoothCoexist, pHalData->EEPROMBluetoothAntNum));
+       DBG_8192C("%s: %s BT-coex, ant_num=%d\n",
+               __FUNCTION__,
+               pHalData->EEPROMBluetoothCoexist==_TRUE?"Enable":"Disable",
+               pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1);
 }
 
 VOID
@@ -4265,11 +4322,11 @@ Hal_EfuseParsePackageType_8723B(
                        pHalData->PackageType = PACKAGE_QFN68;
                        break;
                case 0x7:
-                       pHalData->PackageType = PACKAGE_TFBGA79;
+                       pHalData->PackageType = PACKAGE_TFBGA80;
                        break;
 
                default:
-                       pHalData->PackageType = PACKAGE_TFBGA79;
+                       pHalData->PackageType = PACKAGE_DEFAULT;
                        break;
        }
 
@@ -4277,6 +4334,21 @@ Hal_EfuseParsePackageType_8723B(
 }
 
 
+VOID
+Hal_EfuseParseVoltage_8723B(
+       IN      PADAPTER                pAdapter,
+       IN      u8*                     hwinfo,
+       IN      BOOLEAN         AutoLoadFail
+       ) 
+{
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
+       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter);
+
+       //_rtw_memcpy(pEEPROM->adjuseVoltageVal, &hwinfo[EEPROM_Voltage_ADDR_8723B], 1);
+       DBG_871X("%s hwinfo[EEPROM_Voltage_ADDR_8723B] =%02x \n",__func__, hwinfo[EEPROM_Voltage_ADDR_8723B]);
+       pEEPROM->adjuseVoltageVal = (hwinfo[EEPROM_Voltage_ADDR_8723B] & 0xf0) >> 4 ;
+       DBG_871X("%s pEEPROM->adjuseVoltageVal =%x \n",__func__,pEEPROM->adjuseVoltageVal);
+}
 
 VOID
 Hal_EfuseParseChnlPlan_8723B(
@@ -4326,9 +4398,39 @@ Hal_EfuseParseAntennaDiversity_8723B(
        IN      BOOLEAN                 AutoLoadFail
        )
 {
-#if 0
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       
+#ifdef CONFIG_ANTENNA_DIVERSITY
+       HAL_DATA_TYPE           pHalData = GET_HAL_DATA(pAdapter);
+       struct registry_priv    *registry_par = &pAdapter->registrypriv;
+
+       if (pHalData->EEPROMBluetoothAntNum == Ant_x1){
+               pHalData->AntDivCfg = 0;
+       }
+       else{
+               if(registry_par->antdiv_cfg == 2)// 0:OFF , 1:ON, 2:By EFUSE
+                       pHalData->AntDivCfg = 0;  
+               else
+                       pHalData->AntDivCfg = registry_par->antdiv_cfg;
+       }
+
+       //if (REGISTRY(pAdapter,bEfusePriorityAuto) == TRUE)
+       if(registry_par->antdiv_type == 0)// If TRxAntDivType is AUTO in advanced setting, use EFUSE value instead.
+       {
+               pHalData->TRxAntDivType = hwinfo[EEPROM_RFE_OPTION_8723B];
+               if (pHalData->TRxAntDivType == 0xFF)
+                       pHalData->TRxAntDivType = S0S1_SW_ANTDIV;//GetRegAntDivType(pAdapter);
+               else if (pHalData->TRxAntDivType == 0x10)
+                       pHalData->TRxAntDivType = S0S1_SW_ANTDIV; //intrnal switch S0S1
+               else if (pHalData->TRxAntDivType == 0x11)               
+                       pHalData->TRxAntDivType = S0S1_SW_ANTDIV; //intrnal switch S0S1
+                       //pHalData->TRxAntDivType = CG_TRX_HW_ANTDIV; //DPDT
+               
+       }
+       else{
+               pHalData->TRxAntDivType = registry_par->antdiv_type ;//GetRegAntDivType(pAdapter);
+       }
+               
+               
+/*
        if(!AutoLoadFail)
        {
                // Antenna Diversity setting.
@@ -4343,9 +4445,10 @@ Hal_EfuseParseAntennaDiversity_8723B(
                pHalData->AntDivCfg = 0;
                pHalData->ReverseDPDT = 1;
        }
-       
+
        RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("EEPROM SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n", 
                                                 pHalData->AntDivCfg, pHalData->TRxAntDivType));
+*/
 #endif 
 }
 
@@ -4530,6 +4633,7 @@ u8        SCMapping_8723B(PADAPTER Adapter, struct pkt_attrib *pattrib)
        return SCSettingOfDesc;
 }
 
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
 void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc)
 {
        u16     *usPtr = (u16*)ptxdesc;
@@ -4552,6 +4656,7 @@ void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc)
 
        ptxdesc->txdw7 |= cpu_to_le32(checksum & 0x0000ffff);
 }
+#endif
 
 static u8 fill_txdesc_sectype(struct pkt_attrib *pattrib)
 {
@@ -4691,7 +4796,7 @@ static void rtl8723b_fill_default_txdesc(
                        {
                                ptxdesc->agg_en = 1; // AGG EN
                                ptxdesc->max_agg_num = 0x1f;
-                               ptxdesc->ampdu_density = pHalData->AMPDUDensity;
+                               ptxdesc->ampdu_density = pattrib->ampdu_spacing;
                        }
                        else
                                ptxdesc->bk = 1; // AGG BK
@@ -4901,7 +5006,9 @@ void rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf)
        pdesc->txdw15 = cpu_to_le32(pdesc->txdw15);
 #endif
 
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
        rtl8723b_cal_txdesc_chksum(pdesc);
+#endif
 }
 
 //
@@ -5024,10 +5131,8 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
                
                Set_MSR(padapter, mode);
                
-               DBG_871X("#### %s() -%d iface_type(%d) mode = %d ####\n", __FUNCTION__, __LINE__, padapter->iface_type,mode);
-
-               
-               DBG_871X("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode);
+               DBG_871X("#### %s()-%d iface_type(%d) mode=%d ####\n",
+                       __FUNCTION__, __LINE__, padapter->iface_type, mode);
 
                if ((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))
                {
@@ -5052,12 +5157,13 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
 #endif // !CONFIG_PCI_HCI
                        }
 
-                       rtw_write8(padapter, REG_BCN_CTRL_1, 0x11);//disable atim wnd and disable beacon function
+                       // disable atim wnd and disable beacon function
+                       rtw_write8(padapter, REG_BCN_CTRL_1, DIS_TSF_UDT|DIS_ATIM);
                }
                else if ((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)
                {
                        ResumeTxBeacon(padapter);
-                       rtw_write8(padapter, REG_BCN_CTRL_1, 0x1a);
+                       rtw_write8(padapter, REG_BCN_CTRL_1, DIS_TSF_UDT|EN_BCN_FUNCTION|DIS_BCNQ_SUB);
                }
                else if (mode == _HW_STATE_AP_)
                {
@@ -5079,7 +5185,7 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
 
                        ResumeTxBeacon(padapter);
 
-                       rtw_write8(padapter, REG_BCN_CTRL_1, 0x12);
+                       rtw_write8(padapter, REG_BCN_CTRL_1, DIS_TSF_UDT|DIS_BCNQ_SUB);
 
                        // Set RCR
                        //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0
@@ -5106,23 +5212,21 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
                        // don't enable update TSF1 for if2 (due to TSF update when beacon/probe rsp are received)
                        rtw_write8(padapter, REG_BCN_CTRL_1, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB));
 
-                       
                        //SW_BCN_SEL - Port1
-                       //rtw_write8(Adapter, REG_DWBCN1_CTRL+2, rtw_read8(Adapter, REG_DWBCN1_CTRL+2)|BIT4);
+                       //rtw_write8(Adapter, REG_DWBCN1_CTRL_8192E+2, rtw_read8(Adapter, REG_DWBCN1_CTRL_8192E+2)|BIT4);
                        rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);
                        
                        // select BCN on port 1
                        rtw_write8(padapter, REG_CCK_CHECK_8723B,
                                (rtw_read8(padapter, REG_CCK_CHECK_8723B)|BIT_BCN_PORT_SEL));
                        
-#ifdef CONFIG_CONCURRENT_MODE
                        if (check_buddy_fwstate(padapter, WIFI_FW_NULL_STATE))
                        {
                                val8 = rtw_read8(padapter, REG_BCN_CTRL);
                                val8 &= ~EN_BCN_FUNCTION;
                                rtw_write8(padapter, REG_BCN_CTRL, val8);
                        }
-#endif
+
                        //BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked
                        //rtw_write8(padapter, REG_BCN_CTRL_1, rtw_read8(padapter, REG_BCN_CTRL_1)|BIT(5));
                        //rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(3));
@@ -5177,13 +5281,14 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
 #endif // !CONFIG_PCI_HCI
                        }
 
-                       rtw_write8(padapter, REG_BCN_CTRL, 0x19); // disable atim wnd
+                       // disable atim wnd
+                       rtw_write8(padapter, REG_BCN_CTRL, DIS_TSF_UDT|EN_BCN_FUNCTION|DIS_ATIM);
                        //rtw_write8(padapter,REG_BCN_CTRL, 0x18);
                }
                else if ((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)
                {
                        ResumeTxBeacon(padapter);
-                       rtw_write8(padapter, REG_BCN_CTRL, 0x1a);
+                       rtw_write8(padapter, REG_BCN_CTRL, DIS_TSF_UDT|EN_BCN_FUNCTION|DIS_BCNQ_SUB);
                }
                else if (mode == _HW_STATE_AP_)
                {
@@ -5204,7 +5309,7 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
 
                        ResumeTxBeacon(padapter);
 
-                       rtw_write8(padapter, REG_BCN_CTRL, 0x12);
+                       rtw_write8(padapter, REG_BCN_CTRL, DIS_TSF_UDT|DIS_BCNQ_SUB);
 
                        //Set RCR
                        //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0
@@ -5232,7 +5337,7 @@ static void hw_var_set_opmode(PADAPTER padapter, u8 variable, u8* val)
                        rtw_write8(padapter, REG_BCN_CTRL, (DIS_TSF_UDT|EN_BCN_FUNCTION|EN_TXBCN_RPT|DIS_BCNQ_SUB));
                
                        //SW_BCN_SEL - Port0
-                       //rtw_write8(Adapter, REG_DWBCN1_CTRL+2, rtw_read8(Adapter, REG_DWBCN1_CTRL+2) & ~BIT4);
+                       //rtw_write8(Adapter, REG_DWBCN1_CTRL_8192E+2, rtw_read8(Adapter, REG_DWBCN1_CTRL_8192E+2) & ~BIT4);
                        rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);
                        
                        // select BCN on port 0
@@ -5283,7 +5388,7 @@ static void hw_var_set_macaddr(PADAPTER padapter, u8 variable, u8 *val)
 
        for (idx = 0 ; idx < 6; idx++)
        {
-               rtw_write8(padapter, (reg_macid+idx), val[idx]);
+               rtw_write8(GET_PRIMARY_ADAPTER(padapter), (reg_macid+idx), val[idx]);
        }
 }
 
@@ -5333,6 +5438,11 @@ static void hw_var_set_bcn_func(PADAPTER padapter, u8 variable, u8 *val)
                u8 val8;
                val8 = rtw_read8(padapter, bcn_ctrl_reg);
                val8 &= ~(EN_BCN_FUNCTION | EN_TXBCN_RPT);
+#ifdef CONFIG_BT_COEXIST
+               // Always enable port0 beacon function for PSTDMA
+               if (REG_BCN_CTRL == bcn_ctrl_reg)
+                       val8 |= EN_BCN_FUNCTION;
+#endif
                rtw_write8(padapter, bcn_ctrl_reg, val8);
        }
 }
@@ -5361,7 +5471,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
        {
                // disable related TSF function
                val8 = rtw_read8(padapter, REG_BCN_CTRL_1);
-               val8 &= ~BIT(3);
+               val8 &= ~EN_BCN_FUNCTION;
                rtw_write8(padapter, REG_BCN_CTRL_1, val8);
 
                rtw_write32(padapter, REG_TSFTR1, tsf);
@@ -5370,7 +5480,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
 
                // enable related TSF function
                val8 = rtw_read8(padapter, REG_BCN_CTRL_1);
-               val8 |= BIT(3);
+               val8 |= EN_BCN_FUNCTION;
                rtw_write8(padapter, REG_BCN_CTRL_1, val8);
 
                // Update buddy port's TSF if it is SoftAP for beacon TX issue!
@@ -5380,7 +5490,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
                {
                        // disable related TSF function
                        val8 = rtw_read8(padapter, REG_BCN_CTRL);
-                       val8 &= ~BIT(3);
+                       val8 &= ~EN_BCN_FUNCTION;
                        rtw_write8(padapter, REG_BCN_CTRL, val8);
 
                        rtw_write32(padapter, REG_TSFTR, tsf);
@@ -5388,7 +5498,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
 
                        // enable related TSF function
                        val8 = rtw_read8(padapter, REG_BCN_CTRL);
-                       val8 |= BIT(3);
+                       val8 |= EN_BCN_FUNCTION;
                        rtw_write8(padapter, REG_BCN_CTRL, val8);
 #ifdef CONFIG_TSF_RESET_OFFLOAD
                        // Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue!
@@ -5404,7 +5514,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
        {
                // disable related TSF function
                val8 = rtw_read8(padapter, REG_BCN_CTRL);
-               val8 &= ~BIT(3);
+               val8 &= ~EN_BCN_FUNCTION;
                rtw_write8(padapter, REG_BCN_CTRL, val8);
 
                rtw_write32(padapter, REG_TSFTR, tsf);
@@ -5412,7 +5522,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
 
                // enable related TSF function
                val8 = rtw_read8(padapter, REG_BCN_CTRL);
-               val8 |= BIT(3);
+               val8 |= EN_BCN_FUNCTION;
                rtw_write8(padapter, REG_BCN_CTRL, val8);
 
 #ifdef CONFIG_CONCURRENT_MODE
@@ -5422,7 +5532,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
                {
                        // disable related TSF function
                        val8 = rtw_read8(padapter, REG_BCN_CTRL_1);
-                       val8 &= ~BIT(3);
+                       val8 &= ~EN_BCN_FUNCTION;
                        rtw_write8(padapter, REG_BCN_CTRL_1, val8);
 
                        rtw_write32(padapter, REG_TSFTR1, tsf);
@@ -5430,7 +5540,7 @@ static void hw_var_set_correct_tsf(PADAPTER padapter, u8 variable, u8* val)
 
                        // enable related TSF function
                        val8 = rtw_read8(padapter, REG_BCN_CTRL_1);
-                       val8 |= BIT(3);
+                       val8 |= EN_BCN_FUNCTION;
                        rtw_write8(padapter, REG_BCN_CTRL_1, val8);
 
 #ifdef CONFIG_TSF_RESET_OFFLOAD
@@ -5478,7 +5588,9 @@ static void hw_var_set_mlme_disconnect(PADAPTER padapter, u8 variable, u8 *val)
                rtw_write8(padapter, REG_BCN_CTRL_1, val8);
                
                // disable Port1's beacon function
-               rtw_write8(padapter, REG_BCN_CTRL_1, rtw_read8(padapter, REG_BCN_CTRL_1)&(~BIT(3)));
+               val8 = rtw_read8(padapter, REG_BCN_CTRL_1);
+               val8 &= ~EN_BCN_FUNCTION;
+               rtw_write8(padapter, REG_BCN_CTRL_1, val8);
        }
        else
 #endif
@@ -5536,7 +5648,7 @@ static void hw_var_set_mlme_sitesurvey(PADAPTER padapter, u8 variable, u8* val)
        }
 #ifdef CONFIG_TDLS
        // TDLS will clear RCR_CBSSID_DATA bit for connection.
-       else if (padapter->tdlsinfo.setup_state & TDLS_LINKED_STATE)
+       else if (padapter->tdlsinfo.link_established == _TRUE)
        {
                rcr_clear_bit = RCR_CBSSID_BCN;
        }
@@ -5684,13 +5796,13 @@ static void hw_var_set_mlme_join(PADAPTER padapter, u8 variable, u8 *val)
                if (padapter->iface_type == IFACE_PORT1)
                {
                        val8 = rtw_read8(padapter, REG_BCN_CTRL_1);
-                       val8 &= ~BIT(4);
+                       val8 &= ~DIS_TSF_UDT;
                        rtw_write8(padapter, REG_BCN_CTRL_1, val8);
                }
                else
                {
                        val8 = rtw_read8(padapter, REG_BCN_CTRL);
-                       val8 &= ~BIT(4);
+                       val8 &= ~DIS_TSF_UDT;
                        rtw_write8(padapter, REG_BCN_CTRL, val8);
                }
 
@@ -5743,7 +5855,7 @@ static void hw_var_set_mlme_join(PADAPTER padapter, u8 variable, u8 *val)
        {
                //enable update TSF
                val8 = rtw_read8(padapter, REG_BCN_CTRL);
-               val8 &= ~BIT(4);
+               val8 &= ~DIS_TSF_UDT;
                rtw_write8(padapter, REG_BCN_CTRL, val8);
 
                if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
@@ -5772,11 +5884,14 @@ void CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len)
 #ifdef CONFIG_XMIT_ACK
        if (GET_8723B_C2H_TX_RPT_RETRY_OVER(pdata) | GET_8723B_C2H_TX_RPT_LIFE_TIME_OVER(pdata)) {
                rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL);
-       }       
+       }
+/*     
        else if(seq_no != padapter->xmitpriv.seq_no) {
                DBG_871X("tx_seq_no=%d, rpt_seq_no=%d\n", padapter->xmitpriv.seq_no, seq_no);
                rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL);
-       } else {
+       } 
+*/     
+       else {
                rtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_SUCCESS);
        }
 #endif
@@ -5849,7 +5964,7 @@ s32 c2h_handler_8723b(PADAPTER padapter, u8 *buf)
 #ifdef CONFIG_PCI_HCI
                case C2H_BT_RSSI:
 //                     fwc2h_ODM(padapter, tmpBuf, &C2hEvent);
-                       BT_FwC2hBtRssi(padapter, pC2hEvent->payload);
+                       //BT_FwC2hBtRssi(padapter, pC2hEvent->payload);
                        break;
 #endif
 #endif
@@ -5943,7 +6058,7 @@ static void process_c2h_event(PADAPTER padapter, PC2H_EVT_HDR pC2hEvent, u8 *c2h
 #ifdef CONFIG_PCI_HCI
                case C2H_BT_RSSI:
 //                     fwc2h_ODM(padapter, tmpBuf, &C2hEvent);
-                       BT_FwC2hBtRssi(padapter, c2hBuf);
+                       //BT_FwC2hBtRssi(padapter, c2hBuf);
                        break;
 #endif
 #endif
@@ -6131,42 +6246,41 @@ _func_enter_;
                        break;
 
                case HW_VAR_BASIC_RATE:
-                       {
-                               u16                     BrateCfg = 0;
-                               u8                      RateIndex = 0;
-
-                               // 2007.01.16, by Emily
-                               // Select RRSR (in Legacy-OFDM and CCK)
-                               // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate.
-                               // We do not use other rates.
-                               HalSetBrateCfg(padapter, val, &BrateCfg);
-
-                               //2011.03.30 add by Luke Lee
-                               //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT
-                               //because CCK 2M has poor TXEVM
-                               //CCK 5.5M & 11M ACK should be enabled for better performance
-
-                               pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d;
-                               BrateCfg |= 0x01; // default enable 1M ACK rate
-#ifdef CONFIG_CMCC_TEST
-                               BrateCfg |= 0x0D; /* use 11M to send ACK */
-                               BrateCfg |= BIT(6) | BIT(7) | BIT(8); //CMCC_OFDM_ACK 12/18/24M
-#endif
-                               DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg);
-
-                               // Set RRSR rate table.
-                               rtw_write8(padapter, REG_RRSR, BrateCfg&0xff);
-                               rtw_write8(padapter, REG_RRSR+1, (BrateCfg>>8)&0xff);
+               {
+                       struct mlme_ext_info *mlmext_info = &padapter->mlmeextpriv.mlmext_info;
+                       u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0;
+                       u16 rrsr_2g_force_mask = (RRSR_11M|RRSR_5_5M|RRSR_1M);
+                       u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_CCK_RATES);
+
+                       HalSetBrateCfg(padapter, val, &BrateCfg);
+                       input_b = BrateCfg;
+
+                       /* apply force and allow mask */
+                       BrateCfg |= rrsr_2g_force_mask;
+                       BrateCfg &= rrsr_2g_allow_mask;
+                       masked = BrateCfg;
+
+                       #ifdef CONFIG_CMCC_TEST
+                       BrateCfg |= (RRSR_11M|RRSR_5_5M|RRSR_1M); /* use 11M to send ACK */
+                       BrateCfg |= (RRSR_24M|RRSR_18M|RRSR_12M); //CMCC_OFDM_ACK 12/18/24M
+                       #endif
 
-                               // Set RTS initial rate
-                               while (BrateCfg > 0x1)
-                               {
-                                       BrateCfg = (BrateCfg >> 1);
-                                       RateIndex++;
-                               }
-                               // Ziv - Check
-                               rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex);
+                       /* IOT consideration */
+                       if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {
+                               /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */
+                               if((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0)
+                                       BrateCfg |= RRSR_6M;
                        }
+                       ioted = BrateCfg;
+
+                       pHalData->BasicRateSet = BrateCfg;
+
+                       DBG_8192C("HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\n", input_b, masked, ioted);
+
+                       // Set RRSR rate table.
+                       rtw_write16(padapter, REG_RRSR, BrateCfg);
+                       rtw_write8(padapter, REG_RRSR+2, rtw_read8(padapter, REG_RRSR+2)&0xf0);
+               }
                        break;
 
                case HW_VAR_TXPAUSE:
@@ -6287,14 +6401,6 @@ _func_enter_;
                        }
                        break;
 
-               case HW_VAR_SEC_CFG:
-#ifdef CONFIG_CONCURRENT_MODE
-                       rtw_write8(padapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
-#else
-                       rtw_write8(padapter, REG_SECCFG, *val);
-#endif
-                       break;
-
                case HW_VAR_CAM_EMPTY_ENTRY:
                        {
                                u8      ucIndex = *val;
@@ -6384,15 +6490,6 @@ _func_enter_;
                        }
                        break;
 
-               case HW_VAR_AMPDU_MIN_SPACE:
-                       {
-                               u8      MinSpacingToSet;
-
-                               MinSpacingToSet = *val;
-                               pHalData->AMPDUDensity = MinSpacingToSet;
-                       }
-                       break;
-
                case HW_VAR_AMPDU_FACTOR:
                        {
                                u32     AMPDULen =  (*((u8 *)val));
@@ -6444,7 +6541,30 @@ _func_enter_;
                        rtl8723b_set_p2p_ps_offload_cmd(padapter, *val);
                        break;
 #endif //CONFIG_P2P
+#ifdef CONFIG_TDLS
+               case HW_VAR_TDLS_WRCR:
+                       rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)&(~RCR_CBSSID_DATA ));
+                       break;
+               case HW_VAR_TDLS_INIT_CH_SEN:
+                       {
+                               rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)&(~ RCR_CBSSID_DATA )&(~RCR_CBSSID_BCN ));
+                               rtw_write16(padapter, REG_RXFLTMAP2,0xffff);
 
+                               //disable update TSF
+                               rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|DIS_TSF_UDT);
+                       }
+                       break;
+               case HW_VAR_TDLS_DONE_CH_SEN:
+                       {
+                               //enable update TSF
+                               rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~ DIS_TSF_UDT));
+                               rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|(RCR_CBSSID_BCN ));
+                       }
+                       break;
+               case HW_VAR_TDLS_RS_RCR:
+                       rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|(RCR_CBSSID_DATA));
+                       break;
+#endif //CONFIG_TDLS
                case HW_VAR_INITIAL_GAIN:
                        {
                                DIG_T *pDigTable = &pHalData->odmpriv.DM_DigTable;
@@ -6622,9 +6742,9 @@ _func_enter_;
 #ifdef CONFIG_CONCURRENT_MODE
                        if (padapter->iface_type == IFACE_PORT1)
                        {
-                               val8 = rtw_read8(padapter, REG_TDECTRL1_8723B+2);
+                               val8 = rtw_read8(padapter,  REG_DWBCN1_CTRL_8723B+2);
                                val8 |= BIT(0);
-                               rtw_write8(padapter, REG_TDECTRL1_8723B+2, val8); 
+                               rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+2, val8); 
                        }
                        else
 #endif // CONFIG_CONCURRENT_MODE
@@ -6641,17 +6761,17 @@ _func_enter_;
                        if (padapter->iface_type == IFACE_PORT1)
                        {
                                // SW_BCN_SEL - Port1
-                               val8 = rtw_read8(padapter, REG_TDECTRL1_8723B+2);
+                               val8 = rtw_read8(padapter, REG_DWBCN1_CTRL_8723B+2);
                                val8 |= BIT(4);
-                               rtw_write8(padapter, REG_TDECTRL1_8723B+2, val8);
+                               rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+2, val8);
                        }
                        else
 #endif // CONFIG_CONCURRENT_MODE
                        {
                                // SW_BCN_SEL - Port0
-                               val8 = rtw_read8(padapter, REG_TDECTRL1_8723B+2);
+                               val8 = rtw_read8(padapter, REG_DWBCN1_CTRL_8723B+2);
                                val8 &= ~BIT(4);
-                               rtw_write8(padapter, REG_TDECTRL1_8723B+2, val8);       
+                               rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+2, val8);    
                        }
                        break;
 
@@ -6736,7 +6856,7 @@ void GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val)
 #ifdef CONFIG_CONCURRENT_MODE
                        if (padapter->iface_type == IFACE_PORT1)
                        {
-                               val8 = rtw_read8(padapter, REG_TDECTRL1_8723B+2);
+                               val8 = rtw_read8(padapter, REG_DWBCN1_CTRL_8723B+2);
                                *val = (BIT(0) & val8) ? _TRUE:_FALSE;
                        }
                        else
@@ -6841,12 +6961,6 @@ u8 SetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)
 
        switch (variable)
        {
-               case HAL_DEF_DBG_DUMP_RXPKT:
-                       pHalData->bDumpRxPkt = *(( u8*)pval);
-                       break;
-               case HAL_DEF_DBG_DUMP_TXPKT:
-                       pHalData->bDumpTxPkt = *(( u8*)pval);
-                       break;
                default:
                        bResult = SetHalDefVar(padapter, variable, pval);
                        break;
@@ -6905,45 +7019,48 @@ u8 GetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)
                                u32 cmd;
                                u32 ra_info1, ra_info2;
                                u32 rate_mask1, rate_mask2;
-
-                               if ((padapter->bLinkInfoDump & BIT(0))
-                                       && (check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _TRUE))
-                               {
-                                       DBG_8192C("============ RA status check  Mac_id:%d ===================\n", mac_id);
-
-                                       cmd = 0x40000100 | mac_id;
-                                       rtw_write32(padapter, REG_HMEBOX_DBG_2_8723B, cmd);
-                                       rtw_msleep_os(10);
-                                       ra_info1 = rtw_read32(padapter, 0x2F0);
-                                       DBG_8192C("[ ra_info1:0x%08x ] =>cur_rate= 0x%02x, PWRSTS = 0x%02x\n",
-                                               ra_info1,
-                                               ra_info1&0xFF,
-                                               (ra_info1>>8)  & 0x07);
-
-                                       cmd = 0x40000400 | mac_id;
-                                       rtw_write32(padapter, REG_HMEBOX_DBG_2_8723B,cmd);
-                                       rtw_msleep_os(10);
-                                       ra_info1 = rtw_read32(padapter, 0x2F0);
-                                       ra_info2 = rtw_read32(padapter, 0x2F4);
-                                       rate_mask1 = rtw_read32(padapter, 0x2F8);
-                                       rate_mask2 = rtw_read32(padapter, 0x2FC);
-
-                                       DBG_8192C("[ ra_info1:0x%08x ] =>RSSI=%d, BW_setting=0x%02x, DISRA=0x%02x, VHT_EN=0x%02x\n",
-                                               ra_info1,
-                                               ra_info1&0xFF,
-                                               (ra_info1>>8)  & 0xFF,
-                                               (ra_info1>>16) & 0xFF,
-                                               (ra_info1>>24) & 0xFF);
+                               u8 curr_tx_rate,curr_tx_sgi,hight_rate,lowest_rate;                     
+                               
+                               DBG_8192C("============ RA status check  Mac_id:%d ===================\n", mac_id);
+
+                               cmd = 0x40000100 | mac_id;
+                               rtw_write32(padapter, REG_HMEBOX_DBG_2_8723B, cmd);
+                               rtw_msleep_os(10);
+                               ra_info1 = rtw_read32(padapter, 0x2F0);
+                               curr_tx_rate = ra_info1&0x7F;
+                               curr_tx_sgi = (ra_info1>>7)&0x01;
+                               DBG_8192C("[ ra_info1:0x%08x ] =>cur_tx_rate= %s,cur_sgi:%d, PWRSTS = 0x%02x  \n",
+                                       ra_info1,                                               
+                                       HDATA_RATE(curr_tx_rate),
+                                       curr_tx_sgi,
+                                       (ra_info1>>8)  & 0x07);
+
+                               cmd = 0x40000400 | mac_id;
+                               rtw_write32(padapter, REG_HMEBOX_DBG_2_8723B,cmd);
+                               rtw_msleep_os(10);
+                               ra_info1 = rtw_read32(padapter, 0x2F0);
+                               ra_info2 = rtw_read32(padapter, 0x2F4);
+                               rate_mask1 = rtw_read32(padapter, 0x2F8);
+                               rate_mask2 = rtw_read32(padapter, 0x2FC);
+                               hight_rate = ra_info2&0xFF;
+                               lowest_rate = (ra_info2>>8)  & 0xFF;
                                        
-                                       DBG_8192C("[ ra_info2:0x%08x ] =>hight_rate=0x%02x, lowest_rate=0x%02x, SGI=0x%02x, RateID=%d\n",
-                                               ra_info2,
-                                               ra_info2&0xFF,
-                                               (ra_info2>>8)  & 0xFF,
-                                               (ra_info2>>16) & 0xFF,
-                                               (ra_info2>>24) & 0xFF);
-
-                                       DBG_8192C("rate_mask2=0x%08x, rate_mask1=0x%08x\n", rate_mask2, rate_mask1);
-                               }
+                               DBG_8192C("[ ra_info1:0x%08x ] =>RSSI=%d, BW_setting=0x%02x, DISRA=0x%02x, VHT_EN=0x%02x\n",
+                                       ra_info1,
+                                       ra_info1&0xFF,
+                                       (ra_info1>>8)  & 0xFF,
+                                       (ra_info1>>16) & 0xFF,
+                                       (ra_info1>>24) & 0xFF);
+                                       
+                               DBG_8192C("[ ra_info2:0x%08x ] =>hight_rate=%s, lowest_rate=%s, SGI=0x%02x, RateID=%d\n",
+                                       ra_info2,
+                                       HDATA_RATE(hight_rate),
+                                       HDATA_RATE(lowest_rate),
+                                       (ra_info2>>16) & 0xFF,
+                                       (ra_info2>>24) & 0xFF);
+
+                               DBG_8192C("rate_mask2=0x%08x, rate_mask1=0x%08x\n", rate_mask2, rate_mask1);
+                               
                        }
                        break;
 
@@ -6954,18 +7071,10 @@ u8 GetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)
                        }
                        else
                        {
-                               *(u8*)pval = WMM_NORMAL_TX_PAGE_BOUNDARY;
+                               *(u8*)pval = WMM_NORMAL_TX_PAGE_BOUNDARY_8723B;
                        }
                        break;
 
-               case HAL_DEF_DBG_DUMP_RXPKT:
-                       *(( u8*)pval) = pHalData->bDumpRxPkt;
-                       break;
-
-               case HAL_DEF_DBG_DUMP_TXPKT:
-                       *(( u8*)pval) = pHalData->bDumpTxPkt;
-                       break;
-
                case HAL_DEF_MACID_SLEEP:
                        *(u8*)pval = _TRUE; // support macid sleep
                        break;
index b1ba6b60f0fa08e34667a278633bff38d2a23b1e..80b3eea6297e3e9cc3c1c1702cd1b1a5aea2a8a7 100755 (executable)
@@ -328,10 +328,13 @@ void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven)
                        }\r
                }\r
 \r
-               if (Action == 1)\r
+               if (Action == 1) {\r
+                       if (CCK_index_old == 0)\r
+                               CCK_index_old = 1;\r
                        CCK_index = CCK_index_old - 1;\r
-               else\r
+               } else {\r
                        CCK_index = CCK_index_old + 1;\r
+               }\r
 \r
                if (CCK_index == CCK_TABLE_SIZE) {\r
                        CCK_index = CCK_TABLE_SIZE -1;\r
@@ -439,12 +442,12 @@ void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower)
        // rf-A cck tx power\r
        write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]);\r
        tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A];\r
-       write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);\r
+       write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, tmpval);\r
 \r
        // rf-B cck tx power\r
        write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]);\r
        tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B];\r
-       write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval);\r
+       write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, tmpval);\r
 \r
        RT_TRACE(_module_mp_, _drv_notice_,\r
                 ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n",\r
@@ -551,12 +554,12 @@ mpt_SetTxPower(
                        pwr = pTxPower[ODM_RF_PATH_A];\r
                        TxAGC = (pwr<<16)|(pwr<<8)|(pwr);\r
                        PHY_SetBBReg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pTxPower[ODM_RF_PATH_A]);\r
-                       PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, TxAGC);\r
+                       PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, TxAGC);\r
 \r
                        pwr = pTxPower[ODM_RF_PATH_B];\r
                        TxAGC = (pwr<<16)|(pwr<<8)|(pwr);\r
                        PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, pTxPower[ODM_RF_PATH_B]);\r
-                       PHY_SetBBReg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, TxAGC);\r
+                       PHY_SetBBReg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, TxAGC);\r
                        \r
                } break;\r
                \r
@@ -644,9 +647,9 @@ void Hal_SetTxPower(PADAPTER pAdapter)
 \r
 void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)\r
 {\r
+#if 0\r
        u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC;\r
 \r
-       return ;\r
 \r
        TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);\r
        TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);\r
@@ -655,6 +658,7 @@ void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
        tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);\r
        write_bbreg(pAdapter, rFPGA0_TxGainStage,\r
                        (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);\r
+#endif\r
 }\r
 \r
 void Hal_SetDataRate(PADAPTER pAdapter)\r
@@ -823,7 +827,7 @@ s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
 \r
 void Hal_TriggerRFThermalMeter(PADAPTER pAdapter)\r
 {\r
-       PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x42, BIT17 | BIT16, 0x03);\r
+       PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8723B, BIT17 | BIT16, 0x03);\r
 //     RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" ));\r
 }\r
 \r
@@ -831,7 +835,7 @@ u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter)
 {\r
        u32 ThermalValue = 0;\r
 \r
-       ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, 0x42, 0xfc00);   // 0x42: RF Reg[15:10]                                  \r
+       ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8723B, 0xfc00);       // 0x42: RF Reg[15:10]                                  \r
 \r
        return (u8)ThermalValue;\r
 }\r
@@ -909,13 +913,13 @@ void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
        {\r
                case ANTENNA_A:\r
                default:\r
-                       rfPath = RF_PATH_A;\r
+                       pMptCtx->MptRfPath = rfPath = RF_PATH_A;\r
                        break;\r
                case ANTENNA_B:\r
-                       rfPath = RF_PATH_B;\r
+                       pMptCtx->MptRfPath = rfPath = RF_PATH_B;\r
                        break;\r
                case ANTENNA_C:\r
-                       rfPath = RF_PATH_C;\r
+                       pMptCtx->MptRfPath = rfPath = RF_PATH_C;\r
                        break;\r
        }\r
 \r
index 6bd7fa3782a053102e9b4aa26d76cc1f5df7495b..a36620583a5dc23568322e846843a95e3374c2b1 100755 (executable)
@@ -794,14 +794,24 @@ PHY_BBConfig8723B(
        RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);\r
        rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1));\r
 \r
+#ifdef CONFIG_USB_HCI\r
+       rtw_write32(Adapter, 0x948, 0x0);       // USB use Antenna S0\r
+#else\r
+       rtw_write32(Adapter, 0x948, 0x280);     // Others use Antenna S1\r
+#endif\r
+\r
+       rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB);\r
+\r
+       rtw_usleep_os(10);\r
+\r
+       PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1, 0xfffff,0x780); \r
+\r
 #if 0\r
        // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF.\r
        rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83);\r
        rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb);\r
 #endif\r
 \r
-       rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB);\r
-\r
        rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB);\r
 \r
        rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80);\r
@@ -1049,7 +1059,14 @@ PHY_SetTxPowerLevel8723B(
        PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
        PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
        pFAT_T                  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
-       u8                              RFPath = ( (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B);\r
+       u8                              RFPath = ODM_RF_PATH_A; \r
+\r
+       if(pHalData->AntDivCfg){// antenna diversity Enable\r
+               RFPath = ( (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B);\r
+       }\r
+       else{ // antenna diversity disable\r
+               RFPath = pHalData->ant_path;\r
+       }\r
 \r
        RT_TRACE(_module_hal_init_c_, _drv_info_,("==>PHY_SetTxPowerLevel8723B()\n"));\r
 \r
index 38c72dc4e9ca93eb662faf2af47cf696d0b35bb6..6962cb6b265d6aa4cd90b160b894ef947c221a5a 100755 (executable)
 
 #include <rtl8723b_hal.h>
 
-static s32  translate2dbm(u8 signal_strength_idx)
-{
-       s32     signal_power; // in dBm.
-
-
-       // Translate to dBm (x=0.5y-95).
-       signal_power = (s32)((signal_strength_idx + 1) >> 1);
-       signal_power -= 95;
-
-       return signal_power;
-}
-
 static void process_rssi(_adapter *padapter,union recv_frame *prframe)
 {
        u32     last_rssi, tmp_val;
@@ -75,10 +63,10 @@ static void process_rssi(_adapter *padapter,union recv_frame *prframe)
 
                if(padapter->recvpriv.is_signal_dbg) {
                        padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;
-                       padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg);
+                       padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(padapter->recvpriv.signal_strength_dbg);
                } else {
                        padapter->recvpriv.signal_strength= tmp_val;
-                       padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val);
+                       padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(tmp_val);
                }
 
                RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));
@@ -168,6 +156,50 @@ void rtl8723b_process_phy_info(_adapter *padapter, void *prframe)
        // Check EVM
        //
        process_link_qual(padapter,  precvframe);
+       #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+       rtw_store_phy_info( padapter,prframe);
+       #endif
 
 }
 
+void rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc)
+{
+       struct rx_pkt_attrib    *pattrib = &precvframe->u.hdr.attrib;
+
+       _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
+
+       //Offset 0
+       pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8723B(pdesc);//(le32_to_cpu(pdesc->rxdw0)&0x00003fff)
+       pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 14) & 0x1);
+       pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 15) & 0x1);
+       pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8723B(pdesc) * 8;//((le32_to_cpu(pdesc->rxdw0) >> 16) & 0xf) * 8;//uint 2^3 = 8 bytes
+       pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 20) & 0x7);
+       pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8723B(pdesc);//(( le32_to_cpu( pdesc->rxdw0 ) >> 23) & 0x1);// Qos data, wireless lan header length is 26
+       pattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 24) & 0x3);
+       pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 26) & 0x1);
+       pattrib->bdecrypted = !GET_RX_STATUS_DESC_SWDEC_8723B(pdesc);//(le32_to_cpu(pdesc->rxdw0) & BIT(27))? 0:1;
+
+       //Offset 4
+       pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 8) & 0xf);
+       pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 26) & 0x1);
+       pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 27) & 0x1);//more fragment bit
+
+       //Offset 8
+       pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8723B(pdesc);//(le32_to_cpu(pdesc->rxdw2) & 0x00000fff);
+       pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw2) >> 12) & 0xf);//fragmentation number
+
+       if (GET_RX_STATUS_DESC_RPT_SEL_8723B(pdesc))
+               pattrib->pkt_rpt_type = C2H_PACKET;
+       else
+               pattrib->pkt_rpt_type = NORMAL_RX;
+
+       //Offset 12
+       pattrib->data_rate=(u8)GET_RX_STATUS_DESC_RX_RATE_8723B(pdesc);//((le32_to_cpu(pdesc->rxdw3))&0x7f);
+
+       //Offset 16
+       //Offset 20
+
+}
+
+
+
index 751afd6aacd32372276072a20cb82cf9d27fbe08..fd92affe9a0cfcbb9e5f72c5a908d4694834779e 100755 (executable)
@@ -124,10 +124,10 @@ void update_recvframe_phyinfo(
                !pattrib->icv_err && !pattrib->crc_err &&
                _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN));
 
-       pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && (_rtw_memcmp(get_da(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN));
+       pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && (_rtw_memcmp(get_ra(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN));
 
        pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && (GetFrameSubType(wlanhdr) == WIFI_BEACON);
-
+/*
        if(pkt_info.bPacketBeacon){
                if(check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE){
                        sa = padapter->mlmepriv.cur_network.network.MacAddress;
@@ -143,6 +143,8 @@ void update_recvframe_phyinfo(
        else{
                sa = get_sa(wlanhdr);
        }
+*/
+       sa = get_ta(wlanhdr);
 
        pkt_info.StationID = 0xFF;
 
@@ -158,6 +160,7 @@ void update_recvframe_phyinfo(
        //rtl8723b_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));
+       if(psta) psta->rssi = pattrib->phy_info.RecvSignalPower;
        //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
        precvframe->u.hdr.psta = NULL;
        if (pkt_info.bPacketMatchBSSID &&
@@ -294,7 +297,7 @@ static void rtl8723bs_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length
        if(length == 0)
                return;
        
-       DBG_871X("+%s() length=%d\n", __func__, length);
+       //DBG_871X("+%s() length=%d\n", __func__, length);
 
        tmpBuf = rtw_zmalloc(length);
        if (tmpBuf == NULL)
@@ -307,7 +310,7 @@ static void rtl8723bs_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length
        if (res == _FALSE && tmpBuf != NULL)
                        rtw_mfree(tmpBuf, length);
 
-       DBG_871X("-%s res(%d)\n", __func__, res);
+       //DBG_871X("-%s res(%d)\n", __func__, res);
 
        return;
 }
@@ -392,8 +395,11 @@ static void rtl8723bs_recv_tasklet(void *priv)
                                                        padapter->mppriv.rx_crcerrpktcount++;
                                        }
                                }
+                               else
 #endif
-                               DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+                               {
+                                       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
@@ -650,8 +656,11 @@ static void rtl8723bs_recv_tasklet(void *priv)
                                                        padapter->mppriv.rx_crcerrpktcount++;
                                        }
                                }
+                               else
 #endif
-                               DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+                               {
+                                       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
index ad5d118bd1b9717d66241e9d1d1727d5863e471d..e84a09439ae9bc4a6ec1797b760b997437b8de50 100755 (executable)
 
 #include <rtl8723b_hal.h>
 
-//#define SDIO_TX_AGG_MAX              MAX_TX_AGG_PACKET_NUMBER
-#define TX_PAGE_SIZE           PAGE_SIZE_TX_8723B
-
-
-static inline u32 ffaddr2deviceId(struct dvobj_priv *pdvobj, u32 addr)
-{
-       return pdvobj->Queue2Pipe[addr];
-}
-
-#ifdef CONFIG_SDIO_REDUCE_TX_POLLING
-static u8 rtl8723bs_query_tx_freepage(_adapter *padapter, struct xmit_buf *pxmitbuf)
+static u8 rtw_sdio_wait_enough_TxOQT_space(PADAPTER padapter, u8 agg_num)
 {
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
-       u8      TxRequiredPageNum = 0;
-       u8      DedicatedPgNum = 0;
-       u8      RequiredPublicFreePgNum = 0;
-       u8      PageIdx = 0;
-       u8      CheckStep = 0;
-       u8      bResult = _TRUE;
-       u8      bUpdatePageNum = _FALSE;
-       u32     deviceId;
+       u32 n = 0;
+       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
 
-
-       TxRequiredPageNum = pxmitbuf->pg_num;
-
-       deviceId = ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr);
-
-       // translate fifo addr to queue index
-       switch (deviceId) {
-               case WLAN_TX_HIQ_DEVICE_ID:
-                               PageIdx = HI_QUEUE_IDX;
-                               break;
-
-               case WLAN_TX_MIQ_DEVICE_ID:
-                               PageIdx = MID_QUEUE_IDX;
-                               break;
-
-               case WLAN_TX_LOQ_DEVICE_ID:
-                               PageIdx = LOW_QUEUE_IDX;
-                               break;
-       }
-
-       do {
-               if ((padapter->bSurpriseRemoved == _TRUE) || (padapter->bDriverStopped == _TRUE)){
-                       RT_TRACE(_module_hal_xmit_c_, _drv_notice_,
-                                ("%s: bSurpriseRemoved(update TX FIFO page)\n", __FUNCTION__));
-                       break;
+       while (pHalData->SdioTxOQTFreeSpace < agg_num) 
+       {
+               if ((padapter->bSurpriseRemoved == _TRUE) 
+                       || (padapter->bDriverStopped == _TRUE)
+#ifdef CONFIG_CONCURRENT_MODE
+                       ||((padapter->pbuddy_adapter) 
+               && ((padapter->pbuddy_adapter->bSurpriseRemoved) ||(padapter->pbuddy_adapter->bDriverStopped)))
+#endif         
+               ){
+                       DBG_871X("%s: bSurpriseRemoved or bDriverStopped (wait TxOQT)\n", __func__);
+                       return _FALSE;
                }
 
-               // The number of page which public page is included is available .
-               if ((pHalData->SdioTxFIFOFreePage[PageIdx]+pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) > (TxRequiredPageNum+1)) {
-                       DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
-                       if (TxRequiredPageNum <= DedicatedPgNum) {
-                               pHalData->SdioTxFIFOFreePage[PageIdx] -= TxRequiredPageNum;
-                               break;
-                       } else {
-                               pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
-                               RequiredPublicFreePgNum = TxRequiredPageNum - DedicatedPgNum;
-                               pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
-                               break;
-                       }
-               } else { // Total number of page is NOT available, so update current FIFO status.
-                       if (!bUpdatePageNum) {
-                               bResult = HalQueryTxBufferStatus8723BSdio(padapter); // Set to default value.
-                               bUpdatePageNum = _TRUE;
-                       } else {
-                               bResult = _FALSE;
-                       }
-               }       
-       }while(++CheckStep < 2); // step1: user page variables, step2: physical page number
-
-       RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("%s(): HIQ(%#x), MIQ(%#x), LOQ(%#x), PUBQ(%#x)\n", 
-                       __FUNCTION__,
-                       pHalData->SdioTxFIFOFreePage[HI_QUEUE_IDX], 
-                       pHalData->SdioTxFIFOFreePage[MID_QUEUE_IDX], 
-                       pHalData->SdioTxFIFOFreePage[LOW_QUEUE_IDX], 
-                       pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]));
-       
-       RT_TRACE(_module_hal_xmit_c_, _drv_notice_, ("%s(): TxRequiredPageNum(%d) is available to send?(%d)\n", 
-                       __FUNCTION__, TxRequiredPageNum, bResult));
-
-       return bResult;
-}
-#else
-static u8 rtl8723bs_query_tx_freepage(_adapter *padapter, struct xmit_buf *pxmitbuf)
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-       struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
-       u8      TxRequiredPageNum = 0;
-       u8      DedicatedPgNum = 0;
-       u8      RequiredPublicFreePgNum = 0;
-       u8      PageIdx = 0;
-       u8      bResult = _TRUE;
-       u32     n, deviceId;
-
-       TxRequiredPageNum = pxmitbuf->pg_num;
-
-       deviceId = ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr);
-
-       // translate fifo addr to queue index
-       switch (deviceId) {
-               case WLAN_TX_HIQ_DEVICE_ID:
-                               PageIdx = HI_QUEUE_IDX;
-                               break;
-
-               case WLAN_TX_MIQ_DEVICE_ID:
-                               PageIdx = MID_QUEUE_IDX;
-                               break;
-
-               case WLAN_TX_LOQ_DEVICE_ID:
-                               PageIdx = LOW_QUEUE_IDX;
-                               break;
-       }
-
-       // check if hardware tx fifo page is enough
-       n = 0;
-       do {
-               if ((padapter->bSurpriseRemoved == _TRUE) || (padapter->bDriverStopped == _TRUE)){
-                       RT_TRACE(_module_hal_xmit_c_, _drv_notice_,
-                                ("%s: bSurpriseRemoved(update TX FIFO page)\n", __FUNCTION__));
-                       break;
-               }
+               HalQueryTxOQTBufferStatus8723BSdio(padapter);
                
-               // The number of page which public page is included is available .
-               if ((pHalData->SdioTxFIFOFreePage[PageIdx]+pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]) > (TxRequiredPageNum+1)) {
-                       DedicatedPgNum = pHalData->SdioTxFIFOFreePage[PageIdx];
-                       if (TxRequiredPageNum <= DedicatedPgNum) {
-                               pHalData->SdioTxFIFOFreePage[PageIdx] -= TxRequiredPageNum;
-                               break;
-                       } else {
-                               pHalData->SdioTxFIFOFreePage[PageIdx] = 0;
-                               RequiredPublicFreePgNum = TxRequiredPageNum - DedicatedPgNum;
-                               pHalData->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX] -= RequiredPublicFreePgNum;
-                               break;
-                       }
-               }
-
-               n++;
-
-#if 0
-               if (n >= 5000)
-               {
-                       u8 reg_value_1 = 0;
-                       u8 reg_value_2 = 0;
-                       u8 reg_value_3 = 0;
-                       
-                       //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));
-               }
-#endif 
-
-               if ((n % 0x7F) == 0) {//or 80
-                       //DBG_871X("%s: FIFO starvation!(%d) len=%d agg=%d page=(R)%d(A)%d\n",
-                       //      __func__, n, pxmitbuf->len, pxmitbuf->agg_num, pframe->pg_num, freePage[PageIdx] + freePage[PUBLIC_QUEUE_IDX]);
+               if ((++n % 60) == 0) {
+                       if ((n % 300) == 0) {                   
+                               DBG_871X("%s(%d): QOT free space(%d), agg_num: %d\n",
+                               __func__, n, pHalData->SdioTxOQTFreeSpace, agg_num);
+                       }       
                        rtw_msleep_os(1);
+                       //yield();
                }
+       }
 
-               // Total number of page is NOT available, so update current FIFO status
-               HalQueryTxBufferStatus8723BSdio(padapter);
-       } while (1);
+       pHalData->SdioTxOQTFreeSpace -= agg_num;
+       
+       //if (n > 1)
+       //      ++priv->pshare->nr_out_of_txoqt_space;
 
-       return bResult;
+       return _TRUE;
 }
-#endif
 
 static s32 rtl8723_dequeue_writeport(PADAPTER padapter)
 {
@@ -203,13 +66,14 @@ static s32 rtl8723_dequeue_writeport(PADAPTER padapter)
        struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
        struct xmit_buf *pxmitbuf;
        PADAPTER pri_padapter = padapter;
-       u32 deviceId;
-       u32 requiredPage;
-       u8 PageIdx=0;
-       u8 *freePage;
-       _irqL irql;
-       u32 n;
        s32 ret = 0;
+       u8      PageIdx = 0;
+       u32     deviceId;
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
+       u8      bUpdatePageNum = _FALSE;
+#else
+       u32     polling_num = 0;
+#endif
 
 
 #ifdef CONFIG_CONCURRENT_MODE
@@ -230,12 +94,50 @@ static s32 rtl8723_dequeue_writeport(PADAPTER padapter)
        if (pxmitbuf == NULL)
                return _TRUE;
 
+       deviceId = ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr);
+
+       // translate fifo addr to queue index
+       switch (deviceId) {
+               case WLAN_TX_HIQ_DEVICE_ID:
+                               PageIdx = HI_QUEUE_IDX;
+                               break;
+
+               case WLAN_TX_MIQ_DEVICE_ID:
+                               PageIdx = MID_QUEUE_IDX;
+                               break;
+
+               case WLAN_TX_LOQ_DEVICE_ID:
+                               PageIdx = LOW_QUEUE_IDX;
+                               break;
+       }
+
 query_free_page:
        // check if hardware tx fifo page is enough
-       if( _FALSE == rtl8723bs_query_tx_freepage(pri_padapter, pxmitbuf))
+       if( _FALSE == rtw_hal_sdio_query_tx_freepage(pri_padapter, PageIdx, pxmitbuf->pg_num))
        {
-               rtw_msleep_os(1);
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
+               if (!bUpdatePageNum) {
+                       // Total number of page is NOT available, so update current FIFO status
+                       HalQueryTxBufferStatus8723BSdio(padapter);
+                       bUpdatePageNum = _TRUE;
+                       goto query_free_page;
+               } else {
+                       bUpdatePageNum = _FALSE;
+                       enqueue_pending_xmitbuf_to_head(pxmitpriv, pxmitbuf);
+                       return _TRUE;
+               }
+#else //CONFIG_SDIO_TX_ENABLE_AVAL_INT
+               polling_num++;
+               if ((polling_num % 0x7F) == 0) {//or 80
+                       //DBG_871X("%s: FIFO starvation!(%d) len=%d agg=%d page=(R)%d(A)%d\n",
+                       //      __func__, polling_num, pxmitbuf->len, pxmitbuf->agg_num, pframe->pg_num, freePage[PageIdx] + freePage[PUBLIC_QUEUE_IDX]);
+                       rtw_msleep_os(1);
+               }
+
+               // Total number of page is NOT available, so update current FIFO status
+               HalQueryTxBufferStatus8723BSdio(padapter);
                goto query_free_page;
+#endif //CONFIG_SDIO_TX_ENABLE_AVAL_INT
        }
 
        if ((padapter->bSurpriseRemoved == _TRUE) 
@@ -250,13 +152,18 @@ query_free_page:
                goto free_xmitbuf;
        }
 
+       if (rtw_sdio_wait_enough_TxOQT_space(padapter, pxmitbuf->agg_num) == _FALSE) 
+       {
+               goto free_xmitbuf;
+       }
 
 #ifdef CONFIG_CHECK_LEAVE_LPS
        traffic_check_for_leave_lps(padapter, _TRUE, pxmitbuf->agg_num);
 #endif 
 
+       rtw_write_port(padapter, deviceId, pxmitbuf->len, (u8 *)pxmitbuf);
 
-       rtw_write_port(padapter, ffaddr2deviceId(pdvobjpriv, pxmitbuf->ff_hwaddr), pxmitbuf->len, (u8 *)pxmitbuf);
+       rtw_hal_sdio_update_tx_freepage(pri_padapter, PageIdx, pxmitbuf->pg_num);
 
 free_xmitbuf:
        //rtw_free_xmitframe(pxmitpriv, pframe);
@@ -319,24 +226,12 @@ free_xmitbuf:
  */
 s32 rtl8723bs_xmit_buf_handler(PADAPTER padapter)
 {
-       PHAL_DATA_TYPE phal;
-       struct mlme_priv *pmlmepriv;
        struct xmit_priv *pxmitpriv;
-       struct dvobj_priv       *pdvobjpriv;
-       struct xmit_buf *pxmitbuf;
-       struct xmit_frame *pframe;
-       u32 deviceId;
-       u32 requiredPage;
-       u8 PageIdx, queue_empty;
-       _irqL irql;
-       u32 n;
-       s32 ret;
+       u8      queue_empty, queue_pending;
+       s32     ret;
 
 
-       phal = GET_HAL_DATA(padapter);
-       pmlmepriv = &padapter->mlmepriv;
        pxmitpriv = &padapter->xmitpriv;
-       pdvobjpriv = adapter_to_dvobj(padapter);
 
        ret = _rtw_down_sema(&pxmitpriv->xmit_sema);
        if (_FAIL == ret) {
@@ -352,6 +247,16 @@ s32 rtl8723bs_xmit_buf_handler(PADAPTER padapter)
                return _FAIL;
        }
 
+       queue_pending = check_pending_xmitbuf(pxmitpriv);
+
+#ifdef CONFIG_CONCURRENT_MODE
+       if(rtw_buddy_adapter_up(padapter))
+               queue_pending |= check_pending_xmitbuf(&padapter->pbuddy_adapter->xmitpriv);
+#endif
+
+       if(queue_pending == _FALSE)
+               return _SUCCESS;
+
 #ifdef CONFIG_LPS_LCLK
        ret = rtw_register_tx_alive(padapter);
        if (ret != _SUCCESS) {
@@ -396,7 +301,7 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv)
        struct xmit_frame *pxmitframe;
        _queue *pframe_queue;
        struct xmit_buf *pxmitbuf;
-       u32 txlen;
+       u32 txlen, max_xmit_len;
        u8 txdesc_size = TXDESC_SIZE;
        int inx[4];
        
@@ -428,6 +333,8 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv)
                        }
                }
 
+               max_xmit_len = rtw_hal_get_sdio_tx_max_length(padapter, inx[idx]);
+
                _enter_critical_bh(&pxmitpriv->lock, &irql);
                
                sta_phead = get_list_head(phwxmit->sta_queue);
@@ -457,11 +364,9 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv)
                                // check xmit_buf size enough or not
                                txlen = txdesc_size + rtw_wlan_pkt_size(pxmitframe);
                                if ((NULL == pxmitbuf) ||
-                                       ((pxmitbuf->ptail + txlen) > pxmitbuf->pend)
-#ifdef SDIO_TX_AGG_MAX
-                                       || (k >= SDIO_TX_AGG_MAX)
-#endif
-                                       )
+                                       ((_RND(pxmitbuf->len, 8) + txlen) > max_xmit_len)
+                                       || (k >= (rtw_hal_sdio_max_txoqt_free_space(padapter)-1))
+                               )
                                {
                                        if (pxmitbuf)
                                        {
@@ -489,6 +394,14 @@ static s32 xmit_xmitframes(PADAPTER padapter, struct xmit_priv *pxmitpriv)
                                                DBG_871X_LEVEL(_drv_err_, "%s: xmit_buf is not enough!\n", __FUNCTION__);
 #endif
                                                err = -2;
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
+       #ifdef CONFIG_CONCURRENT_MODE
+                                               if (padapter->adapter_type > PRIMARY_ADAPTER)
+                                                       _rtw_up_sema(&(padapter->pbuddy_adapter->xmitpriv.xmit_sema));
+                                               else
+       #endif
+                                                       _rtw_up_sema(&(pxmitpriv->xmit_sema));
+#endif
                                                break;
                                        }
                                        k = 0;
@@ -613,8 +526,6 @@ next:
        ret = rtw_txframes_pending(padapter);
        _exit_critical_bh(&pxmitpriv->lock, &irql);
        if (ret == 0) {
-               if(!padapter->registrypriv.wifi_spec)
-                       rtw_yield_os();
                return _SUCCESS;
        }
 
@@ -635,7 +546,6 @@ next:
        ret = rtw_txframes_pending(padapter);
        _exit_critical_bh(&pxmitpriv->lock, &irql);
        if (ret == 1) {
-               //rtw_msleep_os(1);
                goto next;
        }
 
@@ -708,7 +618,9 @@ s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe)
 
        if(GetFrameSubType(pframe)==WIFI_BEACON) //dump beacon directly
        {
-               rtw_write_port(padapter, pdvobjpriv->Queue2Pipe[pxmitbuf->ff_hwaddr], pxmitbuf->len, (u8 *)pxmitbuf);
+               ret = rtw_write_port(padapter, pdvobjpriv->Queue2Pipe[pxmitbuf->ff_hwaddr], pxmitbuf->len, (u8 *)pxmitbuf);
+               if (ret != _SUCCESS)
+                       rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);
 
                rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
        }
@@ -717,9 +629,6 @@ s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe)
                enqueue_pending_xmitbuf(pxmitpriv, pxmitbuf);
        }
 
-       if  (ret != _SUCCESS)
-               rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN);
-
        return ret;
 }
 
index 55f97ebf2dc89587eedc015f5ebad28145ff258b..ed19877a8e80338afe9aefe4619868d499b5a9d4 100755 (executable)
@@ -188,6 +188,7 @@ u8 _InitPowerOn_8723BS(PADAPTER padapter)
 //     bMacPwrCtrlOn = _TRUE;
 //     rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
 
+       rtw_write8(padapter, REG_CR, 0x00);
        // Enable MAC DMA/WMAC/SCHEDULE/SEC block
        value16 = rtw_read16(padapter, REG_CR);
        value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN
@@ -195,27 +196,7 @@ u8 _InitPowerOn_8723BS(PADAPTER padapter)
        rtw_write16(padapter, REG_CR, value16);
 
 #ifdef CONFIG_BT_COEXIST
-       // Fix Antenna at WiFi side between power on and BT-Coex init HW
-       // enable BB power
-       value8 = rtw_read8(padapter, REG_SYS_FUNC_EN);
-       value8 |= FEN_BBRSTB | FEN_BB_GLB_RSTn;
-       rtw_write8(padapter, REG_SYS_FUNC_EN, value8);
-//     DBG_8192C("%s: 0x2=0x%02X\n", __FUNCTION__, rtw_read8(padapter, 0x2));
-
-       // internal switch BT->S1
-       // 0x948[12:0] = 0x280 
-       value16 = rtw_read16(padapter, 0x948);
-       value16 &= ~0x1FFF;
-       value16 |= 0x280;
-       rtw_write16(padapter, 0x948, value16);
-//     DBG_8192C("%s: 0x948=0x%04X\n", __FUNCTION__, rtw_read16(padapter, 0x948));
-
-       // mask wlan_act to low
-       // 0x76e[3] = 0
-       value8 = rtw_read8(padapter, 0x76e);
-       value8 &= ~BIT(3);
-       rtw_write8(padapter, 0x76e, value8);
-//     DBG_8192C("%s: 0x76e=0x%02X\n", __FUNCTION__, rtw_read8(padapter, 0x76e));
+       rtw_btcoex_PowerOnSetting(padapter);
 
        // external switch to S1
        // 0x38[11] = 0x1
@@ -245,6 +226,26 @@ u8 _InitPowerOn_8723BS(PADAPTER padapter)
        return _SUCCESS;
 }
 
+//Tx Page FIFO threshold
+static void _init_available_page_threshold(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ)
+{
+       u16     HQ_threshold, NQ_threshold, LQ_threshold;
+
+       HQ_threshold = (numPubQ + numHQ + 1) >> 1;
+       HQ_threshold |= (HQ_threshold<<8);
+
+       NQ_threshold = (numPubQ + numNQ + 1) >> 1;
+       NQ_threshold |= (NQ_threshold<<8);
+
+       LQ_threshold = (numPubQ + numLQ + 1) >> 1;
+       LQ_threshold |= (LQ_threshold<<8);
+
+       rtw_write16(padapter, 0x218, HQ_threshold);
+       rtw_write16(padapter, 0x21A, NQ_threshold);
+       rtw_write16(padapter, 0x21C, LQ_threshold);
+       DBG_8192C("%s(): Enable Tx FIFO Page Threshold H:0x%x,N:0x%x,L:0x%x\n", __FUNCTION__, HQ_threshold, NQ_threshold, LQ_threshold);
+}
+
 static void _InitQueueReservedPage(PADAPTER padapter)
 {
        HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(padapter);
@@ -270,16 +271,23 @@ static void _InitQueueReservedPage(PADAPTER padapter)
 
        // NOTE: This step shall be proceed before writting REG_RQPN.
        if (pHalData->OutEpQueueSel & TX_SELE_NQ) {
-                       numNQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_NPQ_8723B : NORMAL_PAGE_NUM_NPQ_8723B;
+               numNQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_NPQ_8723B : NORMAL_PAGE_NUM_NPQ_8723B;
        }
-       value8 = (u8)_NPQ(numNQ);
-       rtw_write8(padapter, REG_RQPN_NPQ, value8);
 
        numPubQ = TX_TOTAL_PAGE_NUMBER_8723B - numHQ - numLQ - numNQ;
 
+       value8 = (u8)_NPQ(numNQ);
+       rtw_write8(padapter, REG_RQPN_NPQ, value8);
+
        // TX DMA
        value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN;
        rtw_write32(padapter, REG_RQPN, value32);
+
+       rtw_hal_set_sdio_tx_max_length(padapter, numHQ, numNQ, numLQ, numPubQ);
+
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
+       _init_available_page_threshold(padapter, numHQ, numNQ, numLQ, numPubQ);
+#endif
 }
 
 static void _InitTxBufferBoundary(PADAPTER padapter)
@@ -296,7 +304,7 @@ static void _InitTxBufferBoundary(PADAPTER padapter)
                txpktbuf_bndy = TX_PAGE_BOUNDARY_8723B;
        } else {
                //for WMM
-               txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY;
+               txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8723B;
        }
 
        rtw_write8(padapter, REG_TXPKTBUF_BCNQ_BDNY_8723B, txpktbuf_bndy);
@@ -308,11 +316,11 @@ static void _InitTxBufferBoundary(PADAPTER padapter)
 #ifdef CONFIG_CONCURRENT_MODE
        val8 = txpktbuf_bndy + BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B;
        rtw_write8(padapter, REG_BCNQ1_BDNY, val8);
-       rtw_write8(padapter, REG_TDECTRL1_8723B+1, val8); // BCN1_HEAD
+       rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+1, val8); // BCN1_HEAD
 
-       val8 = rtw_read8(padapter, REG_TDECTRL1_8723B+2);
+       val8 = rtw_read8(padapter, REG_DWBCN1_CTRL_8723B+2);
        val8 |= BIT(1); // BIT1- BIT_SW_BCN_SEL_EN
-       rtw_write8(padapter, REG_TDECTRL1_8723B+2, val8);
+       rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+2, val8);
 #endif // CONFIG_CONCURRENT_MODE
 }
 
@@ -801,25 +809,6 @@ void _InitOperationMode(PADAPTER padapter)
 
        rtw_write8(padapter, REG_BWOPMODE, regBwOpMode);
 
-       // For Min Spacing configuration.
-       switch(pHalData->rf_type)
-       {
-               case RF_1T2R:
-               case RF_1T1R:
-                       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter: RF_Type%s\n", (pHalData->rf_type==RF_1T1R? "(1T1R)":"(1T2R)")));
-//                     padapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
-                       MinSpaceCfg = (MAX_MSS_DENSITY_1T << 3);
-                       break;
-               case RF_2T2R:
-               case RF_2T2R_GREEN:
-                       RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter:RF_Type(2T2R)\n"));
-//                     padapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
-                       MinSpaceCfg = (MAX_MSS_DENSITY_2T << 3);
-                       break;
-       }
-
-//     rtw_write8(padapter, REG_AMPDU_MIN_SPACE, padapter->MgntInfo.MinSpaceCfg);
-       rtw_write8(padapter, REG_AMPDU_MIN_SPACE, MinSpaceCfg);
 }
 
 void _InitInterrupt(PADAPTER padapter)
@@ -1021,13 +1010,16 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
                pHalData->LastHMEBoxNum = 0;
 
 #ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HAL_Initialize(padapter);
+               rtw_btcoex_HAL_Initialize(padapter, _FALSE);
+#else
+               rtw_btcoex_HAL_Initialize(padapter, _TRUE);
 #endif // CONFIG_BT_COEXIST
 
                return _SUCCESS;
        }
 #elif defined(CONFIG_FWLPS_IN_IPS)
-       if (adapter_to_pwrctl(padapter)->bips_processing == _TRUE && psrtpriv->silent_reset_inprogress == _FALSE)
+       if (adapter_to_pwrctl(padapter)->bips_processing == _TRUE && psrtpriv->silent_reset_inprogress == _FALSE
+               && adapter_to_pwrctl(padapter)->pre_ips_type == 0)
        {
                u32 start_time;
                u8 cpwm_orig, cpwm_now;
@@ -1076,7 +1068,9 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
                rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);                
 
 #ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HAL_Initialize(padapter);
+               rtw_btcoex_HAL_Initialize(padapter, _FALSE);
+#else
+               rtw_btcoex_HAL_Initialize(padapter, _TRUE);
 #endif // CONFIG_BT_COEXIST
 
 #ifdef DBG_CHECK_FW_PS_STATE
@@ -1130,9 +1124,9 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
        {
                _InitRxSetting(padapter);
        }
-       else
+
 #endif
-       {
+       
                ret = rtl8723b_FirmwareDownload(padapter, _FALSE);
                if (ret != _SUCCESS) {
                        RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("%s: Download Firmware failed!!\n", __FUNCTION__));
@@ -1144,7 +1138,6 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
                        padapter->bFWReady = _TRUE;
                        pHalData->fw_ractrl = _TRUE;
                }
-       }
 
        rtl8723b_InitializeFirmwareVars(padapter);
 
@@ -1202,6 +1195,7 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
        pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(padapter, (RF_PATH)0, RF_CHNLBW, bRFRegOffsetMask);
        pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(padapter, (RF_PATH)1, RF_CHNLBW, bRFRegOffsetMask);
 
+       
        //if (!pHalData->bMACFuncEnable) {
                _InitQueueReservedPage(padapter);
                _InitTxBufferBoundary(padapter);
@@ -1297,20 +1291,6 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
 
        _RfPowerSave(padapter);
        
-#ifdef CONFIG_BT_COEXIST
-       // Init BT hw config.
-       rtw_btcoex_HAL_Initialize(padapter);
-       rtw_btcoex_SwitchGntBt(padapter);
-#else
-       u4Tmp = rtw_read32(padapter, REG_BT_WIFI_ANTENNA_SWITCH_8723B); //Ant select enable
-       u4Tmp |= BIT11;
-       rtw_write32(padapter, REG_BT_WIFI_ANTENNA_SWITCH_8723B, u4Tmp);
-
-       rtw_write8(padapter, 0x974, 0xff);
-       //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
-       rtw_write8(padapter, 0x930, 0x77);
-       rtw_write8(padapter, 0x92c, 0x2);
-#endif
 
        rtl8723b_InitHalDm(padapter);
 
@@ -1323,6 +1303,8 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
        // Update current Tx FIFO page status.
        //
        HalQueryTxBufferStatus8723BSdio(padapter);
+       HalQueryTxOQTBufferStatus8723BSdio(padapter);
+       pHalData->SdioTxOQTMaxFreeSpace = pHalData->SdioTxOQTFreeSpace;
 
        // Enable MACTXEN/MACRXEN block
        u1bTmp = rtw_read8(padapter, REG_CR);
@@ -1351,18 +1333,54 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
 
                if(pwrctrlpriv->rf_pwrstate == rf_on)
                {
+                       struct pwrctrl_priv *pwrpriv;
+                       u32 start_time;
                        u8 restore_iqk_rst;
-                       struct pwrctrl_priv      *pwrpriv = adapter_to_pwrctl(padapter);
-                       restore_iqk_rst = (pwrpriv->bips_processing == _TRUE)?_TRUE:_FALSE;
-                       
-                       PHY_IQCalibrate_8723B(padapter,_FALSE);
+                       u8 b2Ant;
+                       u8 h2cCmdBuf;
+
+                       pwrpriv = adapter_to_pwrctl(padapter);
+
+                       PHY_LCCalibrate_8723B(&pHalData->odmpriv);
+
+                       /* Inform WiFi FW that it is the beginning of IQK */
+                       h2cCmdBuf = 1;
+                       FillH2CCmd8723B(padapter, H2C_8723B_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf);
+
+                       start_time = rtw_get_current_time();
+                       do {
+                               if (rtw_read8(padapter, 0x1e7) & 0x01)
+                                       break;
+
+                               rtw_msleep_os(50);
+                       } while (rtw_get_passing_time_ms(start_time) <= 400);
+
+#ifdef CONFIG_BT_COEXIST
+                       rtw_btcoex_IQKNotify(padapter, _TRUE);
+#endif
+                       restore_iqk_rst = (pwrpriv->bips_processing==_TRUE)?_TRUE:_FALSE;
+                       b2Ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE;
+                       PHY_IQCalibrate_8723B(padapter, _FALSE, restore_iqk_rst, b2Ant, pHalData->ant_path);
                        pHalData->odmpriv.RFCalibrateInfo.bIQKInitialized = _TRUE;
-                       
+#ifdef CONFIG_BT_COEXIST
+                       rtw_btcoex_IQKNotify(padapter, _FALSE);
+#endif
+
+                       /* Inform WiFi FW that it is the finish of IQK */
+                       h2cCmdBuf = 0;
+                       FillH2CCmd8723B(padapter, H2C_8723B_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf);
+
                        ODM_TXPowerTrackingCheck(&pHalData->odmpriv);
-                       PHY_LCCalibrate_8723B(&pHalData->odmpriv);
                }
        }
 
+#ifdef CONFIG_BT_COEXIST
+       // Init BT hw config.
+       rtw_btcoex_HAL_Initialize(padapter, _FALSE);
+#else
+       rtw_btcoex_HAL_Initialize(padapter, _TRUE);
+#endif
+
        RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("-%s\n", __FUNCTION__));
 
        return _SUCCESS;
@@ -1462,50 +1480,71 @@ static u32 rtl8723bs_hal_deinit(PADAPTER padapter)
 #elif defined(CONFIG_FWLPS_IN_IPS)
                if (adapter_to_pwrctl(padapter)->bips_processing == _TRUE && psrtpriv->silent_reset_inprogress == _FALSE)
                {
-                       int cnt=0;
-                       u8 val8 = 0;
+                       if(padapter->netif_up == _TRUE)
+                       {
+                               int cnt=0;
+                               u8 val8 = 0;
                        
-                       DBG_871X("%s: issue H2C to FW when entering IPS\n", __FUNCTION__);
+                               DBG_871X("%s: issue H2C to FW when entering IPS\n", __FUNCTION__);
                        
-                       rtl8723b_set_FwPwrModeInIPS_cmd(padapter, 0x3);
-                       //poll 0x1cc to make sure H2C command already finished by FW; MAC_0x1cc=0 means H2C done by FW.
-                       do{
-                               val8 = rtw_read8(padapter, REG_HMETFR);
-                               cnt++;
-                               DBG_871X("%s  polling REG_HMETFR=0x%x, cnt=%d \n", __FUNCTION__, val8, cnt);
-                               rtw_mdelay_os(10);
-                       }while(cnt<100 && (val8!=0));
-                       //H2C done, enter 32k
-                       if(val8 == 0)
-                       {
-                               //ser rpwm to enter 32k
-                               val8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1);
-                               val8 += 0x80;
-                               val8 |= BIT(0);
-                               rtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8);
-                               DBG_871X("%s: write rpwm=%02x\n", __FUNCTION__, val8);
-                               adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;
-                               cnt = val8 = 0;
+                               rtl8723b_set_FwPwrModeInIPS_cmd(padapter, 0x3);
+                               //poll 0x1cc to make sure H2C command already finished by FW; MAC_0x1cc=0 means H2C done by FW.
                                do{
-                                       val8 = rtw_read8(padapter, REG_CR);
+                                       val8 = rtw_read8(padapter, REG_HMETFR);
                                        cnt++;
-                                       DBG_871X("%s  polling 0x100=0x%x, cnt=%d \n", __FUNCTION__, val8, cnt);                 
+                                       DBG_871X("%s  polling REG_HMETFR=0x%x, cnt=%d \n", __FUNCTION__, val8, cnt);
                                        rtw_mdelay_os(10);
-                               }while(cnt<100 && (val8!=0xEA));
+                               }while(cnt<100 && (val8!=0));
+                               //H2C done, enter 32k
+                               if(val8 == 0)
+                               {
+                                       //ser rpwm to enter 32k
+                                       val8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1);
+                                       val8 += 0x80;
+                                       val8 |= BIT(0);
+                                       rtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8);
+                                       DBG_871X("%s: write rpwm=%02x\n", __FUNCTION__, val8);
+                                       adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;
+                                       cnt = val8 = 0;
+                                       do{
+                                               val8 = rtw_read8(padapter, REG_CR);
+                                               cnt++;
+                                               DBG_871X("%s  polling 0x100=0x%x, cnt=%d \n", __FUNCTION__, val8, cnt);                 
+                                               rtw_mdelay_os(10);
+                                       }while(cnt<100 && (val8!=0xEA));
 #ifdef DBG_CHECK_FW_PS_STATE
                                if(val8 != 0xEA)
                                        DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n", rtw_read32(padapter, 0x1c0), rtw_read32(padapter, 0x1c4)
                                        , rtw_read32(padapter, 0x1c8), rtw_read32(padapter, 0x1cc));
 #endif //DBG_CHECK_FW_PS_STATE
+                               }
+                               else
+                               {
+                                       DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n", rtw_read32(padapter, 0x1c0), rtw_read32(padapter, 0x1c4)
+                                       , rtw_read32(padapter, 0x1c8), rtw_read32(padapter, 0x1cc));
+                               }
+                       
+                               DBG_871X("polling done when entering IPS, check result : 0x100=0x%x, cnt=%d, MAC_1cc=0x%02x\n"
+                               , rtw_read8(padapter, REG_CR), cnt, rtw_read8(padapter, REG_HMETFR));
+
+                               adapter_to_pwrctl(padapter)->pre_ips_type = 0;
+                               
                        }
                        else
                        {
-                               DBG_871X("MAC_1C0=%08x, MAC_1C4=%08x, MAC_1C8=%08x, MAC_1CC=%08x\n", rtw_read32(padapter, 0x1c0), rtw_read32(padapter, 0x1c4)
-                               , rtw_read32(padapter, 0x1c8), rtw_read32(padapter, 0x1cc));
+                               pdbgpriv->dbg_carddisable_cnt++;
+#ifdef DBG_CHECK_FW_PS_STATE
+                               if(rtw_fw_ps_state(padapter) == _FAIL)
+                               {
+                                       DBG_871X("card disable should leave 32k\n");
+                                       pdbgpriv->dbg_carddisable_error_cnt++;
+                               }
+#endif //DBG_CHECK_FW_PS_STATE
+                               CardDisableRTL8723BSdio(padapter);
+
+                               adapter_to_pwrctl(padapter)->pre_ips_type = 1;
                        }
                        
-                       DBG_871X("polling done when entering IPS, check result : 0x100=0x%x, cnt=%d, MAC_1cc=0x%02x\n"
-                       , rtw_read8(padapter, REG_CR), cnt, rtw_read8(padapter, REG_HMETFR));   
                }
                else
 #endif //CONFIG_SWLPS_IN_IPS
@@ -1699,49 +1738,6 @@ Hal_EfuseParseBoardType_8723BS(
 }
 
 #ifdef CONFIG_EFUSE_CONFIG_FILE
-static u32 Hal_readPGDataFromConfigFile(
-       PADAPTER        padapter,
-       u8              *PROMContent)
-{
-       u32 i;
-       struct file *fp;
-       mm_segment_t fs;
-       u8 temp[3];
-       loff_t pos = 0;
-
-
-       temp[2] = 0; // add end of string '\0'
-
-       fp = filp_open("/system/etc/wifi/rtk_efuse_8723bs.map", O_RDONLY,  0);
-       if (IS_ERR(fp)) {
-               RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Error, Efuse configure file doesn't exist.\n"));
-               return _FAIL;
-       }
-
-       fs = get_fs();
-       set_fs(KERNEL_DS);
-
-       DBG_871X("Efuse configure file: /system/etc/wifi/rtk_efuse_8723bs.map\n");
-       for (i=0; i<HWSET_MAX_SIZE_8723B; i++) {
-
-               vfs_read(fp, temp, 2, &pos);
-               PROMContent[i] = simple_strtoul(temp, NULL, 16 );
-               pos += 1; // Filter the space character
-#ifdef CONFIG_DEBUG
-               if (i % 16 == 0)
-                       printk("\n");
-               printk("%02X ", PROMContent[i]);
-#endif
-       }
-       printk("\n");
-       DBG_871X("\n");
-       set_fs(fs);
-
-       filp_close(fp, NULL);
-
-       return _SUCCESS;
-}
-
 static void
 Hal_ReadMACAddrFromFile_8723BS(
        PADAPTER                padapter
@@ -1819,26 +1815,57 @@ _ReadEfuseInfo8723BS(
        )
 {
        EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
-       u8                      hwinfo[HWSET_MAX_SIZE_8723B];
+       u8*                     hwinfo = NULL;
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+       struct file *fp;
+#endif //CONFIG_EFUSE_CONFIG_FILE
 
        RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("====>_ReadEfuseInfo8723BS()\n"));
 
        //
        // This part read and parse the eeprom/efuse content
        //
-#ifdef CONFIG_EFUSE_CONFIG_FILE
-       Hal_readPGDataFromConfigFile(padapter, hwinfo);
-#else
+
+       if (sizeof(pEEPROM->efuse_eeprom_data) < HWSET_MAX_SIZE_8723B)
+               DBG_871X("[WARNING] size of efuse_eeprom_data is less than HWSET_MAX_SIZE_8723B!\n");
+
+       hwinfo = pEEPROM->efuse_eeprom_data;
+
        Hal_InitPGData(padapter, hwinfo);
-#endif
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+       if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {
+               fp = filp_open(EFUSE_MAP_PATH, O_RDONLY, 0);
+               if (fp == NULL || IS_ERR(fp)) {
+                       DBG_871X("[WARNING] invalid phy efuse and no efuse file, use driver default!!\n");
+               } else {
+                       Hal_readPGDataFromConfigFile(padapter, fp);
+                       filp_close(fp, NULL);
+               }
+       }
+#endif //CONFIG_EFUSE_CONFIG_FILE
 
        Hal_EfuseParseIDCode(padapter, hwinfo);
        Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+
 #ifdef CONFIG_EFUSE_CONFIG_FILE
-       Hal_ReadMACAddrFromFile_8723BS(padapter);
-#else
+       if (check_phy_efuse_macaddr_info_valid(padapter) == _TRUE) {
+               DBG_871X("using phy efuse mac\n");
+               Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+       } else {
+               fp = filp_open(WIFIMAC_PATH, O_RDONLY, 0);
+               if (fp == NULL || IS_ERR(fp)) {
+                       DBG_871X("wifimac does not exist!!\n");
+                       Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+               } else {
+                       Hal_ReadMACAddrFromFile(padapter, fp);
+                       filp_close(fp, NULL);
+               }
+       }
+#else //CONFIG_EFUSE_CONFIG_FILE
        Hal_EfuseParseMACAddr_8723BS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
 #endif
+
        Hal_EfuseParseTxPowerInfo_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
        Hal_EfuseParseBoardType_8723BS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
 
@@ -1853,6 +1880,8 @@ _ReadEfuseInfo8723BS(
        Hal_EfuseParseAntennaDiversity_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
        Hal_EfuseParseCustomerID_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
        
+       Hal_EfuseParseVoltage_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+       
 #ifdef CONFIG_WOWLAN
        Hal_DetectWoWMode(padapter);
 #endif
@@ -1916,12 +1945,21 @@ _InitOtherVariable(
 //
 static s32 _ReadAdapterInfo8723BS(PADAPTER padapter)
 {
+    u8 val8;
        u32 start;
 
        RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("+_ReadAdapterInfo8723BS\n"));
 
        // before access eFuse, make sure card enable has been called
-    _InitPowerOn_8723BS(padapter);
+       if(padapter->hw_init_completed == _FALSE)
+               _InitPowerOn_8723BS(padapter);
+
+
+       val8 = rtw_read8(padapter, 0x4e);
+       MSG_8192C("%s, 0x4e=0x%x\n", __func__, val8);
+       val8 |= BIT(6);
+       rtw_write8(padapter, 0x4e, val8);
+
 
        start = rtw_get_current_time();
 
@@ -1930,6 +1968,13 @@ static s32 _ReadAdapterInfo8723BS(PADAPTER padapter)
        _ReadPROMContent(padapter);
        _InitOtherVariable(padapter);
 
+       if(padapter->hw_init_completed == _FALSE)       
+       {
+               rtw_write8(padapter, 0x67, 0x00); // for BT, Switch Ant control to BT
+               CardDisableRTL8723BSdio(padapter);//for the power consumption issue,  wifi ko module is loaded during booting, but wifi GUI is off
+       }       
+       
+
        MSG_8192C("<==== _ReadAdapterInfo8723BS in %d ms\n", rtw_get_passing_time_ms(start));
 
        return _SUCCESS;
@@ -2021,10 +2066,12 @@ _func_enter_;
                                case WOWLAN_ENABLE:
                                        DBG_871X_LEVEL(_drv_always_, "WOWLAN_ENABLE\n");
 
+                                       #ifndef DYNAMIC_CAMID_ALLOC
                                        val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
                                        rtw_write8(padapter, REG_SECCFG, val8);
-                       DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n",
-                                       rtw_read8(padapter, REG_SECCFG));
+                                       DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n", rtw_read8(padapter, REG_SECCFG));
+                                       #endif
+
                                        //backup data rate to register 0x8b for wowlan FW
                                        rtw_write8(padapter, 0x8d, 1);
                                        rtw_write8(padapter, 0x8c, 0);
@@ -2126,9 +2173,11 @@ _func_enter_;
                                                rtl8723b_set_FwMediaStatusRpt_cmd(padapter, RT_MEDIA_DISCONNECT, psta->mac_id); 
                                        else
                                                DBG_871X("psta is null\n");
-                                       
+
+                                       #ifndef DYNAMIC_CAMID_ALLOC
                                        rtw_write8(padapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
                                        DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n", rtw_read8(padapter, REG_SECCFG));
+                                       #endif
                                        
                                        // 1. Read wakeup reason
                                        pwrctl->wowlan_wake_reason = rtw_read8(padapter, REG_WOWLAN_WAKE_REASON);
@@ -2358,10 +2407,20 @@ _func_enter_;
 #ifdef CONFIG_GPIO_WAKEUP
                        DBG_871X_LEVEL(_drv_always_, "Set Wake GPIO to high for default.\n");
                        HalSetOutPutGPIO(padapter, WAKEUP_GPIO_IDX, 1);
-#endif
-                       rtl8723b_set_FwJoinBssRpt_cmd(padapter,
-                                       RT_MEDIA_CONNECT);
-
+#endif //CONFIG_GPIO_WAKEUP
+#ifdef CONFIG_CONCURRENT_MODE
+                       if (rtw_buddy_adapter_up(padapter) == _TRUE &&
+                               check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
+                               rtl8723b_set_FwJoinBssRpt_cmd(padapter->pbuddy_adapter, RT_MEDIA_CONNECT);
+                               issue_beacon(padapter->pbuddy_adapter, 0);
+                       } else {
+                               rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);
+                               issue_beacon(padapter, 0);
+                       }
+#else
+                       rtl8723b_set_FwJoinBssRpt_cmd(padapter, RT_MEDIA_CONNECT);
+                       issue_beacon(padapter, 0);
+#endif //CONFIG_CONCURRENT_MODE
                        break;
                default:
                        break;
@@ -2372,7 +2431,6 @@ _func_enter_;
                case HW_VAR_DM_IN_LPS:
                        rtl8723b_hal_dm_in_lps(padapter);
                        break;
-                       
                default:
                        SetHwReg8723B(padapter, variable, val);
                        break;
@@ -2421,7 +2479,7 @@ _func_enter_;
        switch (variable)
        {
                case HW_VAR_C2H_HANDLE:
-                       DBG_8192C("%s len=%d \n",__func__,len);
+                       //DBG_8192C("%s len=%d \n",__func__,len);
                        C2HPacketHandler_8723B(padapter, pbuf, len);
                        break;
 
@@ -2448,9 +2506,6 @@ GetHalDefVar8723BSDIO(
 
        switch(eVariable)
        {
-               case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
-                       *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB;
-                       break;
                case HAL_DEF_IS_SUPPORT_ANT_DIV:
 #ifdef CONFIG_ANTENNA_DIVERSITY
                        *((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE;
@@ -2461,9 +2516,6 @@ GetHalDefVar8723BSDIO(
                        *(( u8*)pValue) = pHalData->CurAntenna;
 #endif
                        break;
-               case HAL_DEF_DBG_DUMP_RXPKT:
-                       *(( u8*)pValue) = pHalData->bDumpRxPkt;
-                       break;
                case HW_VAR_MAX_RX_AMPDU_FACTOR:
                        // Stanley@BB.SD3 suggests 16K can get stable performance
                        // coding by Lucas@20130730
@@ -2493,9 +2545,6 @@ SetHalDefVar8723BSDIO(
 
        switch(eVariable)
        {
-               case HAL_DEF_DBG_DUMP_RXPKT:
-                       pHalData->bDumpRxPkt = *(( u8*)pValue);
-                       break;
                default:
                        bResult = SetHalDefVar8723B(Adapter, eVariable, pValue);
                        break;
@@ -2510,20 +2559,6 @@ void rtl8723bs_set_hal_ops(PADAPTER padapter)
 
 _func_enter_;
 
-
-#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");
-               }
-       }
-
-       padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
-
        rtl8723b_set_hal_ops(pHalFunc);
 
        pHalFunc->hal_init = &rtl8723bs_hal_init;
index 68bfff44c71641e44ca502351a7b692ade474c3f..ed0d7f193438907aa87f128c1ea7fa60bbf32642 100755 (executable)
@@ -1110,7 +1110,9 @@ void InitInterrupt8723BSdio(PADAPTER padapter)
        pHalData = GET_HAL_DATA(padapter);
        pHalData->sdio_himr = (u32)(                    \
                                                                SDIO_HIMR_RX_REQUEST_MSK                        |
-//                                                             SDIO_HIMR_AVAL_MSK                                      |
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
+                                                               SDIO_HIMR_AVAL_MSK                                      |
+#endif
 //                                                             SDIO_HIMR_TXERR_MSK                             |
 //                                                             SDIO_HIMR_RXERR_MSK                             |
 //                                                             SDIO_HIMR_TXFOVW_MSK                            |
@@ -1541,18 +1543,13 @@ static void sd_rxhandler(PADAPTER padapter, struct recv_buf *precvbuf)
        precvpriv = &padapter->recvpriv;
        ppending_queue = &precvpriv->recv_buf_pending_queue;
 
-       if (_rtw_queue_empty(ppending_queue) == _TRUE)
-       {
-               //3 1. enqueue recvbuf
-               rtw_enqueue_recvbuf(precvbuf, ppending_queue);
+       //3 1. enqueue recvbuf
+       rtw_enqueue_recvbuf(precvbuf, ppending_queue);
 
-               //3 2. schedule tasklet
+       //3 2. schedule tasklet
 #ifdef PLATFORM_LINUX
-               tasklet_schedule(&precvpriv->recv_tasklet);
+       tasklet_schedule(&precvpriv->recv_tasklet);
 #endif
-       } else
-               rtw_enqueue_recvbuf(precvbuf, ppending_queue);
-
 }
 
 void sd_int_dpc(PADAPTER padapter)
@@ -1567,6 +1564,24 @@ void sd_int_dpc(PADAPTER padapter)
        dvobj = adapter_to_dvobj(padapter);
        pwrctl = dvobj_to_pwrctl(dvobj);
 
+#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT
+       if (phal->sdio_hisr & SDIO_HISR_AVAL)
+       {
+               //_irqL irql;
+               u8      freepage[4];
+
+               _sdio_local_read(padapter, SDIO_REG_FREE_TXPG, 4, freepage);
+               //_enter_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql);
+               //_rtw_memcpy(phal->SdioTxFIFOFreePage, freepage, 4);
+               //_exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql);
+               //DBG_871X("SDIO_HISR_AVAL, Tx Free Page = 0x%x%x%x%x\n",
+               //      freepage[0],
+               //      freepage[1],
+               //      freepage[2],
+               //      freepage[3]);
+               _rtw_up_sema(&(padapter->xmitpriv.xmit_sema));
+       }
+#endif
        if (phal->sdio_hisr & SDIO_HISR_CPWM1)
        {
                struct reportpwrstate_parm report;
@@ -1738,14 +1753,14 @@ u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter)
 {
        PHAL_DATA_TYPE phal;
        u32 NumOfFreePage;
-//     _irqL irql;
+       //_irqL irql;
 
 
        phal = GET_HAL_DATA(padapter);
 
        NumOfFreePage = SdioLocalCmd53Read4Byte(padapter, SDIO_REG_FREE_TXPG);
 
-//     _enter_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql);
+       //_enter_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql);
        _rtw_memcpy(phal->SdioTxFIFOFreePage, &NumOfFreePage, 4);
        RT_TRACE(_module_hci_ops_c_, _drv_notice_,
                        ("%s: Free page for HIQ(%#x),MIDQ(%#x),LOWQ(%#x),PUBQ(%#x)\n",
@@ -1754,11 +1769,22 @@ u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter)
                        phal->SdioTxFIFOFreePage[MID_QUEUE_IDX],
                        phal->SdioTxFIFOFreePage[LOW_QUEUE_IDX],
                        phal->SdioTxFIFOFreePage[PUBLIC_QUEUE_IDX]));
-//     _exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql);
+       //_exit_critical_bh(&phal->SdioTxFIFOFreePageLock, &irql);
 
        return _TRUE;
 }
 
+//
+//     Description:
+//             Query SDIO Local register to get the current number of TX OQT Free Space.
+//
+u8 HalQueryTxOQTBufferStatus8723BSdio(PADAPTER padapter)
+{
+       HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
+       pHalData->SdioTxOQTFreeSpace = SdioLocalCmd52Read1Byte(padapter, SDIO_REG_OQT_FREE_PG);
+       return _TRUE;
+}
+
 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) 
 u8 RecvOnePkt(PADAPTER padapter, u32 size)
 {
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/ifcfg-wlan0 b/drivers/net/wireless/rockchip_wlan/rtl8723bs/ifcfg-wlan0
new file mode 100755 (executable)
index 0000000..20dcbec
--- /dev/null
@@ -0,0 +1,4 @@
+#DHCP client\r
+DEVICE=wlan0\r
+BOOTPROTO=dhcp\r
+ONBOOT=yes
\ No newline at end of file
index 648f0afd8a7ac2c4295208903af558165b1a7cfc..2ef34ed802d37333d27cff1b2a6154ffbc8d0f06 100755 (executable)
 #define                rOFDM1_CFOTracking                      0xd2c\r
 #define                rOFDM1_TRxMesaure1                      0xd34\r
 #define                rOFDM1_IntfDet                          0xd3c\r
+#define                rOFDM1_csi_fix_mask1                            0xd40\r
+#define                rOFDM1_csi_fix_mask2                            0xd44\r
 #define                rOFDM1_PseudoNoiseStateAB       0xd50\r
 #define                rOFDM1_PseudoNoiseStateCD       0xd54\r
 #define                rOFDM1_RxPseudoNoiseWgt         0xd58\r
 #define                bMaskHWord                              0xffff0000\r
 #define                bMaskLWord                              0x0000ffff\r
 #define                bMaskDWord                              0xffffffff\r
+#define                bMaskH3Bytes                            0xffffff00\r
 #define                bMask12Bits                             0xfff   \r
 #define                bMaskH4Bits                             0xf0000000      \r
 #define                bMaskOFDM_D                     0xffc00000\r
index e4e977c67fbbe9111d375708f681b77ce2360b30..1c7cd5d1ed1eb0059d8719953b1e5a3ec0a5b326 100755 (executable)
 #define                bMaskHWord              0xffff0000
 #define                bMaskLWord                      0x0000ffff
 #define                bMaskDWord              0xffffffff
+#define                bMaskH3Bytes            0xffffff00
 #define                bMask12Bits                     0xfff
 #define                bMaskH4Bits                     0xf0000000      
 #define                bMaskOFDM_D             0xffc00000
index fb32eacd90ae300c8b8b87ff64c25b59dd718b75..b5af827275de7a5efecca52f16ab6d0e30abf8c3 100755 (executable)
 #define                RF_TX_G3                                        0x22    // 
 
 #define                RF_TX_BB1                                       0x23    // 
-
+#define                RF_T_METER_92D                  0x42
 #define                RF_T_METER                                      0x42    // 
 
 #define                RF_SYN_G1                                       0x25    // RF TX Power control
 #define                bMaskHWord              0xffff0000
 #define                bMaskLWord                      0x0000ffff
 #define                bMaskDWord              0xffffffff
+#define                bMaskH3Bytes            0xffffff00
 #define                bMask12Bits                     0xfff
 #define                bMaskH4Bits                     0xf0000000      
 #define                bMaskOFDM_D             0xffc00000
index 0621fb96fb18e2a01a6a88056712e8bdd2bf3262..02a3f865a96b7c067f2374b3fbff1653c7d462de 100755 (executable)
 \r
 #define                RF_TX_BB1                                       0x23    // \r
 \r
-//#if HARDWARE_TYPE_IS_RTL8192D        == 1\r
-#define                RF_T_METER_92D                                  0x42    // \r
-//#else\r
-#define                RF_T_METER_88E                                  0x42    // \r
+#define                RF_T_METER_8192E                        0x42    // \r
+#define                RF_T_METER_88E                          0x42    //\r
 #define                RF_T_METER                                      0x24    // \r
 \r
 //#endif\r
 #define                bMaskHWord                              0xffff0000\r
 #define                bMaskLWord                              0x0000ffff\r
 #define                bMaskDWord                              0xffffffff\r
+#define                bMaskH3Bytes                            0xffffff00\r
 #define                bMask12Bits                             0xfff   \r
 #define                bMaskH4Bits                             0xf0000000      \r
 #define                bMaskOFDM_D                     0xffc00000\r
index 5125e227dc235248ebc7f2b1dd842c0cb70ee8ff..fde6f33d58ccc0f72b5c3598fe44652c6ae2f900 100755 (executable)
 #define rFPGA0_AdDaClockEn                     0x888   // enable ad/da clock1 for dual-phy\r
 #define rFPGA0_AnalogParameter4        0x88c\r
 #define rFPGA0_XB_LSSIReadBack         0x8a4\r
+#define rFPGA0_XCD_RFPara      0x8b4\r
+\r
 //\r
 // 4. Page9(0x900)\r
 //\r
 #define bMaskHWord                     0xffff0000\r
 #define bMaskLWord                             0x0000ffff\r
 #define bMaskDWord                     0xffffffff\r
+#define bMaskH3Bytes                           0xffffff00\r
 #define bMask12Bits                            0xfff   \r
 #define bMaskH4Bits                            0xf0000000      \r
 #define bMaskOFDM_D                    0xffc00000\r
index d0a57600bd7abcbe317154f026353e58a9ae5f43..e934d6f1bbeed448e465c3ac07f2c3d09ceb17c8 100755 (executable)
@@ -53,7 +53,7 @@
 #define CONFIG_80211N_HT
 #define CONFIG_RECV_REORDERING_CTRL
 
-#define CONFIG_IOCTL_CFG80211
+//#define CONFIG_IOCTL_CFG80211
 
 #if defined(CONFIG_PLATFORM_SPRD) && !defined(ANDROID_2X)
        #ifndef CONFIG_IOCTL_CFG80211
@@ -82,6 +82,7 @@
        #endif
        //#define CONFIG_FIND_BEST_CHANNEL
        //#define CONFIG_NO_WIRELESS_HANDLERS
+       #define CONFIG_TX_MCAST2UNI             // Support IP multicast->unicast
 #endif
 
 #define CONFIG_P2P
        #endif
        //#define CONFIG_DBG_P2P
        #define CONFIG_P2P_PS
-       #define CONFIG_P2P_IPS
+       //#define CONFIG_P2P_IPS
        #define CONFIG_P2P_OP_CHK_SOCIAL_CH
-       #define CONFIG_P2P_CHK_INVITE_CH_LIST
+       #define CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT  //replace CONFIG_P2P_CHK_INVITE_CH_LIST flag
+       #define CONFIG_P2P_INVITE_IOT
 #endif
 
 //     Added by Kurt 20110511
 #define CONFIG_LAYER2_ROAMING
 #define CONFIG_LAYER2_ROAMING_RESUME
 
-#define CONFIG_SCAN_SPARSE     //partial scan, ASUS RK3188 use the feature
+#define CONFIG_RESUME_IN_WORKQUEUE
+
+//#define CONFIG_SCAN_SPARSE   //partial scan, ASUS RK3188 use the feature
 #ifdef CONFIG_SCAN_SPARSE 
        #define ALLOW_SCAN_INTERVAL     12000 // unit is ms
        #define SCAN_DIVISION_NUM 4
 /*
  * Interface Related Config
  */
+#define CONFIG_TX_AGGREGATION
 #define CONFIG_SDIO_RX_COPY
 #define CONFIG_XMIT_THREAD_MODE
+#define CONFIG_SDIO_TX_ENABLE_AVAL_INT
 
 /*
  * Others
 #endif
 
 
-#define CONFIG_CONCURRENT_MODE
+//#define CONFIG_CONCURRENT_MODE
 #ifdef CONFIG_CONCURRENT_MODE
        #define CONFIG_TSF_RESET_OFFLOAD 1                      // For 2 PORT TSF SYNC.
        //#define CONFIG_HWPORT_SWAP                            //Port0->Sec , Port1 -> Pri
  * Outsource  Related Config
  */
 
+#define        TESTCHIP_SUPPORT                                0
+
 #define        RTL8192CE_SUPPORT                               0
 #define        RTL8192CU_SUPPORT                       0
 #define        RTL8192C_SUPPORT                                (RTL8192CE_SUPPORT|RTL8192CU_SUPPORT)
 #define        RTL8723AU_SUPPORT                               0
 #define        RTL8723AE_SUPPORT                               0
 #define        RTL8723A_SUPPORT                                (RTL8723AU_SUPPORT|RTL8723AS_SUPPORT|RTL8723AE_SUPPORT)
-
-
 #define        RTL8723_FPGA_VERIFICATION               0
 
-#define RTL8188EE_SUPPORT                              0
-#define RTL8188EU_SUPPORT                              0
-#define RTL8188ES_SUPPORT                              0
-#define RTL8188E_SUPPORT                               (RTL8188EE_SUPPORT|RTL8188EU_SUPPORT|RTL8188ES_SUPPORT)
-
-#define RTL8812E_SUPPORT                               0
-#define RTL8812AU_SUPPORT                              0
-#define RTL8812A_SUPPORT                               (RTL8812E_SUPPORT|RTL8812AU_SUPPORT)
-
+#define RTL8188E_SUPPORT                               0
+#define RTL8812A_SUPPORT                               0
 #define RTL8821A_SUPPORT                               0
-
 #define RTL8723B_SUPPORT                               1
-
 #define RTL8192E_SUPPORT                               0
+#define RTL8814A_SUPPORT                               0
 
-#define RTL8813A_SUPPORT                               0
-
-#define TESTCHIP_SUPPORT                       0
-
-//#if (RTL8188E_SUPPORT==1)
 #define RATE_ADAPTIVE_SUPPORT                  0
 #define POWER_TRAINING_ACTIVE                  0
-//#endif
+
 
 //#define CONFIG_HW_ANTENNA_DIVERSITY
 
 #else // !CONFIG_DEBUG
 #define DBG    0       // for ODM & BTCOEX debug
 #endif // !CONFIG_DEBUG
-//
+
 #define CONFIG_PROC_DEBUG
-//
+
 #define DBG_CONFIG_ERROR_DETECT
 //#define DBG_XMIT_BUF
 //#define DBG_XMIT_BUF_EXT
-//#define DBG_CHECK_FW_PS_STATE
-//#define DBG_CHECK_FW_PS_STATE_H2C
-//
+#define DBG_CHECK_FW_PS_STATE
+#define DBG_CHECK_FW_PS_STATE_H2C
+
index 497b328bc1c5363370522d0a72dd7edd2f9f1c9e..28ba763ba5a2524e675757f819e5d5c5c02a8713 100755 (executable)
                        ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \
                );
 
-//pclint
+
+#define LE_BITS_CLEARED_TO_2BYTE_16BIT(__pStart, __BitOffset, __BitLen) \
+       ( \
+               LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
+       )
+
+#define SET_BITS_TO_LE_2BYTE_16BIT(__pStart, __BitOffset, __BitLen, __Value) \
+       *((u16 *)(__pStart)) = \
+               EF2Byte( \
+                       LE_BITS_CLEARED_TO_2BYTE_16BIT(__pStart, __BitOffset, __BitLen) \
+                       | \
+                       ( (u16)__Value) \
+               );
+
 #define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \
        ( \
                LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
        )
 
-//pclint
 #define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \
 { \
-       *((pu1Byte)(__pStart)) = \
+       *((u8 *)(__pStart)) = \
                EF1Byte( \
                        LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \
                        | \
-                       ((u1Byte)__Value) \
+                       ((u8)__Value) \
                ); \
 }
 
index 1b1aa722ca71c36bfaa3af6396b98a88a9304d2a..37f432f5ddbbbb31433b3b36b22a31a5a5559a2f 100755 (executable)
@@ -46,6 +46,7 @@
 #define CONFIG_SIGNAL_DISPLAY_DBM
 #endif
 
+/*
 #if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE)
        #warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
        #undef CONFIG_RESUME_IN_WORKQUEUE
@@ -55,6 +56,7 @@
        #warning "You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
        #undef CONFIG_RESUME_IN_WORKQUEUE
 #endif
+*/
 
 #ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this...
        #if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER)
        #define CONFIG_USB_VENDOR_REQ_MUTEX
 #endif
 
+#define DYNAMIC_CAMID_ALLOC
+
+#ifndef CONFIG_RTW_HIQ_FILTER
+       #define CONFIG_RTW_HIQ_FILTER 1
+#endif
 
 //#include <rtl871x_byteorder.h>
 
index 60c364648096dcc1a83e72fc3de551af3c72f245..2d3b19120c7ab03cdb73bf3c59ee94402bca02bf 100755 (executable)
 #include <wlan_bssdef.h>
 #include <wifi.h>
 #include <ieee80211.h>
-
+#ifdef CONFIG_ARP_KEEP_ALIVE
+#include <net/neighbour.h>
+#include <net/arp.h>
+#endif
 
 #ifdef PLATFORM_OS_XP
 #include <drv_types_xp.h>
@@ -57,8 +60,6 @@ enum _NIC_VERSION {
 
 };
 
-#define CONFIG_SUSPEND_REFINE  
-
 typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 
 #include <rtw_debug.h>
@@ -76,16 +77,17 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 #include <rtw_intel_widi.h>
 #endif
 
-#ifdef CONFIG_BEAMFORMING
-#include <rtw_beamforming.h>
-#endif
-
 #include <rtw_cmd.h>
 #include <cmd_osdep.h>
 #include <rtw_security.h>
 #include <rtw_xmit.h>
 #include <xmit_osdep.h>
 #include <rtw_recv.h>
+
+#ifdef CONFIG_BEAMFORMING
+#include <rtw_beamforming.h>
+#endif
+
 #include <recv_osdep.h>
 #include <rtw_efuse.h>
 #include <rtw_sreset.h>
@@ -111,6 +113,10 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
 #include <rtw_version.h>
 #include <rtw_odm.h>
 
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
+#include <rtw_mem.h>
+#endif
+
 #ifdef CONFIG_P2P
 #include <rtw_p2p.h>
 #endif // CONFIG_P2P
@@ -254,6 +260,7 @@ struct registry_priv
        u8      bt_iso;
        u8      bt_sco;
        u8      bt_ampdu;
+       s8      ant_num;
 #endif
        BOOLEAN bAcceptAddbaReq;
 
@@ -295,7 +302,6 @@ struct registry_priv
        u8 force_ant;//0 normal,1 main,2 aux
        u8 force_igi;//0 normal
 #endif
-       u8 regulatory_tid;
 
        //define for tx power adjust
        u8      RegEnableTxPowerLimit;
@@ -318,6 +324,9 @@ struct registry_priv
 #ifdef CONFIG_MULTI_VIR_IFACES
        u8 ext_iface_num;//primary/secondary iface is excluded
 #endif
+       u8 qos_opt_enable;
+
+       u8 hiq_filter;
 };
 
 
@@ -358,6 +367,131 @@ enum _IFACE_ID {
        IFACE_ID_MAX,
 };
 
+#ifdef CONFIG_DBG_COUNTER
+
+struct rx_logs {
+       u32 intf_rx;
+       u32 intf_rx_err_recvframe;
+       u32 intf_rx_err_skb;
+       u32 intf_rx_report;
+       u32 core_rx;
+       u32 core_rx_pre;
+       u32 core_rx_pre_ver_err;
+       u32 core_rx_pre_mgmt;
+       u32 core_rx_pre_mgmt_err_80211w;
+       u32 core_rx_pre_mgmt_err;
+       u32 core_rx_pre_ctrl;
+       u32 core_rx_pre_ctrl_err;
+       u32 core_rx_pre_data;
+       u32 core_rx_pre_data_wapi_seq_err;
+       u32 core_rx_pre_data_wapi_key_err;
+       u32 core_rx_pre_data_handled;
+       u32 core_rx_pre_data_err;
+       u32 core_rx_pre_data_unknown;
+       u32 core_rx_pre_unknown;
+       u32 core_rx_enqueue;
+       u32 core_rx_dequeue;
+       u32 core_rx_post;
+       u32 core_rx_post_decrypt;
+       u32 core_rx_post_decrypt_wep;
+       u32 core_rx_post_decrypt_tkip;
+       u32 core_rx_post_decrypt_aes;
+       u32 core_rx_post_decrypt_wapi;
+       u32 core_rx_post_decrypt_hw;
+       u32 core_rx_post_decrypt_unknown;
+       u32 core_rx_post_decrypt_err;
+       u32 core_rx_post_defrag_err;
+       u32 core_rx_post_portctrl_err;
+       u32 core_rx_post_indicate;
+       u32 core_rx_post_indicate_in_oder;
+       u32 core_rx_post_indicate_reoder;
+       u32 core_rx_post_indicate_err;
+       u32 os_indicate;
+       u32 os_indicate_ap_mcast;
+       u32 os_indicate_ap_forward;
+       u32 os_indicate_ap_self;
+       u32 os_indicate_err;
+       u32 os_netif_ok;
+       u32 os_netif_err;
+};
+
+struct tx_logs {
+       u32 os_tx;
+       u32 os_tx_err_up;
+       u32 os_tx_err_xmit;
+       u32 os_tx_m2u;
+       u32 os_tx_m2u_ignore_fw_linked;
+       u32 os_tx_m2u_ignore_self;
+       u32 os_tx_m2u_entry;
+       u32 os_tx_m2u_entry_err_xmit;
+       u32 os_tx_m2u_entry_err_skb;
+       u32 os_tx_m2u_stop;
+       u32 core_tx;
+       u32 core_tx_err_pxmitframe;
+       u32 core_tx_err_brtx;
+       u32 core_tx_upd_attrib;
+       u32 core_tx_upd_attrib_adhoc;
+       u32 core_tx_upd_attrib_sta;
+       u32 core_tx_upd_attrib_ap;
+       u32 core_tx_upd_attrib_unknown;
+       u32 core_tx_upd_attrib_dhcp;
+       u32 core_tx_upd_attrib_icmp;
+       u32 core_tx_upd_attrib_active;
+       u32 core_tx_upd_attrib_err_ucast_sta;
+       u32 core_tx_upd_attrib_err_ucast_ap_link;
+       u32 core_tx_upd_attrib_err_sta;
+       u32 core_tx_upd_attrib_err_link;
+       u32 core_tx_upd_attrib_err_sec;
+       u32 core_tx_ap_enqueue_warn_fwstate;
+       u32 core_tx_ap_enqueue_warn_sta;
+       u32 core_tx_ap_enqueue_warn_nosta;
+       u32 core_tx_ap_enqueue_warn_link;
+       u32 core_tx_ap_enqueue_warn_trigger;
+       u32 core_tx_ap_enqueue_mcast;
+       u32 core_tx_ap_enqueue_ucast;
+       u32 core_tx_ap_enqueue;
+       u32 intf_tx;
+       u32 intf_tx_pending_ac;
+       u32 intf_tx_pending_fw_under_survey;
+       u32 intf_tx_pending_fw_under_linking;
+       u32 intf_tx_pending_xmitbuf;
+       u32 intf_tx_enqueue;
+       u32 core_tx_enqueue;
+       u32 core_tx_enqueue_class;
+       u32 core_tx_enqueue_class_err_sta;
+       u32 core_tx_enqueue_class_err_nosta;
+       u32 core_tx_enqueue_class_err_fwlink;
+       u32 intf_tx_direct;
+       u32 intf_tx_direct_err_coalesce;
+       u32 intf_tx_dequeue;
+       u32 intf_tx_dequeue_err_coalesce;
+       u32 intf_tx_dump_xframe;
+       u32 intf_tx_dump_xframe_err_txdesc;
+       u32 intf_tx_dump_xframe_err_port;
+};
+
+struct int_logs {
+       u32 all;
+       u32 err;
+       u32 tbdok;
+       u32 tbder;
+       u32 bcnderr;
+       u32 bcndma;
+       u32 bcndma_e;
+       u32 rx;
+       u32 rx_rdu;
+       u32 rx_fovw;
+       u32 txfovw;
+       u32 mgntok;
+       u32 highdok;
+       u32 bkdok;
+       u32 bedok;
+       u32 vidok;
+       u32 vodok;
+};
+
+#endif // CONFIG_DBG_COUNTER
+
 struct debug_priv {
        u32 dbg_sdio_free_irq_error_cnt;
        u32 dbg_sdio_alloc_irq_error_cnt;
@@ -388,6 +522,14 @@ struct debug_priv {
        u32 dbg_rpwm_toogle_cnt;
        u32 dbg_rpwm_timeout_fail_cnt;
        u32 dbg_sreset_cnt;
+       u64 dbg_rx_fifo_last_overflow;
+       u64 dbg_rx_fifo_curr_overflow;
+       u64 dbg_rx_fifo_diff_overflow;
+       u64 dbg_rx_ampdu_drop_count;
+       u64 dbg_rx_ampdu_forced_indicate_count;
+       u64 dbg_rx_ampdu_loss_count;
+       u64 dbg_rx_dup_mgt_frame_drop_count;
+       u64 dbg_rx_ampdu_window_shift_cnt;
 };
 
 struct rtw_traffic_statistics {
@@ -408,15 +550,31 @@ struct rtw_traffic_statistics {
        u32     cur_rx_tp; // Rx throughput in MBps.
 };
 
+struct cam_ctl_t {
+       _lock lock;
+       u64 bitmap;
+};
+
+struct cam_entry_cache {
+       u16 ctrl;
+       u8 mac[ETH_ALEN];
+       u8 key[16];
+};
+
+#define KEY_FMT "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
+#define KEY_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5], \
+       ((u8*)(x))[6],((u8*)(x))[7],((u8*)(x))[8],((u8*)(x))[9],((u8*)(x))[10],((u8*)(x))[11], \
+       ((u8*)(x))[12],((u8*)(x))[13],((u8*)(x))[14],((u8*)(x))[15]
+
 struct dvobj_priv
 {
        /*-------- below is common data --------*/      
-        _adapter *if1; //PRIMARY_ADAPTER
+       _adapter *if1; //PRIMARY_ADAPTER
        _adapter *if2; //SECONDARY_ADAPTER
 
        s32     processing_dev_remove;
 
-        struct debug_priv drv_dbg;
+       struct debug_priv drv_dbg;
 
        //for local/global synchronization
        //
@@ -439,6 +597,8 @@ struct dvobj_priv
        _adapter *padapters[IFACE_ID_MAX];
        u8 iface_nums; // total number of ifaces used runtime
 
+       struct cam_ctl_t cam_ctl;
+       struct cam_entry_cache cam_cache[TOTAL_CAM_ENTRY];
 
        //For 92D, DMDP have 2 interface.
        u8      InterfaceNumber;
@@ -446,12 +606,14 @@ struct dvobj_priv
 
        //In /Out Pipe information
        int     RtInPipe[2];
-       int     RtOutPipe[3];
+       int     RtOutPipe[4];
        u8      Queue2Pipe[HW_QUEUE_ENTRY];//for out pipe mapping
 
        u8      irq_alloc;
        ATOMIC_T continual_io_error;
 
+       ATOMIC_T disable_func;
+
        struct pwrctrl_priv pwrctl_priv;
 
        struct rtw_traffic_statistics   traffic_stat;
@@ -773,11 +935,11 @@ struct _ADAPTER{
        _lock glock;
 #endif //PLATFORM_FREEBSD
        int net_closed;
+       
+       u8 netif_up;
 
        u8 bFWReady;
        u8 bBTFWReady;
-       u8 bReadPortCancel;
-       u8 bWritePortCancel;
        u8 bLinkInfoDump;
        u8 bRxRSSIDisplay;
        //      Added by Albert 2012/10/26
@@ -845,15 +1007,65 @@ struct _ADAPTER{
        PLOOPBACKDATA ploopback;
 #endif
 
+       //for debug purpose
        u8 fix_rate;
+       u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense for tx
+       u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+       u8 driver_ampdu_spacing;//driver control AMPDU Density for peer sta's rx
+       u8 driver_rx_ampdu_factor;//0xff: disable drv ctrl, 0:8k, 1:16k, 2:32k, 3:64k;
 
        unsigned char     in_cta_test;
+
+#ifdef CONFIG_DBG_COUNTER      
+       struct rx_logs rx_logs;
+       struct tx_logs tx_logs;
+       struct int_logs int_logs;
+#endif
 };
 
 #define adapter_to_dvobj(adapter) (adapter->dvobj)
 #define adapter_to_pwrctl(adapter) (dvobj_to_pwrctl(adapter->dvobj))
 #define adapter_wdev_data(adapter) (&((adapter)->wdev_data))
 
+//
+// Function disabled.
+//
+#define DF_TX_BIT              BIT0
+#define DF_RX_BIT              BIT1
+#define DF_IO_BIT              BIT2
+
+//#define RTW_DISABLE_FUNC(padapter, func) (ATOMIC_ADD(&adapter_to_dvobj(padapter)->disable_func, (func)))
+//#define RTW_ENABLE_FUNC(padapter, func) (ATOMIC_SUB(&adapter_to_dvobj(padapter)->disable_func, (func)))
+__inline static void RTW_DISABLE_FUNC(_adapter*padapter, int func_bit)
+{
+       int     df = ATOMIC_READ(&adapter_to_dvobj(padapter)->disable_func);
+       df |= func_bit;
+       ATOMIC_SET(&adapter_to_dvobj(padapter)->disable_func, df);
+}
+
+__inline static void RTW_ENABLE_FUNC(_adapter*padapter, int func_bit)
+{
+       int     df = ATOMIC_READ(&adapter_to_dvobj(padapter)->disable_func);
+       df &= ~(func_bit);
+       ATOMIC_SET(&adapter_to_dvobj(padapter)->disable_func, df);
+}
+
+#define RTW_IS_FUNC_DISABLED(padapter, func_bit) (ATOMIC_READ(&adapter_to_dvobj(padapter)->disable_func) & (func_bit))
+
+#define RTW_CANNOT_IO(padapter) \
+                       ((padapter)->bSurpriseRemoved || \
+                        RTW_IS_FUNC_DISABLED((padapter), DF_IO_BIT))
+
+#define RTW_CANNOT_RX(padapter) \
+                       ((padapter)->bDriverStopped || \
+                        (padapter)->bSurpriseRemoved || \
+                        RTW_IS_FUNC_DISABLED((padapter), DF_RX_BIT))
+
+#define RTW_CANNOT_TX(padapter) \
+                       ((padapter)->bDriverStopped || \
+                        (padapter)->bSurpriseRemoved || \
+                        RTW_IS_FUNC_DISABLED((padapter), DF_TX_BIT))
+
 int rtw_handle_dualmac(_adapter *adapter, bool init);
 
 #ifdef CONFIG_PNO_SUPPORT
@@ -865,6 +1077,17 @@ void rtw_dev_pno_debug(struct net_device *net);
 #endif //CONFIG_PNO_SET_DEBUG
 #endif //CONFIG_PNO_SUPPORT
 
+#ifdef CONFIG_GPIO_API
+int rtw_get_gpio(struct net_device *netdev, int gpio_num);
+int rtw_set_gpio_output_value(struct net_device *netdev, int gpio_num, BOOLEAN isHigh);
+int rtw_config_gpio(struct net_device *netdev, int gpio_num, BOOLEAN isOutput);
+#endif
+
+#ifdef CONFIG_WOWLAN
+int rtw_suspend_wow(_adapter *padapter);
+int rtw_resume_process_wow(_adapter *padapter);
+#endif
+
 __inline static u8 *myid(struct eeprom_priv *peepriv)
 {
        return (peepriv->mac_addr);
index 968d0c6815e52c3b8de69040cbe21937bb06c3f4..f12d6554801082f7efc597e206b8a8bd6571b982 100755 (executable)
@@ -41,9 +41,11 @@ void hal_btcoex_SetChipType(PADAPTER padapter, u8 chipType);
 u8 hal_btcoex_GetChipType(PADAPTER padapter);
 void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum);
 u8 hal_btcoex_GetPgAntNum(PADAPTER padapter);
+void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
 
 u8 hal_btcoex_Initialize(PADAPTER padapter);
-void hal_btcoex_InitHwConfig(PADAPTER padapter);
+void hal_btcoex_PowerOnSetting(PADAPTER padapter);
+void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly);
 
 void hal_btcoex_IpsNotify(PADAPTER padapter, u8 type);
 void hal_btcoex_LpsNotify(PADAPTER padapter, u8 type);
@@ -51,10 +53,11 @@ void hal_btcoex_ScanNotify(PADAPTER padapter, u8 type);
 void hal_btcoex_ConnectNotify(PADAPTER padapter, u8 action);
 void hal_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus);
 void hal_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType);
+void hal_btcoex_IQKNotify(PADAPTER padapter, u8 state);
 void hal_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf);
 void hal_btcoex_SuspendNotify(PADAPTER padapter, u8 state);
 void hal_btcoex_HaltNotify(PADAPTER padapter);
-void hal_btcoex_SwitchGntBt(PADAPTER padapter);
+void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter);
 
 void hal_btcoex_Hanlder(PADAPTER padapter);
 
index e3af6691d755b6afca7ccb82448dac240c895861..d9680a84d9b7d1733a0dd23c234ac85a85a1efcb 100755 (executable)
 //     Rate
 //-----------------------------------------------------------
 // CCK Rates, TxHT = 0
-#define DESC_RATE1M                            0x00
-#define DESC_RATE2M                            0x01
+#define DESC_RATE1M                                    0x00
+#define DESC_RATE2M                                    0x01
 #define DESC_RATE5_5M                          0x02
 #define DESC_RATE11M                           0x03
 
 // OFDM Rates, TxHT = 0
-#define DESC_RATE6M                            0x04
-#define DESC_RATE9M                            0x05
+#define DESC_RATE6M                                    0x04
+#define DESC_RATE9M                                    0x05
 #define DESC_RATE12M                           0x06
 #define DESC_RATE18M                           0x07
 #define DESC_RATE24M                           0x08
 #define DESC_RATEVHTSS4MCS8            0x52
 #define DESC_RATEVHTSS4MCS9            0x53
 
+#define HDATA_RATE(rate)\
+(rate==DESC_RATE1M)?"CCK_1M":\
+(rate==DESC_RATE2M)?"CCK_2M":\
+(rate==DESC_RATE5_5M)?"CCK5_5M":\
+(rate==DESC_RATE11M)?"CCK_11M":\
+(rate==DESC_RATE6M)?"OFDM_6M":\
+(rate==DESC_RATE9M)?"OFDM_9M":\
+(rate==DESC_RATE12M)?"OFDM_12M":\
+(rate==DESC_RATE18M)?"OFDM_18M":\
+(rate==DESC_RATE24M)?"OFDM_24M":\
+(rate==DESC_RATE36M)?"OFDM_36M":\
+(rate==DESC_RATE48M)?"OFDM_48M":\
+(rate==DESC_RATE54M)?"OFDM_54M":\
+(rate==DESC_RATEMCS0)?"MCS0":\
+(rate==DESC_RATEMCS1)?"MCS1":\
+(rate==DESC_RATEMCS2)?"MCS2":\
+(rate==DESC_RATEMCS3)?"MCS3":\
+(rate==DESC_RATEMCS4)?"MCS4":\
+(rate==DESC_RATEMCS5)?"MCS5":\
+(rate==DESC_RATEMCS6)?"MCS6":\
+(rate==DESC_RATEMCS7)?"MCS7":\
+(rate==DESC_RATEMCS8)?"MCS8":\
+(rate==DESC_RATEMCS9)?"MCS9":\
+(rate==DESC_RATEMCS10)?"MCS10":\
+(rate==DESC_RATEMCS11)?"MCS11":\
+(rate==DESC_RATEMCS12)?"MCS12":\
+(rate==DESC_RATEMCS13)?"MCS13":\
+(rate==DESC_RATEMCS14)?"MCS14":\
+(rate==DESC_RATEMCS15)?"MCS15":\
+(rate==DESC_RATEVHTSS1MCS0)?"VHTSS1MCS0":\
+(rate==DESC_RATEVHTSS1MCS1)?"VHTSS1MCS1":\
+(rate==DESC_RATEVHTSS1MCS2)?"VHTSS1MCS2":\
+(rate==DESC_RATEVHTSS1MCS3)?"VHTSS1MCS3":\
+(rate==DESC_RATEVHTSS1MCS4)?"VHTSS1MCS4":\
+(rate==DESC_RATEVHTSS1MCS5)?"VHTSS1MCS5":\
+(rate==DESC_RATEVHTSS1MCS6)?"VHTSS1MCS6":\
+(rate==DESC_RATEVHTSS1MCS7)?"VHTSS1MCS7":\
+(rate==DESC_RATEVHTSS1MCS8)?"VHTSS1MCS8":\
+(rate==DESC_RATEVHTSS1MCS9)?"VHTSS1MCS9":\
+(rate==DESC_RATEVHTSS2MCS0)?"VHTSS2MCS0":\
+(rate==DESC_RATEVHTSS2MCS1)?"VHTSS2MCS1":\
+(rate==DESC_RATEVHTSS2MCS2)?"VHTSS2MCS2":\
+(rate==DESC_RATEVHTSS2MCS3)?"VHTSS2MCS3":\
+(rate==DESC_RATEVHTSS2MCS4)?"VHTSS2MCS4":\
+(rate==DESC_RATEVHTSS2MCS5)?"VHTSS2MCS5":\
+(rate==DESC_RATEVHTSS2MCS6)?"VHTSS2MCS6":\
+(rate==DESC_RATEVHTSS2MCS7)?"VHTSS2MCS7":\
+(rate==DESC_RATEVHTSS2MCS8)?"VHTSS2MCS8":\
+(rate==DESC_RATEVHTSS2MCS9)?"VHTSS2MCS9":"UNKNOW"
+
+
 enum{
        UP_LINK,
        DOWN_LINK,      
@@ -153,6 +204,9 @@ typedef enum _FIRMWARE_SOURCE {
 #define PageNum(_Len, _Size)           (u32)(((_Len)/(_Size)) + ((_Len)&((_Size) - 1) ? 1:0))
 
 
+u8 rtw_hal_data_init(_adapter *padapter);
+void rtw_hal_data_deinit(_adapter *padapter);
+
 void dump_chip_info(HAL_VERSION        ChipVersion);
 
 u8     //return the final channel plan decision
@@ -201,6 +255,7 @@ void hw_var_port_switch(_adapter *adapter);
 
 void SetHwReg(PADAPTER padapter, u8 variable, u8 *val);
 void GetHwReg(PADAPTER padapter, u8 variable, u8 *val);
+void rtw_hal_check_rxfifo_full(_adapter *adapter);
 
 u8 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value);
 u8 GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value);
@@ -263,5 +318,47 @@ isAllSpaceOrTab(
        u8      size
        );
 
+void linked_info_dump(_adapter *padapter,u8 benable);
+#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+void rtw_get_raw_rssi_info(void *sel, _adapter *padapter);
+void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe);
+void rtw_dump_raw_rssi_info(_adapter *padapter);
+#endif
+
+#define                HWSET_MAX_SIZE                  512
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+#define                EFUSE_FILE_COLUMN_NUM           16
+u32 Hal_readPGDataFromConfigFile(PADAPTER padapter, struct file *fp);
+void Hal_ReadMACAddrFromFile(PADAPTER padapter, struct file *fp);
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr);
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter);
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter);
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
+#ifdef CONFIG_RF_GAIN_OFFSET
+void rtw_bb_rf_gain_offset(_adapter *padapter);
+#endif //CONFIG_RF_GAIN_OFFSET
+
+void GetHalODMVar(     
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       PVOID                                   pValue2);
+void SetHalODMVar(
+       PADAPTER                                Adapter,
+       HAL_ODM_VARIABLE                eVariable,
+       PVOID                                   pValue1,
+       BOOLEAN                                 bSet);
+
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+struct noise_info
+{
+       u8              bPauseDIG;
+       u8              IGIValue;
+       u32     max_time;//ms   
+       u8              chan;
+};
+#endif
+
 #endif //__HAL_COMMON_H__
 
index 71df15317bf910edef9ab33c80f7fc268a077230..7983e4b1af3378c0232ff0883e7827185503b356 100755 (executable)
@@ -79,6 +79,7 @@ enum h2c_cmd{
        H2C_D0_SCAN_OFFLOAD_CTRL = 0x85,
        H2C_D0_SCAN_OFFLOAD_INFO = 0x86,
        H2C_CHNL_SWITCH_OFFLOAD = 0x87,
+       H2C_AOAC_RSVDPAGE3 = 0x88,
 
        H2C_RESET_TSF = 0xC0,
        H2C_MAXID,
@@ -89,7 +90,8 @@ enum h2c_cmd{
 #define H2C_KEEP_ALIVE_CTRL_LEN        2
 #define H2C_DISCON_DECISION_LEN                3
 #define H2C_AP_OFFLOAD_LEN             3
-#define H2C_AP_WOW_GPIO_CTRL_LEN               3
+#define H2C_AP_WOW_GPIO_CTRL_LEN       4
+#define H2C_AP_PS_LEN                  2
 #define H2C_PWRMODE_LEN                        7
 #define H2C_PSTUNEPARAM_LEN                    4
 #define H2C_MACID_CFG_LEN              7
@@ -161,78 +163,99 @@ enum h2c_cmd{
 #endif //CONFIG_WOWLAN
 
 //_RSVDPAGE_LOC_CMD_0x00
-#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
 
 //_MEDIA_STATUS_RPT_PARM_CMD_0x01
 #define SET_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                   SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)   SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)   SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
 //_KEEP_ALIVE_CMD_0x03
 #define SET_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
 #define SET_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
 #define SET_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
+#define SET_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
 
 //_DISCONNECT_DECISION_CMD_0x04
 #define SET_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
 #define SET_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
+#ifdef CONFIG_AP_WOWLAN
+//_AP_Offload 0x08
+#define SET_H2CCMD_AP_WOWLAN_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+//_BCN_RsvdPage        0x09
+#define SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+//_Probersp_RsvdPage 0x0a
+#define SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+//_Probersp_RsvdPage 0x13
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_INDEX(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value)
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_C2H_EN(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_PLUS(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_HIGH_ACTIVE(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_EN(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_DURATION(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_AP_WOW_GPIO_CTRL_C2H_DURATION(__pH2CCmd, __Value)SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+//_AP_PS 0x26
+#define SET_H2CCMD_AP_WOW_PS_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_H2CCMD_AP_WOW_PS_32K_EN(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_AP_WOW_PS_RF(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_H2CCMD_AP_WOW_PS_DURATION(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#endif
 
 // _WoWLAN PARAM_CMD_0x80
-#define SET_H2CCMD_WOWLAN_FUNC_ENABLE(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_WOWLAN_FUNC_ENABLE(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
 #define SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_H2CCMD_WOWLAN_ALL_PKT_DROP(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
-#define SET_H2CCMD_WOWLAN_GPIO_ACTIVE(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
-#define SET_H2CCMD_WOWLAN_REKEY_WAKE_UP(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
-#define SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)
-#define SET_H2CCMD_WOWLAN_GPIONUM(__pH2CCmd, __Value)                                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 7, __Value)
-#define SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(__pH2CCmd, __Value)                                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 7, 1, __Value)
-#define SET_H2CCMD_WOWLAN_GPIO_DURATION(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-//#define SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 1, __Value)
-#define SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_H2CCMD_WOWLAN_ALL_PKT_DROP(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_H2CCMD_WOWLAN_GPIO_ACTIVE(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
+#define SET_H2CCMD_WOWLAN_REKEY_WAKE_UP(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
+#define SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)
+#define SET_H2CCMD_WOWLAN_GPIONUM(__pH2CCmd, __Value)                          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 7, __Value)
+#define SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 7, 1, __Value)
+#define SET_H2CCMD_WOWLAN_GPIO_DURATION(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+//#define SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 1, __Value)
+#define SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
 
 // _REMOTE_WAKEUP_CMD_0x81
 #define SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)
 #define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 1, __Value)
 
 // AOAC_GLOBAL_INFO_0x82
-#define SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
 
 // AOAC_RSVDPAGE_LOC_0x83
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE((__pH2CCmd), 0, 8, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__pH2CCmd, __Value)                                       SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__pH2CCmd, __Value)                                       SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__pH2CCmd, __Value)                                      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd), 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
 #ifdef CONFIG_GTK_OL
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(__pH2CCmd, __Value)                                   SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
 #endif //CONFIG_GTK_OL
 #ifdef CONFIG_PNO_SUPPORT
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(__pH2CCmd, __Value)                                      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+6, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd), 0, 8, __Value)
 #endif
 
 #ifdef CONFIG_PNO_SUPPORT
 // D0_Scan_Offload_Info_0x86
 #define SET_H2CCMD_AOAC_NLO_FUN_EN(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE((__pH2CCmd), 3, 1, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
 #endif //CONFIG_PNO_SUPPORT
 
 //---------------------------------------------------------------------------------------------------------//
@@ -268,8 +291,9 @@ typedef struct _RSVDPAGE_LOC {
 } RSVDPAGE_LOC, *PRSVDPAGE_LOC;
 
 #endif
-
-#ifdef CONFIG_WOWLAN
+void dump_TX_FIFO(PADAPTER padapter, u8 page_num, u16 page_size);
+u8 rtw_check_invalid_mac_address (u8 *mac_addr);
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip);
 void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr);
 void rtw_set_sec_pn(_adapter *padapter);
index 6aaf8ec3e437577479404c0273dcb1cf5483192a..19276ea53628d8ea482f1d337e7c7c48cff73824 100755 (executable)
@@ -285,7 +285,9 @@ int PHY_ConfigRFWithParaFile(IN     PADAPTER        Adapter, IN char*       pFileName, IN u8        eRFP
 int PHY_ConfigRFWithTxPwrTrackParaFile(IN PADAPTER     Adapter, IN char*       pFileName);
 
 int PHY_ConfigRFWithPowerLimitTableParaFile(IN PADAPTER        Adapter, IN char*       pFileName);
-#endif
+
+void phy_free_filebuf(_adapter *padapter);
+#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE
 
 
 #endif //__HAL_COMMON_H__
index 3fd0623477c9e3edd9aa2b2885a497a7024a9dae..7c5e631a6ea62f05f305c03c08c5848b73b37385 100755 (executable)
 #define REG_GPIO_OUTSTS                                0x00F4  // For RTL8723 only.
 #define REG_TYPE_ID                                            0x00FC
 
+//
+// 2010/12/29 MH Add for 92D
+//
+#define REG_MAC_PHY_CTRL_NORMAL                0x00f8
+
 
 //-----------------------------------------------------
 //
 #define REG_PKT_BE_BK_LIFE_TIME                0x04C2
 #define REG_STBC_SETTING                               0x04C4
 #define REG_QUEUE_CTRL                                 0x04C6
+#define REG_SINGLE_AMPDU_CTRL                  0x04c7
 #define REG_PROT_MODE_CTRL                     0x04C8
 #define REG_MAX_AGGR_NUM                               0x04CA
 #define REG_RTS_MAX_AGGR_NUM                   0x04CB
@@ -633,6 +639,9 @@ Default: 00b.
 #define RRSR_MCS6                              BIT18
 #define RRSR_MCS7                              BIT19
 
+#define RRSR_CCK_RATES (RRSR_11M|RRSR_5_5M|RRSR_2M|RRSR_1M)
+#define RRSR_OFDM_RATES (RRSR_54M|RRSR_48M|RRSR_36M|RRSR_24M|RRSR_18M|RRSR_12M|RRSR_9M|RRSR_6M)
+
 // WOL bit information
 #define HAL92C_WOL_PTK_UPDATE_EVENT            BIT0
 #define HAL92C_WOL_GTK_UPDATE_EVENT            BIT1
@@ -757,10 +766,6 @@ Default: 00b.
 #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     
 //
@@ -1094,7 +1099,7 @@ Current IOREG MAP
 #define FEN_CPUEN                              BIT(10)
 #define FEN_DCORE                              BIT(11)
 #define FEN_ELDR                               BIT(12)
-//#define FEN_DIO_RF                           BIT(13)
+#define FEN_EN_25_1                            BIT(13)
 #define FEN_HWPDN                              BIT(14)
 #define FEN_MREGEN                             BIT(15)
 
@@ -1509,6 +1514,7 @@ Current IOREG MAP
 #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
+#define SCR_CHK_KEYID                  BIT(8)
 
 //-----------------------------------------------------
 //
@@ -1718,10 +1724,17 @@ Current IOREG MAP
 #define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC   127
 
 #define POLLING_LLT_THRESHOLD                          20
+#if defined(CONFIG_RTL8723B) && defined(CONFIG_PCI_HCI)
+#define POLLING_READY_TIMEOUT_COUNT            6000
+#else
 #define POLLING_READY_TIMEOUT_COUNT            1000
+#endif
+
 
 // GPIO BIT
-#define HAL_8192C_HW_GPIO_WPS_BIT      BIT2
+#define        HAL_8192C_HW_GPIO_WPS_BIT       BIT2
+#define        HAL_8192EU_HW_GPIO_WPS_BIT      BIT7
+#define        HAL_8188E_HW_GPIO_WPS_BIT       BIT7
 
 #endif //__HAL_COMMON_H__
 
index 3c011e4e9ba11685b409de325ad6665ec68d7051..191caf3a27d73b39f7a512dffe97b49b2e4510af 100755 (executable)
 #include <hal_btcoex.h>
 #endif
 
+#ifdef CONFIG_SDIO_HCI
+#include <hal_sdio.h>
+#endif
+
 //
 // <Roger_Notes> For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06.
 //
@@ -132,6 +136,10 @@ typedef enum _USB_RX_AGG_MODE{
 
 #endif
 
+#define PAGE_SIZE_128  128
+#define PAGE_SIZE_256  256
+#define PAGE_SIZE_512  512
+
 struct dm_priv
 {
        u8      DM_Type;
@@ -356,18 +364,18 @@ typedef struct hal_com_data
        u8      TxPwrLevelCck[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];
        u8      TxPwrLevelHT40_1S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];     // For HT 40MHZ pwr
        u8      TxPwrLevelHT40_2S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];     // For HT 40MHZ pwr
-       u8      TxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
+       s8      TxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
        u8      TxPwrLegacyHtDiff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
 
        // Power Limit Table for 2.4G
-       u8      TxPwrLimit_2_4G[MAX_REGULATION_NUM]
+       s8      TxPwrLimit_2_4G[MAX_REGULATION_NUM]
                                                [MAX_2_4G_BANDWITH_NUM]
                                        [MAX_RATE_SECTION_NUM]
                                        [CHANNEL_MAX_NUMBER_2G]
                                                [MAX_RF_PATH_NUM];
 
        // Power Limit Table for 5G
-       u8      TxPwrLimit_5G[MAX_REGULATION_NUM]
+       s8      TxPwrLimit_5G[MAX_REGULATION_NUM]
                                                [MAX_5G_BANDWITH_NUM]
                                                [MAX_RATE_SECTION_NUM]
                                                [CHANNEL_MAX_NUMBER_5G]
@@ -460,6 +468,7 @@ typedef struct hal_com_data
        u8      AntDivCfg;
        u8      AntDetection;
        u8      TRxAntDivType;
+       u8      ant_path; //for 8723B s0/s1 selection
 
        u8      u1ForcedIgiLb;                  // forced IGI lower bound
 
@@ -487,7 +496,7 @@ typedef struct hal_com_data
        u8      p2p_ps_offload;
 #endif
 
-       u8      AMPDUDensity;
+       //u8    AMPDUDensity;
 
        // Auto FSM to Turn On, include clock, isolation, power control for MAC only
        u8      bMacPwrCtrlOn;
@@ -517,12 +526,17 @@ typedef struct hal_com_data
        // HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg
        u8                      SdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE];
        _lock           SdioTxFIFOFreePageLock;
+       u8                      SdioTxOQTMaxFreeSpace;
+       u8                      SdioTxOQTFreeSpace;
+       
 
        //
        // SDIO Rx FIFO related.
        //
        u8                      SdioRxFIFOCnt;
        u16                     SdioRxFIFOSize;
+
+       u32                     sdio_tx_max_len[SDIO_MAX_TX_QUEUE];// H, N, L, used for sdio tx aggregation max length per queue
 #endif //CONFIG_SDIO_HCI
 
 #ifdef CONFIG_USB_HCI
@@ -580,7 +594,8 @@ typedef struct hal_com_data
        
        u8      bInterruptMigration;
        u8      bDisableTxInt;
-       u8      bGpioHwWpsPbc;
+
+       u16     RxTag;  
 #endif //CONFIG_PCI_HCI
 
        struct dm_priv  dmpriv;
@@ -598,9 +613,11 @@ typedef struct hal_com_data
 #endif // CONFIG_BT_COEXIST
 
 #if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
+       #ifndef CONFIG_PCI_HCI  // mutual exclusive with PCI -- so they're SDIO and GSPI 
        // Interrupt relatd register information.
        u32                     SysIntrStatus;
        u32                     SysIntrMask;
+       #endif
 #endif //endif CONFIG_RTL8723A
 
        
@@ -664,6 +681,11 @@ typedef struct hal_com_data
        char *rf_tx_pwr_lmt;
        u32     rf_tx_pwr_lmt_len;
 #endif
+
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+       s16 noise[ODM_MAX_CHANNEL_NUM];
+#endif
+       
 } HAL_DATA_COMMON, *PHAL_DATA_COMMON;
 
 
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_gspi.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_gspi.h
new file mode 100755 (executable)
index 0000000..f5880e2
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *
+ * 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 __HAL_GSPI_H_
+#define __HAL_GSPI_H_
+
+#define ffaddr2deviceId(pdvobj, addr)  (pdvobj->Queue2Pipe[addr])
+
+u8 rtw_hal_gspi_max_txoqt_free_space(_adapter *padapter);
+u8 rtw_hal_gspi_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_gspi_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_set_gspi_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);
+u32 rtw_hal_get_gspi_tx_max_length(PADAPTER padapter, u8 queue_idx);
+
+#endif 
+
index 7fc6c5f7a3372c82d17487724893ce032a0b97ce..37acfcf5809e10f8701c2f8fa3fab9dabedcec0f 100755 (executable)
@@ -65,6 +65,7 @@ typedef enum _HW_VARIABLES{
        HW_VAR_RESP_SIFS,
        HW_VAR_ACK_PREAMBLE,
        HW_VAR_SEC_CFG,
+       HW_VAR_SEC_DK_CFG,
        HW_VAR_BCN_VALID,
        HW_VAR_RF_TYPE,
        HW_VAR_DM_FLAG,
@@ -171,6 +172,7 @@ typedef enum _HAL_DEF_VARIABLE{
        HW_DEF_FA_CNT_DUMP,
        HW_DEF_ODM_DBG_FLAG,
        HW_DEF_ODM_DBG_LEVEL,
+       HAL_DEF_TX_PAGE_SIZE,
        HAL_DEF_TX_PAGE_BOUNDARY,
        HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN,
        HAL_DEF_ANT_DETECT,//to do for 8723a
@@ -178,12 +180,14 @@ typedef enum _HAL_DEF_VARIABLE{
        HAL_DEF_PCI_AMD_L1_SUPPORT,
        HAL_DEF_PCI_ASPM_OSC, // Support for ASPM OSC, added by Roger, 2013.03.27.
        HAL_DEF_MACID_SLEEP, // Support for MACID sleep
+       HAL_DEF_DBG_RX_INFO_DUMP,
 }HAL_DEF_VARIABLE;
 
 typedef enum _HAL_ODM_VARIABLE{
        HAL_ODM_STA_INFO,       
        HAL_ODM_P2P_STATE,
        HAL_ODM_WIFI_DISPLAY_STATE,
+       HAL_ODM_NOISE_MONITOR,
 }HAL_ODM_VARIABLE;
 
 typedef enum _HAL_INTF_PS_FUNC{
@@ -250,7 +254,7 @@ struct hal_ops {
        u8      (*GetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
        u8      (*SetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
 
-       void    (*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
+       void    (*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);
        void    (*SetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
 
        void    (*UpdateRAMaskHandler)(_adapter *padapter, u32 mac_id, u8 rssi_level);
@@ -409,6 +413,11 @@ typedef enum _HARDWARE_TYPE{
 #define        IS_HARDWARE_TYPE_8188E(_Adapter)        \
 (IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter))
 
+
+#define        IS_HARDWARE_TYPE_8188E_before(_Adapter)                 \
+(IS_HARDWARE_TYPE_8192C(_Adapter) ||IS_HARDWARE_TYPE_8192D(_Adapter) ||IS_HARDWARE_TYPE_8723A(_Adapter))
+
+
 #define IS_HARDWARE_TYPE_OLDER_THAN_8812A(_Adapter)    \
 (IS_HARDWARE_TYPE_8192D(_Adapter) || IS_HARDWARE_TYPE_8192C(_Adapter) ||\
  IS_HARDWARE_TYPE_8723AE(_Adapter) || IS_HARDWARE_TYPE_8723AU(_Adapter) || IS_HARDWARE_TYPE_8723AS(_Adapter) ||\
@@ -527,7 +536,7 @@ u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pVa
 u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
 
 void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
-void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
+void   rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);
        
 void rtw_hal_enable_interrupt(_adapter *padapter);
 void rtw_hal_disable_interrupt(_adapter *padapter);
index 958a75f41bf99d3b8b8c9bb9f1822188eb7a56f2..2019214416f76f0c492c9ae5321a6d5634e61e9f 100755 (executable)
 #define EEPROM_VID_88EU                                                0xD0\r
 #define EEPROM_PID_88EU                                                0xD2\r
 #define EEPROM_USB_OPTIONAL_FUNCTION0          0xD4 //92EU is the same\r
+#define EEPROM_USB_OPTIONAL_FUNCTION0_8811AU 0x104\r
 \r
 // RTL88ES\r
 #define EEPROM_MAC_ADDR_88ES                                   0x11A\r
 \r
 //RTL8723BS\r
 #define        EEPROM_MAC_ADDR_8723BS                          0x11A\r
+#define EEPROM_Voltage_ADDR_8723B                      0x8\r
 \r
 \r
 //====================================================\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_sdio.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/hal_sdio.h
new file mode 100755 (executable)
index 0000000..ccb49e7
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *
+ * 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 __HAL_SDIO_H_
+#define __HAL_SDIO_H_
+
+#define ffaddr2deviceId(pdvobj, addr)  (pdvobj->Queue2Pipe[addr])
+
+u8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter);
+u8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);
+u32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx);
+
+#endif //__RTW_LED_H_
+
index 9c6958fae0ba315d5e4c611633ad8936c5e55d8e..fc293c45759882a1bb87705aee10aa841e0e3c95 100755 (executable)
@@ -1444,15 +1444,14 @@ enum rtw_ieee80211_back_actioncode {
 
 /* HT features action code */
 enum rtw_ieee80211_ht_actioncode {
-       RTW_WLAN_ACTION_NOTIFY_CH_WIDTH = 0,
-       RTW_WLAN_ACTION_SM_PS = 1,
-       RTW_WLAN_ACTION_PSPM = 2,
-       RTW_WLAN_ACTION_PCO_PHASE = 3,
-       RTW_WLAN_ACTION_MIMO_CSI_MX = 4,
-       RTW_WLAN_ACTION_MIMO_NONCP_BF = 5,
-       RTW_WLAN_ACTION_MIMP_CP_BF = 6,
-       RTW_WLAN_ACTION_ASEL_INDICATES_FB = 7,
-       RTW_WLAN_ACTION_HI_INFO_EXCHG = 8,
+       RTW_WLAN_ACTION_HT_NOTI_CHNL_WIDTH = 0,
+       RTW_WLAN_ACTION_HT_SM_PS = 1,
+       RTW_WLAN_ACTION_HT_PSMP = 2,
+       RTW_WLAN_ACTION_HT_SET_PCO_PHASE = 3,
+       RTW_WLAN_ACTION_HT_CSI = 4,
+       RTW_WLAN_ACTION_HT_NON_COMPRESS_BEAMFORMING = 5,
+       RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING = 6,
+       RTW_WLAN_ACTION_HT_ASEL_FEEDBACK = 7,
 };
 
 /* BACK (block-ack) parties */
@@ -1462,6 +1461,13 @@ enum rtw_ieee80211_back_parties {
        RTW_WLAN_BACK_TIMER = 2,
 };
 
+/* VHT features action code */
+enum rtw_ieee80211_vht_actioncode{
+       RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING = 0,
+       RTW_WLAN_ACTION_VHT_GROUPID_MANAGEMENT = 1,
+       RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION = 2,
+};
+
 
 #define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs)
                                * 00:50:F2 */
@@ -1651,6 +1657,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);
@@ -1672,6 +1679,7 @@ 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);
@@ -1681,6 +1689,7 @@ void rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id);
 #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
 
@@ -1702,7 +1711,7 @@ void rtw_get_bcn_info(struct wlan_network *pnetwork);
 
 void rtw_macaddr_cfg(u8 *mac_addr);
 
-u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI_20, u8 short_GI_40, unsigned char * MCS_rate);
+u16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate);
 
 int rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *action);
 const char *action_public_str(u8 action);
index c6c6024ae2d68b1c711d046aafbefdf41d14cf89..6fe9f86f1bda9871022601e409a247f75bbf05fc 100755 (executable)
@@ -49,7 +49,7 @@ struct rtw_wdev_invit_info {
        } while (0)\r
 \r
 struct rtw_wdev_nego_info {\r
-       u8 state; /* 0: req, 1:rep, 3:conf */\r
+       u8 state; /* 0: req, 1:rep, 2:conf */\r
        u8 peer_mac[ETH_ALEN];\r
        u8 active;\r
        u8 token;\r
@@ -117,6 +117,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev);
 \r
 void rtw_cfg80211_init_wiphy(_adapter *padapter);\r
 \r
+void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork);\r
 void rtw_cfg80211_surveydone_event_callback(_adapter *padapter);\r
 struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork);\r
 int rtw_cfg80211_check_bss(_adapter *padapter);\r
index 7a61a132d5b2b10ef31b4d427904134ea5762dce..d67d06c54cf88efbe461814d9e24fd3460b3a10b 100755 (executable)
@@ -129,11 +129,6 @@ extern int rtw_ioctl(struct ifnet * ifp, u_long cmd, caddr_t data);
 
 void rtw_ips_dev_unload(_adapter *padapter);
 
-#ifdef CONFIG_RF_GAIN_OFFSET
-void rtw_bb_rf_gain_offset(_adapter *padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
-
 #ifdef CONFIG_IPS
 int rtw_ips_pwr_up(_adapter *padapter);
 void rtw_ips_pwr_down(_adapter *padapter);
@@ -155,11 +150,12 @@ void rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj);
 int rtw_drv_register_netdev(_adapter *padapter);
 void rtw_ndev_destructor(_nic_hdl ndev);
 
-#ifdef CONFIG_SUSPEND_REFINE
-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
 
+int rtw_suspend_common(_adapter *padapter);
+int rtw_resume_common(_adapter *padapter);
 
 #endif //_OSDEP_INTF_H_
 
index 98f3564a75edbaff935d6d28f5aeba74b89025ee..76026b9723efe401901e04f56ae397e950796def 100755 (executable)
@@ -99,7 +99,7 @@
 extern int RTW_STATUS_CODE(int error_code);
 
 #ifndef RTK_DMP_PLATFORM
-//#define CONFIG_USE_VMALLOC
+#define CONFIG_USE_VMALLOC
 #endif
 
 /* flags used for rtw_mstat_update() */
index 21075dd57ed124f6feba19fd4a5cfc4f2fdf3d01..a37040b741a592d924a8b45b7dd65fd1c71c91c6 100755 (executable)
@@ -36,6 +36,14 @@ void rtl8188ee_set_hal_ops(_adapter * padapter);
 void rtl8812ae_set_hal_ops(_adapter * padapter);
 #endif
 
+#if defined(CONFIG_RTL8192E)
+void rtl8192ee_set_hal_ops(_adapter * padapter);
+#endif
+
+#ifdef CONFIG_RTL8723B
+void rtl8723be_set_hal_ops(_adapter * padapter);
+#endif
+
 void rtw_set_hal_ops(_adapter *padapter);
 
 #endif //__PCIE_HAL_H__
index ea46fab3d8da117f7de5c6e5b812be43ab734a75..cc2f45dab3b1dbe39cc8e82d05ec93b13f70e614 100755 (executable)
@@ -68,5 +68,25 @@ void rtl8812ae_prepare_bcn_tasklet(void *priv);
 void   rtl8812ae_set_intf_ops(struct _io_ops   *pops);
 #endif
 
+#ifdef CONFIG_RTL8192E
+u32    rtl8192ee_init_desc_ring(_adapter * padapter);
+u32    rtl8192ee_free_desc_ring(_adapter * padapter);
+void   rtl8192ee_reset_desc_ring(_adapter * padapter);
+void   rtl8192ee_recv_tasklet(void *priv);
+void   rtl8192ee_prepare_bcn_tasklet(void *priv);
+int    rtl8192ee_interrupt(PADAPTER Adapter);
+void   rtl8192ee_set_intf_ops(struct _io_ops   *pops);
+#endif
+
+#ifdef CONFIG_RTL8723B
+u32    rtl8723be_init_desc_ring(_adapter * padapter);
+u32    rtl8723be_free_desc_ring(_adapter * padapter);
+void   rtl8723be_reset_desc_ring(_adapter * padapter);
+int    rtl8723be_interrupt(PADAPTER Adapter);
+void   rtl8723be_recv_tasklet(void *priv);
+void   rtl8723be_prepare_bcn_tasklet(void *priv);
+void   rtl8723be_set_intf_ops(struct _io_ops   *pops);
+#endif
+
 #endif
 
index dcde3fa0a8689b52f1aa41461aa46e38cc1f8aaa..cc417a26354ec843d1e946778cb19b99418f431d 100755 (executable)
@@ -233,12 +233,13 @@ void SetFwRelatedForWoWLAN8188ES(_adapter* padapter, u8 bHostIsGoingtoSleep);
 //---------------------------------------------------------------------------------------------------------//
 //----------------------------------    H2C CMD CONTENT    --------------------------------------------------//
 //---------------------------------------------------------------------------------------------------------//
+//
+/* move to hal_com_h2c.h
 //_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)
-/* move to hal_com_h2c.h
 // 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)
index a7fed3fbe43574663cd8c0677d8708d1eb4688b1..df06a09af5ea9b733c792f08fe4d15fc40dc0763 100755 (executable)
 #endif\r
 \r
 \r
-       #define RTL8188E_FW_IMG                                 "rtl8188E/FW_NIC.bin"\r
-       #define RTL8188E_FW_WW_IMG                              "rtl8188E/FW_WoWLAN.bin"\r
-       #define RTL8188E_PHY_REG                                        "rtl8188E/PHY_REG.txt" \r
-       #define RTL8188E_PHY_RADIO_A                            "rtl8188E/RadioA.txt"\r
-       #define RTL8188E_PHY_RADIO_B                            "rtl8188E/RadioB.txt"\r
-       #define RTL8188E_TXPWR_TRACK                            "rtl8188E/TxPowerTrack.txt"                     \r
-       #define RTL8188E_AGC_TAB                                        "rtl8188E/AGC_TAB.txt"\r
-       #define RTL8188E_PHY_MACREG                             "rtl8188E/MAC_REG.txt"\r
-       #define RTL8188E_PHY_REG_PG                             "rtl8188E/PHY_REG_PG.txt"\r
-       #define RTL8188E_PHY_REG_MP                             "rtl8188E/PHY_REG_MP.txt" \r
-       #define RTL8188E_TXPWR_LMT                              "rtl8188E/TXPWR_LMT.txt" \r
+       #define RTL8188E_FW_IMG                                 "rtl8188e/FW_NIC.bin"\r
+       #define RTL8188E_FW_WW_IMG                              "rtl8188e/FW_WoWLAN.bin"\r
+       #define RTL8188E_PHY_REG                                        "rtl8188e/PHY_REG.txt" \r
+       #define RTL8188E_PHY_RADIO_A                            "rtl8188e/RadioA.txt"\r
+       #define RTL8188E_PHY_RADIO_B                            "rtl8188e/RadioB.txt"\r
+       #define RTL8188E_TXPWR_TRACK                            "rtl8188e/TxPowerTrack.txt"                     \r
+       #define RTL8188E_AGC_TAB                                        "rtl8188e/AGC_TAB.txt"\r
+       #define RTL8188E_PHY_MACREG                             "rtl8188e/MAC_REG.txt"\r
+       #define RTL8188E_PHY_REG_PG                             "rtl8188e/PHY_REG_PG.txt"\r
+       #define RTL8188E_PHY_REG_MP                             "rtl8188e/PHY_REG_MP.txt" \r
+       #define RTL8188E_TXPWR_LMT                              "rtl8188e/TXPWR_LMT.txt" \r
 \r
        //---------------------------------------------------------------------\r
        //              RTL8188E Power Configuration CMDs for USB/SDIO/PCIE interfaces\r
@@ -152,19 +152,31 @@ typedef struct _RT_8188E_FIRMWARE_HDR
 // must reserved about 7 pages for LPS =>  176-7 = 169 (0xA9)\r
 // 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS null-data \r
 \r
-#define TX_TOTAL_PAGE_NUMBER_88E               0xA9//  169 (21632=> 21k)\r
+#define BCNQ_PAGE_NUM_88E              0x08\r
 \r
-#ifdef RTL8188ES_MAC_LOOPBACK\r
-#define TX_PAGE_BOUNDARY_88E 0x48 //72\r
-#else //TX_PAGE_BOUNDARY_LOOPBACK_MODE\r
-#define TX_PAGE_BOUNDARY_88E (TX_TOTAL_PAGE_NUMBER_88E + 1)\r
+//For WoWLan , more reserved page\r
+#ifdef CONFIG_WOWLAN\r
+#define WOWLAN_PAGE_NUM_88E    0x00\r
+#else\r
+#define WOWLAN_PAGE_NUM_88E    0x00\r
 #endif\r
 \r
+#define TX_TOTAL_PAGE_NUMBER_88E       (0xB0 - BCNQ_PAGE_NUM_88E - WOWLAN_PAGE_NUM_88E)\r
+#define TX_PAGE_BOUNDARY_88E           (TX_TOTAL_PAGE_NUMBER_88E + 1)\r
+\r
+#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E    TX_TOTAL_PAGE_NUMBER_88E\r
+#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E                (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E + 1)\r
 \r
-//Note: For Normal Chip Setting ,modify later\r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER        TX_TOTAL_PAGE_NUMBER_88E  //0xA9 , 0xb0=>176=>22k\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E        (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1) //0xA9\r
+// For Normal Chip Setting\r
+// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B\r
+#define NORMAL_PAGE_NUM_HPQ_88E                0x00\r
+#define NORMAL_PAGE_NUM_LPQ_88E                0x09\r
+#define NORMAL_PAGE_NUM_NPQ_88E                0x00\r
 \r
+// Note: For Normal Chip Setting, modify later\r
+#define WMM_NORMAL_PAGE_NUM_HPQ_88E            0x29\r
+#define WMM_NORMAL_PAGE_NUM_LPQ_88E            0x1C\r
+#define WMM_NORMAL_PAGE_NUM_NPQ_88E            0x1C\r
 \r
 \r
 //-------------------------------------------------------------------------\r
@@ -196,8 +208,6 @@ typedef struct _RT_8188E_FIRMWARE_HDR
 //\r
 #define EFUSE_OOB_PROTECT_BYTES                15      // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.\r
 \r
-#define                HWSET_MAX_SIZE_88E              512\r
-\r
 #define                EFUSE_REAL_CONTENT_LEN_88E      256\r
 #define                EFUSE_MAP_LEN_88E               512\r
 #define                EFUSE_MAX_SECTION_88E           64\r
@@ -267,6 +277,10 @@ void Hal_DetectWoWMode(PADAPTER pAdapter);
 //void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail);\r
 void Hal_InitChannelPlan(PADAPTER padapter);\r
 \r
+#ifdef CONFIG_RF_GAIN_OFFSET\r
+void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\r
+#endif //CONFIG_RF_GAIN_OFFSET\r
+\r
 void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc);\r
 \r
 // register\r
@@ -283,6 +297,13 @@ void _InitTransferPageSize(PADAPTER padapter);
 \r
 void SetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);\r
 void GetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);\r
-\r
+void ResumeTxBeacon(PADAPTER padapter);\r
+void StopTxBeacon(PADAPTER padapter);\r
+u8\r
+GetHalDefVar8188E(\r
+       IN      PADAPTER                                Adapter,\r
+       IN      HAL_DEF_VARIABLE                eVariable,\r
+       IN      PVOID                                   pValue\r
+       );\r
 #endif //__RTL8188E_HAL_H__\r
 \r
index 264c3780630a3e15021a4000f84dca2f41c1abdc..535862c6ece27a92121a7d6dfe004c8792f70271 100755 (executable)
@@ -84,8 +84,8 @@
 //\r
 //-----------------------------------------------------\r
 #ifdef CONFIG_WOWLAN\r
-#define REG_TXPKTBUF_IV_LOW             0x0484\r
-#define REG_TXPKTBUF_IV_HIGH            0x0488\r
+#define REG_TXPKTBUF_IV_LOW             0x01a4\r
+#define REG_TXPKTBUF_IV_HIGH            0x01a8\r
 #endif\r
 \r
 //-----------------------------------------------------\r
 //     0x0600h ~ 0x07FFh       WMAC Configuration\r
 //\r
 //-----------------------------------------------------\r
+#ifdef CONFIG_RF_GAIN_OFFSET\r
+#define EEPROM_RF_GAIN_OFFSET                  0xC1\r
+#define EEPROM_RF_GAIN_VAL                             0xF6\r
+#define EEPROM_THERMAL_OFFSET                  0xF5\r
+#endif //CONFIG_RF_GAIN_OFFSET\r
 //----------------------------------------------------------------------------\r
 //       88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits)  \r
 //----------------------------------------------------------------------------\r
index 3a711c161f68e2dbf32a26381895f1e4308c0f79..ef88d94aaecf41fa62257690eda3fcec02651c1d 100755 (executable)
@@ -249,7 +249,10 @@ struct txrpt_ccx_88e {
 #define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8))\r
 #define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8))\r
 \r
-void rtl8188e_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8  IsBTQosNull);\r
+#define SET_TX_DESC_SEC_TYPE_8188E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\r
+\r
+void rtl8188e_fill_fake_txdesc(PADAPTER        padapter,u8*pDesc,u32 BufferLen,\r
+               u8 IsPsPoll,u8  IsBTQosNull, u8 bDataFrame);\r
 #ifdef CONFIG_SDIO_HCI\r
 s32 rtl8188es_init_xmit_priv(PADAPTER padapter);\r
 void rtl8188es_free_xmit_priv(PADAPTER padapter);\r
@@ -278,10 +281,10 @@ s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
 #ifdef CONFIG_PCI_HCI\r
 s32 rtl8188ee_init_xmit_priv(PADAPTER padapter);\r
 void rtl8188ee_free_xmit_priv(PADAPTER padapter);\r
-struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);\r
 void   rtl8188ee_xmitframe_resume(_adapter *padapter);\r
 s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
 s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\r
+s32    rtl8188ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\r
 void rtl8188ee_xmit_tasklet(void *priv);\r
 #endif\r
 \r
index 795e39696666d191a0162549f4507474d88dabbb..5387d9711377db3c358f1fd87641a4294614ba69 100755 (executable)
@@ -402,7 +402,7 @@ void rtl8192c_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoad
 
 HAL_VERSION rtl8192c_ReadChipVersion(IN PADAPTER Adapter);
 void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
-//void rtl8192c_free_hal_data(_adapter * padapter);
+
 VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo);
 void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc);
 
index 85716b4105e47f6bc1c4088f929a02b08b9566b1..71d9974cd04884f734025e9cdaeeee28db190489 100755 (executable)
@@ -26,6 +26,7 @@
 
 #if defined(CONFIG_USB_HCI)
 
+#ifndef MAX_RECVBUF_SZ
 #ifdef PLATFORM_OS_CE
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
 #else
@@ -43,6 +44,7 @@
                #define MAX_RECVBUF_SZ (4000) // about 4K
        #endif
 #endif
+#endif //!MAX_RECVBUF_SZ
 
 #elif defined(CONFIG_PCI_HCI)
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE
index 3896b7daa751ce09bde05ed7267a19af8f698107..151f2d548bc6f82b0ab77efa3c639592f3728452 100755 (executable)
 // User Define Message [31:8]
 
 //_SETPWRMODE_PARM
-#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                   SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
 
 //JOINBSSRPT_PARM
-#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
 
 //_RSVDPAGE_LOC
-#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                             SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
 
 
-#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
 #define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
 #define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
 
 // Fisrt constructed by tynli. 2009.10.09.
 typedef enum _RTL8192D_H2C_CMD 
 {
-       H2C_AP_OFFLOAD = 0,             /*0*/
+       H2C_92D_AP_OFFLOAD = 0,         /*0*/
        H2C_SETPWRMODE = 1,             /*1*/
        H2C_JOINBSSRPT = 2,             /*2*/
        H2C_RSVDPAGE = 3,
        H2C_RSSI_REPORT = 5,
        H2C_RA_MASK = 6,
-       H2C_P2P_PS_OFFLOAD = 8,
+       H2C_92D_P2P_PS_OFFLOAD = 8,
        H2C_MAC_MODE_SEL = 9,
        H2C_PWRM=15,
        H2C_P2P_PS_CTW_CMD = 24,
index eff00fe7d6cc56d0c6e66823802c9b87eab7d12b..8ebdfdf3f0eaaf73b44f5e891340cb5e5fdf1292 100755 (executable)
@@ -27,6 +27,7 @@
 
 #if defined(CONFIG_USB_HCI)
 
+#ifndef MAX_RECVBUF_SZ
 #ifdef PLATFORM_OS_CE
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
 #else
@@ -43,6 +44,7 @@
                #define MAX_RECVBUF_SZ (4000) // about 4K
        #endif
 #endif
+#endif //!MAX_RECVBUF_SZ
 
 #elif defined(CONFIG_PCI_HCI)
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE
index 09c76e049d40fa8827e152dc204e052ab42d4018..f1184a6831b94af5b3ac795a57caf944078159cc 100755 (executable)
@@ -41,7 +41,7 @@
 #define REG_HMEBOX_EXT_1                       0x008A
 #define REG_HMEBOX_EXT_2                       0x008C
 #define REG_HMEBOX_EXT_3                       0x008E
-#define REG_MAC_PHY_CTRL_NORMAL        0x00F8
+//#define REG_MAC_PHY_CTRL_NORMAL      0x00F8
 #define REG_MAC0                                       0x0081
 #define REG_MAC1                                       0x0053
 #define FW_MAC0_ready                          0x18
index 078d3a2e5023a0b05af7be926d0ae400c7e97141..f7657951143cc468814696aa47a885b8fc1c4b34 100755 (executable)
 
 typedef enum _RTL8192E_H2C_CMD 
 {
-       H2C_8192E_RSVDPAGE = 0,
-       H2C_8192E_MSRRPT = 1,
-       H2C_8192E_SCAN = 2,
-       H2C_8192E_KEEP_ALIVE_CTRL = 3,
-       H2C_8192E_DISCONNECT_DECISION = 4,
-
-       H2C_8192E_INIT_OFFLOAD = 6,             
-       H2C_8192E_AP_OFFLOAD = 8,
-       H2C_8192E_BCN_RSVDPAGE = 9,
-       H2C_8192E_PROBERSP_RSVDPAGE = 10,
+       H2C_8192E_RSVDPAGE      = 0x00,
+       H2C_8192E_MSRRPT        = 0x01,
+       H2C_8192E_SCAN          = 0x02,
+       H2C_8192E_KEEP_ALIVE_CTRL = 0x03,
+       H2C_8192E_DISCONNECT_DECISION = 0x04,
+       H2C_8192E_INIT_OFFLOAD = 0x06,
+       H2C_8192E_AP_OFFLOAD = 0x08,
+       H2C_8192E_BCN_RSVDPAGE = 0x09,
+       H2C_8192E_PROBERSP_RSVDPAGE = 0x0a,
+
+       H2C_8192E_AP_WOW_GPIO_CTRL = 0x13,
        
        H2C_8192E_SETPWRMODE = 0x20,            
        H2C_8192E_PS_TUNING_PARA = 0x21,
        H2C_8192E_PS_TUNING_PARA2 = 0x22,
        H2C_8192E_PS_LPS_PARA = 0x23,
        H2C_8192E_P2P_PS_OFFLOAD = 0x24,
+       H2C_8192E_SAP_PS = 0x26,
        H2C_8192E_RA_MASK = 0x40,
        H2C_8192E_RSSI_REPORT = 0x42,
 
@@ -112,22 +114,22 @@ typedef struct _RSVDPAGE_LOC_92E {
 
 
 //_SETPWRMODE_PARM
-#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
-#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                  LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
+#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                          LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
 
 //_P2P_PS_OFFLOAD
 #define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
 #define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
 
 
 // host message to firmware cmd
@@ -175,10 +177,14 @@ typedef struct _SETWOWLAN_PARM{
 
 #define FW_REMOTE_WAKE_CTRL_EN                 BIT(0)
 #define FW_REALWOWLAN_EN                               BIT(5)
-void rtl8192e_set_wowlan_cmd(_adapter* padapter, u8 enable);
-void SetFwRelatedForWoWLAN8192E(_adapter* padapter, u8 bHostIsGoingtoSleep);
 #endif//CONFIG_WOWLAN
 
+#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
+void rtl8192e_set_wowlan_cmd(_adapter* padapter, u8 enable);
+void rtl8192e_set_ap_wowlan_cmd(_adapter* padapter, u8 enable);
+void rtl8192e_set_ap_ps_wowlan_cmd(_adapter* padapter, u8 enable);
+void SetFwRelatedForWoWLAN8192E(_adapter* padapter, u8 bHostIsGoingtoSleep);
+#endif
 /// TX Feedback Content
 #define        USEC_UNIT_FOR_8192E_C2H_TX_RPT_QUEUE_TIME                       256
 
index ca9978b17e733929eb70d75c74ce08189e6b30de..2d72c687211d392c3bc82010a8cbaf01588dfb9a 100755 (executable)
 //---------------------------------------------------------------------\r
 //             RTL8192E From header\r
 //---------------------------------------------------------------------\r
-       #define RTL8192E_FW_IMG                                 "rtl8192E/FW_NIC.bin"\r
-       #define RTL8192E_FW_WW_IMG                              "rtl8192E/FW_WoWLAN.bin"\r
-       #define RTL8192E_PHY_REG                                        "rtl8192E/PHY_REG.txt" \r
-       #define RTL8192E_PHY_RADIO_A                            "rtl8192E/RadioA.txt"\r
-       #define RTL8192E_PHY_RADIO_B                            "rtl8192E/RadioB.txt"\r
-       #define RTL8192E_TXPWR_TRACK                            "rtl8192E/TxPowerTrack.txt"\r
-       #define RTL8192E_AGC_TAB                                        "rtl8192E/AGC_TAB.txt"\r
-       #define RTL8192E_PHY_MACREG                             "rtl8192E/MAC_REG.txt"\r
-       #define RTL8192E_PHY_REG_PG                             "rtl8192E/PHY_REG_PG.txt"\r
-       #define RTL8192E_PHY_REG_MP                             "rtl8192E/PHY_REG_MP.txt" \r
-       #define RTL8192E_TXPWR_LMT                                      "rtl8192E/TXPWR_LMT.txt" \r
+       #define RTL8192E_FW_IMG                                 "rtl8192e/FW_NIC.bin"\r
+       #define RTL8192E_FW_WW_IMG                              "rtl8192e/FW_WoWLAN.bin"\r
+       #define RTL8192E_PHY_REG                                        "rtl8192e/PHY_REG.txt" \r
+       #define RTL8192E_PHY_RADIO_A                            "rtl8192e/RadioA.txt"\r
+       #define RTL8192E_PHY_RADIO_B                            "rtl8192e/RadioB.txt"\r
+       #define RTL8192E_TXPWR_TRACK                            "rtl8192e/TxPowerTrack.txt"\r
+       #define RTL8192E_AGC_TAB                                        "rtl8192e/AGC_TAB.txt"\r
+       #define RTL8192E_PHY_MACREG                             "rtl8192e/MAC_REG.txt"\r
+       #define RTL8192E_PHY_REG_PG                             "rtl8192e/PHY_REG_PG.txt"\r
+       #define RTL8192E_PHY_REG_MP                             "rtl8192e/PHY_REG_MP.txt" \r
+       #define RTL8192E_TXPWR_LMT                              "rtl8192e/TXPWR_LMT.txt" \r
 \r
 //---------------------------------------------------------------------\r
 //             RTL8192E Power Configuration CMDs for PCIe interface\r
@@ -137,39 +137,34 @@ typedef struct _RT_FIRMWARE_8192E {
 \r
 #define TX_TOTAL_PAGE_NUMBER_8192E             243 //0x00~0xF3 totoal pages: F4\r
 \r
-#define TX_PAGE_BOUNDARY_8192E                 (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4,Rserved 12 pages for BCN/PS-POLL..\r
+#define TX_PAGE_BOUNDARY_8192E                 (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4 ~0xFF ,Rserved 12 pages for BCN/PS-POLL..\r
 #define TX_PAGE_LOAD_FW_BOUNDARY_8192E         0x47 //0xA5\r
 #define TX_PAGE_BOUNDARY_WOWLAN_8192E          0xE0\r
 \r
 // For Normal Chip Setting\r
 // (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C\r
-#define NORMAL_PAGE_NUM_PUBQ_8192E                     0xE0\r
-#define NORMAL_PAGE_NUM_LPQ_8192E                      0x00\r
-#define NORMAL_PAGE_NUM_HPQ_8192E                      0x08\r
-#define NORMAL_PAGE_NUM_NPQ_8192E                      0x0C\r
-#define NORMAL_PAGE_NUM_EPQ_8192E                      0x00\r
 \r
+#define NORMAL_PAGE_NUM_HPQ_8192E                      0x10\r
+#define NORMAL_PAGE_NUM_LPQ_8192E                      0x10\r
+#define NORMAL_PAGE_NUM_NPQ_8192E                      0x10\r
+#define NORMAL_PAGE_NUM_EPQ_8192E                      0x00\r
 \r
 \r
 //Note: For WMM Normal Chip Setting ,modify later\r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E  TX_PAGE_BOUNDARY_8192E\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_8192E              (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E + 1)\r
-\r
-#define WMM_NORMAL_PAGE_NUM_PUBQ_8192E NORMAL_PAGE_NUM_PUBQ_8192E\r
 #define WMM_NORMAL_PAGE_NUM_HPQ_8192E          NORMAL_PAGE_NUM_HPQ_8192E\r
 #define WMM_NORMAL_PAGE_NUM_LPQ_8192E          NORMAL_PAGE_NUM_LPQ_8192E\r
 #define WMM_NORMAL_PAGE_NUM_NPQ_8192E          NORMAL_PAGE_NUM_NPQ_8192E\r
 \r
-#define USB_JAGUAR_DUMMY_OFFSET_8192EU         2\r
-#define USB_JAGUAR_DUMMY_UNIT_8192EU                   8\r
-#define USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU                     (USB_JAGUAR_DUMMY_OFFSET_8192EU * USB_JAGUAR_DUMMY_UNIT_8192EU)\r
-#define USB_HWDESC_HEADER_LEN_8192EU           (TX_DESC_SIZE_8192E + USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU)\r
-\r
 \r
 //-------------------------------------------------------------------------\r
 //     Chip specific\r
 //-------------------------------------------------------------------------\r
 \r
+// pic buffer descriptor\r
+#define RTL8192EE_SEG_NUM                      TX_BUFFER_SEG_NUM\r
+#define TX_DESC_NUM_92E                        128\r
+#define RX_DESC_NUM_92E                        128\r
+\r
 //-------------------------------------------------------------------------\r
 //     Channel Plan\r
 //-------------------------------------------------------------------------\r
@@ -291,5 +286,11 @@ void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);
 \r
 void rtl8192e_start_thread(_adapter *padapter);\r
 void rtl8192e_stop_thread(_adapter *padapter);\r
+\r
+#ifdef CONFIG_PCI_HCI\r
+BOOLEAN        InterruptRecognized8192EE(PADAPTER Adapter);\r
+u16    get_txdesc_buf_addr(u16 ff_hwaddr);\r
+#endif\r
+\r
 #endif //__RTL8192E_HAL_H__\r
 \r
index a8404849669cb92ed2aadc81190699678063e1ea..4dc97693e2154cef7d5bcbef3ce55ca738a4a40e 100755 (executable)
 \r
 #if defined(CONFIG_USB_HCI)\r
 \r
+#ifndef MAX_RECVBUF_SZ\r
 #ifdef PLATFORM_OS_CE\r
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\r
 #else\r
        #ifdef CONFIG_MINIMAL_MEMORY_USAGE\r
                #define MAX_RECVBUF_SZ (4000) // about 4K\r
        #else\r
+               #ifdef CONFIG_PLATFORM_MSTAR\r
+                       #define MAX_RECVBUF_SZ (8192) // 8K\r
+               #else\r
                #define MAX_RECVBUF_SZ (32768) // 32k\r
+               #endif\r
                //#define MAX_RECVBUF_SZ (20480) //20K\r
                //#define MAX_RECVBUF_SZ (10240) //10K \r
                //#define MAX_RECVBUF_SZ (16384) //  16k - 92E RX BUF :16K\r
                //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k           \r
        #endif\r
 #endif\r
+#endif //!MAX_RECVBUF_SZ\r
 \r
 #elif defined(CONFIG_PCI_HCI)\r
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE\r
 #define Rx_Smooth_Factor (20)\r
 \r
 //=============\r
+// [1] Rx Buffer Descriptor (for PCIE) buffer descriptor architecture\r
+//DWORD 0\r
+#define SET_RX_BUFFER_DESC_DATA_LENGTH_92E(__pRxStatusDesc, __Value)           SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\r
+#define SET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc,__Value)     SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 15, 1, __Value)\r
+#define SET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc, __Value)            SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 1, __Value)\r
+#define SET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc, __Value)          SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 15, __Value)\r
+\r
+#define GET_RX_BUFFER_DESC_OWN_92E(__pRxStatusDesc)            LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\r
+#define GET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc)             LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\r
+#define GET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc)             LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 1)\r
+#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc)           LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 15)\r
+\r
 \r
+//DWORD 1\r
+#define SET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc, __Value)               SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+4, 0, 32, __Value)\r
+#define GET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc)                LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 0, 32)\r
+\r
+//DWORD 2\r
+#define SET_RX_BUFFER_PHYSICAL_HIGH_92E(__pRxStatusDesc, __Value)              SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+8, 0, 32, __Value)\r
+\r
+//=============\r
+// [2] Rx Descriptor\r
 //DWORD 0\r
 #define GET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc)                        LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\r
 #define GET_RX_STATUS_DESC_CRC32_92E(__pRxStatusDesc)                  LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\r
 #define GET_RX_STATUS_DESC_PHY_STATUS_92E(__pRxStatusDesc)             LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\r
 #define GET_RX_STATUS_DESC_SWDEC_92E(__pRxStatusDesc)                  LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\r
 #define GET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc)                            LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\r
+#define GET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc)                            LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\r
+\r
+\r
+#define SET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc, __Value)               SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\r
+#define SET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc, __Value)           SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\r
+#define SET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc, __Value)           SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\r
 \r
 //DWORD 1\r
 #define GET_RX_STATUS_DESC_MACID_92E(__pRxDesc)                                        LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\r
 #define GET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc)            LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\r
 #define GET_RX_STATUS_DESC_BUFF_ADDR64_92E(__pRxDesc)          LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\r
 \r
-#define SET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc, __Value)   SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)\r
-\r
 \r
 #ifdef CONFIG_SDIO_HCI\r
 s32 rtl8812s_init_recv_priv(PADAPTER padapter);\r
index d7215e4f33a92457cd41b944b905a812d14254e9..7e5a17e8eab30094a3bd88b35d3cfebfa2d7b0c4 100755 (executable)
@@ -35,6 +35,8 @@
 //     0x0000h ~ 0x00FFh       System Configuration\r
 //\r
 //-----------------------------------------------------\r
+#define REG_SYS_SWR_CTRL1_8192E                0x0010  // 1 Byte        \r
+#define REG_SYS_SWR_CTRL2_8192E                0x0014  // 1 Byte      \r
 #define REG_AFE_CTRL1_8192E                    0x0024\r
 #define REG_AFE_CTRL2_8192E                    0x0028\r
 #define REG_AFE_CTRL3_8192E                    0x002c\r
@@ -79,9 +81,8 @@
 //     0x0200h ~ 0x027Fh       TXDMA Configuration\r
 //\r
 //-----------------------------------------------------\r
-#define REG_DWBCN0_CTRL                                0x0208\r
-#define REG_DWBCN1_CTRL                                0x0228\r
-\r
+#define REG_DWBCN0_CTRL             0x0208\r
+#define REG_DWBCN1_CTRL             0x0228\r
 \r
 //-----------------------------------------------------\r
 //\r
 //     0x0300h ~ 0x03FFh       PCIe\r
 //\r
 //-----------------------------------------------------\r
-#define        REG_PCIE_MULTIFET_CTRL_8192E    0x036A  //PCIE Multi-Fethc Control\r
+#define        REG_PCIE_CTRL_REG_8192E                 0x0300\r
+#define        REG_INT_MIG_8192E                                       0x0304  // Interrupt Migration \r
+#define        REG_BCNQ_TXBD_DESA_8192E                0x0308  // TX Beacon Descriptor Address\r
+#define        REG_MGQ_TXBD_DESA_8192E                 0x0310  // TX Manage Queue Descriptor Address\r
+#define        REG_VOQ_TXBD_DESA_8192E                 0x0318  // TX VO Queue Descriptor Address\r
+#define        REG_VIQ_TXBD_DESA_8192E                 0x0320  // TX VI Queue Descriptor Address\r
+#define        REG_BEQ_TXBD_DESA_8192E                 0x0328  // TX BE Queue Descriptor Address\r
+#define        REG_BKQ_TXBD_DESA_8192E                 0x0330  // TX BK Queue Descriptor Address\r
+#define        REG_RXQ_RXBD_DESA_8192E                 0x0338  // RX Queue     Descriptor Address\r
+#define        REG_HI0Q_TXBD_DESA_8192E                        0x0340\r
+#define        REG_HI1Q_TXBD_DESA_8192E                        0x0348\r
+#define        REG_HI2Q_TXBD_DESA_8192E                        0x0350\r
+#define        REG_HI3Q_TXBD_DESA_8192E                        0x0358\r
+#define        REG_HI4Q_TXBD_DESA_8192E                        0x0360\r
+#define        REG_HI5Q_TXBD_DESA_8192E                        0x0368\r
+#define        REG_HI6Q_TXBD_DESA_8192E                        0x0370\r
+#define        REG_HI7Q_TXBD_DESA_8192E                        0x0378\r
+#define        REG_MGQ_TXBD_NUM_8192E                  0x0380\r
+#define        REG_RX_RXBD_NUM_8192E                   0x0382\r
+#define        REG_VOQ_TXBD_NUM_8192E                  0x0384\r
+#define        REG_VIQ_TXBD_NUM_8192E                  0x0386\r
+#define        REG_BEQ_TXBD_NUM_8192E                  0x0388\r
+#define        REG_BKQ_TXBD_NUM_8192E                  0x038A\r
+#define        REG_HI0Q_TXBD_NUM_8192E                 0x038C\r
+#define        REG_HI1Q_TXBD_NUM_8192E                 0x038E\r
+#define        REG_HI2Q_TXBD_NUM_8192E                 0x0390\r
+#define        REG_HI3Q_TXBD_NUM_8192E                 0x0392\r
+#define        REG_HI4Q_TXBD_NUM_8192E                 0x0394\r
+#define        REG_HI5Q_TXBD_NUM_8192E                 0x0396\r
+#define        REG_HI6Q_TXBD_NUM_8192E                 0x0398\r
+#define        REG_HI7Q_TXBD_NUM_8192E                 0x039A\r
+#define        REG_TSFTIMER_HCI_8192E                  0x039C\r
+\r
+//Read Write Point\r
+#define        REG_VOQ_TXBD_IDX_8192E                  0x03A0\r
+#define        REG_VIQ_TXBD_IDX_8192E                  0x03A4\r
+#define        REG_BEQ_TXBD_IDX_8192E                  0x03A8\r
+#define        REG_BKQ_TXBD_IDX_8192E                  0x03AC\r
+#define        REG_MGQ_TXBD_IDX_8192E                  0x03B0\r
+#define        REG_RXQ_TXBD_IDX_8192E                  0x03B4\r
+#define        REG_HI0Q_TXBD_IDX_8192E                 0x03B8\r
+#define        REG_HI1Q_TXBD_IDX_8192E                 0x03BC\r
+#define        REG_HI2Q_TXBD_IDX_8192E                 0x03C0\r
+#define        REG_HI3Q_TXBD_IDX_8192E                 0x03C4\r
+#define        REG_HI4Q_TXBD_IDX_8192E                 0x03C8\r
+#define        REG_HI5Q_TXBD_IDX_8192E                 0x03CC\r
+#define        REG_HI6Q_TXBD_IDX_8192E                 0x03D0\r
+#define        REG_HI7Q_TXBD_IDX_8192E                 0x03D4\r
+\r
+#define        REG_PCIE_HCPWM_8192EE                   0x03D8 // ??????\r
+#define        REG_PCIE_HRPWM_8192EE                   0x03DC  //PCIe RPWM // ??????\r
+#define        REG_DBI_WDATA_V1_8192E                  0x03E8\r
+#define        REG_DBI_RDATA_V1_8192E                  0x03EC\r
+#define        REG_DBI_FLAG_V1_8192E                           0x03F0\r
+#define        REG_MDIO_V1_8192E                                       0x3F4\r
+#define        REG_PCIE_MIX_CFG_8192E                          0x3F8\r
 \r
 //-----------------------------------------------------\r
 //\r
 //\r
 //-----------------------------------------------------\r
 #define REG_TXBF_CTRL_8192E                            0x042C\r
+#define REG_ARFR0_8192E                                        0x0444\r
 #define REG_ARFR1_8192E                                        0x044C\r
 #define REG_CCK_CHECK_8192E                            0x0454\r
 #define REG_AMPDU_MAX_TIME_8192E                       0x0456\r
 #define REG_BCNQ1_BDNY_8192E                           0x0457\r
 \r
 #define REG_AMPDU_MAX_LENGTH_8192E     0x0458\r
+#define REG_WMAC_LBK_BUF_HD_8192E                      0x045D\r
 #define REG_NDPA_OPT_CTRL_8192E                0x045F\r
 #define REG_DATA_SC_8192E                              0x0483\r
+#define REG_ARFR2_8192E                                        0x048C\r
+#define REG_ARFR3_8192E                                        0x0494\r
 #define REG_TXRPT_START_OFFSET                 0x04AC\r
 #define REG_AMPDU_BURST_MODE_8192E     0x04BC\r
 #define REG_HT_SINGLE_AMPDU_8192E              0x04C7\r
index 200a111b20e71e2461fe60a348081b2a97e2c2bc..91fc0183d6492aa3c51bd831e47f44807a218999 100755 (executable)
@@ -207,16 +207,48 @@ typedef struct txdescriptor_8192e
 #define USB_TXAGG_NUM_SHT      24\r
 \r
 \r
+//=====Tx Desc Buffer content\r
 \r
-//=====Desc content\r
+// config element for each tx buffer \r
+/*\r
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 0, 16, __Valeu)\r
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 31, 1, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+4, 0, 32, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)\r
+*/\r
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 0, 16, __Valeu)\r
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 31, 1, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8)+4, 0, 32, __Valeu)\r
+#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)\r
+\r
+\r
+// Dword 0\r
+#define SET_TX_BUFF_DESC_LEN_0_92E(__pTxDesc, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 14, __Valeu)\r
+#define SET_TX_BUFF_DESC_PSB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 15, __Value)\r
+#define SET_TX_BUFF_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\r
+// Dword 1\r
+#define SET_TX_BUFF_DESC_ADDR_LOW_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value)\r
+#define GET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+4, 0,32)\r
+\r
+\r
+// Dword 2\r
+#define SET_TX_BUFF_DESC_ADDR_HIGH_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value)\r
+// Dword 3, RESERVED \r
+\r
+\r
+//=====Tx Desc content\r
 // Dword 0\r
 #define SET_TX_DESC_PKT_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\r
 #define SET_TX_DESC_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\r
 #define SET_TX_DESC_BMC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\r
 #define SET_TX_DESC_HTC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\r
+#define SET_TX_DESC_LAST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\r
+#define SET_TX_DESC_FIRST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\r
 #define SET_TX_DESC_LINIP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\r
 #define SET_TX_DESC_NO_ACM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\r
 #define SET_TX_DESC_GF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\r
+#define SET_TX_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\r
+#define GET_TX_DESC_OWN_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\r
 \r
 // Dword 1\r
 #define SET_TX_DESC_MACID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\r
@@ -324,12 +356,7 @@ typedef struct txdescriptor_8192e
 #define SET_TX_DESC_TXBF_PATH_92E(__pTxDesc, __Value)                                  SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value)\r
 #define SET_TX_DESC_SEQ_92E(__pTxDesc, __Value)                                        SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\r
 #define SET_TX_DESC_FINAL_DATA_RATE_92E(__pTxDesc, __Value)                                    SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 8, __Value)\r
-// Dword 10\r
-#define SET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\r
-\r
 \r
-// Dword 11\r
-#define SET_TX_DESC_NEXT_DESC_ADDRESS_92E(__pTxDesc, __Value)  SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\r
 \r
 #define SET_EARLYMODE_PKTNUM_92E(__pAddr, __Value)                                     SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\r
 #define SET_EARLYMODE_LEN0_92E(__pAddr, __Value)                                       SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\r
@@ -358,6 +385,7 @@ s32 rtl8192eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
 s32 rtl8192ee_init_xmit_priv(PADAPTER padapter);\r
 void rtl8192ee_free_xmit_priv(PADAPTER padapter);\r
 struct xmit_buf *rtl8192ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);\r
+s32    rtl8192ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\r
 void   rtl8192ee_xmitframe_resume(_adapter *padapter);\r
 s32 rtl8192ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
 s32 rtl8192ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\r
index 43523d440f07ef68063944f4f4887855f7f1e6c1..ced4a49623eff15edf220af30aa824b344d1db5a 100755 (executable)
@@ -21,7 +21,7 @@
 #define __RTL8723A_CMD_H__
 
 
-#define H2C_BT_FW_PATCH_LEN            3
+#define H2C_8723A_BT_FW_PATCH_LEN              3
 #define H2C_BT_PWR_FORCE_LEN           3
 
 enum cmd_msg_element_id
@@ -49,11 +49,11 @@ enum cmd_msg_element_id
        BT_PTA_MANAGER_UPDATE_ENABLE_EID = 38,
        DAC_SWING_VALUE_EID = 41,
        TRADITIONAL_TDMA_EN_EID = 51,
-       H2C_BT_FW_PATCH = 54,
+       H2C_8723A_BT_FW_PATCH = 54,
        B_TYPE_TDMA_EID = 58,
        SCAN_EN_EID = 59,
        LOWPWR_LPS_EID = 71,
-       H2C_RESET_TSF = 75,
+       H2C_8723A_RESET_TSF = 75,
        MAX_CMDMSG_EID   
 };
 
index 1a222f9c4c8a46e4802dde7e6356efa38dcd00e9..13c68614c0354d5b168473c1c1c851a44314de05 100755 (executable)
@@ -201,37 +201,26 @@ typedef struct _RT_8723A_FIRMWARE_HDR
 #define DRIVER_EARLY_INT_TIME_8723A            0x05\r
 #define BCN_DMA_ATIME_INT_TIME_8723A           0x02\r
 \r
-// Note: We will divide number of page equally for each queue other than public queue!\r
-#define TX_TOTAL_PAGE_NUMBER_8723A     0xF8\r
-#define TX_PAGE_BOUNDARY               (TX_TOTAL_PAGE_NUMBER_8723A + 1)\r
+//For General Reserved Page Number(Beacon Queue is reserved page)\r
+//Beacon:2, PS-Poll:1, Null Data:1,Qos Null Data:1,BT Qos Null Data:1\r
+#define BCNQ_PAGE_NUM_8723A            0x08\r
 \r
-// For Normal Chip Setting\r
-// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A\r
-#define NORMAL_PAGE_NUM_PUBQ   0xE7\r
-#define NORMAL_PAGE_NUM_HPQ            0x0C\r
-#define NORMAL_PAGE_NUM_LPQ            0x02\r
-#define NORMAL_PAGE_NUM_NPQ            0x02\r
-\r
-// For Test Chip Setting\r
-// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A\r
-#define TEST_PAGE_NUM_PUBQ             0x7E\r
+#define TX_TOTAL_PAGE_NUMBER_8723A     (0xFF - BCNQ_PAGE_NUM_8723A)\r
+#define TX_PAGE_BOUNDARY_8723A         (TX_TOTAL_PAGE_NUMBER_8723A + 1)\r
 \r
-// For Test Chip Setting\r
-#define WMM_TEST_TX_TOTAL_PAGE_NUMBER  0xF5\r
-#define WMM_TEST_TX_PAGE_BOUNDARY              (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6\r
+#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8723A  TX_TOTAL_PAGE_NUMBER_8723A\r
+#define WMM_NORMAL_TX_PAGE_BOUNDARY_8723A              (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8723A + 1)\r
 \r
-#define WMM_TEST_PAGE_NUM_PUBQ         0xA3\r
-#define WMM_TEST_PAGE_NUM_HPQ          0x29\r
-#define WMM_TEST_PAGE_NUM_LPQ          0x29\r
+// For Normal Chip Setting\r
+// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723A\r
+#define NORMAL_PAGE_NUM_HPQ_8723A              0x0C\r
+#define NORMAL_PAGE_NUM_LPQ_8723A              0x02\r
+#define NORMAL_PAGE_NUM_NPQ_8723A              0x02\r
 \r
 // Note: For Normal Chip Setting, modify later\r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER        0xF5\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY            (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6\r
-\r
-#define WMM_NORMAL_PAGE_NUM_PUBQ       0xB0\r
-#define WMM_NORMAL_PAGE_NUM_HPQ                0x29\r
-#define WMM_NORMAL_PAGE_NUM_LPQ                0x1C\r
-#define WMM_NORMAL_PAGE_NUM_NPQ                0x1C\r
+#define WMM_NORMAL_PAGE_NUM_HPQ_8723A          0x29\r
+#define WMM_NORMAL_PAGE_NUM_LPQ_8723A          0x1C\r
+#define WMM_NORMAL_PAGE_NUM_NPQ_8723A          0x1C\r
 \r
 \r
 //-------------------------------------------------------------------------\r
index a4bc48d1d04ad86ff263788d240bb8fa1850af79..0613b87947bc0d8bef99d898b599ce4afa9ea033 100755 (executable)
@@ -48,7 +48,7 @@
 \r
 //OFFSET 8\r
 #define AGG_EN         BIT(29)\r
-\r
+#define AMPDU_DENSITY_SHT 20\r
 //OFFSET 12\r
 #define SEQ_SHT                16\r
 \r
index d352bc35894a75c556b4b3bd698f10fbc7b2e728..79a1261fafb2700373f3125bee0e9465c32649e9 100755 (executable)
@@ -69,6 +69,7 @@ enum h2c_cmd_8723B{
        H2C_8723B_BT_CONTROL = 0x68,
        H2C_8723B_BT_WIFI_CTRL = 0x69,
        H2C_8723B_BT_FW_PATCH = 0x6A,
+       H2C_8723B_BT_WLAN_CALIBRATION = 0x6D,   
        
        //WOWLAN Class: 100
        H2C_8723B_WOWLAN = 0x80,
@@ -155,55 +156,38 @@ enum h2c_cmd_8723B{
 //----------------------------------    H2C CMD CONTENT    --------------------------------------------------//
 //---------------------------------------------------------------------------------------------------------//
 //_RSVDPAGE_LOC_CMD_0x00
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                       SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                               SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
 
 //_MEDIA_STATUS_RPT_PARM_CMD_0x01
-#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
 //_KEEP_ALIVE_CMD_0x03
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)                   SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
 
 //_DISCONNECT_DECISION_CMD_0x04
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)          SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
-
-#ifdef CONFIG_AP_WOWLAN
-#define SET_8723B_H2CCMD_AP_WOWLAN_EN(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-//_AP_Offload 0x08
-//_BCN_RsvdPage        0x09
-#define SET_8723B_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-//_Probersp_RsvdPage 0x0a
-#define SET_8723B_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(__pH2CCmd, __Value)   SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-//_Probersp_RsvdPage 0x13
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_INDEX(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value)
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_C2H_EN(__pH2CCmd, __Value)           SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_PLUS(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_HIGH_ACTIVE(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_EN(__pH2CCmd, __Value)               SET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_DURATION(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_AP_WOW_GPIO_CTRL_C2H_DURATION(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#endif
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)                        SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)   SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
 // _PWR_MOD_CMD_0x20
-#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                 SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)    SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)                    SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
 
 #define GET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                  LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
 
@@ -246,6 +230,7 @@ enum h2c_cmd_8723B{
 #define SET_8723B_H2CCMD_BT_MPOPER_IDX(__pH2CCmd, __Value)                                                     SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
 #define SET_8723B_H2CCMD_BT_MPOPER_PARAM1(__pH2CCmd, __Value)                                                  SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
 #define SET_8723B_H2CCMD_BT_MPOPER_PARAM2(__pH2CCmd, __Value)                                                  SET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_BT_MPOPER_PARAM3(__pH2CCmd, __Value)                                                  SET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)
 
 // _BT_FW_PATCH_0x6A
 #define SET_8723B_H2CCMD_BT_FW_PATCH_SIZE(__pH2CCmd, __Value)                                  SET_BITS_TO_LE_2BYTE((pu1Byte)(__pH2CCmd), 0, 16, __Value)
index a1f3edc34eb19477b736f64a911c73785f3d7dcf..d7a99a470b0affdda240fb75d608a9abe863f77f 100755 (executable)
 //---------------------------------------------------------------------\r
 //             RTL8723B From file\r
 //---------------------------------------------------------------------\r
-       #define RTL8723B_FW_IMG                                 "rtl8723B/FW_NIC.bin"\r
-       #define RTL8723B_FW_WW_IMG                              "rtl8723B/FW_WoWLAN.bin"\r
-       #define RTL8723B_PHY_REG                                        "rtl8723B/PHY_REG.txt"\r
-       #define RTL8723B_PHY_RADIO_A                            "rtl8723B/RadioA.txt"\r
-       #define RTL8723B_PHY_RADIO_B                            "rtl8723B/RadioB.txt"\r
-       #define RTL8723B_TXPWR_TRACK                            "rtl8723B/TxPowerTrack.txt" \r
-       #define RTL8723B_AGC_TAB                                        "rtl8723B/AGC_TAB.txt"\r
-       #define RTL8723B_PHY_MACREG                             "rtl8723B/MAC_REG.txt"\r
-       #define RTL8723B_PHY_REG_PG                             "rtl8723B/PHY_REG_PG.txt"\r
-       #define RTL8723B_PHY_REG_MP                             "rtl8723B/PHY_REG_MP.txt"\r
-       #define RTL8723B_TXPWR_LMT                              "rtl8723B/TXPWR_LMT.txt"\r
+       #define RTL8723B_FW_IMG                                 "rtl8723b/FW_NIC.bin"\r
+       #define RTL8723B_FW_WW_IMG                              "rtl8723b/FW_WoWLAN.bin"\r
+       #define RTL8723B_PHY_REG                                        "rtl8723b/PHY_REG.txt"\r
+       #define RTL8723B_PHY_RADIO_A                            "rtl8723b/RadioA.txt"\r
+       #define RTL8723B_PHY_RADIO_B                            "rtl8723b/RadioB.txt"\r
+       #define RTL8723B_TXPWR_TRACK                            "rtl8723b/TxPowerTrack.txt" \r
+       #define RTL8723B_AGC_TAB                                        "rtl8723b/AGC_TAB.txt"\r
+       #define RTL8723B_PHY_MACREG                             "rtl8723b/MAC_REG.txt"\r
+       #define RTL8723B_PHY_REG_PG                             "rtl8723b/PHY_REG_PG.txt"\r
+       #define RTL8723B_PHY_REG_MP                             "rtl8723b/PHY_REG_MP.txt"\r
+       #define RTL8723B_TXPWR_LMT                              "rtl8723b/TXPWR_LMT.txt"\r
 \r
 //---------------------------------------------------------------------\r
 //             RTL8723B From header\r
@@ -152,6 +152,7 @@ typedef struct _RT_8723B_FIRMWARE_HDR
 #undef BCNQ1_PAGE_NUM_8723B\r
 #define BCNQ1_PAGE_NUM_8723B           0x00 // 0x04\r
 #endif\r
+#define MAX_RX_DMA_BUFFER_SIZE_8723B   0x2800  // RX 10K\r
 \r
 //For WoWLan , more reserved page\r
 //ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2, PNO: 6\r
@@ -166,11 +167,15 @@ typedef struct _RT_8723B_FIRMWARE_HDR
 #define WOWLAN_PAGE_NUM_8723B  0x0d\r
 #endif\r
 \r
+#ifdef CONFIG_AP_WOWLAN\r
+#define AP_WOWLAN_PAGE_NUM_8723B       0x02\r
+#endif\r
+\r
 #define TX_TOTAL_PAGE_NUMBER_8723B     (0xFF - BCNQ_PAGE_NUM_8723B - BCNQ1_PAGE_NUM_8723B - WOWLAN_PAGE_NUM_8723B)\r
 #define TX_PAGE_BOUNDARY_8723B         (TX_TOTAL_PAGE_NUMBER_8723B + 1)\r
 \r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER        TX_TOTAL_PAGE_NUMBER_8723B\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY            (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER + 1)\r
+#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8723B  TX_TOTAL_PAGE_NUMBER_8723B\r
+#define WMM_NORMAL_TX_PAGE_BOUNDARY_8723B              (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8723B + 1)\r
 \r
 // For Normal Chip Setting\r
 // (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B\r
@@ -238,10 +243,11 @@ typedef struct _C2H_EVT_HDR
 \r
 typedef enum tag_Package_Definition\r
 {\r
-       PACKAGE_DEFAULT         = 0,\r
-       PACKAGE_QFN68           = BIT(0),\r
-       PACKAGE_TFBGA90         = BIT(1),\r
-       PACKAGE_TFBGA79         = BIT(2),\r
+    PACKAGE_DEFAULT,\r
+    PACKAGE_QFN68,\r
+    PACKAGE_TFBGA90,\r
+    PACKAGE_TFBGA80,\r
+    PACKAGE_TFBGA79\r
 }PACKAGE_TYPE_E;\r
 \r
 #define INCLUDE_MULTI_FUNC_BT(_Adapter)                (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\r
@@ -275,6 +281,7 @@ void Hal_EfuseParseAntennaDiversity_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN
 void Hal_EfuseParseXtal_8723B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail);\r
 void Hal_EfuseParseThermalMeter_8723B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail);\r
 VOID Hal_EfuseParsePackageType_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\r
+VOID Hal_EfuseParseVoltage_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN  AutoLoadFail); \r
 \r
 #ifdef CONFIG_C2H_PACKET_EN\r
 void C2HPacketHandler_8723B(PADAPTER padapter, u8 *pbuffer, u16 length);\r
@@ -291,8 +298,8 @@ u8 GetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);
 void rtl8723b_InitBeaconParameters(PADAPTER padapter);\r
 void rtl8723b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode);\r
 void   _InitBurstPktLen_8723BS(PADAPTER Adapter);\r
-#ifdef CONFIG_WOWLAN\r
 void _8051Reset8723(PADAPTER padapter);\r
+#ifdef CONFIG_WOWLAN\r
 void Hal_DetectWoWMode(PADAPTER pAdapter);\r
 #endif //CONFIG_WOWLAN\r
 \r
@@ -322,5 +329,10 @@ u8 HwRateToMRate8723B(u8    rate);
 void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\r
 #endif //CONFIG_RF_GAIN_OFFSET\r
 \r
+#ifdef CONFIG_PCI_HCI\r
+BOOLEAN        InterruptRecognized8723BE(PADAPTER Adapter);\r
+VOID   UpdateInterruptMask8723BE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\r
+#endif\r
+\r
 #endif\r
 \r
index f5458f27fced5e3476fa0dcf0abec7a35c194a94..36772c05157190333103c3258dd21cc6bc078e8f 100755 (executable)
@@ -40,6 +40,10 @@ void rtl8723bs_DeInitSwLeds(PADAPTER padapter);
 void rtl8723bs_InitSwLeds(PADAPTER padapter);\r
 void rtl8723bs_DeInitSwLeds(PADAPTER padapter);\r
 #endif\r
+#ifdef CONFIG_PCI_HCI\r
+void rtl8723be_InitSwLeds(PADAPTER padapter);\r
+void rtl8723be_DeInitSwLeds(PADAPTER padapter);\r
+#endif\r
 \r
 #endif\r
 \r
index 81c181fe540e29cd0e54192ac12222ca9c1860d8..3f0990fd649e09a694ba637cd9f9f2ae0a84142c 100755 (executable)
@@ -161,5 +161,13 @@ int        rtl8723bu_init_recv_priv(_adapter *padapter);
 void rtl8723bu_free_recv_priv (_adapter *padapter);\r
 void rtl8723bu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\r
 #endif\r
+\r
+#ifdef CONFIG_PCI_HCI\r
+s32 rtl8723be_init_recv_priv(PADAPTER padapter);\r
+void rtl8723be_free_recv_priv(PADAPTER padapter);\r
+#endif\r
+\r
+void   rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\r
+\r
 #endif\r
 \r
index 7fea179020a22d184105905d8134277b87eed394..b1fba0f1b502d174d59feae41c41c5daa4dd6221 100755 (executable)
 //     0x0000h ~ 0x00FFh       System Configuration\r
 //\r
 //-----------------------------------------------------\r
+#define REG_RSV_CTRL_8723B                             0x001C  // 3 Byte\r
 #define REG_BT_WIFI_ANTENNA_SWITCH_8723B       0x0038\r
+#define REG_HSISR_8723B                                        0x005c\r
 #define REG_PAD_CTRL1_8723B            0x0064\r
 #define REG_AFE_CTRL_4_8723B           0x0078\r
 #define REG_HMEBOX_DBG_0_8723B 0x0088\r
 #define REG_HMEBOX_DBG_1_8723B 0x008A\r
 #define REG_HMEBOX_DBG_2_8723B 0x008C\r
 #define REG_HMEBOX_DBG_3_8723B 0x008E\r
+#define REG_HIMR0_8723B                                        0x00B0\r
+#define REG_HISR0_8723B                                        0x00B4\r
+#define REG_HIMR1_8723B                                        0x00B8\r
+#define REG_HISR1_8723B                                        0x00BC\r
+#define REG_PMC_DBG_CTRL2_8723B                        0x00CC\r
 \r
 //-----------------------------------------------------\r
 //\r
@@ -64,6 +71,7 @@
 //     0x0280h ~ 0x02FFh       RXDMA Configuration\r
 //\r
 //-----------------------------------------------------\r
+#define REG_RXDMA_CONTROL_8723B                0x0286 // Control the RX DMA.\r
 #define REG_RXDMA_MODE_CTRL_8723B              0x0290\r
 \r
 //-----------------------------------------------------\r
 //     0x0300h ~ 0x03FFh       PCIe\r
 //\r
 //-----------------------------------------------------\r
+#define        REG_PCIE_CTRL_REG_8723B         0x0300\r
+#define        REG_INT_MIG_8723B                               0x0304  // Interrupt Migration \r
+#define        REG_BCNQ_DESA_8723B                     0x0308  // TX Beacon Descriptor Address\r
+#define        REG_HQ_DESA_8723B                               0x0310  // TX High Queue Descriptor Address\r
+#define        REG_MGQ_DESA_8723B                      0x0318  // TX Manage Queue Descriptor Address\r
+#define        REG_VOQ_DESA_8723B                      0x0320  // TX VO Queue Descriptor Address\r
+#define        REG_VIQ_DESA_8723B                              0x0328  // TX VI Queue Descriptor Address\r
+#define        REG_BEQ_DESA_8723B                      0x0330  // TX BE Queue Descriptor Address\r
+#define        REG_BKQ_DESA_8723B                      0x0338  // TX BK Queue Descriptor Address\r
+#define        REG_RX_DESA_8723B                               0x0340  // RX Queue     Descriptor Address\r
+#define        REG_DBI_WDATA_8723B                     0x0348  // DBI Write Data\r
+#define        REG_DBI_RDATA_8723B                     0x034C  // DBI Read Data\r
+#define        REG_DBI_ADDR_8723B                              0x0350  // DBI Address\r
+#define        REG_DBI_FLAG_8723B                              0x0352  // DBI Read/Write Flag\r
+#define        REG_MDIO_WDATA_8723B            0x0354  // MDIO for Write PCIE PHY\r
+#define        REG_MDIO_RDATA_8723B                    0x0356  // MDIO for Reads PCIE PHY\r
+#define        REG_MDIO_CTL_8723B                      0x0358  // MDIO for Control\r
+#define        REG_DBG_SEL_8723B                               0x0360  // Debug Selection Register\r
+#define        REG_PCIE_HRPWM_8723B                    0x0361  //PCIe RPWM\r
+#define        REG_PCIE_HCPWM_8723B                    0x0363  //PCIe CPWM\r
+#define        REG_PCIE_MULTIFET_CTRL_8723B    0x036A  //PCIE Multi-Fethc Control\r
 \r
 //-----------------------------------------------------\r
 //\r
 #define REG_TXPKTBUF_IV_LOW             0x0484\r
 #define REG_TXPKTBUF_IV_HIGH            0x0488\r
 #endif\r
+#define REG_AMPDU_BURST_MODE_8723B     0x04BC\r
 \r
 //-----------------------------------------------------\r
 //\r
 #define EEPROM_RF_GAIN_VAL                             0x1F6\r
 #endif //CONFIG_RF_GAIN_OFFSET\r
 \r
+\r
+//----------------------------------------------------------------------------\r
+//       8195 IMR/ISR bits                                             (offset 0xB0,  8bits)\r
+//----------------------------------------------------------------------------\r
+#define        IMR_DISABLED_8723B                                      0\r
+// IMR DW0(0x00B0-00B3) Bit 0-31\r
+#define        IMR_TIMER2_8723B                                        BIT31           // Timeout interrupt 2\r
+#define        IMR_TIMER1_8723B                                        BIT30           // Timeout interrupt 1  \r
+#define        IMR_PSTIMEOUT_8723B                             BIT29           // Power Save Time Out Interrupt\r
+#define        IMR_GTINT4_8723B                                        BIT28           // When GTIMER4 expires, this bit is set to 1   \r
+#define        IMR_GTINT3_8723B                                        BIT27           // When GTIMER3 expires, this bit is set to 1   \r
+#define        IMR_TXBCN0ERR_8723B                             BIT26           // Transmit Beacon0 Error                       \r
+#define        IMR_TXBCN0OK_8723B                              BIT25           // Transmit Beacon0 OK                  \r
+#define        IMR_TSF_BIT32_TOGGLE_8723B              BIT24           // TSF Timer BIT32 toggle indication interrupt                  \r
+#define        IMR_BCNDMAINT0_8723B                            BIT20           // Beacon DMA Interrupt 0                       \r
+#define        IMR_BCNDERR0_8723B                              BIT16           // Beacon Queue DMA OK0                 \r
+#define        IMR_HSISR_IND_ON_INT_8723B              BIT15           // HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\r
+#define        IMR_BCNDMAINT_E_8723B                   BIT14           // Beacon DMA Interrupt Extension for Win7                      \r
+#define        IMR_ATIMEND_8723B                               BIT12           // CTWidnow End or ATIM Window End\r
+#define        IMR_C2HCMD_8723B                                        BIT10           // CPU to Host Command INT Status, Write 1 clear        \r
+#define        IMR_CPWM2_8723B                                 BIT9                    // CPU power Mode exchange INT Status, Write 1 clear    \r
+#define        IMR_CPWM_8723B                                  BIT8                    // CPU power Mode exchange INT Status, Write 1 clear    \r
+#define        IMR_HIGHDOK_8723B                               BIT7                    // High Queue DMA OK    \r
+#define        IMR_MGNTDOK_8723B                               BIT6                    // Management Queue DMA OK      \r
+#define        IMR_BKDOK_8723B                                 BIT5                    // AC_BK DMA OK         \r
+#define        IMR_BEDOK_8723B                                 BIT4                    // AC_BE DMA OK \r
+#define        IMR_VIDOK_8723B                                 BIT3                    // AC_VI DMA OK         \r
+#define        IMR_VODOK_8723B                                 BIT2                    // AC_VO DMA OK \r
+#define        IMR_RDU_8723B                                   BIT1                    // Rx Descriptor Unavailable    \r
+#define        IMR_ROK_8723B                                   BIT0                    // Receive DMA OK\r
+\r
+// IMR DW1(0x00B4-00B7) Bit 0-31\r
+#define        IMR_BCNDMAINT7_8723B                            BIT27           // Beacon DMA Interrupt 7\r
+#define        IMR_BCNDMAINT6_8723B                            BIT26           // Beacon DMA Interrupt 6\r
+#define        IMR_BCNDMAINT5_8723B                            BIT25           // Beacon DMA Interrupt 5\r
+#define        IMR_BCNDMAINT4_8723B                            BIT24           // Beacon DMA Interrupt 4\r
+#define        IMR_BCNDMAINT3_8723B                            BIT23           // Beacon DMA Interrupt 3\r
+#define        IMR_BCNDMAINT2_8723B                            BIT22           // Beacon DMA Interrupt 2\r
+#define        IMR_BCNDMAINT1_8723B                            BIT21           // Beacon DMA Interrupt 1\r
+#define        IMR_BCNDOK7_8723B                                       BIT20           // Beacon Queue DMA OK Interrup 7\r
+#define        IMR_BCNDOK6_8723B                                       BIT19           // Beacon Queue DMA OK Interrup 6\r
+#define        IMR_BCNDOK5_8723B                                       BIT18           // Beacon Queue DMA OK Interrup 5\r
+#define        IMR_BCNDOK4_8723B                                       BIT17           // Beacon Queue DMA OK Interrup 4\r
+#define        IMR_BCNDOK3_8723B                                       BIT16           // Beacon Queue DMA OK Interrup 3\r
+#define        IMR_BCNDOK2_8723B                                       BIT15           // Beacon Queue DMA OK Interrup 2\r
+#define        IMR_BCNDOK1_8723B                                       BIT14           // Beacon Queue DMA OK Interrup 1\r
+#define        IMR_ATIMEND_E_8723B                             BIT13           // ATIM Window End Extension for Win7\r
+#define        IMR_TXERR_8723B                                 BIT11           // Tx Error Flag Interrupt Status, write 1 clear.\r
+#define        IMR_RXERR_8723B                                 BIT10           // Rx Error Flag INT Status, Write 1 clear\r
+#define        IMR_TXFOVW_8723B                                        BIT9                    // Transmit FIFO Overflow\r
+#define        IMR_RXFOVW_8723B                                        BIT8                    // Receive FIFO Overflow\r
+\r
+#ifdef CONFIG_PCI_HCI\r
+//#define IMR_RX_MASK          (IMR_ROK_8723B|IMR_RDU_8723B|IMR_RXFOVW_8723B)\r
+#define IMR_TX_MASK                    (IMR_VODOK_8723B|IMR_VIDOK_8723B|IMR_BEDOK_8723B|IMR_BKDOK_8723B|IMR_MGNTDOK_8723B|IMR_HIGHDOK_8723B)\r
+\r
+#define RT_BCN_INT_MASKS       (IMR_BCNDMAINT0_8723B | IMR_TXBCN0OK_8723B | IMR_TXBCN0ERR_8723B | IMR_BCNDERR0_8723B)\r
+\r
+#define RT_AC_INT_MASKS        (IMR_VIDOK_8723B | IMR_VODOK_8723B | IMR_BEDOK_8723B|IMR_BKDOK_8723B)\r
+#endif\r
+\r
 #endif\r
 \r
 #ifdef CONFIG_USB_HCI\r
@@ -199,4 +290,4 @@ typedef     enum _BOARD_TYPE_8192CUSB{
        BOARD_USB_COMBO                 = 4,            // USB Combo-Slim module\r
 } BOARD_TYPE_8723BUSB, *PBOARD_TYPE_8723BUSB;\r
 \r
-#endif
\ No newline at end of file
+#endif\r
index 47b105d241cb6176876cecae175013b541404145..2de6a6829c1ef9871124c161092a4ca3f97e2939 100755 (executable)
@@ -373,7 +373,7 @@ typedef struct txdesc_8723b
 \r
 // Dword 10\r
 #define SET_TX_DESC_TX_BUFFER_ADDRESS_8723B(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\r
-\r
+#define GET_TX_DESC_TX_BUFFER_ADDRESS_8723B(__pTxDesc)         LE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)\r
 \r
 // Dword 11\r
 #define SET_TX_DESC_NEXT_DESC_ADDRESS_8723B(__pTxDesc, __Value)        SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\r
@@ -483,5 +483,20 @@ void rtl8723bu_xmit_tasklet(void *priv);
 s32 rtl8723bu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\r
 void _dbg_dump_tx_info(_adapter        *padapter,int frame_tag,struct tx_desc *ptxdesc);\r
 #endif\r
+\r
+#ifdef CONFIG_PCI_HCI\r
+s32 rtl8723be_init_xmit_priv(PADAPTER padapter);\r
+void rtl8723be_free_xmit_priv(PADAPTER padapter);\r
+struct xmit_buf *rtl8723be_dequeue_xmitbuf(struct rtw_tx_ring *ring);\r
+void   rtl8723be_xmitframe_resume(_adapter *padapter);\r
+s32 rtl8723be_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\r
+s32 rtl8723be_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\r
+s32    rtl8723be_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\r
+void rtl8723be_xmit_tasklet(void *priv);\r
+#endif\r
+\r
+u8     BWMapping_8723B(PADAPTER Adapter, struct pkt_attrib *pattrib);\r
+u8     SCMapping_8723B(PADAPTER Adapter, struct pkt_attrib     *pattrib);\r
+\r
 #endif\r
 \r
index 8cf7322409fcacb1b249aa3eaa4fc95889408b7f..0dfc257e073a2b4940524f5e30590243654e7254 100755 (executable)
@@ -91,37 +91,37 @@ struct H2C_SS_RFOFF_PARAM{
 
 
 //_RSVDPAGE_LOC_CMD0
-#define SET_8812_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8812_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                        SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_8812_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)             SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8812_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8812_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8812_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8812_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_8812_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8812_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8812_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)      SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
 
 //_MEDIA_STATUS_RPT_PARM_CMD1
-#define SET_8812_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8812_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8812_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8812_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_8812_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8812_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8812_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)                                  SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8812_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
 
 //_SETPWRMODE_PARM
-#define SET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)              SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)                          SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)                          SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)       SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)                         SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
 
-#define GET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                   LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
+#define GET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)                                                   LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
 
 //_P2P_PS_OFFLOAD
-#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)                      SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                        SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)                              SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)                                SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
 #define SET_8812_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
-#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
-#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value)   SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
+#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)                     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)         SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
+#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value)                   SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
 
 
 void   Set_RA_LDPC_8812(struct sta_info        *psta, BOOLEAN bLDPC);
@@ -133,7 +133,7 @@ void rtl8812_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);
 u8 rtl8812_set_rssi_cmd(PADAPTER padapter, u8 *param);
 void rtl8812_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg);
 void rtl8812_Add_RateATid(PADAPTER padapter, u32 bitmap, u8* arg, u8 rssi_level);
-
+void rtl8812_set_wowlan_cmd(_adapter* padapter, u8 enable);
 
 #ifdef CONFIG_P2P_PS
 void rtl8812_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);
index b811b87908210e8f5304c687c36bbcbb323f78c2..79718ee5933d472c797f446b82645d11a253d5c8 100755 (executable)
 //---------------------------------------------------------------------\r
 //             RTL8812AU From header\r
 //---------------------------------------------------------------------\r
-               #define RTL8812_FW_IMG                                          "rtl8812A/FW_NIC.bin"\r
-               #define RTL8812_FW_WW_IMG                               "rtl8812A/FW_WoWLAN.bin"\r
-               #define RTL8812_PHY_REG                                 "rtl8812A/PHY_REG.txt" \r
-               #define RTL8812_PHY_RADIO_A                             "rtl8812A/RadioA.txt"\r
-               #define RTL8812_PHY_RADIO_B                             "rtl8812A/RadioB.txt"\r
-               #define RTL8812_TXPWR_TRACK                             "rtl8812A/TxPowerTrack.txt"                     \r
-               #define RTL8812_AGC_TAB                                 "rtl8812A/AGC_TAB.txt"\r
-               #define RTL8812_PHY_MACREG                              "rtl8812A/MAC_REG.txt"\r
-               #define RTL8812_PHY_REG_PG                                      "rtl8812A/PHY_REG_PG.txt"\r
-               #define RTL8812_PHY_REG_MP                              "rtl8812A/PHY_REG_MP.txt" \r
-               #define RTL8812_TXPWR_LMT                                       "rtl8812A/TXPWR_LMT.txt" \r
+               #define RTL8812_FW_IMG                                          "rtl8812a/FW_NIC.bin"\r
+               #define RTL8812_FW_WW_IMG                               "rtl8812a/FW_WoWLAN.bin"\r
+               #define RTL8812_PHY_REG                                 "rtl8812a/PHY_REG.txt" \r
+               #define RTL8812_PHY_RADIO_A                             "rtl8812a/RadioA.txt"\r
+               #define RTL8812_PHY_RADIO_B                             "rtl8812a/RadioB.txt"\r
+               #define RTL8812_TXPWR_TRACK                             "rtl8812a/TxPowerTrack.txt"                     \r
+               #define RTL8812_AGC_TAB                                 "rtl8812a/AGC_TAB.txt"\r
+               #define RTL8812_PHY_MACREG                              "rtl8812a/MAC_REG.txt"\r
+               #define RTL8812_PHY_REG_PG                                      "rtl8812a/PHY_REG_PG.txt"\r
+               #define RTL8812_PHY_REG_MP                              "rtl8812a/PHY_REG_MP.txt" \r
+               #define RTL8812_TXPWR_LMT                                       "rtl8812a/TXPWR_LMT.txt" \r
 \r
 //---------------------------------------------------------------------\r
 //             RTL8821U From file\r
 //---------------------------------------------------------------------\r
-               #define RTL8821_FW_IMG                                          "rtl8821A/FW_NIC.bin"\r
-               #define RTL8821_FW_WW_IMG                               "rtl8821A/FW_WoWLAN.bin"\r
-               #define RTL8821_PHY_REG                                 "rtl8821A/PHY_REG.txt" \r
-               #define RTL8821_PHY_RADIO_A                             "rtl8821A/RadioA.txt"\r
-               #define RTL8821_PHY_RADIO_B                             "rtl8821A/RadioB.txt" \r
-               #define RTL8821_TXPWR_TRACK                             "rtl8821A/TxPowerTrack.txt"             \r
-               #define RTL8821_AGC_TAB                                 "rtl8821A/AGC_TAB.txt"\r
-               #define RTL8821_PHY_MACREG                              "rtl8821A/MAC_REG.txt"\r
-               #define RTL8821_PHY_REG_PG                                      "rtl8821A/PHY_REG_PG.txt"\r
-               #define RTL8821_PHY_REG_MP                              "rtl8821A/PHY_REG_MP.txt"\r
-               #define RTL8821_TXPWR_LMT                                       "rtl8821A/TXPWR_LMT.txt" \r
+               #define RTL8821_FW_IMG                                          "rtl8821a/FW_NIC.bin"\r
+               #define RTL8821_FW_WW_IMG                               "rtl8821a/FW_WoWLAN.bin"\r
+               #define RTL8821_PHY_REG                                 "rtl8821a/PHY_REG.txt" \r
+               #define RTL8821_PHY_RADIO_A                             "rtl8821a/RadioA.txt"\r
+               #define RTL8821_PHY_RADIO_B                             "rtl8821a/RadioB.txt" \r
+               #define RTL8821_TXPWR_TRACK                             "rtl8821a/TxPowerTrack.txt"             \r
+               #define RTL8821_AGC_TAB                                 "rtl8821a/AGC_TAB.txt"\r
+               #define RTL8821_PHY_MACREG                              "rtl8821a/MAC_REG.txt"\r
+               #define RTL8821_PHY_REG_PG                                      "rtl8821a/PHY_REG_PG.txt"\r
+               #define RTL8821_PHY_REG_MP                              "rtl8821a/PHY_REG_MP.txt"\r
+               #define RTL8821_TXPWR_LMT                                       "rtl8821a/TXPWR_LMT.txt" \r
 \r
 //---------------------------------------------------------------------\r
 //             RTL8812 Power Configuration CMDs for PCIe interface\r
@@ -159,26 +159,33 @@ typedef struct _RT_FIRMWARE_8812 {
 #define BCN_DMA_ATIME_INT_TIME_8812            0x02\r
 \r
 //for 8812\r
+// TX 128K, RX 16K, Page size 512B for TX, 128B for RX\r
 #define MAX_RX_DMA_BUFFER_SIZE_8812    0x3E80   //0x3FFF       // RX 16K\r
 \r
-#define TX_TOTAL_PAGE_NUMBER_8812              0xF8\r
+#define BCNQ_PAGE_NUM_8812             0x07\r
 \r
+//For WoWLan , more reserved page\r
+//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:1,GTK EXT MEM:1, PNO: 6\r
+#ifdef CONFIG_WOWLAN\r
+#define WOWLAN_PAGE_NUM_8812   0x05\r
+#else\r
+#define WOWLAN_PAGE_NUM_8812   0x00\r
+#endif\r
+\r
+#define TX_TOTAL_PAGE_NUMBER_8812      (0xFF - BCNQ_PAGE_NUM_8812 - WOWLAN_PAGE_NUM_8812)\r
 #define TX_PAGE_BOUNDARY_8812                  (TX_TOTAL_PAGE_NUMBER_8812 + 1)\r
-#define TX_PAGE_LOAD_FW_BOUNDARY_8812          0x47 //0xA5\r
+\r
 #define TX_PAGE_BOUNDARY_WOWLAN_8812           0xE0\r
 \r
+#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812   TX_PAGE_BOUNDARY_8812\r
+#define WMM_NORMAL_TX_PAGE_BOUNDARY_8812               (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 + 1)\r
+\r
 // For Normal Chip Setting\r
-// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C\r
-#define NORMAL_PAGE_NUM_PUBQ_8812                      0xD8\r
+// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8812\r
 #define NORMAL_PAGE_NUM_LPQ_8812                               0x10\r
 #define NORMAL_PAGE_NUM_HPQ_8812                       0x10\r
-#define NORMAL_PAGE_NUM_NPQ_8812                               0x00\r
+#define NORMAL_PAGE_NUM_NPQ_8812                       0x00\r
 \r
-//Note: For WMM Normal Chip Setting ,modify later\r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812   0xFB\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_8812               (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 + 1)\r
-\r
-#define WMM_NORMAL_PAGE_NUM_PUBQ_8812          0x8B\r
 #define WMM_NORMAL_PAGE_NUM_HPQ_8812           0x30\r
 #define WMM_NORMAL_PAGE_NUM_LPQ_8812           0x20\r
 #define WMM_NORMAL_PAGE_NUM_NPQ_8812           0x20\r
@@ -198,24 +205,27 @@ typedef struct _RT_FIRMWARE_8812 {
 #define BCNQ1_PAGE_NUM_8821            0x00\r
 #endif\r
 \r
-// For Normal Chip Setting\r
-#define TX_TOTAL_PAGE_NUMBER_8821              (0xF7 - BCNQ1_PAGE_NUM_8821)\r
+//For WoWLan , more reserved page\r
+//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:1,GTK EXT MEM:1, PNO: 6\r
+#ifdef CONFIG_WOWLAN\r
+#define WOWLAN_PAGE_NUM_8821   0x06\r
+#else\r
+#define WOWLAN_PAGE_NUM_8821   0x00\r
+#endif\r
 \r
+#define TX_TOTAL_PAGE_NUMBER_8821      (0xFF - BCNQ_PAGE_NUM_8821 - BCNQ1_PAGE_NUM_8821 - WOWLAN_PAGE_NUM_8821)\r
 #define TX_PAGE_BOUNDARY_8821                          (TX_TOTAL_PAGE_NUMBER_8821 + 1)\r
 //#define TX_PAGE_BOUNDARY_WOWLAN_8821         0xE0\r
 \r
+#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821   TX_TOTAL_PAGE_NUMBER_8821\r
+#define WMM_NORMAL_TX_PAGE_BOUNDARY_8821               (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 + 1)\r
+\r
+\r
 // (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER\r
-#define NORMAL_PAGE_NUM_PUBQ_8821              (0xE7 - BCNQ1_PAGE_NUM_8821)\r
 #define NORMAL_PAGE_NUM_LPQ_8821                       0x08//0x10\r
 #define NORMAL_PAGE_NUM_HPQ_8821               0x08//0x10\r
 #define NORMAL_PAGE_NUM_NPQ_8821               0x00\r
 \r
-\r
-// For WMM Normal Chip Setting\r
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821   (0xF7 -BCNQ1_PAGE_NUM_8821)\r
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_8821               (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 + 1)\r
-\r
-#define WMM_NORMAL_PAGE_NUM_PUBQ_8821          (0x87 - BCNQ1_PAGE_NUM_8821)\r
 #define WMM_NORMAL_PAGE_NUM_HPQ_8821           0x30\r
 #define WMM_NORMAL_PAGE_NUM_LPQ_8821           0x20\r
 #define WMM_NORMAL_PAGE_NUM_NPQ_8821           0x20\r
@@ -301,6 +311,7 @@ void        Hal_ReadRFEType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFai
 void   Hal_EfuseParseBTCoexistInfo8812A(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail);\r
 void   hal_ReadUsbType_8812AU(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);\r
 int    FirmwareDownloadBT(PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\r
+void   Hal_ReadRemoteWakeup_8812A(PADAPTER padapter, u8* hwinfo, BOOLEAN AutoLoadFail);\r
 \r
 BOOLEAN HalDetectPwrDownMode8812(PADAPTER Adapter);\r
        \r
index d1c202995fb2c7146887a4573b71f84fc141d60a..1ad222dc99057e1914b008f8fba6a823d6bd5df2 100755 (executable)
 \r
 #if defined(CONFIG_USB_HCI)\r
 \r
+#ifndef MAX_RECVBUF_SZ\r
 #ifdef PLATFORM_OS_CE\r
 #define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\r
 #else\r
        #ifndef CONFIG_MINIMAL_MEMORY_USAGE\r
+               #ifdef CONFIG_PLATFORM_MSTAR\r
+                       #define MAX_RECVBUF_SZ (8192) // 8K\r
+               #else\r
                #define MAX_RECVBUF_SZ (32768) // 32k\r
+               #endif\r
                //#define MAX_RECVBUF_SZ (24576) // 24k\r
                //#define MAX_RECVBUF_SZ (20480) //20K\r
                //#define MAX_RECVBUF_SZ (10240) //10K\r
@@ -36,6 +41,7 @@
                #define MAX_RECVBUF_SZ (4000) // about 4K\r
        #endif\r
 #endif\r
+#endif //!MAX_RECVBUF_SZ\r
 \r
 #elif defined(CONFIG_PCI_HCI)\r
 //#ifndef CONFIG_MINIMAL_MEMORY_USAGE\r
index 1daf4103bc3cea1eeca866e1f3ca66957c10db3e..f1e266f14e7b60e464089c56c1eb1c0174309488 100755 (executable)
@@ -75,7 +75,8 @@
 //     0x0200h ~ 0x027Fh       TXDMA Configuration\r
 //\r
 //-----------------------------------------------------\r
-#define REG_TDECTRL1_8812                              0x0228\r
+#define REG_DWBCN0_CTRL_8812                           REG_TDECTRL\r
+#define REG_DWBCN1_CTRL_8812                           0x0228\r
 \r
 //-----------------------------------------------------\r
 //\r
index 00a5117b2c1ef311892ea99eb00717648766e662..bdc4d996075c1f03ef57bfce84988983994cf0a1 100755 (executable)
@@ -45,6 +45,9 @@ enum ANDROID_WIFI_CMD {
        ANDROID_WIFI_CMD_P2P_GET_NOA,   
        ANDROID_WIFI_CMD_P2P_SET_PS,    
        ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE,
+
+       ANDROID_WIFI_CMD_MIRACAST,
+
 #ifdef CONFIG_PNO_SUPPORT
        ANDROID_WIFI_CMD_PNOSSIDCLR_SET,
        ANDROID_WIFI_CMD_PNOSETUP_SET,
@@ -69,16 +72,23 @@ enum ANDROID_WIFI_CMD {
 #ifdef CONFIG_GTK_OL
        ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD,
 #endif //CONFIG_GTK_OL
+       ANDROID_WIFI_CMD_P2P_DISABLE,
        ANDROID_WIFI_CMD_MAX
 };
 
 int rtw_android_cmdstr_to_num(char *cmdstr);
 int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
 
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
+int rtw_android_pno_enable(struct net_device *net, int pno_enable);
+int rtw_android_cfg80211_pno_setup(struct net_device *net,
+               struct cfg80211_ssid *ssid, int n_ssids, int interval);
+#endif
+
 #if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
 int rtw_android_wifictrl_func_add(void);
 void rtw_android_wifictrl_func_del(void);
-void* wl_android_prealloc(int section, unsigned long size);
+void* rtw_wl_android_prealloc(int section, unsigned long size);
 
 int wifi_get_irq_number(unsigned long *irq_flags_ptr);
 int wifi_set_power(int on, unsigned long msec);
index 8a8a340bde7ba6ed95e4db1b80551a4833bec48f..69d781931ea6860715226dd5dba5e32d67920264 100755 (executable)
@@ -74,19 +74,28 @@ enum BEAMFORMING_CTRL_TYPE
        BEAMFORMING_CTRL_LEAVE = 1,\r
        BEAMFORMING_CTRL_START_PERIOD = 2,\r
        BEAMFORMING_CTRL_END_PERIOD = 3,\r
+       BEAMFORMING_CTRL_SOUNDING_FAIL=4,\r
+       BEAMFORMING_CTRL_SOUNDING_CLK=5,\r
 };\r
 \r
 struct beamforming_entry {\r
-       u8                                                      used;\r
-       u8                                                      tx_bf;\r
-       u16                                                     aid;                    // Used to construct AID field of NDPA packet.\r
-       u16                                                     mac_id;         // Used to Set Reg42C in IBSS mode. \r
-       u16                                                     p_aid;          // Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. \r
-       u8                                                      mac_addr[6];// Used to fill Reg6E4 to fill Mac address of CSI report frame.\r
-       CHANNEL_WIDTH                           sound_bw;       // Sounding BandWidth\r
-       u16                                                     sound_period;\r
-       BEAMFORMING_CAP                 beamforming_entry_cap;\r
+       BOOLEAN bUsed;\r
+       BOOLEAN bSound;\r
+       u16     aid;                    // Used to construct AID field of NDPA packet.\r
+       u16     mac_id;         // Used to Set Reg42C in IBSS mode. \r
+       u16     p_aid;          // Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. \r
+       u8      mac_addr[6];// Used to fill Reg6E4 to fill Mac address of CSI report frame.\r
+       CHANNEL_WIDTH   sound_bw;       // Sounding BandWidth\r
+       u16     sound_period;\r
+       BEAMFORMING_CAP beamforming_entry_cap;\r
        BEAMFORMING_ENTRY_STATE beamforming_entry_state;\r
+       u8      LogSeq;\r
+       u8      LogRetryCnt;\r
+       u8      LogSuccessCnt;\r
+       u8      LogStatusFailCnt;\r
+       u8      PreCsiReport[327];\r
+       u8      DefaultCsiCnt;\r
+       BOOLEAN bDefaultCSI;\r
 };\r
 \r
 struct sounding_info {\r
@@ -102,12 +111,30 @@ struct beamforming_info {
        struct beamforming_entry        beamforming_entry[BEAMFORMING_ENTRY_NUM];\r
        u8                                              beamforming_cur_idx;\r
        u8                                              beamforming_in_progress;\r
+       u8                                              sounding_sequence;\r
        struct sounding_info            sounding_info;\r
 };\r
 \r
+struct rtw_ndpa_sta_info {\r
+       u16     aid:12; \r
+       u16     feedback_type:1;\r
+       u16     nc_index:3;     \r
+};\r
+\r
+BEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv ,u8 mac_id);\r
 void   beamforming_notify(PADAPTER adapter);\r
 BEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info   *pBeamInfo);\r
 \r
+u32    beamforming_get_report_frame(PADAPTER    Adapter, union recv_frame *precv_frame);\r
+void   beamforming_get_ndpa_frame(PADAPTER      Adapter, union recv_frame *precv_frame);\r
+\r
+BOOLEAN        beamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx);\r
+BOOLEAN        beamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx);\r
+\r
+void   beamforming_check_sounding_success(PADAPTER Adapter,BOOLEAN status);\r
+\r
+void   beamforming_watchdog(PADAPTER Adapter);\r
+\r
 void   beamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf);\r
 u8     beamforming_wk_cmd(_adapter*padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue);\r
 \r
index 7a1fa0d5242292bf9ef62854f39771583fd24655..9ede51af8d6a66674d6aec06c21d47875c67a929 100755 (executable)
@@ -75,7 +75,7 @@ typedef enum _MP_BT_PAYLOAD_TYPE{
        MP_BT_PAYLOAD_ALL_0                                             = 2,\r
        MP_BT_PAYLOAD_11110000                                  = 3,\r
        MP_BT_PAYLOAD_PRBS9                                             = 4,\r
-       MP_BT_PAYLOAD_MAX\r
+       MP_BT_PAYLOAD_MAX                                               = 8,\r
 }MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE;\r
 \r
 \r
index 4a639afadc3144386471f92ff2ff216054f15986..9086a61b66d53185d5fbfeda96e7a489173826d6 100755 (executable)
 #define        PACKET_EAPOL                    3
 
 void rtw_btcoex_Initialize(PADAPTER);
-void rtw_btcoex_HAL_Initialize(PADAPTER padapter);
+void rtw_btcoex_PowerOnSetting(PADAPTER padapter);
+void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly);
 void rtw_btcoex_IpsNotify(PADAPTER, u8 type);
 void rtw_btcoex_LpsNotify(PADAPTER, u8 type);
 void rtw_btcoex_ScanNotify(PADAPTER, u8 type);
 void rtw_btcoex_ConnectNotify(PADAPTER, u8 action);
 void rtw_btcoex_MediaStatusNotify(PADAPTER, u8 mediaStatus);
 void rtw_btcoex_SpecialPacketNotify(PADAPTER, u8 pktType);
+void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state);
 void rtw_btcoex_BtInfoNotify(PADAPTER, u8 length, u8 *tmpBuf);
 void rtw_btcoex_SuspendNotify(PADAPTER, u8 state);
 void rtw_btcoex_HaltNotify(PADAPTER);
-void rtw_btcoex_SwitchGntBt(PADAPTER);
+void rtw_btcoex_SwitchBtTRxMask(PADAPTER);
 void rtw_btcoex_Switch(PADAPTER, u8 enable);
 u8 rtw_btcoex_IsBtDisabled(PADAPTER);
 void rtw_btcoex_Handler(PADAPTER);
@@ -55,6 +57,7 @@ void rtw_btcoex_SetBTCoexist(PADAPTER, u8 bBtExist);
 void rtw_btcoex_SetChipType(PADAPTER, u8 chipType);
 void rtw_btcoex_SetPGAntNum(PADAPTER, u8 antNum);
 u8 rtw_btcoex_GetPGAntNum(PADAPTER);
+void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
 u32 rtw_btcoex_GetRaMask(PADAPTER);
 void rtw_btcoex_RecordPwrMode(PADAPTER, u8 *pCmdBuf, u8 cmdLen);
 void rtw_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize);
index c7af567d87440dfc41492c7a041219a3ddfbc53e..154cf40808963717e5d07631238b7180c88442d3 100755 (executable)
@@ -69,7 +69,8 @@
                u32     cmd_issued_cnt;
                u32     cmd_done_cnt;
                u32     rsp_cnt;
-               u8 cmdthd_running;
+               ATOMIC_T cmdthd_running;
+               //u8 cmdthd_running;
                u8 stop_req;
                _adapter *padapter;
                _mutex sctx_mutex;
@@ -130,6 +131,16 @@ do {\
        pcmd->rspsz = 0;\
 } while(0)
 
+#define init_h2fwcmd_w_parm_no_parm_rsp(pcmd, code) \
+do {\
+       _rtw_init_listhead(&pcmd->list);\
+       pcmd->cmdcode = code;\
+       pcmd->parmbuf = NULL;\
+       pcmd->cmdsz = 0;\
+       pcmd->rsp = NULL;\
+       pcmd->rspsz = 0;\
+} while(0)
+
 struct c2h_evt_hdr {
        u8 id:4;
        u8 plen:4;
@@ -211,7 +222,9 @@ enum rtw_drvextra_cmd_id
        DM_RA_MSK_WK_CID, //add for STA update RAMask when bandwith change.
        BEAMFORMING_WK_CID,
        LPS_CHANGE_DTIM_CID,
-       MAX_WK_CID};
+       BTINFO_WK_CID,
+       MAX_WK_CID
+};
 
 enum LPS_CTRL_TYPE
 {
@@ -375,7 +388,7 @@ when shared key ==> algorithm/keyid
 struct set_stakey_parm {
        u8      addr[ETH_ALEN];
        u8      algorithm;
-       u8      id;// currently for erasing cam entry if algorithm == _NO_PRIVACY_ 
+       u8      keyid;
        u8      key[16];
 };
 
@@ -971,8 +984,11 @@ extern u8 rtw_createbss_cmd(_adapter  *padapter);
 extern u8 rtw_createbss_cmd_ex(_adapter  *padapter, unsigned char *pbss, unsigned int sz);
 u8 rtw_startbss_cmd(_adapter  *padapter, int flags);
 extern u8 rtw_setphy_cmd(_adapter  *padapter, u8 modem, u8 ch);
-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);
+
+struct sta_info;
+extern u8 rtw_setstakey_cmd(_adapter  *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue);
+extern u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, 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, bool enqueue);
@@ -1008,7 +1024,7 @@ u8 rtw_rpt_timer_cfg_cmd(_adapter*padapter, u16 minRptTime);
 extern  u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue);
 #endif
 
-u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter);
+u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta);
 
 extern u8 rtw_ps_cmd(_adapter*padapter);
 
@@ -1016,6 +1032,10 @@ extern u8 rtw_ps_cmd(_adapter*padapter);
 u8 rtw_chk_hi_queue_cmd(_adapter*padapter);
 #endif
 
+#ifdef CONFIG_BT_COEXIST
+u8 rtw_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length);
+#endif
+
 u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue);
 extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enqueue, u8 swconfig);
 extern u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed);
@@ -1120,6 +1140,7 @@ enum rtw_h2c_cmd
 
        GEN_CMD_CODE(_SetChannelSwitch), /*61*/
        GEN_CMD_CODE(_TDLS), /*62*/
+       GEN_CMD_CODE(_ChkBMCSleepq), /*63*/
        
        MAX_H2CCMD
 };
@@ -1202,6 +1223,7 @@ struct _cmd_callback      rtw_cmd_callback[] =
        
        {GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/
        {GEN_CMD_CODE(_TDLS), NULL},/*62*/
+       {GEN_CMD_CODE(_ChkBMCSleepq), NULL}, /*63*/
 };
 #endif
 
index ab506b6963327920977035ff5546933e847a91d6..c9545411d89218c5ed57374accb67b6a76758ced 100755 (executable)
@@ -317,6 +317,12 @@ extern void rtl871x_cedbg(const char *fmt, ...);
 #endif /* defined(_dbgdump) */
 #endif /* CONFIG_DEBUG_RTL871X */
 
+#ifdef CONFIG_DBG_COUNTER
+#define DBG_COUNTER(counter) counter++
+#else
+#define DBG_COUNTER(counter) 
+#endif
+
 void dump_drv_version(void *sel);
 void dump_log_level(void *sel);
 
@@ -346,6 +352,7 @@ ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, siz
 int proc_get_qos_option(struct seq_file *m, void *v);
 int proc_get_ht_option(struct seq_file *m, void *v);
 int proc_get_rf_info(struct seq_file *m, void *v);
+int proc_get_survey_info(struct seq_file *m, void *v);
 int proc_get_ap_info(struct seq_file *m, void *v);
 int proc_get_adapter_state(struct seq_file *m, void *v);
 int proc_get_trx_info(struct seq_file *m, void *v);
@@ -354,6 +361,7 @@ ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t c
 int proc_get_suspend_resume_info(struct seq_file *m, void *v);
 
 ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
 #ifdef CONFIG_AP_MODE
 int proc_get_all_sta_info(struct seq_file *m, void *v);
@@ -370,6 +378,7 @@ ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size
 
 int proc_get_rx_signal(struct seq_file *m, void *v);
 ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+int proc_get_hw_status(struct seq_file *m, void *v);
 
 #ifdef CONFIG_80211N_HT
 int proc_get_ht_enable(struct seq_file *m, void *v);
@@ -391,7 +400,7 @@ ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t co
 int proc_get_en_fwps(struct seq_file *m, void *v);
 ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
-int proc_get_two_path_rssi(struct seq_file *m, void *v);
+//int proc_get_two_path_rssi(struct seq_file *m, void *v);
 int proc_get_rssi_disp(struct seq_file *m, void *v);
 ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
@@ -414,6 +423,17 @@ ssize_t proc_set_odm_dbg_level(struct file *file, const char __user *buffer, siz
 int proc_get_odm_adaptivity(struct seq_file *m, void *v);
 ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
 
+#ifdef CONFIG_DBG_COUNTER
+int proc_get_rx_logs(struct seq_file *m, void *v);
+int proc_get_tx_logs(struct seq_file *m, void *v);
+int proc_get_int_logs(struct seq_file *m, void *v);
+#endif
+
+#ifdef CONFIG_PCI_HCI
+int proc_get_rx_ring(struct seq_file *m, void *v);
+int proc_get_tx_ring(struct seq_file *m, void *v);
+#endif
+
 #endif /* CONFIG_PROC_DEBUG */
 
 #endif //__RTW_DEBUG_H__
index 24eb1a06f13012e3ce0c1e5d3e54d26eeeba22c6..7705adc9bd5267b6b2e2c61d21c0c8d26384a80f 100755 (executable)
@@ -121,10 +121,11 @@ struct eeprom_priv
        u16             CustomerID;
 
        u8              efuse_eeprom_data[EEPROM_MAX_SIZE]; //92C:256bytes, 88E:512bytes, we use union set (512bytes)
+       u8              adjuseVoltageVal;
 
 #ifdef CONFIG_RF_GAIN_OFFSET
-               u8              EEPROMRFGainOffset;
-               u8              EEPROMRFGainVal;
+       u8              EEPROMRFGainOffset;
+       u8              EEPROMRFGainVal;
 #endif //CONFIG_RF_GAIN_OFFSET
 
 #ifdef CONFIG_SDIO_HCI
index f713f84d3fcf3b36b10396a2243f467da673a81e..9dbab56fa0ca474fc67ec25d481b17340d9df106 100755 (executable)
@@ -141,5 +141,8 @@ u8  Efuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *
 u8     EFUSE_Read1Byte(PADAPTER pAdapter, u16 Address);
 void   EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);
 void   EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value);
+void Rtw_Hal_ReadMACAddrFromFile(PADAPTER padapter);
+u32 Rtw_Hal_readPGDataFromConfigFile(PADAPTER  padapter);
+
 #endif
 
index e2c63248d3a75c768fa03e733c558e4469567619..2fb9503e89c58413f469bc5c6e717f43104ab8a9 100755 (executable)
@@ -82,6 +82,10 @@ struct addba_event
        unsigned int tid;
 };
 
+struct wmm_event
+{
+       unsigned char wmm;
+};
 
 #ifdef CONFIG_H2CLBK
 struct c2hlbk_event{
index 0c4928a8db054fcc4dda67cb730fcc084e485955..40269af8ed05a73a42b872ca7ac02fc595dd7916 100755 (executable)
@@ -32,6 +32,8 @@ struct ht_priv
        u32     tx_amsdu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx
        u32     rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback.
        
+       u8      rx_ampdu_min_spacing;
+       
        u8      ch_offset;//PRIME_CHNL_OFFSET
        u8      sgi_20m;
        u8      sgi_40m;
@@ -91,8 +93,32 @@ typedef enum _RT_HT_INF1_CAP{
 #define        BEAMFORMING_HT_BEAMFORMEE_ENABLE        BIT1    // Declare our NIC supports beamformee
 #define        BEAMFORMING_HT_BEAMFORMER_TEST          BIT2    // Transmiting Beamforming no matter the target supports it or not
 
+//------------------------------------------------------------
+// The HT Control field
+//------------------------------------------------------------
+#define SET_HT_CTRL_CSI_STEERING(_pEleStart, _val)                                     SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 2, _val)
+#define SET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart, _val)                 SET_BITS_TO_LE_1BYTE((_pEleStart)+3, 0, 1, _val)
+#define GET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart)                                       LE_BITS_TO_1BYTE((_pEleStart)+3, 0, 1)
+
+// 20/40 BSS Coexist
 #define SET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart, _val)                   SET_BITS_TO_LE_1BYTE((_pEleStart), 0, 1, _val)
 #define GET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart)                         LE_BITS_TO_1BYTE((_pEleStart), 0, 1)
 
+
+#define GET_HT_CAPABILITY_ELE_LDPC_CAP(_pEleStart)                             LE_BITS_TO_1BYTE(_pEleStart, 0, 1)
+#define GET_HT_CAPABILITY_ELE_TX_STBC(_pEleStart)                                      LE_BITS_TO_1BYTE(_pEleStart, 7, 1)
+
+#define GET_HT_CAPABILITY_ELE_RX_STBC(_pEleStart)                                      LE_BITS_TO_1BYTE((_pEleStart)+1, 0, 2)
+
+//TXBF Capabilities
+#define SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(_pEleStart, _val)                                      SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 3, 1, ((u8)_val) )
+#define SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(_pEleStart, _val)                             SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 4, 1, ((u8)_val) )
+#define SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart, _val)           SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 10, 1, ((u8)_val) )
+#define SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart, _val)           SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 15, 2, ((u8)_val) )
+#define SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(_pEleStart, _val)   SET_BITS_TO_LE_4BYTE( ((u8 *)(_pEleStart))+21, 23, 2, ((u8)_val) )
+
+#define GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart)                 LE_BITS_TO_4BYTE((_pEleStart)+21, 10, 1)
+#define GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart)                 LE_BITS_TO_4BYTE((_pEleStart)+21, 15, 2)
+
 #endif //_RTL871X_HT_H_
 
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mem.h b/drivers/net/wireless/rockchip_wlan/rtl8723bs/include/rtw_mem.h
new file mode 100755 (executable)
index 0000000..5283d77
--- /dev/null
@@ -0,0 +1,38 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ *                                        \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#ifndef __RTW_MEM_H__\r
+#define __RTW_MEM_H__\r
+\r
+#include <drv_conf.h>\r
+#include <basic_types.h>\r
+#include <osdep_service.h>\r
+\r
+\r
+#ifndef MAX_RECVBUF_SZ\r
+#define MAX_RECVBUF_SZ (32768-RECVBUFF_ALIGN_SZ) // 32k\r
+#endif\r
+\r
+struct u8* rtw_alloc_revcbuf_premem(void);\r
+struct sk_buff *rtw_alloc_skb_premem(void);\r
+int rtw_free_skb_premem(struct sk_buff *pskb);\r
+\r
+\r
+#endif //__RTW_MEM_H__\r
+\r
index 87b5ab6a4619af988d7804fdf83f4a72460c4731..891bdaf8f387bd22cb4f9d4b3a8e34fd512c2da0 100755 (executable)
@@ -256,7 +256,6 @@ struct cfg80211_wifidirect_info{
        u64                                             remain_on_ch_cookie;
        bool is_ro_ch;
        u32 last_ro_ch_time; /* this will be updated at the beginning and end of ro_ch */
-       u8                                              chk_invite_ch_list;
 };
 #endif //CONFIG_IOCTL_CFG80211
 
@@ -366,12 +365,10 @@ struct tdls_ss_record{    //signal strength record
 
 struct tdls_info{
        u8                                      ap_prohibited;
-       uint                                    setup_state;
+       u8                                      link_established;
        u8                                      sta_cnt;
        u8                                      sta_maximum;    // 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else;
        struct tdls_ss_record   ss_record;
-       u8                                      macid_index;    //macid entry that is ready to write
-       u8                                      clear_cam;      //cam entry that is trying to clear, using it in direct link teardown
        u8                                      ch_sensing;
        u8                                      cur_channel;
        u8                                      candidate_ch;
@@ -380,12 +377,23 @@ struct tdls_info{
        _lock                           hdl_lock;
        u8                                      watchdog_count;
        u8                                      dev_discovered;         //WFD_TDLS: for sigma test
-       u8                                      enable;
+       u8                                      tdls_enable;
+       u8                                      external_setup; // _TRUE: setup is handled by wpa_supplicant
 #ifdef CONFIG_WFD
        struct wifi_display_info                *wfd_info;
 #endif         
 };
 
+struct tdls_txmgmt {
+       u8 peer[ETH_ALEN];
+       u8 action_code;
+       u8 dialog_token;
+       u16 status_code;
+       u8 *buf;
+       size_t len;
+       u8 external_support;
+};
+
 /* used for mlme_priv.roam_flags */
 enum {
        RTW_ROAM_ON_EXPIRED = BIT0,
@@ -481,8 +489,6 @@ struct mlme_priv {
        u8      ChannelPlan;
        RT_SCAN_TYPE    scan_mode; // active: 1, passive: 0
 
-       //u8 probereq_wpsie[MAX_WPS_IE_LEN];//added in probe req        
-       //int probereq_wpsie_len;
        u8 *wps_probe_req_ie;
        u32 wps_probe_req_ie_len;
 
@@ -613,6 +619,8 @@ struct mlme_priv {
        u8      scanning_via_buddy_intf;
 #endif
 
+       u8      NumOfBcnInfoChkFail;
+       u32     timeBcnInfoChkStart;
 };
 
 #define rtw_mlme_set_auto_scan_int(adapter, ms) \
@@ -648,6 +656,7 @@ extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf);
 extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf);
 extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf);
 extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf);
+extern void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf);
 
 extern void rtw_join_timeout_handler(RTW_TIMER_HDL_ARGS);
 extern void _rtw_scan_timeout_handler(RTW_TIMER_HDL_ARGS);
@@ -770,6 +779,8 @@ extern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *
 extern void rtw_generate_random_ibss(u8 *pibss);
 extern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr);
 extern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue);
+struct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network);
+struct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network);
 
 extern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue);
 extern void rtw_indicate_disconnect(_adapter* adapter);
@@ -836,6 +847,7 @@ void rtw_joinbss_reset(_adapter *padapter);
 
 #ifdef CONFIG_80211N_HT
 void   rtw_ht_use_default_setting(_adapter *padapter);
+void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len);
 unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel);
 void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel);
 void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe);
@@ -843,7 +855,7 @@ void rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len);
 #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
 #define rtw_roam_flags(adapter) ((adapter)->mlmepriv.roam_flags)
index e609725067d00b173b1f0756d824802af28e9334..31be126a7a313a5eef9d6ef4ccf15f2ff074cd65 100755 (executable)
 #define                _48M_RATE_      10
 #define                _54M_RATE_      11
 
+/********************************************************
+MCS rate definitions
+*********************************************************/
+#define MCS_RATE_1R    (0x000000ff)
+#define MCS_RATE_2R    (0x0000ffff)
+#define MCS_RATE_3R    (0x00ffffff)
+#define MCS_RATE_4R    (0xffffffff)
+#define MCS_RATE_2R_13TO15_OFF (0x00001fff)
+
 
 extern unsigned char RTW_WPA_OUI[];
 extern unsigned char WMM_OUI[];
@@ -374,13 +383,11 @@ struct    ss_res
 // 8: Set channel back to base channel
 // 9: Set channel back to off channel
 // 10: Restore RCR DATA BIT
-// 11: Check alive
-// 12: Check alive
-// 13: Free TDLS sta
+// 11: Free TDLS sta
 enum TDLS_option
 {
-       TDLS_WRCR                       =       1,
-       TDLS_SD_PTI             =       2,
+       TDLS_ESTABLISHED        =       1,
+       TDLS_SD_PTI             =       2,
        TDLS_CS_OFF             =       3,
        TDLS_INIT_CH_SEN        =       4,
        TDLS_DONE_CH_SEN        =       5,
@@ -389,9 +396,7 @@ enum TDLS_option
        TDLS_P_OFF_CH           =       8,
        TDLS_P_BASE_CH  =       9,
        TDLS_RS_RCR             =       10,
-       TDLS_CKALV_PH1  =       11,
-       TDLS_CKALV_PH2  =       12,
-       TDLS_FREE_STA           =       13,
+       TDLS_TEAR_STA           =       11,
        maxTDLS,
 };
 
@@ -557,6 +562,9 @@ struct mlme_ext_priv
        struct p2p_channels channel_list;
        unsigned char   basicrate[NumRates];
        unsigned char   datarate[NumRates];
+#ifdef CONFIG_80211N_HT
+       unsigned char default_supported_mcs_set[16];
+#endif
        
        struct ss_res           sitesurvey_res;         
        struct mlme_ext_info    mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info.
@@ -604,6 +612,7 @@ struct mlme_ext_priv
        
 };
 
+void init_mlme_default_rate_set(_adapter* padapter);
 int init_mlme_ext_priv(_adapter* padapter);
 int init_hw_mlme_ext(_adapter *padapter);
 void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext);
@@ -619,6 +628,7 @@ unsigned char networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta);
 
 u8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen);
 void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len);
+void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask);
 void UpdateBrateTbl(_adapter *padapter,u8 *mBratesOS);
 void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen);
 void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
@@ -651,8 +661,18 @@ unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval);
 
 void read_cam(_adapter *padapter ,u8 entry, u8 *get_key);
 
-void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key);
-void clear_cam_entry(_adapter *padapter, u8 entry);
+/* modify HW only */
+void _write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key);
+void _clear_cam_entry(_adapter *padapter, u8 entry);
+void write_cam_from_cache(_adapter *adapter, u8 id);
+
+/* modify both HW and cache */
+void write_cam(_adapter *padapter, u8 id, u16 ctrl, u8 *mac, u8 *key);
+void clear_cam_entry(_adapter *padapter, u8 id);
+
+/* modify cache only */
+void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key);
+void clear_cam_cache(_adapter *adapter, u8 id);
 
 void invalidate_cam_all(_adapter *padapter);
 void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex);
@@ -689,6 +709,7 @@ void HTOnAssocRsp(_adapter *padapter);
 
 void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
 void VCS_update(_adapter *padapter, struct sta_info *psta);
+void   update_ldpc_stbc_cap(struct sta_info *psta);
 
 void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta);
 int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len);
@@ -718,9 +739,14 @@ unsigned int is_ap_in_tkip(_adapter *padapter);
 unsigned int is_ap_in_wep(_adapter *padapter);
 unsigned int should_forbid_n_rate(_adapter * padapter);
 
-extern uint rtw_get_camid(uint macid);
+s16 rtw_get_camid(_adapter *adapter, struct sta_info* sta, s16 kid);
+s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid);
+s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid);
+void rtw_camid_free(_adapter *adapter, u8 cam_id);
+
 extern void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);
 extern void rtw_release_macid(_adapter *padapter, struct sta_info *psta);
+extern u8 rtw_search_max_mac_id(_adapter *padapter);
 
 void report_join_res(_adapter *padapter, int res);
 void report_survey_event(_adapter *padapter, union recv_frame *precv_frame);
@@ -728,8 +754,10 @@ void report_surveydone_event(_adapter *padapter);
 void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason);
 void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx);
 bool rtw_port_switch_chk(_adapter *adapter);
+void report_wmm_edca_update(_adapter *padapter);
 
 void beacon_timing_control(_adapter *padapter);
+u8 chk_bmc_sleepq_cmd(_adapter* padapter);
 extern u8 set_tx_beacon_cmd(_adapter*padapter);
 unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame);
 void update_mgnt_tx_rate(_adapter *padapter, u8 rate);
@@ -754,7 +782,7 @@ void issue_assocreq(_adapter *padapter);
 void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type);
 void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status);
 void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da);
-s32 issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8* da, int try_cnt, int wait_ms);
+s32 issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8* da, u8 ch, bool append_wps, int try_cnt, int wait_ms);
 int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
 s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da);
 int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms);
@@ -796,6 +824,7 @@ unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame);
 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_vht(_adapter *padapter, union recv_frame *precv_frame);
 unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame);
 
 
@@ -843,6 +872,7 @@ extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
 extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext);
 extern void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
 extern u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer);
+extern void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer);
 
 #ifdef CONFIG_CONCURRENT_MODE
  sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state);
@@ -896,6 +926,7 @@ u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf);
 
 u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf);
 u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf);
+u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf);
 u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf);
 u8 set_ch_hdl(_adapter *padapter, u8 *pbuf);
 u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf);
@@ -977,6 +1008,7 @@ struct cmd_hdl wlancmds[] =
 
        GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), set_csa_hdl) /*61*/
        GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/
+       GEN_MLME_EXT_HANDLER(0, chk_bmc_sleepq_hdl) /*63*/
 };
 
 #endif
@@ -1037,6 +1069,7 @@ enum rtw_c2h_event
        GEN_EVT_CODE(_C2HBCN),
        GEN_EVT_CODE(_ReportPwrState),          //filen: only for PCIE, USB     
        GEN_EVT_CODE(_CloseRF),                         //filen: only for PCIE, work around ASPM
+       GEN_EVT_CODE(_WMM),                                     /*25*/
        MAX_C2HEVT
 };
 
@@ -1071,6 +1104,8 @@ static struct fwevent wlanevents[] =
        {0, NULL},
        {0, &rtw_cpwm_event_callback},
        {0, NULL},
+       {0, &rtw_wmm_event_callback},
+
 };
 
 #endif//_RTL8192C_CMD_C_
index 9d65819569dd50afebf5ba6ae026dc6e55bfadff..2663a2211e992f3794d693b08c4fa5630fb53d33 100755 (executable)
@@ -347,6 +347,9 @@ enum {
        CTA_TEST,
        MP_DISABLE_BT_COEXIST,
        MP_PwrCtlDM,
+#ifdef CONFIG_WOWLAN
+       MP_WOW_ENABLE,
+#endif
 #ifdef CONFIG_AP_WOWLAN
        MP_AP_WOW_ENABLE,
 #endif
@@ -370,6 +373,7 @@ struct mp_priv
        //Tx Section
        u8 TID;
        u32 tx_pktcount;
+       u32 pktInterval;
        struct mp_tx tx;
 
        //Rx Section
@@ -378,7 +382,7 @@ struct mp_priv
        u32 rx_pktcount_filter_out;
        u32 rx_crcerrpktcount;
        u32 rx_pktloss;
-
+       BOOLEAN  rx_bindicatePkt;
        struct recv_stat rxstat;
 
        //RF/BB relative
@@ -680,6 +684,9 @@ typedef enum        _MPT_TXPWR_DEF{
 #elif defined(CONFIG_RTL8723B)
        #define         REG_RF_BB_GAIN_OFFSET   0x7f
        #define         RF_GAIN_OFFSET_MASK     0xfffff
+#elif defined(CONFIG_RTL8188E)
+       #define         REG_RF_BB_GAIN_OFFSET   0x55
+       #define         RF_GAIN_OFFSET_MASK     0xfffff
 #else
        #define         REG_RF_BB_GAIN_OFFSET   0x55
        #define         RF_GAIN_OFFSET_MASK     0xfffff
@@ -782,7 +789,7 @@ extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
 extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
 extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
 extern void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCapVal);
-extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
+//extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
 extern void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter ,BOOLEAN bMain);
 extern ULONG mpt_ProQueryCalTxPower(PADAPTER   pAdapter,u8 RfPath);
 extern void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart);
index 781bb821994888c6d816c54c516ab939e065fe71..340015cd3b2b6255d7b73acfb987687a00f48fea 100755 (executable)
 #define                bMaskByte1              0xff00
 #define                bMaskByte2              0xff0000
 #define                bMaskByte3              0xff000000
-#define                bMaskHWord              0xffff0000
+#define                bMaskHWord      0xffff0000
 #define                bMaskLWord              0x0000ffff
-#define                bMaskDWord              0xffffffff
-#define                bMaskH4Bits             0xf0000000      
-#define        bMaskOFDM_D             0xffc00000
+#define                bMaskDWord      0xffffffff
+#define                bMaskH4Bits             0xf0000000
+#define                bMaskH3Bytes    0xffffff00
+#define                bMaskOFDM_D     0xffc00000
 #define                bMaskCCK                0x3f3f3f3f
 #define                bMask12Bits             0xfff
 
index 148e44d1c49402193365b99a00957d4fc25550e7..50edd0124aee8e2f7b307adca3ea714d3b2c4483 100755 (executable)
@@ -37,6 +37,6 @@ void rtw_odm_ability_set(_adapter *adapter, u32 ability);
 void rtw_odm_adaptivity_parm_msg(void *sel,_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);
-
+void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter);
 #endif // __RTW_ODM_H__
 
index 4e6ae962e11096658bde011da66e17a7782a86df..8b3f3ab568dcc2f9910e182da8f5d068fcf9f1f1 100755 (executable)
@@ -209,7 +209,7 @@ typedef struct pno_nlo_info
        u32     slow_scan_period;                       //slow scan period
        u32     fast_scan_iterations;                   //Fast scan iterations
        u8      ssid_length[MAX_PNO_LIST_COUNT];        //SSID Length Array
-       u8      ssid_chiper_info[MAX_PNO_LIST_COUNT];   //Chiper information for security
+       u8      ssid_cipher_info[MAX_PNO_LIST_COUNT];   //Cipher information for security
        u8      ssid_channel_info[MAX_PNO_LIST_COUNT];  //channel information
 }pno_nlo_info_t;       
 
@@ -281,9 +281,11 @@ struct pwrctrl_priv
        uint    ips_leave_cnts;
 
        u8      ips_mode; 
+       u8      ips_org_mode; 
        u8      ips_mode_req; // used to accept the mode setting request, will update to ipsmode later
        uint bips_processing;
        u32 ips_deny_time; /* will deny IPS when system time is smaller than this */
+       u8 pre_ips_type;// 0: default flow, 1: carddisbale flow
 
        // ps_deny: if 0, power save is free to go; otherwise deny all kinds of power save.
        // Use PS_DENY_REASON to decide reason.
@@ -297,6 +299,7 @@ struct pwrctrl_priv
        u8      bLeisurePs;
        u8      LpsIdleCount;
        u8      power_mgnt;
+       u8      org_power_mgnt;
        u8      bFwCurrentInPSMode;
        u32     DelayLPSLastTimeStamp;
        s32             pnp_current_pwr_state;
@@ -312,14 +315,16 @@ struct pwrctrl_priv
        u8              bSupportRemoteWakeup;   
        u8              wowlan_wake_reason;
        u8              wowlan_ap_mode;
+       u8              wowlan_mode;
 #ifdef CONFIG_WOWLAN
-       u8              wowlan_mode;    u8              wowlan_pattern;
+       u8              wowlan_pattern;
        u8              wowlan_magic;
        u8              wowlan_unicast;
        u8              wowlan_pattern_idx;
        u8              wowlan_pno_enable;
 #ifdef CONFIG_PNO_SUPPORT
        u8              pno_in_resume;
+       u8              pno_inited;
        pno_nlo_info_t  *pnlo_info;
        pno_scan_info_t *pscan_info;
        pno_ssid_list_t *pno_ssid_list;
@@ -398,8 +403,6 @@ extern void cpwm_int_hdl(PADAPTER padapter, struct reportpwrstate_parm *preportp
 extern void LPS_Leave_check(PADAPTER padapter);
 #endif
 
-extern void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);
-extern void rtw_set_rpwm(_adapter * padapter, u8 val8);
 extern void LeaveAllPowerSaveMode(PADAPTER Adapter);
 extern void LeaveAllPowerSaveModeDirect(PADAPTER Adapter);
 #ifdef CONFIG_IPS
@@ -425,7 +428,9 @@ int rtw_fw_ps_state(PADAPTER padapter);
 s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms);
 void LPS_Enter(PADAPTER padapter, const char *msg);
 void LPS_Leave(PADAPTER padapter, const char *msg);
-void   traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets);
+void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets);
+void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);
+void rtw_set_rpwm(_adapter * padapter, u8 val8);
 #endif
 
 #ifdef CONFIG_RESUME_IN_WORKQUEUE
index a5eb0480573ee82e4b82e56783c3699dc9735ee8..ce01eb193e733b715ca46ccff03bde46f66febad 100755 (executable)
@@ -190,12 +190,27 @@ struct phy_info
        u8              BTRxRSSIPercentage;     
        u8              SignalStrength; // in 0-100 index.
 
-       u8              RxPwr[4];                               //per-path's pwdb
+       s8              RxPwr[4];                               //per-path's pwdb
        u8              RxSNR[4];                               //per-path's SNR        
        u8              BandWidth;
        u8              btCoexPwrAdjust;
 };
 
+#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+struct rx_raw_rssi
+{
+       u8 data_rate;
+       u8 pwdball;
+       s8 pwr_all;
+       
+       u8 mimo_singal_strength[4];// in 0~100 index
+       u8 mimo_singal_quality[4];
+       
+       s8 ofdm_pwr[4];
+       u8 ofdm_snr[4];
+
+};
+#endif
 
 struct rx_pkt_attrib   {
        u16     pkt_len;
@@ -263,7 +278,16 @@ struct rx_pkt_attrib       {
 
 #define RECVBUFF_ALIGN_SZ 8
 
+#if defined (CONFIG_RTL8192E)
+       #ifdef CONFIG_PCI_HCI
+               #define RXDESC_SIZE 16
+               #define RX_WIFI_INFO_SIZE       24
+       #else
+               #define RXDESC_SIZE     24
+       #endif
+#else
 #define RXDESC_SIZE    24
+#endif
 #define RXDESC_OFFSET RXDESC_SIZE
 
 struct recv_stat
@@ -272,10 +296,13 @@ struct recv_stat
 
        unsigned int rxdw1;
 
+#if !(defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI)) //exclude 8192ee
        unsigned int rxdw2;
 
        unsigned int rxdw3;
+#endif
 
+#ifndef BUF_DESC_ARCH
        unsigned int rxdw4;
 
        unsigned int rxdw5;
@@ -285,6 +312,7 @@ struct recv_stat
 
        unsigned int rxdw7;
 #endif
+#endif //if BUF_DESC_ARCH is defined, rx_buf_desc occupy 4 double words
 };
 
 #define EOR BIT(30)
@@ -301,6 +329,8 @@ struct rtw_rx_ring {
 };
 #endif
 
+
+
 /*
 accesser of recv_priv: rtw_recv_entry(dispatch / passive level); recv_thread(passive) ; returnpkt(dispatch)
 ; halt(passive) ;
@@ -380,9 +410,6 @@ struct recv_priv
        struct ifqueue rx_indicate_queue;
 #endif // CONFIG_RX_INDICATE_QUEUE
 
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-       _queue  recv_buf_pending_queue;
-#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
 #endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
 
        u8 *pallocated_recv_buf;
@@ -390,7 +417,7 @@ struct recv_priv
        _queue  free_recv_buf_queue;
        u32     free_recv_buf_queue_cnt;
 
-#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_USB_HCI) 
        _queue  recv_buf_pending_queue;
 #endif
 
@@ -404,14 +431,19 @@ struct recv_priv
        //For display the phy informatiom
        u8 is_signal_dbg;       // for debug
        u8 signal_strength_dbg; // for debug
-       s8 rssi;
-       s8 rxpwdb;
+       
        u8 signal_strength;
        u8 signal_qual;
-       u8 noise;
-       int RxSNRdB[2];
-       s8 RxRssi[2];
-       int FalseAlmCnt_all;
+       s8 rssi;        //translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength);
+       #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
+       struct rx_raw_rssi raw_rssi_info;
+       #endif
+       //s8 rxpwdb;    
+       s16 noise;      
+       //int RxSNRdB[2];
+       //s8 RxRssi[2];
+       //int FalseAlmCnt_all;
+       
 
 #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
        _timer signal_stat_timer;
@@ -803,9 +835,14 @@ __inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
 {
        s32     SignalPower; // in dBm.
 
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+       // Translate to dBm (x=y-100)
+       SignalPower = SignalStrengthIndex - 100;
+#else
        // Translate to dBm (x=0.5y-95).
        SignalPower = (s32)((SignalStrengthIndex + 1) >> 1); 
        SignalPower -= 95; 
+#endif
 
        return SignalPower;
 }
index 567ac52dc016cb2c320a1f4dcf67ace29c2cb9af..35d031f0b1e48ea0eb22e740fd91e989eb4f0ffb 100755 (executable)
@@ -155,20 +155,6 @@ typedef enum _PROTECTION_MODE{
        PROTECTION_MODE_FORCE_DISABLE = 2,
 }PROTECTION_MODE, *PPROTECTION_MODE;
 
-#define        LDPC_VHT_ENABLE_RX                      BIT0
-#define        LDPC_VHT_ENABLE_TX                      BIT1
-#define        LDPC_VHT_TEST_TX_ENABLE         BIT2
-#define        LDPC_VHT_CAP_TX                         BIT3
-
-#define        STBC_VHT_ENABLE_RX                      BIT0
-#define        STBC_VHT_ENABLE_TX                      BIT1
-#define        STBC_VHT_TEST_TX_ENABLE         BIT2
-#define        STBC_VHT_CAP_TX                         BIT3
-
-#define        BEAMFORMING_VHT_BEAMFORMER_ENABLE       BIT0    // Declare our NIC supports beamformer
-#define        BEAMFORMING_VHT_BEAMFORMEE_ENABLE       BIT1    // Declare our NIC supports beamformee
-#define        BEAMFORMING_VHT_BEAMFORMER_TEST         BIT2    // Transmiting Beamforming no matter the target supports it or not
-
 /* 2007/11/15 MH Define different RF type. */
 typedef        enum _RT_RF_TYPE_DEFINITION
 {
index 4c866ce7ba4ef63f803b27d9085e586510968b16..00b08fd75e469cbab330ca30ed8099a281c5d3e1 100755 (executable)
@@ -34,6 +34,8 @@
 #endif //CONFIG_IEEE80211W
 #define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
 
+const char *security_type_str(u8 value);
+
 #define _WPA_IE_ID_    0xdd
 #define _WPA2_IE_ID_   0x30
 
@@ -207,6 +209,30 @@ struct security_priv
        //u8                            szCapability[256];                              // For WPA2-PSK using zero-config, by Annie, 2005-09-20.
 
        u8 bWepDefaultKeyIdxSet;
+
+#define DBG_SW_SEC_CNT
+#ifdef DBG_SW_SEC_CNT
+       u64 wep_sw_enc_cnt_bc;
+       u64 wep_sw_enc_cnt_mc;
+       u64 wep_sw_enc_cnt_uc;
+       u64 wep_sw_dec_cnt_bc;
+       u64 wep_sw_dec_cnt_mc;
+       u64 wep_sw_dec_cnt_uc;
+
+       u64 tkip_sw_enc_cnt_bc;
+       u64 tkip_sw_enc_cnt_mc;
+       u64 tkip_sw_enc_cnt_uc;
+       u64 tkip_sw_dec_cnt_bc;
+       u64 tkip_sw_dec_cnt_mc;
+       u64 tkip_sw_dec_cnt_uc;
+
+       u64 aes_sw_enc_cnt_bc;
+       u64 aes_sw_enc_cnt_mc;
+       u64 aes_sw_enc_cnt_uc;
+       u64 aes_sw_dec_cnt_bc;
+       u64 aes_sw_dec_cnt_mc;
+       u64 aes_sw_dec_cnt_uc;
+#endif /* DBG_SW_SEC_CNT */
 };
 
 struct sha256_state {
index 5168f74368437a07e9d9f5520cf148d127323a21..ce0e2fc3c8973e6514bff6e49d07f3e4a9527f17 100755 (executable)
 #define        TDLS_AT_OFF_CH_STATE                    0x04000000\r
 #define        TDLS_CH_SW_INITIATOR_STATE      0x08000000      //avoiding duplicated or unconditional ch. switch rsp.\r
 #define        TDLS_APSD_CHSW_STATE            0x00100000      //in APSD and want to setup channel switch\r
-#define        TDLS_PEER_SLEEP_STATE           0x00200000      //peer sta is sleeping\r
+#define        TDLS_PEER_SLEEP_STATE           0x00200000      //peer sta is sleeping  //[TDLS] UAPSD: will not be used one day\r
 #define        TDLS_SW_OFF_STATE                       0x00400000      //terminate channel swithcing\r
 #define        TDLS_ALIVE_STATE                                0x00010000      //Check if peer sta is alived.\r
+#define        TDLS_WAIT_PTR_STATE                     0x00020000      //Waiting peer's TDLS_PEER_TRAFFIC_RESPONSE frame\r
 \r
 #define        TPK_RESEND_COUNT                                301\r
 #define        CH_SWITCH_TIME                          10\r
 #define        TDLS_STAY_TIME                          500\r
 #define        TDLS_SIGNAL_THRESH                      0x20\r
 #define        TDLS_WATCHDOG_PERIOD            10      //Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec\r
-#define        TDLS_ALIVE_TIMER_PH1                    5000\r
-#define        TDLS_ALIVE_TIMER_PH2                    2000\r
 #define        TDLS_STAY_TIME                          500\r
-#define        TDLS_HANDSHAKE_TIME                     8000\r
+#define        TDLS_HANDSHAKE_TIME                     3000\r
+#define        TDLS_PTI_TIME                                   7000\r
 #define        TDLS_ALIVE_COUNT                                3\r
 #define        TDLS_INI_MACID_ENTRY                    6\r
 \r
@@ -78,13 +78,13 @@ static u8 TDLS_RSNIE[]={    0x01, 0x00,     //version shall be set to 1
                                                0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only\r
                                                0x01, 0x00,     //AKM suite count\r
                                                0x00, 0x0f, 0xac, 0x07, //TPK Handshake\r
-                                               0x00, 0x02,\r
+                                               0x0c, 0x02,\r
                                                //PMKID shall not be present\r
                                                };\r
 \r
 static u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};     //Qos info all set zero\r
 \r
-static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20};   //bit(28), bit(30), bit(37)\r
+static u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00}; //bit(28), bit(30), bit(37)\r
 \r
 //     SRC: Supported Regulatory Classes\r
 static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 };\r
@@ -92,42 +92,41 @@ static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0
 void rtw_reset_tdls_info(_adapter* padapter);\r
 int rtw_init_tdls_info(_adapter* padapter);\r
 void rtw_free_tdls_info(struct tdls_info *ptdlsinfo);\r
-void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode);\r
-void init_TPK_timer(_adapter *padapter, struct sta_info *psta);\r
-void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta);\r
-void init_base_ch_timer(_adapter *padapter, struct sta_info *psta);\r
-void init_off_ch_timer(_adapter *padapter, struct sta_info *psta);\r
-void init_tdls_alive_timer(_adapter *padapter, struct sta_info *psta);\r
-void init_handshake_timer(_adapter *padapter, struct sta_info *psta);\r
+int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);\r
+void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta);\r
+void rtw_free_tdls_timer(struct sta_info *psta);\r
 void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta);\r
 #ifdef CONFIG_WFD\r
-void issue_tunneled_probe_req(_adapter *padapter);\r
-void issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);\r
+int issue_tunneled_probe_req(_adapter *padapter);\r
+int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);\r
 #endif //CONFIG_WFD\r
-void issue_tdls_dis_req(_adapter *padapter, u8 *mac_addr);\r
-void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr);\r
-void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame);\r
-void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame);\r
-void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame, u8 dialog);\r
-void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr);\r
-void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);\r
-void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr);\r
-void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr);\r
+int issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);\r
+int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);\r
+int issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);\r
+int issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);\r
+int issue_tdls_dis_rsp(_adapter * padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy);\r
+int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack);\r
+int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta);\r
+int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);\r
+int issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr);\r
+int issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr);\r
 sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame);\r
 sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame);\r
-sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);\r
-sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame);\r
-sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame);\r
-sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame);\r
-sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame);\r
+int On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);\r
+int On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame);\r
+int On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame);\r
+int On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame);\r
+int On_TDLS_Peer_Traffic_Indication(_adapter *adapter, union recv_frame *precv_frame);\r
+int On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame);\r
 sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame);\r
 sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame);\r
-void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
-void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
-void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
-void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
-void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
-void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog);\r
+void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\r
+void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\r
+void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\r
+void rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\r
+void rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\r
+void rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 dialog, u8 privacy);\r
+void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
 void rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
 void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
 void rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\r
index f42c8f480029cae0b56661ab4edb8c2081ea2243..bba04f317f831260e8f46ffe346b9920615940bb 100755 (executable)
@@ -1,2 +1,2 @@
-#define DRIVERVERSION  "v4.2.5_10013.20131218_BTCOEX20131113-473F"
-#define BTCOEXVERSION  "BTCOEX20131113-473F"
+#define DRIVERVERSION  "v4.3.5_11545.20140603_BTCOEX20140507-4E40"
+#define BTCOEXVERSION  "BTCOEX20140507-4E40"
index 4fe03564021f9a5dd5413dec723eb11599e806a1..62ad08b5a7d1eee079cd3fa37780200a9a0e238d 100755 (executable)
 #ifndef _RTW_VHT_H_
 #define _RTW_VHT_H_
 
+#define        LDPC_VHT_ENABLE_RX                      BIT0
+#define        LDPC_VHT_ENABLE_TX                      BIT1
+#define        LDPC_VHT_TEST_TX_ENABLE         BIT2
+#define        LDPC_VHT_CAP_TX                         BIT3
+
+#define        STBC_VHT_ENABLE_RX                      BIT0
+#define        STBC_VHT_ENABLE_TX                      BIT1
+#define        STBC_VHT_TEST_TX_ENABLE         BIT2
+#define        STBC_VHT_CAP_TX                         BIT3
+
+#define        BEAMFORMING_VHT_BEAMFORMER_ENABLE       BIT0    // Declare our NIC supports beamformer
+#define        BEAMFORMING_VHT_BEAMFORMEE_ENABLE       BIT1    // Declare our NIC supports beamformee
+#define        BEAMFORMING_VHT_BEAMFORMER_TEST         BIT2    // Transmiting Beamforming no matter the target supports it or not
 
 //VHT capability info
 #define SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart, _val)                       SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val)
@@ -39,9 +52,9 @@
 #define SET_VHT_CAPABILITY_ELE_HTC_VHT(_pEleStart, _val)                               SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 1, _val)
 #define SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart, _val)            SET_BITS_TO_LE_2BYTE((_pEleStart)+2, 7, 3, _val) //B23~B25
 #define SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(_pEleStart, _val)                         SET_BITS_TO_LE_1BYTE((_pEleStart)+2, 2, 2, _val)
-#define SET_VHT_CAPABILITY_ELE_MCS_RX_MAP(_pEleStart, _val)                            SET_BITS_TO_LE_2BYTE((_pEleStart)+4, 0, 16, _val)   //B0~B15 indicate Rx MCS MAP, we write 0 to indicate MCS0~7. by page
+#define SET_VHT_CAPABILITY_ELE_MCS_RX_MAP(_pEleStart, _val)                            SET_BITS_TO_LE_2BYTE_16BIT((_pEleStart)+4, 0, 16, _val)   //B0~B15 indicate Rx MCS MAP, we write 0 to indicate MCS0~7. by page
 #define SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart, _val)                           SET_BITS_TO_LE_2BYTE((_pEleStart)+6, 0, 13, _val)  
-#define SET_VHT_CAPABILITY_ELE_MCS_TX_MAP(_pEleStart, _val)                            SET_BITS_TO_LE_2BYTE((_pEleStart)+8, 0, 16, _val)   //B0~B15 indicate Tx MCS MAP, we write 0 to indicate MCS0~7. by page
+#define SET_VHT_CAPABILITY_ELE_MCS_TX_MAP(_pEleStart, _val)                            SET_BITS_TO_LE_2BYTE_16BIT((_pEleStart)+8, 0, 16, _val)   //B0~B15 indicate Tx MCS MAP, we write 0 to indicate MCS0~7. by page
 #define SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart, _val)                           SET_BITS_TO_LE_2BYTE((_pEleStart)+10, 0, 13, _val)  
 
 
 
 
 //VHT Operation Information Element
-#define SET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart, _val)                      SET_BITS_TO_LE_1BYTE(_pEleStart, 0, 8, _val)
-#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(_pEleStart, _val)                       SET_BITS_TO_LE_1BYTE(_pEleStart+1, 0, 8, _val)
-#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(_pEleStart, _val)                       SET_BITS_TO_LE_1BYTE(_pEleStart+2, 0, 8, _val)
-#define SET_VHT_OPERATION_ELE_BASIC_MCS_SET(_pEleStart, _val)                  SET_BITS_TO_LE_2BYTE(_pEleStart+3, 0, 16, _val)
+#define SET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart, _val)                      SET_BITS_TO_LE_1BYTE_8BIT(_pEleStart, 0, 8, _val)
+#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(_pEleStart, _val)                       SET_BITS_TO_LE_1BYTE_8BIT(_pEleStart+1, 0, 8, _val)
+#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(_pEleStart, _val)                       SET_BITS_TO_LE_1BYTE_8BIT(_pEleStart+2, 0, 8, _val)
+#define SET_VHT_OPERATION_ELE_BASIC_MCS_SET(_pEleStart, _val)                  SET_BITS_TO_LE_2BYTE_16BIT((_pEleStart)+3, 0, 16, _val)
 
 #define GET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart)            LE_BITS_TO_1BYTE(_pEleStart,0,8)
 #define GET_VHT_OPERATION_ELE_CENTER_FREQ1(_pEleStart) LE_BITS_TO_1BYTE((_pEleStart)+1,0,8)
@@ -101,8 +114,9 @@ struct vht_priv
        u8      vht_cap[32];
 };
 
-u8     rtw_get_vht_highest_rate(_adapter *padapter, u8 *pvht_mcs_map);
-u16    rtw_vht_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate);
+u8     rtw_get_vht_highest_rate(u8 *pvht_mcs_map);
+void   rtw_get_vht_nss(u8 *pvht_mcs_map);
+u16    rtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate);
 u32    rtw_vht_rate_to_bitmap(u8 *pVHTRate);
 void   rtw_vht_use_default_setting(_adapter *padapter);
 u32    rtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel);
@@ -112,6 +126,7 @@ void        update_sta_vht_info_apmode(_adapter *padapter, PVOID psta);
 void   update_hw_vht_param(_adapter *padapter);
 void   VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
 void   VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
+void   rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta);
 u32    rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len);
 void   VHTOnAssocRsp(_adapter *padapter);
 
index 46cba1bffd85d3246147ba043e6458c188f81842..8b28be34b0ae9f43adecec844e494dd819a2a93b 100755 (executable)
@@ -20,9 +20,9 @@ enum country_code_type_t {
 }; 
 
 int rtw_regd_init(_adapter *padapter,
-       int (*reg_notifier)(struct wiphy *wiphy,
+       void (*reg_notifier)(struct wiphy *wiphy,
                struct regulatory_request *request));
-int rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
 
 
 #endif
index bf4586dc4ea6111d23896912c1e643ba499f67e7..f9806ca1c9bd85e3a08c2207a0a0f180c7de8344 100755 (executable)
 
 
 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-//#define MAX_XMITBUF_SZ (30720)//     (2048)
 #ifdef CONFIG_TX_AGGREGATION
 #define MAX_XMITBUF_SZ (20480) // 20k
+//#define SDIO_TX_AGG_MAX      5
 #else
-#define MAX_XMITBUF_SZ (12288)  //12k 1536*8
+#define MAX_XMITBUF_SZ (1664)
+#define SDIO_TX_AGG_MAX        1
 #endif
 
 #if defined CONFIG_SDIO_HCI
@@ -78,7 +79,7 @@
 #define MAX_XMIT_EXTBUF_SZ     (1536)
 #define NR_XMIT_EXTBUFF        (32)
 
-#define MAX_CMDBUF_SZ  (4096)
+#define MAX_CMDBUF_SZ  (5120)  //(4096)
 
 #define MAX_NUMBLKS            (1)
 
@@ -143,8 +144,24 @@ do{\
 
 #define HWXMIT_ENTRY   4
 
-#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8723B)
+// For Buffer Descriptor ring architecture
+#ifdef BUF_DESC_ARCH   
+#if defined (CONFIG_RTL8192E)
+#define TX_BUFFER_SEG_NUM      1 // 0:2 seg, 1: 4 seg, 2: 8 seg.       
+#endif
+#endif
+
+#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B)
 #define TXDESC_SIZE 40
+//8192EE_TODO
+#elif defined (CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
+       #ifdef CONFIG_PCI_HCI
+               #define TXDESC_SIZE ((TX_BUFFER_SEG_NUM ==0)?16: ((TX_BUFFER_SEG_NUM ==1)? 32:64) )
+               #define TX_WIFI_INFO_SIZE 40  
+       #else  //USB or SDIO
+               #define TXDESC_SIZE 40
+       #endif
+//8192EE_TODO
 #else
 #define TXDESC_SIZE 32
 #endif
@@ -168,9 +185,13 @@ do{\
 #endif
 
 #ifdef CONFIG_PCI_HCI
+#if defined(CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
+#define TXDESC_OFFSET TX_WIFI_INFO_SIZE
+#else
 #define TXDESC_OFFSET 0
+#endif 
 #define TX_DESC_NEXT_DESC_OFFSET       (TXDESC_SIZE + 8)
-#endif
+#endif //CONFIG_PCI_HCI
 
 enum TXDESC_SC{
        SC_DONT_CARE = 0x00,
@@ -185,6 +206,20 @@ enum TXDESC_SC{
 #define TXDESC_40_BYTES
 #endif
 
+#if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) //8192ee
+//8192EE_TODO
+struct tx_desc
+{
+       unsigned int txdw0;
+       unsigned int txdw1;
+       unsigned int txdw2;
+       unsigned int txdw3;
+       unsigned int txdw4;
+       unsigned int txdw5;
+       unsigned int txdw6;
+       unsigned int txdw7;
+};
+#else
 struct tx_desc
 {
        unsigned int txdw0;
@@ -215,7 +250,7 @@ struct tx_desc
        unsigned int txdw15;
 #endif
 };
-
+#endif
 
 union txdesc {
        struct tx_desc txdesc;
@@ -226,12 +261,13 @@ union txdesc {
 #define PCI_MAX_TX_QUEUE_COUNT 8
 
 struct rtw_tx_ring {
+       unsigned char   qid;
        struct tx_desc  *desc;
-       dma_addr_t              dma;
-       unsigned int            idx;
-       unsigned int            entries;
-       _queue                  queue;
-       u32                             qlen;
+       dma_addr_t      dma;
+       unsigned int    idx;
+       unsigned int    entries;
+       _queue          queue;
+       u32             qlen;
 };
 #endif
 
@@ -330,10 +366,12 @@ struct pkt_attrib
        u8      ch_offset;//PRIME_CHNL_OFFSET
        u8      sgi;//short GI
        u8      ampdu_en;//tx ampdu enable
+       u8      ampdu_spacing; //ampdu_min_spacing for peer sta's rx
        u8      mdata;//more data bit
        u8      pctrl;//per packet txdesc control enable
        u8      triggered;//for ap mode handling Power Saving sta
        u8      qsel;
+       u8      order;//order bit
        u8      eosp;
        u8      rate;
        u8      intel_proxim;
@@ -352,6 +390,11 @@ struct pkt_attrib
        //union Keytype dot11tkiprxmickey;
        union Keytype   dot118021x_UncstKey;
 
+#ifdef CONFIG_TDLS
+       u8 direct_link;
+       struct sta_info *ptdls_sta;
+#endif //CONFIG_TDLS
+
        u8 icmp_pkt;
        
 };
@@ -484,6 +527,10 @@ struct xmit_buf
 #endif
 #endif
 
+#ifdef CONFIG_PCI_HCI
+       struct tx_desc *desc;
+#endif
+
 #if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT)
        u8 no;
 #endif
@@ -580,6 +627,12 @@ struct agg_pkt_info{
        u16 pkt_len;
 };
 
+enum cmdbuf_type {
+       CMDBUF_BEACON = 0x00,
+       CMDBUF_RSVD,
+       CMDBUF_MAX
+};
+
 struct xmit_priv       {
 
        _lock   lock;
@@ -690,7 +743,7 @@ struct      xmit_priv       {
        u8 *pxmit_extbuf;
        uint free_xmit_extbuf_cnt;
 
-       struct xmit_buf pcmd_xmitbuf;
+       struct xmit_buf pcmd_xmitbuf[CMDBUF_MAX];
 
        u16     nqos_ssn;
        #ifdef CONFIG_TX_EARLY_MODE
@@ -713,9 +766,10 @@ struct     xmit_priv       {
        _lock lock_sctx;
 };
 
-extern struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv);
-extern struct xmit_buf *rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv);
-extern s32     rtw_free_cmd_xmitbuf(struct xmit_priv *pxmitpriv);
+extern struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
+               enum cmdbuf_type buf_type);
+#define rtw_alloc_cmdxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_RSVD)
+#define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON)
 
 extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);
 extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
@@ -725,6 +779,8 @@ extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitb
 
 void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz);
 extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len);
+static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
+static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
 extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib);
 extern s32 rtw_put_snap(u8 *data, u16 h_proto);
 
@@ -745,7 +801,9 @@ extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_fra
 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);
+extern struct tdls_txmgmt *ptxmgmt;
+s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, struct tdls_txmgmt *ptxmgmt);
+s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
 #endif
 s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag);
 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv);
@@ -765,7 +823,7 @@ void rtw_free_hwxmits(_adapter *padapter);
 
 
 s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
-
+bool xmitframe_hiq_filter(struct xmit_frame *xmitframe);
 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
@@ -786,6 +844,7 @@ sint        check_pending_xmitbuf(struct xmit_priv *pxmitpriv);
 thread_return  rtw_xmit_thread(thread_context context);
 #endif
 
+static void do_queue_select(_adapter * padapter, struct pkt_attrib * pattrib);
 u32    rtw_get_ff_hwaddr(struct xmit_frame     *pxmitframe);
 
 #ifdef CONFIG_XMIT_ACK
index 72604cfb514398ab7cb1a9baca39027004c71b07..e142871e0bb832021f23960a7e9f3d4d7b2eba65 100755 (executable)
@@ -76,6 +76,7 @@ extern void EnableInterrupt8188ESdio(PADAPTER padapter);
 extern void DisableInterrupt8188ESdio(PADAPTER padapter);
 extern void UpdateInterruptMask8188ESdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);
 extern u8 HalQueryTxBufferStatus8189ESdio(PADAPTER padapter);
+extern u8 HalQueryTxOQTBufferStatus8189ESdio(PADAPTER padapter);
 extern void ClearInterrupt8188ESdio(PADAPTER padapter);
 #endif // CONFIG_RTL8188E
 
@@ -84,6 +85,7 @@ extern void InitInterrupt8821AS(PADAPTER padapter);
 extern void EnableInterrupt8821AS(PADAPTER padapter);
 extern void DisableInterrupt8821AS(PADAPTER padapter);
 extern u8 HalQueryTxBufferStatus8821AS(PADAPTER padapter);
+extern u8 HalQueryTxOQTBufferStatus8821ASdio(PADAPTER padapter);
 #endif // CONFIG_RTL8188E
 
 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
@@ -95,6 +97,7 @@ extern void InitSysInterrupt8723BSdio(PADAPTER padapter);
 extern void EnableInterrupt8723BSdio(PADAPTER padapter);
 extern void DisableInterrupt8723BSdio(PADAPTER padapter);
 extern u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter);
+extern u8 HalQueryTxOQTBufferStatus8723BSdio(PADAPTER padapter);
 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
 extern void DisableInterruptButCpwm28723BSdio(PADAPTER padapter);
 extern void ClearInterrupt8723BSdio(PADAPTER padapter);
index a62461af2f13a04e5449ac65cca310ffd7bb148f..15964d7f80c46becf237ee441470e7b8c2e5413c 100755 (executable)
@@ -140,6 +140,9 @@ struct sta_info {
        u8      wireless_mode;  // NETWORK_TYPE
        u8      bw_mode;
 
+       u8      ldpc;
+       u8      stbc;
+
        struct stainfo_stats sta_stats;
 
 #ifdef CONFIG_TDLS
@@ -159,12 +162,11 @@ struct sta_info {
        _timer  option_timer;
        _timer  base_ch_timer;
        _timer  off_ch_timer;
-
        _timer handshake_timer;
-       _timer alive_timer1;
-       _timer alive_timer2;
        u8 timer_flag;
        u8 alive_count;
+       _timer  pti_timer;
+       u8      TDLS_RSNIE[20]; //Save peer's RSNIE, use for sending TDLS_SETUP_RSP
 #endif //CONFIG_TDLS
 
        //for A-MPDU TX, ADDBA timeout check    
index 7b522670f8844d0b153087e78feb6db342c23e18..dff95b413506d9e386e12734e23a1ad613f5860f 100755 (executable)
@@ -48,6 +48,7 @@
 #define WLAN_MIN_ETHFRM_LEN    60
 #define WLAN_MAX_ETHFRM_LEN    1514
 #define WLAN_ETHHDR_LEN                14
+#define WLAN_WMM_LEN           24
 
 #define P80211CAPTURE_VERSION  0x80211001
 
@@ -81,6 +82,7 @@ enum WIFI_FRAME_SUBTYPE {
     WIFI_AUTH           = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE),
     WIFI_DEAUTH         = (BIT(7) | BIT(6) | WIFI_MGT_TYPE),
     WIFI_ACTION         = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE),
+    WIFI_ACTION_NOACK = (BIT(7) | BIT(6) | BIT(5) | WIFI_MGT_TYPE),
 
     // below is for control frame
     WIFI_NDPA         = (BIT(6) | BIT(4) | WIFI_CTRL_TYPE),
@@ -437,6 +439,18 @@ __inline static int IS_MCAST(unsigned char *da)
                return _FALSE;
 }
 
+__inline static unsigned char * get_ra(unsigned char *pframe)
+{
+       unsigned char   *ra;
+       ra = GetAddr1Ptr(pframe);
+       return ra;
+}
+__inline static unsigned char * get_ta(unsigned char *pframe)
+{
+       unsigned char   *ta;
+       ta = GetAddr2Ptr(pframe);
+       return ta;
+}
 
 __inline static unsigned char * get_da(unsigned char *pframe)
 {
@@ -487,7 +501,7 @@ __inline static unsigned char * get_sa(unsigned char *pframe)
 
 __inline static unsigned char * get_hdr_bssid(unsigned char *pframe)
 {
-       unsigned char   *sa;
+       unsigned char   *sa = NULL;
        unsigned int    to_fr_ds        = (GetToDs(pframe) << 1) | GetFrDs(pframe);
 
        switch (to_fr_ds) {
@@ -503,9 +517,6 @@ __inline static unsigned char * get_hdr_bssid(unsigned char *pframe)
                case 0x03:      // ToDs=1, FromDs=1
                        sa = GetAddr1Ptr(pframe);
                        break;
-               default:        
-                       sa =NULL; //???????
-                       break;
        }
 
        return sa;
@@ -732,6 +743,7 @@ typedef     enum _ELEMENT_ID{
 
 #define GetOrderBit(pbuf)      (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0)
 
+#define ACT_CAT_VENDOR                         0x7F/* 127 */
 
 /**
  * struct rtw_ieee80211_bar - HT Block Ack Request
@@ -922,6 +934,7 @@ typedef enum _HT_CAP_AMPDU_FACTOR {
 }HT_CAP_AMPDU_FACTOR;
 
 /* 802.11n HT capabilities masks */
+#define IEEE80211_HT_CAP_LDPC_CODING           0x0001
 #define IEEE80211_HT_CAP_SUP_WIDTH             0x0002
 #define IEEE80211_HT_CAP_SM_PS                 0x000C
 #define IEEE80211_HT_CAP_GRN_FLD               0x0010
@@ -946,6 +959,11 @@ typedef enum _HT_CAP_AMPDU_FACTOR {
 #define IEEE80211_HT_CAP_MCS_TX_RX_DIFF                0x02
 #define IEEE80211_HT_CAP_MCS_TX_STREAMS                0x0C
 #define IEEE80211_HT_CAP_MCS_TX_UEQM           0x10
+/* 802.11n HT capability TXBF capability */
+#define IEEE80211_HT_CAP_TXBF_RX_NDP           0x00000008
+#define IEEE80211_HT_CAP_TXBF_TX_NDP           0x00000010
+#define IEEE80211_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP       0x00000400
+
 /* 802.11n HT IE masks */
 #define IEEE80211_HT_IE_CHA_SEC_OFFSET         0x03
 #define IEEE80211_HT_IE_CHA_SEC_NONE           0x00
index b2f59dc387a8964cc7802cff68db6d2730c92181..a5425fa842ba2697e905758101ff77375c558499 100755 (executable)
@@ -28,7 +28,7 @@
 #define RTW_MAX_MGMT_TX_CNT (8)\r
 \r
 #define RTW_SCAN_IE_LEN_MAX      2304\r
-#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 //ms\r
+#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 //ms\r
 #define RTW_MAX_NUM_PMKIDS 4\r
 \r
 #define RTW_CH_MAX_2G_CHANNEL               14      /* Max channel in 2G band */\r
@@ -91,6 +91,23 @@ static const u32 rtw_cipher_suites[] = {
        .max_power              = 30,                           \\r
 }\r
 \r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\r
+/* if wowlan is not supported, kernel generate a disconnect at each suspend\r
+ * cf: /net/wireless/sysfs.c, so register a stub wowlan.\r
+ * Moreover wowlan has to be enabled via a the nl80211_set_wowlan callback.\r
+ * (from user space, e.g. iw phy0 wowlan enable)\r
+ */\r
+static const struct wiphy_wowlan_support wowlan_stub = {\r
+       .flags = WIPHY_WOWLAN_ANY,\r
+       .n_patterns = 0,\r
+       .pattern_max_len = 0,\r
+       .pattern_min_len = 0,\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))\r
+       .max_pkt_offset = 0,\r
+#endif\r
+};\r
+#endif\r
+\r
 static struct ieee80211_rate rtw_rates[] = {\r
        RATETAB_ENT(10,  0x1,   0),\r
        RATETAB_ENT(20,  0x2,   0),\r
@@ -333,6 +350,19 @@ static int rtw_ieee80211_channel_to_frequency(int chan, int band)
        }\r
 }\r
 \r
+static u64 rtw_get_systime_us(void)\r
+{\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39))\r
+       struct timespec ts;\r
+       get_monotonic_boottime(&ts);\r
+       return ((u64)ts.tv_sec*1000000) + ts.tv_nsec / 1000;\r
+#else\r
+       struct timeval tv;\r
+       do_gettimeofday(&tv);\r
+       return ((u64)tv.tv_sec*1000000) + tv.tv_usec;\r
+#endif\r
+}\r
+\r
 #define MAX_BSSINFO_LEN 1000\r
 struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork)\r
 {\r
@@ -464,19 +494,20 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        \r
        notify_channel = ieee80211_get_channel(wiphy, freq);\r
 \r
-       //rtw_get_timestampe_from_ie()\r
-       notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */\r
+       if (0)\r
+               notify_timestamp = le64_to_cpu(*(u64*)rtw_get_timestampe_from_ie(pnetwork->network.IEs));\r
+       else\r
+               notify_timestamp = rtw_get_systime_us();\r
 \r
        notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs));\r
        notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs));              \r
 \r
-       \r
        notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_;\r
        notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_;\r
 \r
        //We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm)\r
        if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&\r
-               is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) {\r
+               is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {\r
                notify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm\r
        } else {\r
                notify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm\r
@@ -488,7 +519,7 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        DBG_8192C("Capability: %X\n", notify_capability);\r
        DBG_8192C("Beacon interval: %d\n", notify_interval);\r
        DBG_8192C("Signal: %d\n", notify_signal);\r
-       DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp);\r
+       DBG_8192C("notify_timestamp: %llu\n", notify_timestamp);\r
        #endif\r
 \r
        pbuf = buf;\r
@@ -518,13 +549,14 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength);\r
        len += pnetwork->network.IELength;\r
 \r
+       *((u64*)pbuf) = cpu_to_le64(notify_timestamp);\r
+\r
        //#ifdef CONFIG_P2P\r
        //if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL))\r
        //{\r
        //      DBG_8192C("%s, got p2p_ie\n", __func__);\r
        //}\r
        //#endif\r
-       \r
 \r
 #if 1  \r
        bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf,\r
@@ -610,6 +642,12 @@ int rtw_cfg80211_check_bss(_adapter *padapter)
                        pnetwork->Ssid.SsidLength,\r
                        WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);\r
 \r
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\r
+       cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);\r
+#else\r
+       cfg80211_put_bss(bss);\r
+#endif\r
+\r
        return  (bss!=NULL);\r
 }\r
 \r
@@ -1257,7 +1295,7 @@ _func_enter_;
                                        //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));\r
                                        DBG_871X(" ~~~~set sta key:unicastkey\n");\r
                                        \r
-                                       rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE);\r
+                                       rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);\r
                                }\r
                                else//group key\r
                                {\r
@@ -1271,14 +1309,7 @@ _func_enter_;
                                                DBG_871X(" ~~~~set sta key:groupkey\n");\r
        \r
                                                padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;\r
-#ifdef CONFIG_CONCURRENT_MODE \r
-                                               if (padapter->adapter_type == PRIMARY_ADAPTER)\r
-                                                       rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);\r
-                                               else\r
-                                                       DBG_871X_LEVEL(_drv_always_, "second interface do not set cam.\n");\r
-#else\r
                                                rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);\r
-#endif\r
                                        }\r
 #ifdef CONFIG_IEEE80211W\r
                                        else if(strcmp(param->u.crypt.alg, "BIP") == 0)\r
@@ -1524,6 +1555,12 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
                ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);\r
 #endif\r
        }\r
+        else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE\r
+                || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)\r
+        {\r
+                //DBG_8192C("@@@@@@@@@@ fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);\r
+                ret =  rtw_cfg80211_set_encryption(ndev, param, param_len);\r
+        }\r
        else\r
        {\r
                DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);\r
@@ -1743,7 +1780,7 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        int ret = 0;\r
        u8 change = _FALSE;\r
 \r
-       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
+       DBG_871X(FUNC_NDEV_FMT" type=%d\n", FUNC_NDEV_ARG(ndev), type);\r
 \r
        if(adapter_to_dvobj(padapter)->processing_dev_remove == _TRUE)\r
        {\r
@@ -1756,6 +1793,7 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        {\r
                DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open\n", FUNC_NDEV_ARG(ndev));\r
                if(netdev_if2_open(ndev) != 0) {\r
+                       DBG_871X(FUNC_NDEV_FMT" call netdev_if2_open fail\n", FUNC_NDEV_ARG(ndev));\r
                        ret= -EPERM;\r
                        goto exit;\r
                }\r
@@ -1765,12 +1803,14 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        {\r
                DBG_871X(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev));\r
                if(netdev_open(ndev) != 0) {\r
+                       DBG_871X(FUNC_NDEV_FMT" call netdev_open fail\n", FUNC_NDEV_ARG(ndev));\r
                        ret= -EPERM;\r
                        goto exit;\r
                }\r
        }\r
 \r
        if(_FAIL == rtw_pwr_wakeup(padapter)) {\r
+               DBG_871X(FUNC_NDEV_FMT" call rtw_pwr_wakeup fail\n", FUNC_NDEV_ARG(ndev));\r
                ret= -EPERM;\r
                goto exit;\r
        }\r
@@ -1826,7 +1866,8 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
                #endif //CONFIG_P2P\r
                break;          \r
        default:\r
-               return -EOPNOTSUPP;\r
+               ret = -EOPNOTSUPP;\r
+               goto exit;\r
        }\r
 \r
        rtw_wdev->iftype = type;\r
@@ -1842,6 +1883,7 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        \r
 exit:\r
 \r
+       DBG_871X(FUNC_NDEV_FMT" ret:%d\n", FUNC_NDEV_ARG(ndev), ret);\r
        return ret;\r
 }\r
 \r
@@ -1875,6 +1917,30 @@ void rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted)
        _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\r
 }\r
 \r
+void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork)\r
+{\r
+       struct wireless_dev *pwdev = padapter->rtw_wdev;\r
+       struct wiphy *wiphy = pwdev->wiphy;\r
+       struct cfg80211_bss *bss = NULL;\r
+       WLAN_BSSID_EX select_network = pnetwork->network;\r
+       \r
+       bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,\r
+               select_network.MacAddress, select_network.Ssid.Ssid,\r
+               select_network.Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/, \r
+               0/*WLAN_CAPABILITY_ESS*/);\r
+       \r
+       if (bss) {\r
+               cfg80211_unlink_bss(wiphy, bss);\r
+               DBG_8192C("%s(): cfg80211_unlink %s!! () ",__func__,select_network.Ssid.Ssid );\r
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\r
+               cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);\r
+#else\r
+               cfg80211_put_bss(bss);\r
+#endif\r
+       }\r
+       return;\r
+}\r
+\r
 void rtw_cfg80211_surveydone_event_callback(_adapter *padapter)\r
 {\r
        _irqL   irqL;\r
@@ -2232,9 +2298,9 @@ if (padapter->registrypriv.mp_mode == 1)
                passtime = rtw_get_passing_time_ms(buddylastscantime);\r
                buddylastscantime = rtw_get_current_time();\r
                if ((passtime > 12000)\r
-#ifdef CONFIG_P2P\r
-                       ||(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))\r
-#endif //CONFIG_P2P\r
+//#ifdef CONFIG_P2P\r
+//                     ||(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))\r
+//#endif //CONFIG_P2P\r
                )\r
 #endif\r
                {\r
@@ -2244,36 +2310,45 @@ if (padapter->registrypriv.mp_mode == 1)
                }\r
        }\r
 \r
-       if (check_buddy_fwstate(padapter,\r
-               _FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)\r
-       {               \r
-               if(check_buddy_fwstate(padapter, _FW_UNDER_SURVEY))\r
-               {\r
-                       DBG_8192C("scanning_via_buddy_intf\n");\r
+       if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) {\r
+               DBG_871X("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state);\r
+               need_indicate_scan_done = _TRUE;\r
+               goto check_need_indicate_scan_done;\r
+\r
+       } else if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY)) {\r
+               bool scan_via_buddy = _FALSE;\r
+               struct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(pbuddy_adapter);\r
+\r
+               _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\r
+               _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\r
+               if (buddy_wdev_priv->scan_request) {\r
+                       DBG_871X("scan via buddy\n");\r
                        pmlmepriv->scanning_via_buddy_intf = _TRUE;\r
-               }               \r
+                       _enter_critical_bh(&pmlmepriv->lock, &irqL);\r
+                       set_fwstate(pmlmepriv, _FW_UNDER_SURVEY);\r
+                       _exit_critical_bh(&pmlmepriv->lock, &irqL);\r
+                       scan_via_buddy = _TRUE;\r
+               }\r
+               _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\r
+               _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\r
+\r
+               if (scan_via_buddy == _FALSE)\r
+                       need_indicate_scan_done = _TRUE;\r
 \r
-               DBG_8192C("buddy_intf's mlme state:0x%x\n", pbuddy_mlmepriv->fw_state);\r
-               \r
-               need_indicate_scan_done = _TRUE;\r
                goto check_need_indicate_scan_done;\r
        }\r
-#endif\r
-\r
+#endif /* CONFIG_CONCURRENT_MODE */\r
 \r
 #ifdef CONFIG_P2P\r
-       if( pwdinfo->driver_interface == DRIVER_CFG80211 )\r
+       if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\r
        {\r
-               if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\r
-               {\r
-                       rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\r
-                       rtw_free_network_queue(padapter, _TRUE);\r
+               rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\r
+               rtw_free_network_queue(padapter, _TRUE);\r
 \r
-                       if(social_channel == 0)\r
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\r
-                       else\r
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\r
-               }\r
+               if(social_channel == 0)\r
+                       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\r
+               else\r
+                       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\r
        }\r
 #endif //CONFIG_P2P\r
 \r
@@ -2902,7 +2977,7 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
                goto exit;\r
        }\r
 \r
-#ifdef CONFIG_PLATFORM_MSTAR\r
+#ifdef CONFIG_PLATFORM_MSTAR_SCAN_BEFORE_CONNECT\r
        printk("MStar Android!\n");\r
        if(adapter_wdev_data(padapter)->bandroid_scan == _FALSE)\r
        {\r
@@ -3133,7 +3208,7 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
 \r
        rtw_set_to_roam(padapter, 0);\r
 \r
-       if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) \r
+       //if(check_fwstate(&padapter->mlmepriv, _FW_LINKED))\r
        {\r
                rtw_scan_abort(padapter);\r
                LeaveAllPowerSaveMode(padapter);\r
@@ -3149,6 +3224,7 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
 \r
        padapter->mlmepriv.not_indic_disco = _FALSE;\r
 \r
+       DBG_871X(FUNC_NDEV_FMT" return 0\n", FUNC_NDEV_ARG(ndev));\r
        return 0;\r
 }\r
 \r
@@ -3986,7 +4062,7 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
                WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network;\r
 \r
                if(0)\r
-               DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),\r
+               DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%zu), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),\r
                        settings->ssid, settings->ssid_len,\r
                        pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength);\r
 \r
@@ -4132,14 +4208,53 @@ static int      cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *n
        return 0;\r
 }\r
 \r
+struct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *pstapriv)\r
+\r
+{\r\r
+       _list   *phead, *plist;\r
+       struct sta_info *psta = NULL;\r
+       int i = 0;\r
+       \r
+       phead = &pstapriv->asoc_list;\r
+       plist = get_next(phead);\r
+\r
+       //check asoc_queue\r
+       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)       \r
+       {\r
+               if(idx == i) psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\r
+               plist = get_next(plist);        \r
+               i++;\r
+       }\r
+       return psta;\r
+}\r
+\r
 static int     cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev,\r
                               int idx, u8 *mac, struct station_info *sinfo)\r
 {\r
-       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
 \r
-       //TODO: dump scanned queue\r
+       int ret = 0;\r
+       _irqL irqL;\r
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
+       struct sta_info *psta = NULL;\r
+       struct sta_priv *pstapriv = &padapter->stapriv;\r
+       DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));\r
 \r
-       return -ENOENT;\r
+       _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
+       psta = rtw_sta_info_get_by_idx(idx, pstapriv);\r
+       _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
+       if(NULL == psta)\r
+       {\r
+               DBG_871X("Station is not found\n");\r
+               ret = -ENOENT;\r
+               goto exit;\r
+       }\r
+       _rtw_memcpy(mac, psta->hwaddr, ETH_ALEN);\r
+       sinfo->filled = 0;\r
+       sinfo->filled |= STATION_INFO_SIGNAL;\r
+       sinfo->signal = psta->rssi;\r
+       \r
+exit:\r
+       return ret;\r
 }\r
 \r
 static int     cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,\r
@@ -4593,6 +4708,19 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
                rtw_scan_abort(padapter->pbuddy_adapter);                       \r
 #endif //CONFIG_CONCURRENT_MODE\r
 \r
+       if (check_fwstate(&padapter->mlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)\r
+       {\r
+               DBG_871X("mlme state:0x%x\n", get_fwstate(&padapter->mlmepriv));\r
+               remain_ch = padapter->mlmeextpriv.cur_channel;\r
+       }\r
+#ifdef CONFIG_CONCURRENT_MODE\r
+       if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)\r
+       {\r
+               DBG_871X("buddy_intf's mlme state:0x%x\n", get_fwstate(&(padapter->pbuddy_adapter->mlmepriv)));\r
+               remain_ch = padapter->pbuddy_adapter->mlmeextpriv.cur_channel;\r
+       }\r
+#endif /* CONFIG_CONCURRENT_MODE */\r
+\r
        //if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\r
        if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\r
        {\r
@@ -5101,6 +5229,195 @@ exit:
        return;\r
 }\r
 \r
+#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
+static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,\r
+       struct net_device *ndev,\r
+       u8 *peer,\r
+       u8 action_code,\r
+       u8 dialog_token,\r
+       u16 status_code,\r
+       const u8 *buf,\r
+       size_t len)\r
+{\r
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
+       int ret = 0;\r
+       struct tdls_txmgmt txmgmt;\r
+\r
+       //TDLS: discard wpa_supplicant's frame mgmt\r
+       DBG_871X("%s %d\n", __FUNCTION__, __LINE__);\r
+       return 0;\r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       _rtw_memcpy(txmgmt.peer, peer, ETH_ALEN);\r
+       txmgmt.action_code = action_code;\r
+       txmgmt.dialog_token= dialog_token;\r
+       txmgmt.status_code = status_code;\r
+       txmgmt.len = len;\r
+       txmgmt.buf = (u8 *)rtw_malloc(txmgmt.len);\r
+       if (txmgmt.buf == NULL)\r
+       {\r
+               ret = -ENOMEM;\r
+               goto bad;\r
+       }\r
+       _rtw_memcpy(txmgmt.buf, (void*)buf, txmgmt.len);\r
+       txmgmt.external_support = _TRUE;\r
+\r
+//TDLS: Debug purpose\r
+#if 0\r
+       DBG_871X("%s %d\n", __FUNCTION__, __LINE__);\r
+       DBG_871X("peer:"MAC_FMT" ", MAC_ARG(txmgmt.peer));\r
+       DBG_871X("action code:%d ", txmgmt.action_code);\r
+       DBG_871X("dialog:%d ", txmgmt.dialog_token);\r
+       DBG_871X("status code:%d\n", txmgmt.status_code);\r
+       if( txmgmt.len > 0 )\r
+       {\r
+               int i=0;\r
+               for(;i < len; i++)\r
+                       DBG_871X("%02x ", *(txmgmt.buf+i));\r
+                       DBG_871X("\n len:%d\n", txmgmt.len);\r
+       }\r
+#endif\r
+\r
+       switch(txmgmt.action_code) {\r
+               case TDLS_SETUP_REQUEST:\r
+                       issue_tdls_setup_req(padapter, &txmgmt, _TRUE);\r
+                       break;\r
+               case TDLS_SETUP_RESPONSE:\r
+                       issue_tdls_setup_rsp(padapter, &txmgmt);\r
+                       break;\r
+               case TDLS_SETUP_CONFIRM:\r
+                       issue_tdls_setup_cfm(padapter, &txmgmt);\r
+                       break;\r
+               case TDLS_TEARDOWN:\r
+                       break;\r
+               case TDLS_DISCOVERY_REQUEST:\r
+                       issue_tdls_dis_req(padapter, &txmgmt);\r
+               break;\r
+       }\r
+\r
+bad:\r
+       if (txmgmt.buf)\r
+       {\r
+               rtw_mfree(txmgmt.buf, txmgmt.len);\r
+       }\r
+\r
+       return ret;\r
+}\r
+\r
+static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy,\r
+       struct net_device *ndev,\r
+       u8 *peer,\r
+       enum nl80211_tdls_operation oper)\r
+{\r
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\r
+       struct tdls_txmgmt      txmgmt;\r
+       struct sta_info *ptdls_sta = NULL;\r
+\r
+       DBG_871X(FUNC_NDEV_FMT", nl80211_tdls_operation:%d\n", FUNC_NDEV_ARG(ndev), oper);\r
+\r
+#ifdef CONFIG_LPS\r
+       rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);\r
+#endif //CONFIG_LPS\r
+\r
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\r
+       if(peer)\r
+               _rtw_memcpy(txmgmt.peer, peer, ETH_ALEN);\r
+#if 0\r
+       CFG80211_TDLS_DISCOVERY_REQ,\r
+       CFG80211_TDLS_SETUP,\r
+       CFG80211_TDLS_TEARDOWN,\r
+       CFG80211_TDLS_ENABLE_LINK,\r
+       CFG80211_TDLS_DISABLE_LINK,\r
+       CFG80211_TDLS_ENABLE,\r
+       CFG80211_TDLS_DISABLE\r
+#endif\r
+       switch(oper) {\r
+               case NL80211_TDLS_DISCOVERY_REQ:\r
+                       issue_tdls_dis_req(padapter, &txmgmt);\r
+                       break;\r
+               case NL80211_TDLS_SETUP:\r
+#ifdef CONFIG_WFD\r
+                       if ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm )\r
+                       {\r
+                               if ( padapter->wdinfo.wfd_tdls_weaksec == _TRUE)\r
+                                       issue_tdls_setup_req(padapter, &txmgmt, _TRUE);\r
+                               else\r
+                                       DBG_871X( "[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__ );\r
+                       }\r
+                       else\r
+#endif // CONFIG_WFD\r
+                       {\r
+                               issue_tdls_setup_req(padapter, &txmgmt, _TRUE);\r
+                       }\r
+                       break;\r
+               case NL80211_TDLS_TEARDOWN:\r
+                       ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer);\r
+                       if(ptdls_sta != NULL)\r
+                       {\r
+                               txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;\r
+                               issue_tdls_teardown(padapter, &txmgmt, _FALSE);\r
+                       }\r
+                       else\r
+                               DBG_871X( "TDLS peer not found\n");\r
+                       break;\r
+               case NL80211_TDLS_ENABLE_LINK:\r
+                       break;\r
+               case NL80211_TDLS_DISABLE_LINK:\r
+                       break;\r
+       }\r
+       return 0;\r
+}\r
+#endif /* CONFIG_TDLS */\r
+\r
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\r
+static int cfg80211_rtw_sched_scan_start(struct wiphy *wiphy,\r
+               struct net_device *dev,\r
+               struct cfg80211_sched_scan_request *request) {\r
+\r
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\r
+       struct  mlme_priv       *pmlmepriv = &(padapter->mlmepriv);\r
+       u8 ret;\r
+\r
+       if (padapter->bup == _FALSE) {\r
+               DBG_871X("%s: net device is down.\n", __func__);\r
+               return -EIO;\r
+       }\r
+\r
+       if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE ||\r
+               check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE  ||\r
+               check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\r
+               DBG_871X("%s: device is busy.\n", __func__);\r
+               rtw_scan_abort(padapter);\r
+       }\r
+\r
+       if (request == NULL) {\r
+               DBG_871X("%s: invalid cfg80211_requests parameters.\n", __func__);\r
+               return -EINVAL;\r
+       }\r
+\r
+       ret = rtw_android_cfg80211_pno_setup(dev, request->ssids,\r
+                       request->n_ssids, request->interval);\r
+\r
+       if (ret < 0) {\r
+               DBG_871X("%s ret: %d\n", __func__, ret);\r
+               goto exit;\r
+       }\r
+\r
+       ret = rtw_android_pno_enable(dev, _TRUE);\r
+       if (ret < 0) {\r
+               DBG_871X("%s ret: %d\n", __func__, ret);\r
+               goto exit;\r
+       }\r
+exit:\r
+       return ret;\r
+}\r
+\r
+static int cfg80211_rtw_sched_scan_stop(struct wiphy *wiphy,\r
+               struct net_device *dev) {\r
+       return rtw_android_pno_enable(dev, _FALSE);\r
+}\r
+#endif /* CONFIG_PNO_SUPPORT */\r
+\r
 static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len)\r
 {      \r
        int ret = 0;\r
@@ -5474,65 +5791,6 @@ int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,
        \r
 }\r
 \r
-static struct cfg80211_ops rtw_cfg80211_ops = {\r
-       .change_virtual_intf = cfg80211_rtw_change_iface,\r
-       .add_key = cfg80211_rtw_add_key,\r
-       .get_key = cfg80211_rtw_get_key,\r
-       .del_key = cfg80211_rtw_del_key,\r
-       .set_default_key = cfg80211_rtw_set_default_key,\r
-       .get_station = cfg80211_rtw_get_station,\r
-       .scan = cfg80211_rtw_scan,\r
-       .set_wiphy_params = cfg80211_rtw_set_wiphy_params,\r
-       .connect = cfg80211_rtw_connect,\r
-       .disconnect = cfg80211_rtw_disconnect,\r
-       .join_ibss = cfg80211_rtw_join_ibss,\r
-       .leave_ibss = cfg80211_rtw_leave_ibss,\r
-       .set_tx_power = cfg80211_rtw_set_txpower,\r
-       .get_tx_power = cfg80211_rtw_get_txpower,\r
-       .set_power_mgmt = cfg80211_rtw_set_power_mgmt,\r
-       .set_pmksa = cfg80211_rtw_set_pmksa,\r
-       .del_pmksa = cfg80211_rtw_del_pmksa,\r
-       .flush_pmksa = cfg80211_rtw_flush_pmksa,\r
-       \r
-#ifdef CONFIG_AP_MODE\r
-       .add_virtual_intf = cfg80211_rtw_add_virtual_intf,\r
-       .del_virtual_intf = cfg80211_rtw_del_virtual_intf,\r
-\r
-       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE)\r
-       .add_beacon = cfg80211_rtw_add_beacon,\r
-       .set_beacon = cfg80211_rtw_set_beacon,\r
-       .del_beacon = cfg80211_rtw_del_beacon,\r
-       #else\r
-       .start_ap = cfg80211_rtw_start_ap,\r
-       .change_beacon = cfg80211_rtw_change_beacon,\r
-       .stop_ap = cfg80211_rtw_stop_ap,\r
-       #endif\r
-       \r
-       .add_station = cfg80211_rtw_add_station,\r
-       .del_station = cfg80211_rtw_del_station,\r
-       .change_station = cfg80211_rtw_change_station,\r
-       .dump_station = cfg80211_rtw_dump_station,\r
-       .change_bss = cfg80211_rtw_change_bss,\r
-       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))\r
-       .set_channel = cfg80211_rtw_set_channel,\r
-       #endif\r
-       //.auth = cfg80211_rtw_auth,\r
-       //.assoc = cfg80211_rtw_assoc,  \r
-#endif //CONFIG_AP_MODE\r
-\r
-#ifdef CONFIG_P2P\r
-       .remain_on_channel = cfg80211_rtw_remain_on_channel,\r
-       .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,\r
-#endif\r
-\r
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)    \r
-       .mgmt_tx = cfg80211_rtw_mgmt_tx,\r
-       .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,\r
-#elif  (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))\r
-       .action = cfg80211_rtw_mgmt_tx,\r
-#endif\r
-};\r
-\r
 static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type)\r
 {\r
 \r
@@ -5702,16 +5960,101 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
        wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME;\r
 #endif\r
 \r
+#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\r
+       wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;\r
+#ifdef CONFIG_PNO_SUPPORT\r
+       wiphy->max_sched_scan_ssids = MAX_PNO_LIST_COUNT;\r
+#endif\r
+#endif\r
+\r
+#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\r
+       wiphy->wowlan = wowlan_stub;\r
+#endif\r
+\r
+#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
+       wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;\r
+       //wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;\r
+#endif /* CONFIG_TDLS */\r
+\r
        if(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)\r
                wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;\r
        else \r
                wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;\r
 \r
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
-       wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;\r
+       //wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;\r
 #endif\r
 }\r
 \r
+static struct cfg80211_ops rtw_cfg80211_ops = {\r
+       .change_virtual_intf = cfg80211_rtw_change_iface,\r
+       .add_key = cfg80211_rtw_add_key,\r
+       .get_key = cfg80211_rtw_get_key,\r
+       .del_key = cfg80211_rtw_del_key,\r
+       .set_default_key = cfg80211_rtw_set_default_key,\r
+       .get_station = cfg80211_rtw_get_station,\r
+       .scan = cfg80211_rtw_scan,\r
+       .set_wiphy_params = cfg80211_rtw_set_wiphy_params,\r
+       .connect = cfg80211_rtw_connect,\r
+       .disconnect = cfg80211_rtw_disconnect,\r
+       .join_ibss = cfg80211_rtw_join_ibss,\r
+       .leave_ibss = cfg80211_rtw_leave_ibss,\r
+       .set_tx_power = cfg80211_rtw_set_txpower,\r
+       .get_tx_power = cfg80211_rtw_get_txpower,\r
+       .set_power_mgmt = cfg80211_rtw_set_power_mgmt,\r
+       .set_pmksa = cfg80211_rtw_set_pmksa,\r
+       .del_pmksa = cfg80211_rtw_del_pmksa,\r
+       .flush_pmksa = cfg80211_rtw_flush_pmksa,\r
+       \r
+#ifdef CONFIG_AP_MODE\r
+       .add_virtual_intf = cfg80211_rtw_add_virtual_intf,\r
+       .del_virtual_intf = cfg80211_rtw_del_virtual_intf,\r
+\r
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE)\r
+       .add_beacon = cfg80211_rtw_add_beacon,\r
+       .set_beacon = cfg80211_rtw_set_beacon,\r
+       .del_beacon = cfg80211_rtw_del_beacon,\r
+       #else\r
+       .start_ap = cfg80211_rtw_start_ap,\r
+       .change_beacon = cfg80211_rtw_change_beacon,\r
+       .stop_ap = cfg80211_rtw_stop_ap,\r
+       #endif\r
+       \r
+       .add_station = cfg80211_rtw_add_station,\r
+       .del_station = cfg80211_rtw_del_station,\r
+       .change_station = cfg80211_rtw_change_station,\r
+       .dump_station = cfg80211_rtw_dump_station,\r
+       .change_bss = cfg80211_rtw_change_bss,\r
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))\r
+       .set_channel = cfg80211_rtw_set_channel,\r
+       #endif\r
+       //.auth = cfg80211_rtw_auth,\r
+       //.assoc = cfg80211_rtw_assoc,  \r
+#endif //CONFIG_AP_MODE\r
+\r
+#ifdef CONFIG_P2P\r
+       .remain_on_channel = cfg80211_rtw_remain_on_channel,\r
+       .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,\r
+#endif\r
+\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)    \r
+       .mgmt_tx = cfg80211_rtw_mgmt_tx,\r
+       .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,\r
+#elif  (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))\r
+       .action = cfg80211_rtw_mgmt_tx,\r
+#endif\r
+\r
+#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\r
+       .tdls_mgmt = cfg80211_rtw_tdls_mgmt,\r
+       .tdls_oper = cfg80211_rtw_tdls_oper,\r
+#endif /* CONFIG_TDLS */\r
+\r
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\r
+       .sched_scan_start = cfg80211_rtw_sched_scan_start,\r
+       .sched_scan_stop = cfg80211_rtw_sched_scan_stop,\r
+#endif /* CONFIG_PNO_SUPPORT */\r
+};\r
+\r
 int rtw_wdev_alloc(_adapter *padapter, struct device *dev)\r
 {\r
        int ret = 0;\r
index 831c5cfe377777524533bdf12c00899201dfb4df..622515796d0911b2e3bd7bb686040a835788cd0d 100755 (executable)
 #define  iwe_stream_add_point(a, b, c, d, e)  iwe_stream_add_point(b, c, d, e)
 #endif
 
+#ifdef CONFIG_80211N_HT
+extern int rtw_ht_enable;
+#endif
+
 
 #define RTL_IOCTL_WPA_SUPPLICANT       SIOCIWFIRSTPRIV+30
 
@@ -192,6 +196,7 @@ static void request_wps_pbc_event(_adapter *padapter)
 
 }
 
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC
 void rtw_request_wps_pbc_event(_adapter *padapter)
 {
 #ifdef RTK_DMP_PLATFORM
@@ -213,6 +218,7 @@ void rtw_request_wps_pbc_event(_adapter *padapter)
 
        rtw_led_control(padapter, LED_CTL_START_WPS_BOTTON);
 }
+#endif//#ifdef CONFIG_SUPPORT_HW_WPS_PBC
 
 void indicate_wx_scan_complete_event(_adapter *padapter)
 {      
@@ -343,7 +349,7 @@ static char *translate_scan(_adapter *padapter,
                                u32     p2pielen = 0;
 
                                //      Verifying the P2P IE
-                               if ( rtw_get_p2p_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset, NULL, &p2pielen) )
+                               if (rtw_get_p2p_ie_from_scan_queue(&pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])) 
                                {
                                        blnGotP2PIE = _TRUE;
                                }
@@ -364,7 +370,7 @@ static char *translate_scan(_adapter *padapter,
                u8      wfd_ie[ 128 ] = { 0x00 };
                uint    wfd_ielen = 0;
                
-               if ( rtw_get_wfd_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset,  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;
@@ -416,8 +422,14 @@ static char *translate_scan(_adapter *padapter,
        start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);
 
        //parsing HT_CAP_IE
-       p = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-12);
-
+       if (pnetwork->network.Reserved[0] == 2) // Probe Request
+       {
+               p = rtw_get_ie(&pnetwork->network.IEs[0], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength);
+       }
+       else
+       {
+               p = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-12);
+       }
        if(p && ht_ielen>0)
        {
                struct rtw_ieee80211_ht_cap *pht_capie;
@@ -444,8 +456,8 @@ static char *translate_scan(_adapter *padapter,
 
                _rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p+2), 2);
 
-               vht_highest_rate = rtw_get_vht_highest_rate(padapter, mcs_map);
-               vht_data_rate = rtw_vht_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);
+               vht_highest_rate = rtw_get_vht_highest_rate(mcs_map);
+               vht_data_rate = rtw_vht_mcs_to_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);
        }
 #endif
 
@@ -488,11 +500,16 @@ static char *translate_scan(_adapter *padapter,
        start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);
 
          /* Add mode */
+       if (pnetwork->network.Reserved[0] == 2) // Probe Request
+       {
+               cap = 0;
+       }
+       else
+       {
         iwe.cmd = SIOCGIWMODE;
-       _rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);
-
-
-       cap = le16_to_cpu(cap);
+               _rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);
+               cap = le16_to_cpu(cap);
+       }
 
        if(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){
                if (cap & WLAN_CAPABILITY_BSS)
@@ -565,8 +582,9 @@ static char *translate_scan(_adapter *padapter,
        start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_PARAM_LEN);
 
        //parsing WPA/WPA2 IE
+       if (pnetwork->network.Reserved[0] != 2) // Probe Request
        {
-               u8 buf[MAX_WPA_IE_LEN];
+               u8 buf[MAX_WPA_IE_LEN*2];
                u8 wpa_ie[255],rsn_ie[255];
                u16 wpa_len=0,rsn_len=0;
                u8 *p;
@@ -578,11 +596,20 @@ static char *translate_scan(_adapter *padapter,
                if (wpa_len > 0)
                {
                        p=buf;
-                       _rtw_memset(buf, 0, MAX_WPA_IE_LEN);
+                       _rtw_memset(buf, 0, MAX_WPA_IE_LEN*2);
                        p += sprintf(p, "wpa_ie=");
                        for (i = 0; i < wpa_len; i++) {
                                p += sprintf(p, "%02x", wpa_ie[i]);
                        }
+
+                       if (wpa_len > 100) {
+                               printk("-----------------Len %d----------------\n", wpa_len);
+                               for (i = 0; i < wpa_len; i++) {
+                                       printk("%02x ", wpa_ie[i]);
+                               }
+                               printk("\n");
+                               printk("-----------------Len %d----------------\n", wpa_len);
+                       }
        
                        _rtw_memset(&iwe, 0, sizeof(iwe));
                        iwe.cmd = IWEVCUSTOM;
@@ -597,7 +624,7 @@ static char *translate_scan(_adapter *padapter,
                if (rsn_len > 0)
                {
                        p = buf;
-                       _rtw_memset(buf, 0, MAX_WPA_IE_LEN);
+                       _rtw_memset(buf, 0, MAX_WPA_IE_LEN*2);
                        p += sprintf(p, "rsn_ie=");
                        for (i = 0; i < rsn_len; i++) {
                                p += sprintf(p, "%02x", rsn_ie[i]);
@@ -622,6 +649,17 @@ static char *translate_scan(_adapter *padapter,
                u8 *ie_ptr = pnetwork->network.IEs + ie_offset;
                total_ielen= pnetwork->network.IELength - ie_offset;
 
+               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))                    
@@ -636,10 +674,11 @@ static char *translate_scan(_adapter *padapter,
        }
 
 #ifdef CONFIG_WAPI_SUPPORT
+       if (pnetwork->network.Reserved[0] != 2) // Probe Request
        {
                sint out_len_wapi=0;
                /* here use static for stack size */
-               static u8 buf_wapi[MAX_WAPI_IE_LEN];
+               static u8 buf_wapi[MAX_WAPI_IE_LEN*2];
                static u8 wapi_ie[MAX_WAPI_IE_LEN];
                u16 wapi_len=0;
                u16  i;
@@ -658,7 +697,7 @@ static char *translate_scan(_adapter *padapter,
                if (wapi_len > 0)
                {
                        p=buf_wapi;
-                       _rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN);
+                       _rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2);
                        p += sprintf(p, "wapi_ie=");
                        for (i = 0; i < wapi_len; i++) {
                                p += sprintf(p, "%02x", wapi_ie[i]);
@@ -683,14 +722,19 @@ static char *translate_scan(_adapter *padapter,
        
        /* Add quality statistics */
        iwe.cmd = IWEVQUAL;
-       iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID
+       iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED 
+       #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               | IW_QUAL_NOISE_UPDATED
+       #else
+               | IW_QUAL_NOISE_INVALID
+       #endif
        #ifdef CONFIG_SIGNAL_DISPLAY_DBM
                | IW_QUAL_DBM
        #endif
        ;
 
        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 {
@@ -702,19 +746,40 @@ static char *translate_scan(_adapter *padapter,
        #ifdef CONFIG_SIGNAL_DISPLAY_DBM
        iwe.u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
        #else
+       #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+       {
+               /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
+               
+               HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
+               
+               iwe.u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);
+       }
+       #else
        iwe.u.qual.level = (u8)ss;//%
        #endif
+       #endif
        
        iwe.u.qual.qual = (u8)sq;   // signal quality
 
        #ifdef CONFIG_PLATFORM_ROCKCHIPS
        iwe.u.qual.noise = -100; // noise level suggest by zhf@rockchips
        #else 
+       #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+       {
+               s16 tmp_noise=0;
+               rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(tmp_noise));
+               iwe.u.qual.noise = tmp_noise ;
+       }
+       #else
        iwe.u.qual.noise = 0; // noise level
+       #endif  
        #endif //CONFIG_PLATFORM_ROCKCHIPS
        
        //DBG_871X("iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\n", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);
 
+       start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);
+}
+
        {
                u8 buf[MAX_WPA_IE_LEN];
                u8 * p,*pos;
@@ -728,9 +793,6 @@ static char *translate_scan(_adapter *padapter,
                iwe.u.data.length = strlen(buf);
                start = iwe_stream_add_point(info, start, stop, &iwe, buf);
        }
-
-       start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);
-}
        
        return start;   
 }
@@ -959,7 +1021,7 @@ _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, _TRUE);
+                                       rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);
                                }
                                else//group key
                                {                                       
@@ -1250,8 +1312,8 @@ static int rtw_set_wpa_ie(_adapter *padapter, char *pie, unsigned short ielen)
                                {
                                        DBG_871X("SET WPS_IE\n");
 
-                                       padapter->securitypriv.wps_ie_len = ( (buf[cnt+1]+2) < (MAX_WPA_IE_LEN<<2)) ? (buf[cnt+1]+2):(MAX_WPA_IE_LEN<<2);
-                                       
+                                       padapter->securitypriv.wps_ie_len = ((buf[cnt+1]+2) < MAX_WPS_IE_LEN) ? (buf[cnt+1]+2):MAX_WPS_IE_LEN;
+
                                        _rtw_memcpy(padapter->securitypriv.wps_ie, &buf[cnt], padapter->securitypriv.wps_ie_len);
                                        
                                        set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS);
@@ -2084,15 +2146,8 @@ _func_enter_;
 #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_871X("scanning_via_buddy_intf\n");
-                       pmlmepriv->scanning_via_buddy_intf = _TRUE;
-               }               
-
+       {
                indicate_wx_scan_complete_event(padapter);
-               
                goto exit;
        }
 #endif
@@ -2308,20 +2363,6 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
        }
 #endif //CONFIG_P2P
 
-/*
-#ifdef CONFIG_CONCURRENT_MODE  
-       if(pmlmepriv->scanning_via_buddy_intf == _TRUE)
-       {
-               pmlmepriv->scanning_via_buddy_intf = _FALSE;//reset
-
-               // change pointers to buddy interface
-               padapter = pbuddy_adapter;
-               pmlmepriv = pbuddy_mlmepriv;
-               queue = &(pbuddy_mlmepriv->scanned_queue);              
-               
-       }
-#endif // CONFIG_CONCURRENT_MODE                       
-*/
 #if 1 // Wireless Extension use EAGAIN to try
        wait_status = _FW_UNDER_SURVEY
 #ifndef CONFIG_ANDROID
@@ -4202,14 +4243,13 @@ static int rtw_wps_start(struct net_device *dev,
        u32   u32wps_start = 0;
         unsigned int uintRet = 0;
 
-        uintRet = copy_from_user( ( void* ) &u32wps_start, pdata->pointer, 4 );
-
-       if((padapter->bDriverStopped) || (pdata==NULL))
+       if((_TRUE == padapter->bDriverStopped) ||(_TRUE==padapter->bSurpriseRemoved) || (NULL== pdata))
        {                
                ret= -EINVAL;
                goto exit;
        }               
 
+       uintRet = copy_from_user( ( void* ) &u32wps_start, pdata->pointer, 4 );
        if ( u32wps_start == 0 )
        {
                u32wps_start = *extra;
@@ -4744,7 +4784,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)
@@ -4880,7 +4920,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)
                                {
@@ -4973,7 +5013,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)
@@ -5051,7 +5091,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)
@@ -5124,7 +5164,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)
                                {
@@ -5207,7 +5247,14 @@ static int rtw_p2p_connect(struct net_device *dev,
                DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
                return ret;
        }
-       
+
+#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     
+
        if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO )
        {
                return -1;
@@ -5296,6 +5343,19 @@ static int rtw_p2p_connect(struct net_device *dev,
        else
        {
                DBG_871X( "[%s] Not Found in Scanning Queue~\n", __FUNCTION__ );
+#ifdef CONFIG_INTEL_WIDI
+               _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
+               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);
+               /** 
+                * For WiDi, if we can't find candidate device in scanning queue,
+                * driver will do scanning itself
+                */
+               _enter_critical_bh(&pmlmepriv->lock, &irqL);
+               rtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0);
+               _exit_critical_bh(&pmlmepriv->lock, &irqL);
+#endif //CONFIG_INTEL_WIDI 
                ret = -1;
        }
 exit:  
@@ -5388,7 +5448,7 @@ static int rtw_p2p_invite_req(struct net_device *dev,
                //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
                ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
-               if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset, 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.
@@ -5426,7 +5486,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[ie_offset], pnetwork->network.IELength - ie_offset,  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;
@@ -5727,7 +5787,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.
@@ -5768,7 +5828,7 @@ static int rtw_p2p_set_pc(struct net_device *dev,
                uint    wfd_ielen = 0;
                u8 ie_offset = (pnetwork->network.Reserved[0] == 2 ? 0:12);
 
-               if ( rtw_get_wfd_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset,  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;
@@ -5975,7 +6035,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
        else
        {
 #ifdef CONFIG_INTEL_WIDI
-               if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE){
+               if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
                        DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ );
                        return ret;
                }
@@ -6037,7 +6097,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
                //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
                ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
-               if ( (p2pie=rtw_get_p2p_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset, 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 )
                        {
@@ -6096,7 +6156,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
                        u8      wfd_ie[ 128 ] = { 0x00 };
                        uint    wfd_ielen = 0;
                        
-                       if ( rtw_get_wfd_ie( &pnetwork->network.IEs[ie_offset], pnetwork->network.IELength - ie_offset,  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;
@@ -6189,6 +6249,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
        {
                DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
 #ifdef CONFIG_INTEL_WIDI
+               _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
                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);                
@@ -7054,7 +7115,33 @@ static int rtw_dbg_port(struct net_device *dev,
 
                                        }
                                        break;
+                               case 0x0a:
+                                       {
+                                               int max_mac_id = 0;
+                                               max_mac_id = rtw_search_max_mac_id( padapter);
+                                               printk("%s ==> max_mac_id = %d \n",__FUNCTION__,max_mac_id);
+                                       }       
+                                       break;
+                               case 0x0b: //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+                                       {
+                                               //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+                                               //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
 
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl vcs\n");                                          
+                                                       padapter->driver_vcs_en = 0;                                    
+                                               }
+                                               else if(arg == 1){                                                      
+                                                       DBG_871X("enable driver ctrl vcs = %d\n", extra_arg);
+                                                       padapter->driver_vcs_en = 1;
+       
+                                                       if(extra_arg>2)
+                                                               padapter->driver_vcs_type = 1;                                          
+                                                       else
+                                                               padapter->driver_vcs_type = extra_arg;
+                                               }
+                                       }
+                                       break;
                                case 0x0c://dump rx/tx packet
                                        {
                                                if(arg == 0){
@@ -7079,6 +7166,23 @@ static int rtw_dbg_port(struct net_device *dev,
                                        }                               
                                        break;
 #endif
+                               case 0x0e:
+                                       {
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl rx_ampdu_factor\n");                                              
+                                                       padapter->driver_rx_ampdu_factor = 0xFF;
+                                               }
+                                               else if(arg == 1){
+                                                       
+                                                       DBG_871X("enable driver ctrl rx_ampdu_factor = %d\n", extra_arg);       
+       
+                                                       if((extra_arg & 0x03) > 0x03)
+                                                               padapter->driver_rx_ampdu_factor = 0xFF;                                                
+                                                       else
+                                                               padapter->driver_rx_ampdu_factor = extra_arg;
+                                               }                                       
+                                       }
+                                       break;
                #ifdef DBG_CONFIG_ERROR_DETECT
                                case 0x0f:
                                                {
@@ -7103,14 +7207,12 @@ static int rtw_dbg_port(struct net_device *dev,
                #endif  
 
                                case 0x10:// driver version display
-                                       DBG_871X("rtw driver version=%s\n", DRIVERVERSION);
+                                       dump_drv_version(RTW_DBGDUMP);
                                        break;
-                               case 0x11:
-                                       {                                               
-                                               DBG_871X("linked info dump func %s \n",(extra_arg>=1)?"enable":"disable");                                              
-                                               padapter->bLinkInfoDump = extra_arg ;           
-                                               rtw_hal_set_def_var(padapter, HW_DEF_FA_CNT_DUMP, &(extra_arg));                                                
-                                       }
+                               case 0x11://dump linked status
+                                       {
+                                                linked_info_dump(padapter,extra_arg);
+                                       }                                       
                                        break;
 #ifdef CONFIG_80211N_HT
                                case 0x12: //set rx_stbc
@@ -7132,7 +7234,7 @@ static int rtw_dbg_port(struct net_device *dev,
                                {
                                        struct registry_priv    *pregpriv = &padapter->registrypriv;
                                        // 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)
-                                       if( pregpriv && extra_arg >= 0 && extra_arg < 3 )
+                                       if( pregpriv && extra_arg < 3 )
                                        {
                                                pregpriv->ampdu_enable= extra_arg;
                                                DBG_871X("set ampdu_enable=%d\n",pregpriv->ampdu_enable);
@@ -7177,6 +7279,120 @@ static int rtw_dbg_port(struct net_device *dev,
                                                rtw_hal_set_hwreg(padapter, HW_VAR_USB_MODE, (u8 *)&extra_arg);
                                        }
                                        break;
+#ifdef CONFIG_80211N_HT                        
+                               case 0x19:
+                                       {
+                                               struct registry_priv    *pregistrypriv = &padapter->registrypriv;
+                                               // extra_arg :
+                                               // BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, 
+                                               // BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx
+                                               if(arg == 0){
+                                                       DBG_871X("driver disable LDPC\n");                                              
+                                                       pregistrypriv->ldpc_cap = 0x00;
+                                               }
+                                               else if(arg == 1){                                                      
+                                                       DBG_871X("driver set LDPC cap = 0x%x\n", extra_arg);
+                                                       pregistrypriv->ldpc_cap = (u8)(extra_arg&0x33);                                         
+                                               }                                               
+                                       }
+                                        break;
+                               case 0x1a:
+                                       {
+                                               struct registry_priv    *pregistrypriv = &padapter->registrypriv;
+                                               // extra_arg :
+                                               // BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, 
+                                               // BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx
+                                               if(arg == 0){
+                                                       DBG_871X("driver disable STBC\n");                                              
+                                                       pregistrypriv->stbc_cap = 0x00;
+                                               }
+                                               else if(arg == 1){                                                      
+                                                       DBG_871X("driver set STBC cap = 0x%x\n", extra_arg);
+                                                       pregistrypriv->stbc_cap = (u8)(extra_arg&0x33);                                         
+                                               }                                               
+                                       }
+                                        break;
+#endif //CONFIG_80211N_HT
+                               case 0x1b:
+                                       {       
+                                               struct registry_priv    *pregistrypriv = &padapter->registrypriv;
+                                               
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl max_rx_rate, reset to default_rate_set\n");                                                       
+                                                       init_mlme_default_rate_set(padapter);
+#ifdef CONFIG_80211N_HT                                                
+                                                       pregistrypriv->ht_enable = (u8)rtw_ht_enable;
+#endif //CONFIG_80211N_HT
+                                               }
+                                               else if(arg == 1){
+
+                                                       int i;
+                                                       u8 max_rx_rate;                                         
+                                                       
+                                                       DBG_871X("enable driver ctrl max_rx_rate = 0x%x\n", extra_arg); 
+
+                                                       max_rx_rate = (u8)extra_arg;
+
+                                                       if(max_rx_rate < 0xc) // max_rx_rate < MSC0 -> B or G -> disable HT
+                                                       {
+#ifdef CONFIG_80211N_HT                                                
+                                                               pregistrypriv->ht_enable = 0;
+#endif //CONFIG_80211N_HT
+                                                               for(i=0; i<NumRates; i++)
+                                                               {
+                                                                       if(pmlmeext->datarate[i] > max_rx_rate)
+                                                                               pmlmeext->datarate[i] = 0xff;                                                                   
+                                                               }       
+
+                                                       }
+#ifdef CONFIG_80211N_HT        
+                                                       else if(max_rx_rate < 0x1c) // mcs0~mcs15
+                                                       {
+                                                               u32 mcs_bitmap=0x0;
+                                                                                                       
+                                                               for(i=0; i<((max_rx_rate+1)-0xc); i++)
+                                                                       mcs_bitmap |= BIT(i);
+                                                               
+                                                               set_mcs_rate_by_mask(pmlmeext->default_supported_mcs_set, mcs_bitmap);
+                                                       }
+#endif //CONFIG_80211N_HT                                                      
+                                               }                                                                                       
+                                       }
+                                        break;
+                               case 0x1c: //enable/disable driver control AMPDU Density for peer sta's rx
+                                       {
+                                               if(arg == 0){
+                                                       DBG_871X("disable driver ctrl ampdu density\n");                                                
+                                                       padapter->driver_ampdu_spacing = 0xFF;
+                                               }
+                                               else if(arg == 1){
+                                                       
+                                                       DBG_871X("enable driver ctrl ampdu density = %d\n", extra_arg); 
+       
+                                                       if((extra_arg & 0x07) > 0x07)
+                                                               padapter->driver_ampdu_spacing = 0xFF;                                          
+                                                       else
+                                                               padapter->driver_ampdu_spacing = extra_arg;
+                                               }
+                                       }
+                                       break;
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+                               case 0x1e:
+                                       {
+                                               HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+                                               PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
+                                               u8 chan = rtw_get_oper_ch(padapter);
+                                               DBG_871X("===========================================\n");
+                                               ODM_InbandNoise_Monitor(pDM_Odm,_TRUE,0x1e,100);
+                                               DBG_871X("channel(%d),noise_a = %d, noise_b = %d , noise_all:%d \n", 
+                                                       chan,pDM_Odm->noise_level.noise[ODM_RF_PATH_A], 
+                                                       pDM_Odm->noise_level.noise[ODM_RF_PATH_B],
+                                                       pDM_Odm->noise_level.noise_all);
+                                               DBG_871X("===========================================\n");
+                                               
+                                       }
+                                       break;
+#endif
                                case 0x23:
                                        {
                                                DBG_871X("turn %s the bNotifyChannelChange Variable\n",(extra_arg==1)?"on":"off");
@@ -7191,6 +7407,46 @@ static int rtw_dbg_port(struct net_device *dev,
 #endif // CONFIG_P2P
                                                break;                                          
                                        }
+#ifdef CONFIG_GPIO_API              
+                           case 0x25: //Get GPIO register
+                                   {
+                                           /*
+                                           * dbg 0x7f250000 [gpio_num], Get gpio value, gpio_num:0~7
+                                           */                
+                              
+                                           int value;
+                                           DBG_871X("Read GPIO Value  extra_arg = %d\n",extra_arg);
+                                           value = rtw_get_gpio(dev,extra_arg);
+                                           DBG_871X("Read GPIO Value = %d\n",value);                                        
+                                           break;
+                                   }
+                           case 0x26: //Set GPIO direction
+                                   {
+                                                                                       
+                                           /* dbg 0x7f26000x [y], Set gpio direction, 
+                                           * x: gpio_num,4~7  y: indicate direction, 0~1  
+                                           */ 
+                                        
+                                           int value;
+                                           DBG_871X("Set GPIO Direction! arg = %d ,extra_arg=%d\n",arg ,extra_arg);
+                                           value = rtw_config_gpio(dev, arg, extra_arg);
+                                           DBG_871X("Set GPIO Direction %s \n",(value==-1)?"Fail!!!":"Success");
+                                           break;
+                                       }
+                               case 0x27: //Set GPIO output direction value
+                                       {
+                                               /*
+                                               * dbg 0x7f27000x [y], Set gpio output direction value, 
+                                               * x: gpio_num,4~7  y: indicate direction, 0~1  
+                                               */ 
+                                        
+                                               int value;
+                                               DBG_871X("Set GPIO Value! arg = %d ,extra_arg=%d\n",arg ,extra_arg);
+                                               value = rtw_set_gpio_output_value(dev,arg,extra_arg);
+                                               DBG_871X("Set GPIO Value %s \n",(value==-1)?"Fail!!!":"Success");
+                                               break;
+                                       }
+#endif                            
                                case 0xaa:
                                        {
                                                if((extra_arg & 0x7F)> 0x3F) extra_arg = 0xFF;
@@ -8608,8 +8864,6 @@ static int rtw_wx_set_priv(struct net_device *dev,
                {
                        cp_sz = probereq_wpsie_len>MAX_WPS_IE_LEN ? MAX_WPS_IE_LEN:probereq_wpsie_len;
 
-                       //_rtw_memcpy(pmlmepriv->probereq_wpsie, probereq_wpsie, cp_sz);
-                       //pmlmepriv->probereq_wpsie_len = cp_sz;
                        if(pmlmepriv->wps_probe_req_ie)
                        {
                                u32 free_len = pmlmepriv->wps_probe_req_ie_len;
@@ -8729,6 +8983,79 @@ FREE_EXT:
        return ret;
        
 }
+#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 net_device *pnetdev = padapter->pnetdev;
+#ifdef CONFIG_CONCURRENT_MODE
+       struct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;   
+#endif
+       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 )) {
+
+               padapter->registrypriv.mp_mode = 1;
+
+               while (pwrctrlpriv->bips_processing == _TRUE)
+                       rtw_msleep_os(1);
+
+               rtw_ps_deny(padapter, PS_DENY_SUSPEND);
+
+               rtw_cancel_all_timer(padapter);
+
+#ifdef CONFIG_CONCURRENT_MODE
+               if (padapter->pbuddy_adapter){
+                       rtw_cancel_all_timer(padapter->pbuddy_adapter);
+               }
+#endif // CONFIG_CONCURRENT_MODE
+
+               LeaveAllPowerSaveModeDirect(padapter);
+
+               rtw_stop_cmd_thread(padapter);
+
+               rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
+
+               rtw_suspend_wow(padapter);
+
+       } else if (_rtw_memcmp( extra, "disable", 6 )) {
+               rtw_resume_process_wow(padapter);
+               padapter->registrypriv.mp_mode = 0;
+       } 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
 
 #ifdef CONFIG_AP_WOWLAN
 static int rtw_ap_wowlan_ctrl(struct net_device *dev,
@@ -9526,6 +9853,10 @@ static int rtw_mp_efuse_set(struct net_device *dev,
        pHalData = GET_HAL_DATA(padapter);
        pEfuseHal = &pHalData->EfuseHal;
        err = 0;
+       
+       if (copy_from_user(extra, wrqu->pointer, wrqu->length))
+                       return -EFAULT;
+                       
        setdata = rtw_zmalloc(1024);
        if (setdata == NULL)
        {
@@ -9560,9 +9891,6 @@ static int rtw_mp_efuse_set(struct net_device *dev,
        ips_mode = pwrctrlpriv->ips_mode;//keep org value
        rtw_pm_set_ips(padapter,IPS_NONE);
        #endif  
-
-       if (copy_from_user(extra, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
                        
        pch = extra;
        DBG_871X("%s: in=%s\n", __FUNCTION__, extra);
@@ -10571,29 +10899,21 @@ static int rtw_mp_start(struct net_device *dev,
        struct dm_priv  *pdmpriv = &pHalData->dmpriv;
        struct hal_ops *pHalFunc = &padapter->HalFunc;
 
+       rtw_pm_set_ips(padapter,IPS_NONE);
+       LeaveAllPowerSaveMode(padapter);
+
        if(padapter->registrypriv.mp_mode ==0)
        {
-               #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
-               DBG_871X("_rtw_mp_xmit_priv for Download BT patch FW\n");
-               _rtw_mp_xmit_priv(&padapter->xmitpriv);
-               #endif
-       
-               padapter->registrypriv.mp_mode =1;
-
-               rtw_pm_set_ips(padapter,IPS_NONE);
-               LeaveAllPowerSaveMode(padapter);
 
-               MPT_InitializeAdapter(padapter, 1);
 #ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HaltNotify(padapter);
-               rtw_btcoex_SetManualControl(padapter, _TRUE);
                pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT;
-               // Force to switch Antenna to WiFi
-               padapter->registrypriv.mp_mode=0;
+#endif         
+               pHalFunc->hal_deinit(padapter);
+               padapter->registrypriv.mp_mode =1;
                pHalFunc->hal_init(padapter);
-               padapter->registrypriv.mp_mode=1;
-               //rtw_btcoex_HaltNotify(padapter);
-#endif
+
+               rtw_pm_set_ips(padapter,IPS_NONE);
+               LeaveAllPowerSaveMode(padapter);
        }
 
        if (padapter->registrypriv.mp_mode == 0)
@@ -10606,11 +10926,21 @@ static int rtw_mp_start(struct net_device *dev,
                MPT_PwrCtlDM(padapter,0);
        }
        padapter->mppriv.bmac_filter = _FALSE;
+#ifdef CONFIG_RTL8723B
+#ifdef CONFIG_USB_HCI
+       rtw_write32(padapter, 0x765, 0x0000);
+       rtw_write32(padapter, 0x948, 0x0280);
+#else
+       rtw_write32(padapter, 0x765, 0x0000);
+       rtw_write32(padapter, 0x948, 0x0000);
+#endif 
+#endif
 #ifdef CONFIG_RTL8723B
        rtw_write8(padapter, 0x66, 0x27); //Open BT uart Log
        rtw_write8(padapter, 0xc50, 0x20); //for RX init Gain
 #endif 
        ODM_Write_DIG(&pHalData->odmpriv,0x20);
+
        return 0;
 }
 
@@ -10623,10 +10953,6 @@ static int rtw_mp_stop(struct net_device *dev,
 
        if(padapter->registrypriv.mp_mode ==1)
        {
-               #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
-               DBG_871X("_rtw_mp_xmit_priv reinit for normal mode\n");
-               _rtw_mp_xmit_priv(&padapter->xmitpriv);
-               #endif
                
                MPT_DeInitAdapter(padapter);
                pHalFunc->hal_deinit(padapter);
@@ -10881,7 +11207,7 @@ static int rtw_mp_ctx(struct net_device *dev,
 {
        u32 pkTx = 1, countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1;
        u32 bStartTest = 1;
-       u32 count = 0;
+       u32 count = 0,pktinterval=0;
        struct mp_priv *pmp_priv;
        struct pkt_attrib *pattrib;
 
@@ -10903,9 +11229,19 @@ static int rtw_mp_ctx(struct net_device *dev,
        pkTx = strncmp(extra, "background,pkt", 20);
        stop = strncmp(extra, "stop", 4);
        sscanf(extra, "count=%d,pkt", &count);
+       sscanf(extra, "pktinterval=%d", &pktinterval);
        
        //DBG_871X("%s: count=%d countPkTx=%d cotuTx=%d CarrSprTx=%d scTx=%d sgleTx=%d pkTx=%d stop=%d\n", __func__, count, countPkTx, cotuTx, CarrSprTx, pkTx, sgleTx, scTx, stop);
        _rtw_memset(extra, '\0', sizeof(extra));
+
+       if( pktinterval !=0 )
+       {
+               sprintf( extra, "Pkt Interval = %d",pktinterval);
+               padapter->mppriv.pktInterval = pktinterval;
+               
+               wrqu->length = strlen(extra);
+               return 0;
+       }
        
        if (stop == 0) {
                bStartTest = 0; // To set Stop
@@ -10973,15 +11309,15 @@ static int rtw_mp_ctx(struct net_device *dev,
                        if (bStartTest != 0){
                                sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
             }
-                               Hal_SetSingleToneTx(padapter, (u8)bStartTest);
+                       Hal_SetSingleToneTx(padapter, (u8)bStartTest);
                        break;
 
                case MP_CONTINUOUS_TX:
                        //DBG_871X("%s: cotuTx %d\n", __func__, bStartTest);
                        if (bStartTest != 0){
                                sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-                        }
-                         Hal_SetContinuousTx(padapter, (u8)bStartTest);
+                        }
+                       Hal_SetContinuousTx(padapter, (u8)bStartTest);
                        break;
 
                case MP_CARRIER_SUPPRISSION_TX:
@@ -10990,10 +11326,11 @@ static int rtw_mp_ctx(struct net_device *dev,
                                if( pmp_priv->rateidx <= MPT_RATE_11M ) 
                                {
                                        sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-                                       Hal_SetCarrierSuppressionTx(padapter, (u8)bStartTest);
+                                       
                                }else
                                        sprintf( extra, "Specify carrier suppression but not CCK rate");
                        }
+                       Hal_SetCarrierSuppressionTx(padapter, (u8)bStartTest);
                        break;
 
                case MP_SINGLE_CARRIER_TX:
@@ -11001,7 +11338,7 @@ static int rtw_mp_ctx(struct net_device *dev,
                        if (bStartTest != 0){
                                sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
                        }
-                               Hal_SetSingleCarrierTx(padapter, (u8)bStartTest);
+                       Hal_SetSingleCarrierTx(padapter, (u8)bStartTest);
                        break;
 
                default:
@@ -11091,7 +11428,7 @@ static int rtw_mp_arx(struct net_device *dev,
        u32             mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0;
        u8              input[wrqu->length];
        char *pch, *ptmp, *token, *tmp[2]={0x00,0x00};
-       u32 i=0,ii=0,jj=0,kk=0,cnts=0;
+       u32 i=0,ii=0,jj=0,kk=0,cnts=0,bmon=0;
        PADAPTER padapter = rtw_netdev_priv(dev);
        struct mp_priv *pmppriv = &padapter->mppriv;
 
@@ -11107,7 +11444,7 @@ static int rtw_mp_arx(struct net_device *dev,
        bSetBssid = (strncmp(input, "setbssid=", 8)==0)?1:0; // strncmp TRUE is 0
        //bfilter_init = (strncmp(input, "filter_init",11)==0)?1:0;
        bmac_filter = (strncmp(input, "accept_mac",10)==0)?1:0;
-
+       bmon = (strncmp(input, "mon=",4)==0)?1:0;
 
        if(bSetBssid==1){
                pch = input;
@@ -11172,8 +11509,7 @@ static int rtw_mp_arx(struct net_device *dev,
        else if(bQueryPhy)
        {          
 
-               //if (IS_HARDWARE_TYPE_JAGUAR(padapter)) 
-               #ifdef CONFIG_RTL8188A
+               if (IS_HARDWARE_TYPE_JAGUAR(padapter)) 
                {
                        cckok      = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF);        // [13:0]  
                        ofdmok     = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF);        // [13:0]  
@@ -11183,22 +11519,31 @@ static int rtw_mp_arx(struct net_device *dev,
                        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]           
+                       vht_err     = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]   
+                       
+                       CCK_FA = PHY_QueryBBReg(padapter, 0xa5c, bMaskLWord);
+                       OFDM_FA = PHY_QueryBBReg(padapter, 0xF48, bMaskLWord);
                } 
-               #else
+               else
                {
                        cckok      = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord);               
                        ofdmok     = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord);               
-                       htok       = PHY_QueryBBReg(padapter, 0xF90, 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
+               
+               OFDM_FA = PHY_QueryBBReg(padapter, 0xCF0, bMaskLWord) + PHY_QueryBBReg(padapter, 0xCF2, bMaskLWord) + 
+                                       PHY_QueryBBReg(padapter, 0xDA2, bMaskLWord)+ PHY_QueryBBReg(padapter, 0xDA4, bMaskLWord) + 
+                                       PHY_QueryBBReg(padapter, 0xDA6, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA8, bMaskLWord);
+               
                CCK_FA=(rtw_read8(padapter, 0xa5b )<<8 ) | (rtw_read8(padapter, 0xa5c));
+               }
+               DBG_871X("%s: OFDM_FA =%d\n", __FUNCTION__, OFDM_FA);
+               DBG_871X("%s: CCK_FA =%d\n", __FUNCTION__, 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)
@@ -11225,12 +11570,25 @@ static int rtw_mp_arx(struct net_device *dev,
                        DropPacket = rtw_read32(padapter, 0x664)& 0x0000FFFF;
                } 
                
-               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);                 
+               sprintf( extra, "Mac Received packet OK: %d , CRC error: %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,DropPacket);                        
        }
-       wrqu->length = strlen(extra) + 1;
 
+       if( bmon==1 ) { 
+               sscanf(input, "mon=%d", &bmon);
+               
+               if(bmon==1)
+               {
+                       pmppriv->rx_bindicatePkt= _TRUE;
+                       sprintf( extra, "Indicating Receive Packet to network start\n");
+               }else {
+                       pmppriv->rx_bindicatePkt= _FALSE;
+                       sprintf( extra, "Indicating Receive Packet to network Stop\n");
+               }       
+       }
        
+       wrqu->length = strlen(extra) + 1;
+
        return 0;
 }
 
@@ -11284,11 +11642,11 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
                }
                else if (sscanf(input, "ther=%d", &thermal)) {
                        pHalData->TxPowerTrackControl = _TRUE;
-                               ret = Hal_SetThermalMeter(padapter, (u8)thermal);
-                               if (ret == _FAIL) return -EPERM;
+                       ret = Hal_SetThermalMeter(padapter, (u8)thermal);
+                       if (ret == _FAIL) return -EPERM;
                                sprintf(extra, "mp tx power tracking start,target value=%d ok ",thermal);
-               }else   {
-                               return -EINVAL;
+               }else{
+                       return -EINVAL;
                }
        }
 
@@ -11407,12 +11765,26 @@ static int rtw_mp_reset_stats(struct net_device *dev,
        {
                write_bbreg(padapter, 0xB58, BIT0, 0x1);
                write_bbreg(padapter, 0xB58, BIT0, 0x0);
+
+               write_bbreg(padapter, 0x9A4, BIT17, 0x1);//reset  OFDA FA counter
+               write_bbreg(padapter, 0x9A4, BIT17, 0x0);
+               
+               write_bbreg(padapter, 0xA5C, BIT15, 0x0);//reset  CCK FA counter
+               write_bbreg(padapter, 0xA5C, BIT15, 0x1);
        }
        else
        {
                write_bbreg(padapter, 0xF14, BIT16, 0x1);
                rtw_msleep_os(10);
                write_bbreg(padapter, 0xF14, BIT16, 0x0);
+               
+               write_bbreg(padapter, 0xD00, BIT27, 0x1);//reset  OFDA FA counter
+               write_bbreg(padapter, 0xC0C, BIT31, 0x1);//reset  OFDA FA counter
+               write_bbreg(padapter, 0xD00, BIT27, 0x0);
+               write_bbreg(padapter, 0xC0C, BIT31, 0x0);
+               
+               write_bbreg(padapter, 0xA2C, BIT15, 0x0);//reset  CCK FA counter
+               write_bbreg(padapter, 0xA2C, BIT15, 0x1);
        }
        //reset mac counter
        PHY_SetMacReg(padapter, 0x664, BIT27, 0x1); 
@@ -11479,7 +11851,7 @@ static int rtw_mp_SetRFPath(struct net_device *dev,
 {
        PADAPTER padapter = rtw_netdev_priv(dev);
        char    input[wrqu->data.length];
-       u8              bMain=1,bTurnoff=1;
+       s32             bMain=1,bTurnoff=1;
        
        if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
                        return -EFAULT;
@@ -11508,7 +11880,7 @@ static int rtw_mp_QueryDrv(struct net_device *dev,
 {
        PADAPTER padapter = rtw_netdev_priv(dev);
        char    input[wrqu->data.length];
-       u8              qAutoLoad=1;
+       s32     qAutoLoad=1;
 
        EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
        
@@ -11674,12 +12046,6 @@ static int rtw_mp_SetBT(struct net_device *dev,
        }
        if ( strncmp(extra, "dlfw", 4) == 0)
        {
-               #ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HaltNotify(padapter);
-               //DBG_871X("SetBT bt1ant !\n");
-               //hal_btcoex1ant_SetAntPath(padapter);
-               rtw_btcoex_SetManualControl(padapter, _TRUE);
-               #endif
                pHalData->LastHMEBoxNum=0;
                padapter->bBTFWReady = _FALSE;
                rtw_write8(padapter, 0xa3, 0x05);
@@ -11727,6 +12093,12 @@ static int rtw_mp_SetBT(struct net_device *dev,
 #endif
                DBG_871X("Wait for FirmwareDownloadBT fw boot!\n");
                rtw_msleep_os(1000);
+#ifdef CONFIG_BT_COEXIST
+               rtw_btcoex_HaltNotify(padapter);
+               DBG_871X("SetBT btcoex HaltNotify !\n");
+               //hal_btcoex1ant_SetAntPath(padapter);
+               rtw_btcoex_SetManualControl(padapter, _TRUE);
+#endif         
                _rtw_memset(extra,'\0', wrqu->data.length);
                BtReq.opCodeVer = 1;
                BtReq.OpCode = 0;
@@ -11745,7 +12117,7 @@ static int rtw_mp_SetBT(struct net_device *dev,
                        else
                        {
                                #ifdef CONFIG_BT_COEXIST
-                               rtw_btcoex_SwitchGntBt(padapter);
+                               rtw_btcoex_SwitchBtTRxMask(padapter);
                                #endif
                                rtw_msleep_os(200);
                                sprintf(extra, "download FW OK.\n");
@@ -11756,9 +12128,15 @@ static int rtw_mp_SetBT(struct net_device *dev,
 
        if ( strncmp(extra, "down", 4) == 0){
                DBG_871X("SetBT down for to hal_init !\n");
-               mp_stop_test(padapter);
+#ifdef CONFIG_BT_COEXIST               
+               rtw_btcoex_SetManualControl(padapter, _FALSE);
+               rtw_btcoex_Initialize(padapter);
+#endif         
+               pHalFunc->read_adapter_info(padapter);
+               pHalFunc->hal_deinit(padapter);
                pHalFunc->hal_init(padapter);
-               mp_start_test(padapter);
+               rtw_pm_set_ips(padapter,IPS_NONE);
+               LeaveAllPowerSaveMode(padapter);
                MPT_PwrCtlDM(padapter,0);
                rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004));
                rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF));
@@ -11790,7 +12168,7 @@ static int rtw_mp_SetBT(struct net_device *dev,
        if ( strncmp(extra, "2ant", 4) == 0){
                DBG_871X("Set BT 2ant use!\n");
                PHY_SetMacReg(padapter,0x67,BIT5,0x1);
-               rtw_write16(padapter, 0x948, 0000);
+               rtw_write32(padapter, 0x948, 0000);
                
                goto exit;
        }
@@ -12004,6 +12382,12 @@ static int rtw_mp_set(struct net_device *dev,
                        DBG_871X("set case MP_DISABLE_BT_COEXIST \n");
                        rtw_mp_disable_bt_coexist(dev, info, wdata, extra);
                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
 #ifdef CONFIG_AP_WOWLAN
        case MP_AP_WOW_ENABLE:
                        DBG_871X("set case MP_AP_WOW_ENABLE: %s \n", extra);
@@ -12238,14 +12622,16 @@ static int rtw_tdls_enable(struct net_device *dev,
        struct  sta_priv *pstapriv = &padapter->stapriv;
        u8 tdls_sta[NUM_STA][ETH_ALEN];
        u8 empty_hwaddr[ETH_ALEN] = { 0x00 };
+       struct tdls_txmgmt txmgmt;
 
        printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
        _rtw_memset(tdls_sta, 0x00, sizeof(tdls_sta));
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
 
        if ( extra[ 0 ] == '0' )
        {
-               ptdlsinfo->enable = 0;
+               ptdlsinfo->tdls_enable = 0;
 
                if(pstapriv->asoc_sta_count==1)
                        return ret;
@@ -12275,7 +12661,9 @@ static int rtw_tdls_enable(struct net_device *dev,
                        if( !_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN) )
                        {
                                printk("issue tear down to "MAC_FMT"\n", MAC_ARG(tdls_sta[index]));
-                               issue_tdls_teardown(padapter, tdls_sta[index]);
+                               txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;
+                               _rtw_memcpy(txmgmt.peer, tdls_sta[index], ETH_ALEN);
+                               issue_tdls_teardown(padapter, &txmgmt, _FALSE);
                        }
                }
                rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR);
@@ -12283,7 +12671,7 @@ static int rtw_tdls_enable(struct net_device *dev,
        }
        else if ( extra[ 0 ] == '1' )
        {
-               ptdlsinfo->enable = 1;
+               ptdlsinfo->tdls_enable = 1;
        }
 #endif //CONFIG_TDLS
        
@@ -12295,21 +12683,25 @@ static int rtw_tdls_setup(struct net_device *dev,
                                union iwreq_data *wrqu, char *extra)
 {
        int ret = 0;
-
 #ifdef CONFIG_TDLS
-
        u8 i, j;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       u8 mac_addr[ETH_ALEN];
-
+       struct tdls_txmgmt txmgmt;
 #ifdef CONFIG_WFD
        struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
 #endif // CONFIG_WFD
 
        printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
+       if(wrqu->data.length - 1 != 17 )
+       {
+               printk( "[%s] length:%d != 17\n", __FUNCTION__, (wrqu->data.length -1)  );
+               return ret;
+       }
+
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
        for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
-               mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
+               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
        }
 
 #ifdef CONFIG_WFD
@@ -12323,13 +12715,13 @@ static int rtw_tdls_setup(struct net_device *dev,
                }
                else
                {
-                       issue_tdls_setup_req(padapter, mac_addr);
+                       issue_tdls_setup_req(padapter, &txmgmt, _TRUE);
                }
        }
        else
 #endif // CONFIG_WFD
        {
-               issue_tdls_setup_req(padapter, mac_addr);
+               issue_tdls_setup_req(padapter, &txmgmt, _TRUE);
        }
 #endif
        
@@ -12347,22 +12739,33 @@ static int rtw_tdls_teardown(struct net_device *dev,
        u8 i,j;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct sta_info *ptdls_sta = NULL;
-       u8 mac_addr[ETH_ALEN];
+       struct tdls_txmgmt txmgmt;
 
        DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
+       if(wrqu->data.length - 1 != 17 && wrqu->data.length - 1 != 19)
+       {
+               printk( "[%s] length:%d != 17 or 19\n", __FUNCTION__, (wrqu->data.length -1)  );
+               return ret;
+       }
+
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
        for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
-               mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
+               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
        }
 
-       ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), mac_addr);
+       ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer);
        
        if(ptdls_sta != NULL)
        {
-               ptdls_sta->stat_code = _RSON_TDLS_TEAR_UN_RSN_;
-               issue_tdls_teardown(padapter, mac_addr);
+               txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;
+               if(wrqu->data.length - 1 == 17)
+                       issue_tdls_teardown(padapter, &txmgmt, _FALSE);
+               else if(wrqu->data.length - 1 == 19)
+                       issue_tdls_teardown(padapter, &txmgmt, _TRUE);
        }
-
+       else
+               DBG_871X( "TDLS peer not found\n");
 #endif //CONFIG_TDLS
        
        return ret;
@@ -12379,10 +12782,17 @@ static int rtw_tdls_discovery(struct net_device *dev,
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
+       struct tdls_txmgmt      txmgmt;
+       int i = 0, j=0;
 
        DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
-       issue_tdls_dis_req(padapter, NULL);
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
+       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
+       }
+
+       issue_tdls_dis_req(padapter, &txmgmt);
 
 #endif //CONFIG_TDLS
 
@@ -12411,9 +12821,10 @@ static int rtw_tdls_ch_switch(struct net_device *dev,
        ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
        if( ptdls_sta == NULL )
                return ret;
-       ptdlsinfo->ch_sensing=1;
 
-       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_INIT_CH_SEN);
+//     ptdlsinfo->ch_sensing=1;
+
+//     rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_INIT_CH_SEN);
 
 #endif //CONFIG_TDLS
 
@@ -12442,8 +12853,8 @@ static int rtw_tdls_pson(struct net_device *dev,
 
        ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
 
-       issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 1);
-       
+       issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 3, 500);
+
 #endif //CONFIG_TDLS
 
                return ret;
@@ -12471,8 +12882,11 @@ static int rtw_tdls_psoff(struct net_device *dev,
 
        ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
 
-       issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0);
-       
+       if(ptdls_sta)
+       {
+               //issue_tdls_peer_traffic_rsp(padapter, ptdls_sta);
+               issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 3, 500);
+       }
 #endif //CONFIG_TDLS
 
        return ret;
@@ -12628,28 +13042,68 @@ static int rtw_wfd_tdls_status(struct net_device *dev,
        int ret = 0;    
 
 #ifdef CONFIG_TDLS
-#ifdef CONFIG_WFD
 
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
-       struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
 
        printk( "[%s]\n", __FUNCTION__);
 
-       if(ptdlsinfo->setup_state == TDLS_LINKED_STATE )
-       {
-               sprintf( extra, "\n\nStatus=1\n" );
+       sprintf( extra, "\nlink_established:0x%08x \n"
+               "sta_cnt:%d \n"
+               "sta_maximum:%d \n"
+               "cur_channel:%d \n"
+               "tdls_enable:%d",
+               ptdlsinfo->link_established, ptdlsinfo->sta_cnt, ptdlsinfo->sta_maximum,
+               ptdlsinfo->cur_channel, ptdlsinfo->tdls_enable
+               );
+
+       wrqu->data.length = strlen( extra );
+
+#endif //CONFIG_TDLS
+
+       return ret;
+               
        }
-       else
+
+static int rtw_tdls_getsta(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
        {
-               sprintf( extra, "\n\nStatus=0\n" );
+       
+       int ret = 0;
+#ifdef CONFIG_TDLS
+       u8 i, j;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       u8 addr[ETH_ALEN] = {0};
+       char charmac[17];
+       struct sta_info *ptdls_sta = NULL;
+
+       printk( "[%s] %s %d\n", __FUNCTION__, (char *)wrqu->data.pointer, wrqu->data.length -1  );
+
+       if(copy_from_user(charmac, wrqu->data.pointer+9, 17)){
+               ret = -EFAULT;
+               goto exit;
        }
        
+       printk("[%s] %d, charmac:%s\n", __FUNCTION__, __LINE__, charmac);
+       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+               addr[i]=key_2char2num(*(charmac+j), *(charmac+j+1));
+       }
+
+       printk("[%s] %d, charmac:%s, addr:"MAC_FMT"\n", __FUNCTION__, __LINE__, charmac, MAC_ARG(addr));
+       ptdls_sta = rtw_get_stainfo(&padapter->stapriv, addr);  
+       if(ptdls_sta) {
+               sprintf(extra, "\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state);
+               printk("\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state);
+       }
+       else {
+               sprintf(extra, "\n\nNot found this sta\n");
+               printk("\n\nNot found this sta\n");
+       }
        wrqu->data.length = strlen( extra );
 
-#endif //CONFIG_WFD
 #endif //CONFIG_TDLS
-
+exit:
        return ret;
                
 }
@@ -12697,6 +13151,8 @@ static int rtw_tdls(struct net_device *dev,
 #ifdef CONFIG_TDLS
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
 
+
+
        DBG_871X( "[%s] extra = %s\n", __FUNCTION__, extra );
        //      WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now!
        if ( _rtw_memcmp( extra, "wfdenable=", 10 ) )
@@ -12718,7 +13174,7 @@ static int rtw_tdls(struct net_device *dev,
                return ret;
        }
 
-       if( padapter->tdlsinfo.enable == 0 )
+       if( padapter->tdlsinfo.tdls_enable == 0 )
        {
                printk("tdls haven't enabled\n");
                return 0;
@@ -12804,6 +13260,10 @@ static int rtw_tdls_get(struct net_device *dev,
        {
                rtw_wfd_tdls_status( dev, info, wrqu, extra );
        }
+       if ( _rtw_memcmp( wrqu->data.pointer, "tdls_sta=", 9 ) )
+       {
+               rtw_tdls_getsta( dev, info, wrqu, extra );
+       }
 
 #endif //CONFIG_WFD
 
@@ -13754,7 +14214,7 @@ static const struct iw_priv_args rtw_private_args[] = {
        },
        {
                SIOCIWFIRSTPRIV + 0x15,
-               IW_PRIV_TYPE_CHAR | P2P_PRIVATE_IOCTL_SET_LEN, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P2P_PRIVATE_IOCTL_SET_LEN , "tdls_get"
+               IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 , "tdls_get"
        },      
        {
                SIOCIWFIRSTPRIV + 0x16,
@@ -13825,8 +14285,11 @@ 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_mode" }, //set 
+#endif
 #ifdef CONFIG_AP_WOWLAN
-               { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_enable" }, //set 
+               { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_mode" }, //set 
 #endif
 };
 
@@ -13911,12 +14374,40 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                #ifdef CONFIG_SIGNAL_DISPLAY_DBM
                tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); 
                #else
+               #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+               {
+                       /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
+                       
+                       HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
+                       
+                       tmp_level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);
+               }
+               #else
                tmp_level = padapter->recvpriv.signal_strength;
                #endif
+               #endif
                
                tmp_qual = padapter->recvpriv.signal_qual;
-               tmp_noise =padapter->recvpriv.noise;            
-               //DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+               if(rtw_linked_check(padapter)){                 
+                       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+                       struct noise_info info;
+                       info.bPauseDIG = _TRUE;
+                       info.IGIValue = 0x1e;
+                       info.max_time = 100;//ms                
+                       info.chan = pmlmeext->cur_channel ;//rtw_get_oper_ch(padapter);
+                       rtw_ps_deny(padapter, PS_DENY_IOCTL);   
+                       LeaveAllPowerSaveModeDirect(padapter);  
+
+                       rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);     
+                       //ODM_InbandNoise_Monitor(podmpriv,_TRUE,0x20,100);
+                       rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
+                       rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(info.chan), &(padapter->recvpriv.noise)); 
+                       DBG_871X("chan:%d,noise_level:%d\n",info.chan,padapter->recvpriv.noise);
+               }
+#endif         
+               tmp_noise = padapter->recvpriv.noise;
+               DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
 
                piwstats->qual.level = tmp_level;
                piwstats->qual.qual = tmp_qual;
@@ -14017,7 +14508,7 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
 
        _rtw_memcpy(&wdata, wrq_data, sizeof(wdata));
 
-       input_len = wdata.data.length;
+       input_len = 2048;
        input = rtw_zmalloc(input_len);
        if (NULL == input)
                return -ENOMEM;
@@ -14026,7 +14517,7 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
                goto exit;
        }
        ptr = input;
-       len = input_len;
+       len = strlen(input);
 
        sscanf(ptr, "%16s", cmdname);
        cmdlen = strlen(cmdname);
@@ -14357,3 +14848,4 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
        return ret;
 }
 
+
index 78ea1017670575db94f0c5e8744dbff4794542f9..c2cc56d6e231b909339fe72198a76a04d2639e59 100755 (executable)
@@ -285,39 +285,41 @@ _func_enter_;
        if(authmode==_WPA_IE_ID_)
        {
                RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode));
-               
-               buff = rtw_malloc(IW_CUSTOM_MAX);
-               
-               _rtw_memset(buff,0,IW_CUSTOM_MAX);
-               
-               p=buff;
-               
+
+               buff = rtw_zmalloc(IW_CUSTOM_MAX);
+               if (NULL == buff) {
+                       DBG_871X(FUNC_ADPT_FMT ": alloc memory FAIL!!\n",
+                               FUNC_ADPT_ARG(adapter));
+                       return;
+               }
+               p = buff;
+
                p+=sprintf(p,"ASSOCINFO(ReqIEs=");
 
                len = sec_ie[1]+2;
-               len =  (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
+               len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
                        
                for(i=0;i<len;i++){
                        p+=sprintf(p,"%02x",sec_ie[i]);
                }
 
                p+=sprintf(p,")");
-               
+
                _rtw_memset(&wrqu,0,sizeof(wrqu));
-               
+
                wrqu.data.length=p-buff;
-               
+
                wrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;
-               
+
 #ifndef CONFIG_IOCTL_CFG80211
                wireless_send_event(adapter->pnetdev,IWEVCUSTOM,&wrqu,buff);
 #endif
 
-               if(buff)
-                   rtw_mfree(buff, IW_CUSTOM_MAX);
-               
+               rtw_mfree(buff, IW_CUSTOM_MAX);
        }
 
+exit:
+
 _func_exit_;
 
 }
index 748265e8e36c57e17613e2e7ce2b034a5f87da10..addc731c8c2de6d4f7599fc0c5e57c9bcf94136c 100755 (executable)
@@ -107,9 +107,9 @@ int rtw_ht_enable = 1;
 // 0x21 means enable 2.4G 40MHz & 5G 80MHz
 int rtw_bw_mode = 0x21;
 int rtw_cbw40_enable = 3; // 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g
-int rtw_ampdu_enable = 1;//for enable tx_ampdu
+int rtw_ampdu_enable = 1;//for enable tx_ampdu ,// 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)
 int rtw_rx_stbc = 1;// 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ
-int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto
+int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on
 // Short GI support Bit Map
 // BIT0 - 20MHz, 0: non-support, 1: support
 // BIT1 - 40MHz, 0: non-support, 1: support
@@ -144,9 +144,14 @@ int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX;
 
 #ifdef CONFIG_BT_COEXIST
 int rtw_btcoex_enable = 1;
+module_param(rtw_btcoex_enable, int, 0644);
+MODULE_PARM_DESC(rtw_btcoex_enable, "Enable BT co-existence mechanism");
 int rtw_bt_iso = 2;// 0:Low, 1:High, 2:From Efuse
 int rtw_bt_sco = 3;// 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy
 int rtw_bt_ampdu =1 ;// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU.
+int rtw_ant_num = -1; // <0: undefined, >0: Antenna number
+module_param(rtw_ant_num, int, 0644);
+MODULE_PARM_DESC(rtw_ant_num, "Antenna number setting");
 #endif
 
 int rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA req.
@@ -187,14 +192,6 @@ int rtw_dmsp = 0;
 int rtw_80211d = 0;
 #endif
 
-#ifdef CONFIG_REGULATORY_CTRL
-int rtw_regulatory_id =2;
-#else
-int rtw_regulatory_id = 0xff;// Regulatory tab id, 0xff = follow efuse's setting
-#endif
-module_param(rtw_regulatory_id, int, 0644);
-
-
 #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
 int rtw_force_ant = 2;//0 :normal, 1:Main ant, 2:Aux ant
 int rtw_force_igi =0;//0 :normal
@@ -202,6 +199,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");
@@ -308,20 +312,33 @@ module_param(rtw_80211d, int, 0644);
 MODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism");
 #endif
 
-#ifdef CONFIG_BT_COEXIST
-module_param(rtw_btcoex_enable, int, 0644);
-MODULE_PARM_DESC(rtw_btcoex_enable, "Enable BT co-existence mechanism");
-#endif
-
 uint rtw_notch_filter = RTW_NOTCH_FILTER;
 module_param(rtw_notch_filter, uint, 0644);
 MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
 
-int rtw_tx_pwr_lmt_enable = 2;
+uint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;
+module_param(rtw_hiq_filter, uint, 0644);
+MODULE_PARM_DESC(rtw_hiq_filter, "0:allow all, 1:allow special, 2:deny all");
+
+#if defined(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY) //eFuse: Regulatory selection=1
+int rtw_tx_pwr_lmt_enable = 1;
+int rtw_tx_pwr_by_rate = 1;
+#elif defined(CONFIG_CALIBRATE_TX_POWER_TO_MAX)//eFuse: Regulatory selection=0
+int rtw_tx_pwr_lmt_enable = 0;
+int rtw_tx_pwr_by_rate = 1;
+#else //eFuse: Regulatory selection=2
+#ifdef CONFIG_PCI_HCI
+int rtw_tx_pwr_lmt_enable = 2; // 2- Depend on efuse
+int rtw_tx_pwr_by_rate = 2;// 2- Depend on efuse
+#else // USB & SDIO
+int rtw_tx_pwr_lmt_enable = 0;
+int rtw_tx_pwr_by_rate = 0;
+#endif 
+#endif
+
 module_param(rtw_tx_pwr_lmt_enable, int, 0644);
 MODULE_PARM_DESC(rtw_tx_pwr_lmt_enable,"0:Disable, 1:Enable, 2: Depend on efuse");
 
-int rtw_tx_pwr_by_rate = 2;
 module_param(rtw_tx_pwr_by_rate, int, 0644);
 MODULE_PARM_DESC(rtw_tx_pwr_by_rate,"0:Disable, 1:Enable, 2: Depend on efuse");
 
@@ -421,15 +438,15 @@ _func_enter_;
        registry_par->rx_stbc = (u8)rtw_rx_stbc;
        registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu;
        registry_par->short_gi = (u8)rtw_short_gi;
+       registry_par->ldpc_cap = (u8)rtw_ldpc_cap;
+       registry_par->stbc_cap = (u8)rtw_stbc_cap;
+       registry_par->beamform_cap = (u8)rtw_beamform_cap;
 #endif
 
 #ifdef CONFIG_80211AC_VHT
        registry_par->vht_enable = (u8)rtw_vht_enable;
        registry_par->ampdu_factor = (u8)rtw_ampdu_factor;
        registry_par->vht_rate_sel = (u8)rtw_vht_rate_sel;
-       registry_par->ldpc_cap = (u8)rtw_ldpc_cap;
-       registry_par->stbc_cap = (u8)rtw_stbc_cap;
-       registry_par->beamform_cap = (u8)rtw_beamform_cap;
 #endif
 
 #ifdef CONFIG_TX_EARLY_MODE
@@ -449,6 +466,7 @@ _func_enter_;
        registry_par->bt_iso = (u8)rtw_bt_iso;
        registry_par->bt_sco = (u8)rtw_bt_sco;
        registry_par->bt_ampdu = (u8)rtw_bt_ampdu;
+       registry_par->ant_num = (s8)rtw_ant_num;
 #endif
 
        registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;
@@ -500,8 +518,6 @@ _func_enter_;
        registry_par->force_igi = (u8)rtw_force_igi;
 #endif
 
-       registry_par->regulatory_tid = (u8)rtw_regulatory_id;
-
 #ifdef CONFIG_MULTI_VIR_IFACES
        registry_par->ext_iface_num = (u8)rtw_ext_iface_num;
 #endif //CONFIG_MULTI_VIR_IFACES
@@ -519,7 +535,9 @@ _func_enter_;
        registry_par->load_phy_file = (u8)rtw_load_phy_file;
        registry_par->RegDecryptCustomFile = (u8)rtw_decrypt_phy_file;
 #endif
+       registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;
 
+       registry_par->hiq_filter = (u8)rtw_hiq_filter;
 _func_exit_;
 
        return status;
@@ -998,15 +1016,18 @@ u8 rtw_init_default_value(_adapter *padapter)
        rtw_hal_def_value_init(padapter);
 
        //misc.
-       padapter->bReadPortCancel = _FALSE;
-       padapter->bWritePortCancel = _FALSE;
+       RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
+       RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
        padapter->bLinkInfoDump = 0;
        padapter->bNotifyChannelChange = 0;
 #ifdef CONFIG_P2P
        padapter->bShowGetP2PState = 1;
 #endif
 
+       //for debug purpose
        padapter->fix_rate = 0xFF;
+       padapter->driver_ampdu_spacing = 0xFF;
+       padapter->driver_rx_ampdu_factor =  0xFF;
 
        return ret;
 }
@@ -1031,6 +1052,7 @@ struct dvobj_priv *devobj_init(void)
 
        pdvobj->processing_dev_remove = _FALSE;
 
+       ATOMIC_SET(&pdvobj->disable_func, 0);
 
        return pdvobj;
 
@@ -1060,9 +1082,9 @@ u8 rtw_reset_drv_sw(_adapter *padapter)
        //hal_priv
        if( is_primary_adapter(padapter))
                rtw_hal_def_value_init(padapter);
-       
-       padapter->bReadPortCancel = _FALSE;
-       padapter->bWritePortCancel = _FALSE;
+
+       RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
+       RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
        padapter->bLinkInfoDump = 0;
 
        padapter->xmitpriv.tx_pkts = 0;
@@ -1840,6 +1862,10 @@ static int netdev_if2_close(struct net_device *pnetdev)
                        rtw_netif_stop_queue(pnetdev);
        }
 
+#ifdef CONFIG_P2P
+       rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
+#endif
+
 #ifdef CONFIG_IOCTL_CFG80211
        rtw_scan_abort(padapter);
        adapter_wdev_data(padapter)->bandroid_scan = _FALSE;
@@ -2177,6 +2203,8 @@ int _netdev_open(struct net_device *pnetdev)
        RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - dev_open\n"));
        DBG_871X("+871x_drv - drv_open, bup=%d\n", padapter->bup);
 
+       padapter->netif_up = _TRUE;
+
        if(pwrctrlpriv->ps_flag == _TRUE){
                padapter->net_closed = _FALSE;
                goto netdev_open_normal_process;
@@ -2197,10 +2225,6 @@ int _netdev_open(struct net_device *pnetdev)
 
                DBG_871X("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr));
 
-#ifdef CONFIG_RF_GAIN_OFFSET
-               rtw_bb_rf_gain_offset(padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
                status=rtw_start_drv_threads(padapter);
                if(status ==_FAIL)
                {
@@ -2277,6 +2301,13 @@ int netdev_open(struct net_device *pnetdev)
 {
        int ret;
        _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
+       struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
+
+       if (pwrctrlpriv->bInSuspend == _TRUE)
+       {
+               DBG_871X("+871x_drv - drv_open, bInSuspend=%d\n", pwrctrlpriv->bInSuspend);
+               return 0;
+       }
 
        _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
        ret = _netdev_open(pnetdev);
@@ -2307,10 +2338,6 @@ int  ips_netdrv_open(_adapter *padapter)
                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);
@@ -2387,12 +2414,12 @@ void rtw_ips_dev_unload(_adapter *padapter)
 #endif //#ifdef DBG_CONFIG_ERROR_DETECT                
 #endif //defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)
        {
-       rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, 0);
+               rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, 0);
 
-       if (padapter->intf_stop)
-       {
-               padapter->intf_stop(padapter);
-       }
+               if (padapter->intf_stop)
+               {
+                       padapter->intf_stop(padapter);
+               }
        }
 
        if(padapter->bSurpriseRemoved == _FALSE)
@@ -2402,120 +2429,22 @@ void rtw_ips_dev_unload(_adapter *padapter)
 
 }
 
-#ifdef CONFIG_RF_GAIN_OFFSET
-u32 Array_kfreemap[] = { 
-0xf8,0xe,
-0xf6,0xc,
-0xf4,0xa,
-0xf2,0x8,
-0xf0,0x6,
-0xf3,0x4,
-0xf5,0x2,
-0xf7,0x0,
-0xf9,0x0,
-0xfc,0x0,
-};
-
-void rtw_bb_rf_gain_offset(_adapter *padapter)
-{
-       u8              value = padapter->eeprompriv.EEPROMRFGainOffset;
-       u8              tmp = 0x3e;
-       u32     res,i=0;
-       u4Byte     ArrayLen    = sizeof(Array_kfreemap)/sizeof(u32);
-       pu4Byte    Array           = Array_kfreemap;
-       u4Byte v1=0,v2=0,target=0; 
-       //DBG_871X("+%s value: 0x%02x+\n", __func__, value);
-#if defined(CONFIG_RTL8723A)
-       if (value & BIT0) {
-               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){
-                       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_CCK, 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_OFDM, RF_GAIN_OFFSET_MASK, res);
-               }
-               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");
-       }
-#elif defined(CONFIG_RTL8723B)
-       if (value & BIT4) {
-               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){
-                       res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
-                       res &= 0xfff87fff;
-                       DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
-                       //res &= 0xfff87fff;
-                       for (i = 0; i < ArrayLen; i += 2 )
-                       {
-                               v1 = Array[i];
-                               v2 = Array[i+1];
-                                if ( v1 == padapter->eeprompriv.EEPROMRFGainVal )
-                                {
-                                               DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
-                                               target=v2;
-                                               break;
-                                }
-                       }        
-                       DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target);
-                       PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
-
-                       //res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
-                       //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, 0x7f, 0xffffffff);
-                       DBG_871X("Offset RF Gain. After reg 0x7f=0x%08x\n",res);
-               }
-               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");
-       }
-#else
-       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);
-       } else {
-               DBG_871X("Using the default RF gain.\n");
-       }
-#endif
-       
-}
-#endif //CONFIG_RF_GAIN_OFFSET
-
 
 int pm_netdev_open(struct net_device *pnetdev,u8 bnormal)
 {
        int status = 0;
 
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
 
        if (_TRUE == bnormal)
-               status = netdev_open(pnetdev);
+       {
+               _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
+               status = _netdev_open(pnetdev);
+               _exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
+       }       
 #ifdef CONFIG_IPS
        else
-               status =  (_SUCCESS == ips_netdrv_open((_adapter *)rtw_netdev_priv(pnetdev)))?(0):(-1);
+               status =  (_SUCCESS == ips_netdrv_open(padapter))?(0):(-1);
 #endif
 
        return status;
@@ -2535,6 +2464,7 @@ static int netdev_close(struct net_device *pnetdev)
                        pwrctl->ps_flag = _TRUE;
        }
        padapter->net_closed = _TRUE;
+       padapter->netif_up = _FALSE;
 
 /*     if(!padapter->hw_init_completed)
        {
@@ -2585,7 +2515,7 @@ static int netdev_close(struct net_device *pnetdev)
 #ifdef CONFIG_IOCTL_CFG80211
        rtw_scan_abort(padapter);
        adapter_wdev_data(padapter)->bandroid_scan = _FALSE;
-       padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; //set this at the end
+       //padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; //set this at the end
 #endif //CONFIG_IOCTL_CFG80211
 
 #ifdef CONFIG_WAPI_SUPPORT
@@ -2619,12 +2549,291 @@ 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
+
 void rtw_dev_unload(PADAPTER padapter)
 {
        struct net_device *pnetdev = (struct net_device*)padapter->pnetdev;     
        struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
        struct dvobj_priv *pobjpriv = padapter->dvobj;
        struct debug_priv *pdbgpriv = &pobjpriv->drv_dbg;
+       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
+       u8 cnt = 0;
 
        RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+%s\n",__FUNCTION__));
 
@@ -2645,7 +2854,18 @@ void rtw_dev_unload(PADAPTER padapter)
 
                if (!pwrctl->bInternalAutoSuspend)
                        rtw_stop_drv_threads(padapter);
-               
+
+               while(ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _TRUE){
+                       if (cnt > 5) {
+                               DBG_871X("stop cmdthd timeout\n");
+                               break;
+                       } else {
+                               cnt ++;
+                               DBG_871X("cmdthd is running(%d)\n", cnt);
+                               rtw_msleep_os(10);
+                       }
+               }
+
                RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("@ %s: stop thread complete!\n",__FUNCTION__));
 
                //check the status of IPS
@@ -2659,6 +2879,9 @@ void rtw_dev_unload(PADAPTER padapter)
 
                if (padapter->bSurpriseRemoved == _FALSE)
                {
+#ifdef CONFIG_BT_COEXIST
+                       rtw_btcoex_IpsNotify(padapter, pwrctl->ips_mode_req);
+#endif
 #ifdef CONFIG_WOWLAN
                        if (pwrctl->bSupportRemoteWakeup == _TRUE && 
                                pwrctl->wowlan_mode ==_TRUE) {
@@ -2686,7 +2909,6 @@ void rtw_dev_unload(PADAPTER padapter)
        RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-%s\n",__FUNCTION__));
 }
 
-#ifdef CONFIG_SUSPEND_REFINE
 int rtw_suspend_free_assoc_resource(_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
@@ -2761,12 +2983,7 @@ int rtw_suspend_wow(_adapter *padapter)
        int ret = _SUCCESS;
 
        DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
-       
-       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
-               pwrpriv->wowlan_mode = _TRUE;
-       } else if (pwrpriv->wowlan_pno_enable == _TRUE) {
-               pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
-       }
+
 
        DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
        DBG_871X("wowlan_pno_enable: %d\n", pwrpriv->wowlan_pno_enable);
@@ -2793,15 +3010,17 @@ int rtw_suspend_wow(_adapter *padapter)
                }
                #endif // CONFIG_CONCURRENT_MODE
 
-               //#ifdef CONFIG_POWER_SAVING
+               //#ifdef CONFIG_LPS
                //rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
                //#endif
 
+#ifdef CONFIG_SDIO_HCI
                // 2. disable interrupt
                if (padapter->intf_stop) {
                        padapter->intf_stop(padapter);
                }
 
+
                #ifdef CONFIG_CONCURRENT_MODE
                if (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource
                        padapter->pbuddy_adapter->intf_stop(padapter->pbuddy_adapter);
@@ -2811,6 +3030,7 @@ int rtw_suspend_wow(_adapter *padapter)
                // 2.1 clean interupt
                if (padapter->HalFunc.clear_interrupt)
                        padapter->HalFunc.clear_interrupt(padapter);
+#endif //CONFIG_SDIO_HCI
 
                // 2.2 free irq
                //sdio_free_irq(adapter_to_dvobj(padapter));
@@ -2850,7 +3070,7 @@ int rtw_suspend_wow(_adapter *padapter)
                }
                
                if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
-                       DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n",
+                       DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
                                FUNC_ADPT_ARG(padapter), ch, bw, offset);
                        set_channel_bwmode(padapter, ch, offset, bw);
                }
@@ -2859,56 +3079,18 @@ int rtw_suspend_wow(_adapter *padapter)
                        rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);
                }
                #endif  
-               
-               #ifdef CONFIG_POWER_SAVING
+
                if(pwrpriv->wowlan_pno_enable)
                        DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
+               #ifdef CONFIG_LPS
                else
                        rtw_set_ps_mode(padapter, PS_MODE_DTIM, 0, 0, "WOWLAN");
-               #endif
+               #endif //#ifdef CONFIG_LPS
 
        }
        else
        {
-               if(pnetdev){
-                       netif_carrier_off(pnetdev);
-                       rtw_netif_stop_queue(pnetdev);  
-               }
-               #ifdef CONFIG_CONCURRENT_MODE
-               if(pbuddy_netdev){
-                       netif_carrier_off(pbuddy_netdev);
-                       rtw_netif_stop_queue(pbuddy_netdev);
-               }
-               #endif//CONFIG_CONCURRENT_MODE
-               
-               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//CONFIG_CONCURRENT_MODE
-               rtw_led_control(padapter, LED_CTL_POWER_OFF);
-
-
-               if ((rtw_hal_check_ips_status(padapter) == _TRUE)
-                       || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR #### driver in IPS ####ERROR###!!!\n", __FUNCTION__);       
-               
-               }
-
-
-               #ifdef CONFIG_CONCURRENT_MODE
-               if(rtw_buddy_adapter_up(padapter)){
-                       rtw_dev_unload(padapter->pbuddy_adapter);
-               }
-               #endif
-               rtw_dev_unload(padapter);
-
-               //sdio_deinit(adapter_to_dvobj(padapter));
-               if(padapter->intf_deinit)
-                       padapter->intf_deinit(adapter_to_dvobj(padapter));
+               DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR ### wowlan_mode=%d\n", __FUNCTION__, pwrpriv->wowlan_mode); 
        }
        DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
        return ret;
@@ -2922,10 +3104,10 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct net_device *pnetdev = padapter->pnetdev;
        #ifdef CONFIG_CONCURRENT_MODE
-       struct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;   
-       #endif  
+       struct net_device *pbuddy_netdev;
+       #endif
        struct dvobj_priv *psdpriv = padapter->dvobj;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;        
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
        struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
        struct wowlan_ioctl_param poidparam;
        u8 ps_mode;
@@ -2938,10 +3120,11 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        DBG_871X("wowlan_ap_mode: %d\n", pwrpriv->wowlan_ap_mode);
        
        if(pnetdev)
-               rtw_netif_stop_queue(pnetdev);  
+               rtw_netif_stop_queue(pnetdev);
        #ifdef CONFIG_CONCURRENT_MODE
-       if(pbuddy_netdev){
-               netif_carrier_off(pbuddy_netdev);
+       if (rtw_buddy_adapter_up(padapter)) {
+               pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;
+               if (pbuddy_netdev)
                rtw_netif_stop_queue(pbuddy_netdev);
        }
        #endif//CONFIG_CONCURRENT_MODE
@@ -2957,15 +3140,14 @@ int rtw_suspend_ap_wow(_adapter *padapter)
                padapter->pbuddy_adapter->bDriverStopped = _FALSE;      //for 32k command
        }
        #endif // CONFIG_CONCURRENT_MODE
-
-       //#ifdef CONFIG_POWER_SAVING
+       
+       //#ifdef CONFIG_LPS
        //rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
        //#endif
 
+#ifdef CONFIG_SDIO_HCI
        // 2. disable interrupt
-       if (padapter->intf_stop) {
-               padapter->intf_stop(padapter);
-       }
+       rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.
 
        #ifdef CONFIG_CONCURRENT_MODE
        if (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource
@@ -2976,6 +3158,7 @@ int rtw_suspend_ap_wow(_adapter *padapter)
        // 2.1 clean interupt
        if (padapter->HalFunc.clear_interrupt)
                padapter->HalFunc.clear_interrupt(padapter);
+#endif //CONFIG_SDIO_HCI
 
        // 2.2 free irq
        //sdio_free_irq(adapter_to_dvobj(padapter));
@@ -2987,30 +3170,48 @@ int rtw_suspend_ap_wow(_adapter *padapter)
                DBG_871X(" ### PORT SWITCH ### \n");
                rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
        }
-       #endif          
-               
+       #endif
+
        poidparam.subcode = WOWLAN_AP_ENABLE;
        padapter->HalFunc.SetHwRegHandler(padapter,
                                        HW_VAR_AP_WOWLAN,(u8 *)&poidparam);
 
        DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__);
-               
+
+#ifdef CONFIG_CONCURRENT_MODE
+       if (check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
+               if (rtw_get_ch_setting_union(padapter->pbuddy_adapter, &ch, &bw, &offset) != 0) {
+                       DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
+                               FUNC_ADPT_ARG(padapter->pbuddy_adapter), ch, bw, offset);
+                       set_channel_bwmode(padapter->pbuddy_adapter, ch, offset, bw);
+               }
+               rtw_suspend_free_assoc_resource(padapter);
+       } else {
+               if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
+                       DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
+                               FUNC_ADPT_ARG(padapter), ch, bw, offset);
+                       set_channel_bwmode(padapter, ch, offset, bw);
+               }
+               rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);
+       }
+#else
        if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
-               DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n",
+               DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
                        FUNC_ADPT_ARG(padapter), ch, bw, offset);
                        set_channel_bwmode(padapter, ch, offset, bw);
        }
+#endif
+
+
+#ifdef CONFIG_LPS
+       rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, 0, "AP-WOWLAN");
+#endif
 
-       #ifdef CONFIG_CONCURRENT_MODE
-       if(rtw_buddy_adapter_up(padapter)){ //free buddy adapter's resource
-               rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);
-       }
-       #endif
 
        DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
        return ret;
 }
-#endif //#ifdef CONFIG_WOWLAN
+#endif //#ifdef CONFIG_AP_WOWLAN
 
 
 int rtw_suspend_normal(_adapter *padapter)
@@ -3044,6 +3245,14 @@ int rtw_suspend_normal(_adapter *padapter)
        }
 #endif
        rtw_led_control(padapter, LED_CTL_POWER_OFF);
+
+       if ((rtw_hal_check_ips_status(padapter) == _TRUE)
+               || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
+       {
+               DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR #### driver in IPS ####ERROR###!!!\n", __FUNCTION__);       
+               
+       }
+       
 #ifdef CONFIG_CONCURRENT_MODE
        if(rtw_buddy_adapter_up(padapter)){
                rtw_dev_unload(padapter->pbuddy_adapter);
@@ -3108,34 +3317,70 @@ int rtw_suspend_common(_adapter *padapter)
        rtw_stop_cmd_thread(padapter);
        
 #ifdef CONFIG_BT_COEXIST
-       if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
-               rtw_btcoex_SuspendNotify(padapter, 1);
-       else
+       // wait for the latest FW to remove this condition.
+       if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {
+               rtw_btcoex_SuspendNotify(padapter, 0);
+               DBG_871X("WIFI_AP_STATE\n");
+#ifdef CONFIG_CONCURRENT_MODE
+       } else if (check_buddy_fwstate(padapter, WIFI_AP_STATE)) {
                rtw_btcoex_SuspendNotify(padapter, 0);
+               DBG_871X("P2P_ROLE_GO\n");
+#endif //CONFIG_CONCURRENT_MODE
+       } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) {
+               rtw_btcoex_SuspendNotify(padapter, 1);
+               DBG_871X("STATION\n");
+       }
 #endif // CONFIG_BT_COEXIST
 
        rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
 
-       if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE) {
-#ifdef CONFIG_WOWLAN
+       if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE
+#ifdef CONFIG_CONCURRENT_MODE
+               && check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE
+#endif
+       ) {
+       #ifdef CONFIG_WOWLAN
+               if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+                       pwrpriv->wowlan_mode = _TRUE;
+               } else if (pwrpriv->wowlan_pno_enable == _TRUE) {
+                       pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
+               }
+
+               if (pwrpriv->wowlan_mode == _TRUE)      
                rtw_suspend_wow(padapter);
-#else
+               else
+                       rtw_suspend_normal(padapter);
+               
+       #else //CONFIG_WOWLAN
                rtw_suspend_normal(padapter);
+       #endif //CONFIG_WOWLAN
+       } else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE
+#ifdef CONFIG_CONCURRENT_MODE
+               && check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE
 #endif
-       } else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE) {
-#ifdef CONFIG_AP_WOWLAN
+       ) {
+       #ifdef CONFIG_AP_WOWLAN
                rtw_suspend_ap_wow(padapter);
-#else
+       #else
+               rtw_suspend_normal(padapter);
+       #endif //CONFIG_AP_WOWLAN
+#ifdef CONFIG_CONCURRENT_MODE
+       } else if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE
+               && check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
+       #ifdef CONFIG_AP_WOWLAN
+               rtw_suspend_ap_wow(padapter);
+       #else
                rtw_suspend_normal(padapter);
+       #endif //CONFIG_AP_WOWLAN
 #endif
        } else {
                rtw_suspend_normal(padapter);
        }
-       
+
        DBG_871X_LEVEL(_drv_always_, "rtw suspend success in %d ms\n",
-               rtw_get_passing_time_ms(start_time));   
-       
-exit:  
+               rtw_get_passing_time_ms(start_time));
+
+exit:
        DBG_871X("<===  %s return %d.............. in %dms\n", __FUNCTION__
                , ret, rtw_get_passing_time_ms(start_time));
 
@@ -3146,6 +3391,8 @@ exit:
 int rtw_resume_process_wow(_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
+       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        struct net_device *pnetdev = padapter->pnetdev;
        #ifdef CONFIG_CONCURRENT_MODE
        struct net_device *pbuddy_netdev;       
@@ -3169,23 +3416,39 @@ _func_enter_;
                goto exit;
        }
 
+       if (padapter->bDriverStopped || padapter->bSurpriseRemoved) {
+               DBG_871X("%s pdapter %p bDriverStopped %d bSurpriseRemoved %d\n",
+                               __FUNCTION__, padapter, padapter->bDriverStopped,
+                               padapter->bSurpriseRemoved);
+               goto exit;
+       }
+
 #ifdef CONFIG_PNO_SUPPORT
        pwrpriv->pno_in_resume = _TRUE;
 #endif
 
        if (pwrpriv->wowlan_mode == _TRUE){
-#ifdef CONFIG_POWER_SAVING
 #ifdef CONFIG_LPS
                rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
 #endif //CONFIG_LPS
-#endif
+
                pwrpriv->bFwCurrentInPSMode = _FALSE;
 
-               rtw_hal_disable_interrupt(padapter);
+#ifdef CONFIG_SDIO_HCI
+               if (padapter->intf_stop) {
+                       padapter->intf_stop(padapter);
+               }
+
+               #ifdef CONFIG_CONCURRENT_MODE
+               if (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource
+                       padapter->pbuddy_adapter->intf_stop(padapter->pbuddy_adapter);
+               }
+               #endif
 
                if (padapter->HalFunc.clear_interrupt)
                        padapter->HalFunc.clear_interrupt(padapter);
-               
+#endif //CONFIG_SDIO_HCI
+
                //if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {         
                if((padapter->intf_alloc_irq) && (padapter->intf_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)){
                        ret = -1;
@@ -3249,56 +3512,7 @@ _func_enter_;
        }
        else{
 
-               // interface init
-               //if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
-               if ((padapter->intf_init) &&(padapter->intf_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)
-               if ((padapter->intf_alloc_irq)&&(padapter->intf_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);
-               #ifdef CONFIG_CONCURRENT_MODE
-               rtw_reset_drv_sw(padapter->pbuddy_adapter);
-               #endif
-               pwrpriv->bkeepfwalive = _FALSE;
-
-               DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
-               
-               if(pm_netdev_close(pnetdev, _TRUE) == 0) {
-                       DBG_871X("netdev_close success\n");
-               }
-
-               if(pm_netdev_open(pnetdev,_TRUE) != 0) {
-                       ret = -1;
-                       pdbgpriv->dbg_resume_error_cnt++;
-                       goto exit;
-               }
-
-               netif_device_attach(pnetdev);   
-               netif_carrier_on(pnetdev);
-               
-               #ifdef CONFIG_CONCURRENT_MODE
-               if(rtw_buddy_adapter_up(padapter)){                     
-                       pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;                                      
-                       netif_device_attach(pbuddy_netdev);
-                       netif_carrier_on(pbuddy_netdev);        
-               }
-               #endif  
+               DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR ### wowlan_mode=%d\n", __FUNCTION__, pwrpriv->wowlan_mode);         
        } 
 
        if( padapter->pid[1]!=0) {
@@ -3314,26 +3528,34 @@ _func_enter_;
                        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_sta_media_status_rpt(padapter,
+                               rtw_get_stainfo(&padapter->stapriv,
+                                       get_bssid(&padapter->mlmepriv)), 0);
+
                        rtw_free_assoc_resources(padapter, 1);
+                       pmlmeinfo->state = WIFI_FW_NULL_STATE;
+
                } else {
                        DBG_871X("%s: do roaming\n", __func__);
                        rtw_roaming(padapter, NULL);
                }
        }
 
-       #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
-       #endif //CONFIG_RESUME_IN_WORKQUEUE
-
+       if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect) {
+               rtw_lock_ext_suspend_timeout(2000);
+       }
 
        if (pwrpriv->wowlan_wake_reason == Rx_GTK ||
                pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
-               pwrpriv->wowlan_wake_reason == Rx_DeAuth ||
-               pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
+               pwrpriv->wowlan_wake_reason == Rx_DeAuth) {
                rtw_lock_ext_suspend_timeout(8000);
        }
 
+       if (pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
+               rtw_lock_ext_suspend_timeout(15000);
+       }
+
        if (pwrpriv->wowlan_mode == _TRUE) {
                pwrpriv->bips_processing = _FALSE;
                _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
@@ -3369,6 +3591,7 @@ int rtw_resume_process_ap_wow(_adapter *padapter)
        struct wowlan_ioctl_param poidparam;
        struct sta_info *psta = NULL;
        int ret = _SUCCESS;
+       u8 ch, bw, offset;
 _func_enter_;
 
        DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
@@ -3382,11 +3605,11 @@ _func_enter_;
                goto exit;
        }
 
-#ifdef CONFIG_POWER_SAVING
+
 #ifdef CONFIG_LPS
-       rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
+       rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "AP-WOWLAN");
 #endif //CONFIG_LPS
-#endif
+
        pwrpriv->bFwCurrentInPSMode = _FALSE;
 
        rtw_hal_disable_interrupt(padapter);
@@ -3407,21 +3630,12 @@ _func_enter_;
                HW_VAR_AP_WOWLAN,(u8 *)&poidparam);
        pwrpriv->wowlan_ap_mode = _FALSE;
 
-       #ifdef CONFIG_CONCURRENT_MODE
-       rtw_reset_drv_sw(padapter->pbuddy_adapter);
-       #endif          
-
-       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);
 
 #ifdef CONFIG_CONCURRENT_MODE
-       if (padapter->pbuddy_adapter)
+       if (rtw_buddy_adapter_up(padapter))
        {
                padapter->pbuddy_adapter->bDriverStopped = _FALSE;
                DBG_871X("%s: wowmode resuming, pbuddy_adapter->DriverStopped:%d\n",
@@ -3430,6 +3644,27 @@ _func_enter_;
        }
 #endif // CONFIG_CONCURRENT_MODE
 
+#ifdef CONFIG_CONCURRENT_MODE
+       if (rtw_buddy_adapter_up(padapter)) {
+               if (rtw_get_ch_setting_union(padapter->pbuddy_adapter, &ch, &bw, &offset) != 0) {
+                       DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
+                       FUNC_ADPT_ARG(padapter->pbuddy_adapter), ch, bw, offset);
+                       set_channel_bwmode(padapter->pbuddy_adapter, ch, offset, bw);
+               }
+       } else {
+               DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
+                       FUNC_ADPT_ARG(padapter), ch, bw, offset);
+               set_channel_bwmode(padapter, ch, offset, bw);
+               rtw_reset_drv_sw(padapter->pbuddy_adapter);
+       }
+#else
+       if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
+               DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
+                       FUNC_ADPT_ARG(padapter), ch, bw, offset);
+               set_channel_bwmode(padapter, ch, offset, bw);
+       }
+#endif
+
        if (padapter->intf_start) {
                padapter->intf_start(padapter);
        }
@@ -3443,10 +3678,11 @@ _func_enter_;
 #ifdef CONFIG_CONCURRENT_MODE
        if (rtw_buddy_adapter_up(padapter)) {                   
                pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;                      
-
                if(pbuddy_netdev){
-                       netif_device_attach(pbuddy_netdev);
-                       netif_carrier_on(pbuddy_netdev);        
+                       if (!rtw_netif_queue_stopped(pbuddy_netdev))
+                               rtw_netif_start_queue(pbuddy_netdev);
+                       else
+                               rtw_netif_wake_queue(pbuddy_netdev);
                }
        }
 #endif
@@ -3465,7 +3701,7 @@ _func_enter_;
        }       
 
        #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
+       //rtw_unlock_suspend();
        #endif //CONFIG_RESUME_IN_WORKQUEUE
 
        if (pwrpriv->wowlan_wake_reason == AP_WakeUp)
@@ -3487,27 +3723,30 @@ _func_exit_;
 
 int rtw_resume_process_normal(_adapter *padapter)
 {
-       struct net_device *pnetdev = padapter->pnetdev;
+       struct net_device *pnetdev;
        #ifdef CONFIG_CONCURRENT_MODE
        struct net_device *pbuddy_netdev;       
        #endif  
-       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct dvobj_priv *psdpriv = padapter->dvobj;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;        
+       struct pwrctrl_priv *pwrpriv;
+       struct mlme_priv *pmlmepriv;
+       struct dvobj_priv *psdpriv;
+       struct debug_priv *pdbgpriv;    
        
        int ret = _SUCCESS;
 _func_enter_;
-       DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
-       if (padapter) {
-               pnetdev = padapter->pnetdev;
-               pwrpriv = adapter_to_pwrctl(padapter);
-       } else {
-               pdbgpriv->dbg_resume_error_cnt++;
+       
+       if (!padapter) {
                ret = -1;
                goto exit;
        }
        
+       pnetdev = padapter->pnetdev;
+       pwrpriv = adapter_to_pwrctl(padapter);
+       pmlmepriv = &padapter->mlmepriv;        
+       psdpriv = padapter->dvobj;
+       pdbgpriv = &psdpriv->drv_dbg;
+       
+       DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
        // interface init
        //if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
        if((padapter->intf_init)&& (padapter->intf_init(adapter_to_dvobj(padapter)) != _SUCCESS))
@@ -3576,32 +3815,33 @@ _func_enter_;
        #ifdef CONFIG_CONCURRENT_MODE
        if(rtw_buddy_adapter_up(padapter))
        {       
-               pmlmepriv = &padapter->pbuddy_adapter->mlmepriv;        
-               if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
-                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));
+               _adapter *buddy = padapter->pbuddy_adapter;
+               struct mlme_priv *buddy_mlme = &padapter->pbuddy_adapter->mlmepriv;
+               if (check_fwstate(buddy_mlme, WIFI_STATION_STATE)) {
+                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));
 
-                       if (rtw_chk_roam_flags(padapter->pbuddy_adapter, RTW_ROAM_ON_RESUME))
-                               rtw_roaming(padapter->pbuddy_adapter, NULL);
+                       if (rtw_chk_roam_flags(buddy, RTW_ROAM_ON_RESUME))
+                               rtw_roaming(buddy, NULL);
                
-               } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
-                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));
-                       rtw_ap_restore_network(padapter->pbuddy_adapter);
-               } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {
-                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));
+               } else if (check_fwstate(buddy_mlme, WIFI_AP_STATE)) {
+                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));
+                       rtw_ap_restore_network(buddy);
+               } else if (check_fwstate(buddy_mlme, WIFI_ADHOC_STATE)) {
+                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));
                } else {
-                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));
+                       DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - ???\n", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));
                }
        }
        #endif
 
 #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
+       //rtw_unlock_suspend();
 #endif //CONFIG_RESUME_IN_WORKQUEUE
-       
-exit:
        DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
+
+exit:  
 _func_exit_;
-       return ret;
+       return ret;     
 }
 
 int rtw_resume_common(_adapter *padapter)
@@ -3616,21 +3856,41 @@ int rtw_resume_common(_adapter *padapter)
        DBG_871X_LEVEL(_drv_always_, "resume start\n");
        DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid); 
 
-       if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE) {
+       if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE
+#ifdef CONFIG_CONCURRENT_MODE
+               && check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE
+#endif
+       ) {
        #ifdef CONFIG_WOWLAN
+               if (pwrpriv->wowlan_mode == _TRUE)
                        rtw_resume_process_wow(padapter);
-       #else
+               else
                        rtw_resume_process_normal(padapter);
+       #else
+               rtw_resume_process_normal(padapter);
        #endif
 
-       } else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE) {
+       } else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE
+#ifdef CONFIG_CONCURRENT_MODE
+               && check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE
+#endif
+       ) {
        #ifdef CONFIG_AP_WOWLAN
-                       rtw_resume_process_ap_wow(padapter);
+               rtw_resume_process_ap_wow(padapter);
        #else
-                       rtw_resume_process_normal(padapter);
-       #endif
+               rtw_resume_process_normal(padapter);
+       #endif //CONFIG_AP_WOWLAN
+#ifdef CONFIG_CONCURRENT_MODE
+       } else if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE
+               && check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
+       #ifdef CONFIG_AP_WOWLAN
+               rtw_resume_process_ap_wow(padapter);
+       #else
+               rtw_resume_process_normal(padapter);
+       #endif //CONFIG_AP_WOWLAN
+#endif
        } else {
-                       rtw_resume_process_normal(padapter);
+               rtw_resume_process_normal(padapter);
        }
 
        #ifdef CONFIG_BT_COEXIST
@@ -3649,8 +3909,5 @@ int rtw_resume_common(_adapter *padapter)
        _func_exit_;
        
        return ret;
-
 }
-#endif
-
 
index 2f965d2b3433e5cc1409ed5d1fe289e5eb2dacba..57fc16f733683b3eff35c785e8ed8c34f57aa929 100755 (executable)
@@ -233,9 +233,12 @@ int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf)
 
 
        if(precvbuf->pskb)
+       {
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
+               if(rtw_free_skb_premem(precvbuf->pskb)!=0)
+#endif
                rtw_skb_free(precvbuf->pskb);
-
-
+       }
        return ret;
 
 }
@@ -302,6 +305,7 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
 #ifdef CONFIG_BR_EXT
        void *br_port = NULL;
 #endif
+       int ret;
 
        /* Indicat the packets to upper layer */
        if (pkt) {
@@ -342,7 +346,9 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
 
                                        if(bmcast && (pskb2 != NULL) ) {
                                                pkt = pskb2;
+                                               DBG_COUNTER(padapter->rx_logs.os_indicate_ap_mcast);
                                        } else {
+                                               DBG_COUNTER(padapter->rx_logs.os_indicate_ap_forward);
                                                return;
                                        }
                                }
@@ -350,6 +356,7 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
                        else// to APself
                        {
                                //DBG_871X("to APSelf\n");
+                               DBG_COUNTER(padapter->rx_logs.os_indicate_ap_self);
                        }
                }
                
@@ -395,7 +402,11 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
                pkt->ip_summed = CHECKSUM_NONE;
 #endif //CONFIG_TCP_CSUM_OFFLOAD_RX
 
-               rtw_netif_rx(padapter->pnetdev, pkt);
+               ret = rtw_netif_rx(padapter->pnetdev, pkt);
+               if (ret == NET_RX_SUCCESS)
+                       DBG_COUNTER(padapter->rx_logs.os_netif_ok);
+               else
+                       DBG_COUNTER(padapter->rx_logs.os_netif_err);
        }
 }
 
@@ -562,6 +573,8 @@ int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)
 
 _func_enter_;
 
+       DBG_COUNTER(padapter->rx_logs.os_indicate);
+
        precvpriv = &(padapter->recvpriv);
        pfree_recv_queue = &(precvpriv->free_recv_queue);
 
@@ -639,6 +652,7 @@ _recv_indicatepkt_drop:
         if(precv_frame)
                 rtw_free_recvframe(precv_frame, pfree_recv_queue);
 
+        DBG_COUNTER(padapter->rx_logs.os_indicate_err);
         return _FAIL;
 
 _func_exit_;
index 90925fc15a9cdda515159cd3a50301a0741b4b95..1c9ada1e407af5aa4dedff678319e51858ed9e3c 100755 (executable)
@@ -64,6 +64,9 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
        "P2P_GET_NOA",
        "P2P_SET_PS",
        "SET_AP_WPS_P2P_IE",
+
+       "MIRACAST",
+
 #ifdef CONFIG_PNO_SUPPORT
        "PNOSSIDCLR",
        "PNOSETUP",
@@ -86,6 +89,8 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
 #ifdef CONFIG_GTK_OL
        "GTK_REKEY_OFFLOAD",
 #endif //CONFIG_GTK_OL
+/*     Private command for     P2P disable*/
+       "P2P_DISABLE"
 };
 
 #ifdef CONFIG_PNO_SUPPORT
@@ -133,16 +138,18 @@ char pno_in_example[] = {
 #endif /* PNO_SUPPORT */
 
 typedef struct android_wifi_priv_cmd {
+       char *buf;
+       int used_len;
+       int total_len;
+} android_wifi_priv_cmd;
 
 #ifdef CONFIG_COMPAT
+typedef struct compat_android_wifi_priv_cmd {
        compat_uptr_t buf;
-#else
-       char *buf;
-#endif
-
        int used_len;
        int total_len;
-} android_wifi_priv_cmd;
+} compat_android_wifi_priv_cmd;
+#endif /* CONFIG_COMPAT */
 
 /**
  * Local (static) functions and variables
@@ -157,6 +164,17 @@ static int g_wifi_on = _TRUE;
 unsigned int oob_irq;
 
 #ifdef CONFIG_PNO_SUPPORT
+/* 
+ * rtw_android_pno_setup
+ * Description: 
+ * This is used for private command.
+ * 
+ * Parameter:
+ * net: net_device
+ * command: parameters from private command
+ * total_len: the length of the command.
+ *
+ * */
 static int rtw_android_pno_setup(struct net_device *net, char *command, int total_len) {
        pno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];
        int res = -1;
@@ -246,10 +264,56 @@ exit_proc:
        return res;
 }
 
-static int rtw_android_pno_enable(struct net_device *net, int pno_enable) {
+/* 
+ * rtw_android_cfg80211_pno_setup
+ * Description: 
+ * This is used for cfg80211 sched_scan.
+ * 
+ * Parameter:
+ * net: net_device
+ * request: cfg80211_request
+ * */
+
+int rtw_android_cfg80211_pno_setup(struct net_device *net,
+               struct cfg80211_ssid *ssids, int n_ssids, int interval) {
+       int res = -1;
+       int nssid = 0;
+       int pno_time = 0;
+       int pno_repeat = 0;
+       int pno_freq_expo_max = 0;
+       int index = 0;
+       pno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];
+
+       if (n_ssids > MAX_PNO_LIST_COUNT || n_ssids < 0) {
+               DBG_871X("%s: nssids(%d) is invalid.\n", __func__, n_ssids);
+               return -EINVAL;
+       }
+
+       memset(pno_ssids_local, 0, sizeof(pno_ssids_local));
+
+       nssid = n_ssids;
+
+       for (index = 0 ; index < nssid ; index++) {
+               pno_ssids_local[index].SSID_len = ssids[index].ssid_len;
+               memcpy(pno_ssids_local[index].SSID, ssids[index].ssid,
+                               ssids[index].ssid_len);
+       }
+
+       pno_time = (interval / 1000);
+
+       DBG_871X("%s: nssids: %d, pno_time=%d\n", __func__, nssid, pno_time);
+
+       res = rtw_dev_pno_set(net, pno_ssids_local, nssid, pno_time,
+                       pno_repeat, pno_freq_expo_max);
+
+exit_proc:
+       return res;
+}
+
+int rtw_android_pno_enable(struct net_device *net, int pno_enable) {
        _adapter *padapter = (_adapter *)rtw_netdev_priv(net);
        struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
-       
+
        if (pwrctl) {
                pwrctl->wowlan_pno_enable = pno_enable;
                DBG_871X("%s: wowlan_pno_enable: %d\n", __func__, pwrctl->wowlan_pno_enable);
@@ -379,6 +443,46 @@ int rtw_android_getband(struct net_device *net, char *command, int total_len)
        return bytes_written;
 }
 
+enum {
+       MIRACAST_DISABLED = 0,
+       MIRACAST_SOURCE,
+       MIRACAST_SINK,
+       MIRACAST_INVALID,
+};
+
+static const char *miracast_mode_str[] = {
+       "DISABLED",
+       "SOURCE",
+       "SINK",
+       "INVALID",
+};
+
+static const char *get_miracast_mode_str(int mode)
+{
+       if (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID)
+               mode = MIRACAST_INVALID;
+
+       return miracast_mode_str[mode];
+}
+
+int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
+       char *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_MIRACAST]) + 1;
+       u8 mode;
+       int num;
+       int ret = _FAIL;
+
+       num = sscanf(arg, "%hhu", &mode);
+
+       if (num >= 1) {
+               DBG_871X("Miracast mode: %s(%u)\n", get_miracast_mode_str(mode), mode);
+               ret = _SUCCESS;
+       }
+
+       return (ret==_SUCCESS)?0:-1;
+}
+
 int get_int_from_command( char* pcmd )
 {
        int i = 0;
@@ -458,17 +562,35 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
 #ifdef CONFIG_WFD
        struct wifi_display_info                *pwfd_info;
 #endif
+
        rtw_lock_suspend();
 
        if (!ifr->ifr_data) {
                ret = -EINVAL;
                goto exit;
        }
+#ifdef CONFIG_COMPAT
+       if (is_compat_task()) {
+               /* User space is 32-bit, use compat ioctl */
+               compat_android_wifi_priv_cmd compat_priv_cmd;
+
+               if (copy_from_user(&compat_priv_cmd, ifr->ifr_data, sizeof(compat_android_wifi_priv_cmd))) {
+                       ret = -EFAULT;
+                       goto exit;
+               }
+               priv_cmd.buf = compat_ptr(compat_priv_cmd.buf);
+               priv_cmd.used_len = compat_priv_cmd.used_len;
+               priv_cmd.total_len = compat_priv_cmd.total_len;
+       } else
+#endif /* CONFIG_COMPAT */
        if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(android_wifi_priv_cmd))) {
                ret = -EFAULT;
                goto exit;
        }
-       
+       if ( padapter->registrypriv.mp_mode == 1) {
+               ret = -EFAULT;
+               goto exit;
+       }
        //DBG_871X("%s priv_cmd.buf=%p priv_cmd.total_len=%d  priv_cmd.used_len=%d\n",__func__,priv_cmd.buf,priv_cmd.total_len,priv_cmd.used_len);
        command = rtw_zmalloc(priv_cmd.total_len);
        if (!command)
@@ -483,11 +605,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                ret = -EFAULT;
                goto exit;
         }
-#ifdef CONFIG_COMPAT
-       if (copy_from_user(command, compat_ptr(priv_cmd.buf), (unsigned long) priv_cmd.total_len)) {
-#else
        if (copy_from_user(command, (void *)priv_cmd.buf, priv_cmd.total_len)) {
-#endif
                ret = -EFAULT;
                goto exit;
        }
@@ -522,7 +640,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                //rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_ACTIVE);
 #ifdef CONFIG_PLATFORM_MSTAR
 #ifdef CONFIG_IOCTL_CFG80211
-               (adapter_wdev_data((_adapter *)rtw_netdev_priv(net))->bandroid_scan = _TRUE;
+               adapter_wdev_data((_adapter *)rtw_netdev_priv(net))->bandroid_scan = _TRUE;
 #endif //CONFIG_IOCTL_CFG80211
 #endif //CONFIG_PLATFORM_MSTAR
                break;
@@ -590,7 +708,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
        case ANDROID_WIFI_CMD_GETBAND:
                bytes_written = rtw_android_getband(net, command, priv_cmd.total_len);
                break;
-               
+
+       case ANDROID_WIFI_CMD_MIRACAST:
+               bytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len);
+               break;
+
        case ANDROID_WIFI_CMD_COUNTRY:
                bytes_written = rtw_android_set_country(net, command, priv_cmd.total_len);
                break;
@@ -666,12 +788,8 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                pwfd_info = &padapter->wfd_info;
                if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
                {
-#ifdef CONFIG_COMPAT
-                       pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( compat_ptr(priv_cmd.buf) );
-#else
                        pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf );
-#endif
-               }
+       }
                break;
        }
        case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT:
@@ -686,12 +804,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                pwfd_info = &padapter->wfd_info;
                if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
                {
-#ifdef CONFIG_COMPAT
-                       pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( compat_ptr(priv_cmd.buf) );
-#else
                        pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf );
-#endif
-               
                        pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL;
                }
                break;
@@ -701,7 +814,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
                {
 #ifdef CONFIG_LPS
                        u8 dtim;
-                       u8 *ptr = priv_cmd.buf;
+                       u8 *ptr =(u8 *) &priv_cmd.buf;
                        
                        ptr += 9;//string command length of  "SET_DTIM";
 
@@ -735,9 +848,19 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
        }
 #ifdef CONFIG_GTK_OL
        case ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD:
-               rtw_gtk_offload(net, priv_cmd.buf);
+               rtw_gtk_offload(net, (u8 *)&priv_cmd.buf);
                break;
 #endif //CONFIG_GTK_OL         
+       case ANDROID_WIFI_CMD_P2P_DISABLE:
+       {
+               struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;     
+               struct wifidirect_info  *pwdinfo= &(padapter->wdinfo);
+               u8 channel, ch_offset;
+               u16 bwmode;
+
+               rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
+               break;
+       }
        default:
                DBG_871X("Unknown PRIVATE command %s - ignored\n", command);
                snprintf(command, 3, "OK");
@@ -755,11 +878,7 @@ response:
                        bytes_written++;
                }
                priv_cmd.used_len = bytes_written;
-#ifdef CONFIG_COMPAT
-               if (copy_to_user(compat_ptr(priv_cmd.buf), command, bytes_written)) {
-#else
                if (copy_to_user((void *)priv_cmd.buf, command, bytes_written)) {
-#endif
                        DBG_871X("%s: failed to copy data to user buffer\n", __FUNCTION__);
                        ret = -EFAULT;
                }
@@ -791,10 +910,14 @@ static struct resource *wifi_irqres = NULL;
 static int wifi_add_dev(void);
 static void wifi_del_dev(void);
 
+extern int rockchip_wifi_get_oob_irq(void);
 int rtw_android_wifictrl_func_add(void)
 {
        int ret = 0;
-#if 0
+#if 1
+        oob_irq = rockchip_wifi_get_oob_irq();
+        printk("%s: rockchip_wifi_get_oob_irq :%d\n", __func__, oob_irq);
+#else
        sema_init(&wifi_control_sem, 0);
 
        ret = wifi_add_dev();
@@ -824,7 +947,7 @@ void rtw_android_wifictrl_func_del(void)
 #endif
 }
 
-void *wl_android_prealloc(int section, unsigned long size)
+void *rtw_wl_android_prealloc(int section, unsigned long size)
 {
        void *alloc_ptr = NULL;
        if (wifi_control_data && wifi_control_data->mem_prealloc) {
index 95bf78cee04db80e2c87b7f0cb849de2f6c987d3..2971bbb251c54044211866293a4a86cb8aa2c837 100755 (executable)
@@ -110,7 +110,7 @@ static ssize_t proc_set_log_level(struct file *file, const char __user *buffer,
 
                int num = sscanf(tmp, "%d ", &log_level);
 
-               if( log_level >= 0 && log_level < 10 )
+               if( log_level >= _drv_always_ && log_level <= _drv_debug_ )
                {
                        GlobalDebugLevel= log_level;
                        printk("%d\n", GlobalDebugLevel);
@@ -261,6 +261,162 @@ static int proc_get_rf_reg_dump(struct seq_file *m, void *v)
 
        return 0;
 }
+static int proc_get_linked_info_dump(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       
+       if(padapter)
+               DBG_871X_SEL_NL(m, "linked_info_dump :%s \n", (padapter->bLinkInfoDump)?"enable":"disable");
+
+       return 0;
+}
+
+static ssize_t proc_set_linked_info_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       
+       char tmp[2];
+       int mode=0;
+
+       if (count < 1)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {              
+
+               int num = sscanf(tmp, "%d ", &mode);
+
+               if( padapter )
+               {
+                       //padapter->bLinkInfoDump = mode;
+                       //DBG_871X("linked_info_dump =%s \n", (padapter->bLinkInfoDump)?"enable":"disable");
+                        linked_info_dump(padapter,mode);               
+               }
+
+       }
+       
+       return count;
+       
+}
+
+int proc_get_rx_info(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+
+       //Counts of packets whose seq_num is less than preorder_ctrl->indicate_seq, Ex delay, retransmission, redundant packets and so on
+       DBG_871X_SEL_NL(m,"Counts of Packets Whose Seq_Num Less Than Reorder Control Seq_Num: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_drop_count);
+       //How many times the Rx Reorder Timer is triggered.
+       DBG_871X_SEL_NL(m,"Rx Reorder Time-out Trigger Counts: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_forced_indicate_count);
+       //Total counts of packets loss
+       DBG_871X_SEL_NL(m,"Rx Packet Loss Counts: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_loss_count);
+       DBG_871X_SEL_NL(m,"Duplicate Management Frame Drop Count: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_dup_mgt_frame_drop_count);
+       DBG_871X_SEL_NL(m,"AMPDU BA window shift Count: %llu\n",(unsigned long long)pdbgpriv->dbg_rx_ampdu_window_shift_cnt);
+       return 0;
+}      
+
+
+ssize_t proc_reset_rx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *psdpriv = padapter->dvobj;
+       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+       char cmd[32];
+       if (buffer && !copy_from_user(cmd, buffer, sizeof(cmd))) {
+               if('0' == cmd[0]){
+                       pdbgpriv->dbg_rx_ampdu_drop_count = 0;
+                       pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
+                       pdbgpriv->dbg_rx_ampdu_loss_count = 0;
+                       pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
+                       pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
+               }
+       }
+
+       return count;
+}
+
+static int proc_get_cam(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+       u8 i;
+
+       return 0;
+}
+
+static ssize_t proc_set_cam(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+       struct net_device *dev = data;
+       _adapter *adapter;
+
+       char tmp[32];
+       char cmd[4];
+       u8 id;
+
+       adapter = (_adapter *)rtw_netdev_priv(dev);
+       if (!adapter)
+               return -EFAULT;
+
+       if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
+
+               /* c <id>: clear specific cam entry */
+               /* wfc <id>: write specific cam entry from cam cache */
+
+               int num = sscanf(tmp, "%s %hhu", cmd, &id);
+
+               if (num < 2)
+                       return count;
+
+               if (strcmp("c", cmd) == 0) {
+                       _clear_cam_entry(adapter, id);
+                       adapter->securitypriv.hw_decrypted = _FALSE; /* temporarily set this for TX path to use SW enc */
+               } else if (strcmp("wfc", cmd) == 0) {
+                       write_cam_from_cache(adapter, id);
+               }
+       }
+
+       return count;
+}
+
+static int proc_get_cam_cache(struct seq_file *m, void *v)
+{
+       struct net_device *dev = m->private;
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+       struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+       u8 i;
+
+       DBG_871X_SEL_NL(m, "cam bitmap:0x%016llx\n", dvobj->cam_ctl.bitmap);
+
+       DBG_871X_SEL_NL(m, "%-2s %-6s %-17s %-32s %-3s %-7s"
+               //" %-2s %-2s %-4s %-5s"
+               "\n"
+               , "id", "ctrl", "addr", "key", "kid", "type"
+               //, "MK", "GK", "MFB", "valid"
+       );
+
+       for (i=0;i<32;i++) {
+               if (dvobj->cam_cache[i].ctrl != 0)
+                       DBG_871X_SEL_NL(m, "%2u 0x%04x "MAC_FMT" "KEY_FMT" %3u %-7s"
+                               //" %2u %2u 0x%02x %5u"
+                               "\n", i
+                               , dvobj->cam_cache[i].ctrl
+                               , MAC_ARG(dvobj->cam_cache[i].mac)
+                               , KEY_ARG(dvobj->cam_cache[i].key)
+                               , (dvobj->cam_cache[i].ctrl)&0x03
+                               , security_type_str(((dvobj->cam_cache[i].ctrl)>>2)&0x07)
+                               //, ((dvobj->cam_cache[i].ctrl)>>5)&0x01
+                               //, ((dvobj->cam_cache[i].ctrl)>>6)&0x01
+                               //, ((dvobj->cam_cache[i].ctrl)>>8)&0x7f
+                               //, ((dvobj->cam_cache[i].ctrl)>>15)&0x01
+                       );
+       }
+
+       return 0;
+}
 
 /*
 * rtw_adapter_proc:
@@ -275,11 +431,15 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
        {"qos_option", proc_get_qos_option, NULL},
        {"ht_option", proc_get_ht_option, NULL},
        {"rf_info", proc_get_rf_info, NULL},
+       {"survey_info", proc_get_survey_info, NULL},
        {"ap_info", proc_get_ap_info, NULL},
        {"adapter_state", proc_get_adapter_state, NULL},
        {"trx_info", proc_get_trx_info, NULL},
        {"rate_ctl", proc_get_rate_ctl, proc_set_rate_ctl},
+       {"cam", proc_get_cam, proc_set_cam},
+       {"cam_cache", proc_get_cam_cache, NULL},
        {"suspend_info", proc_get_suspend_resume_info, NULL},
+       {"rx_info", proc_get_rx_info, proc_reset_rx_info},
 
 #ifdef CONFIG_LAYER2_ROAMING
        {"roam_flags", proc_get_roam_flags, proc_set_roam_flags},
@@ -292,6 +452,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
 #endif /* CONFIG_SDIO_HCI */
 
        {"fwdl_test_case", proc_get_dummy, proc_set_fwdl_test_case},
+       {"wait_hiq_empty", proc_get_dummy, proc_set_wait_hiq_empty},
 
        {"mac_reg_dump", proc_get_mac_reg_dump, NULL},
        {"bb_reg_dump", proc_get_bb_reg_dump, NULL},
@@ -310,6 +471,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
 #endif
 
        {"rx_signal", proc_get_rx_signal, proc_set_rx_signal},
+       {"hw_info", proc_get_hw_status, NULL},
 
 #ifdef CONFIG_80211N_HT
        {"ht_enable", proc_get_ht_enable, proc_set_ht_enable},
@@ -321,7 +483,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
 
        {"en_fwps", proc_get_en_fwps, proc_set_en_fwps},
 
-       {"path_rssi", proc_get_two_path_rssi, NULL},
+       //{"path_rssi", proc_get_two_path_rssi, NULL},
        {"rssi_disp",proc_get_rssi_disp, proc_set_rssi_disp},
 
 #ifdef CONFIG_BT_COEXIST
@@ -332,6 +494,17 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
 #if defined(DBG_CONFIG_ERROR_DETECT)
        {"sreset", proc_get_sreset, proc_set_sreset},
 #endif /* DBG_CONFIG_ERROR_DETECT */
+       {"linked_info_dump",proc_get_linked_info_dump,proc_set_linked_info_dump},
+#ifdef CONFIG_DBG_COUNTER
+       {"rx_logs", proc_get_rx_logs, NULL},
+       {"tx_logs", proc_get_tx_logs, NULL},
+       {"int_logs", proc_get_int_logs, NULL},
+#endif
+
+#ifdef CONFIG_PCI_HCI
+       {"rx_ring", proc_get_rx_ring, NULL},
+       {"tx_ring", proc_get_tx_ring, NULL},
+#endif
 };
 
 const int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl);
index aee42e9e275111b929efb1bd96133f6739258b99..98d873c6faabca992364e4cd50131708e1c0056c 100755 (executable)
@@ -174,8 +174,10 @@ static irqreturn_t gpio_hostwakeup_irq_thread(int irq, void *data)
 static u8 gpio_hostwakeup_alloc_irq(PADAPTER padapter)
 {
        int err;
-       if (oob_irq == 0)
+       if (oob_irq == 0) {
+               DBG_871X("oob_irq ZERO!\n");
                return _FAIL;
+       }
        /* dont set it IRQF_TRIGGER_LOW, or wowlan */
        /* power is high after suspend */
        /* and failing can prevent can not sleep issue if */
@@ -294,16 +296,7 @@ _func_enter_;
                goto exit;
        }
 
-
-#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;
        psdio->func = func;
@@ -375,6 +368,9 @@ static void rtw_decide_chip_type_by_device_id(PADAPTER padapter, const struct sd
 
 void rtw_set_hal_ops(PADAPTER padapter)
 {
+       //alloc memory for HAL DATA
+       rtw_hal_data_init(padapter);
+       
 #if defined(CONFIG_RTL8723A)
        if( padapter->chip_type == RTL8723A){
                rtl8723as_set_hal_ops(padapter);
@@ -544,7 +540,7 @@ free_adapter:
        if (status != _SUCCESS) {
                if (pnetdev)
                        rtw_free_netdev(pnetdev);
-               else if (padapter)
+               else
                        rtw_vmfree((u8*)padapter, sizeof(*padapter));
                padapter = NULL;
        }
@@ -763,285 +759,34 @@ _func_exit_;
 extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal);
 extern int pm_netdev_close(struct net_device *pnetdev,u8 bnormal);
 
-
-#ifdef CONFIG_SUSPEND_REFINE   
-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);
-       struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv);
-       _adapter *padapter = psdpriv->if1;
-       struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-       int ret = 0;
-       u8 ch, bw, offset;
-
-       ret = rtw_suspend_common(padapter);             
-
-#if (defined CONFIG_MMC_PM_KEEP_POWER) 
-       //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));
-                       pdbgpriv->dbg_suspend_error_cnt++;
-                       return -ENOSYS;
-               } else {
-                       DBG_871X("cmd: suspend with MMC_PM_KEEP_POWER\n");
-                       sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
-               }
-       }
-#endif
-       return ret;
-}
-int rtw_resume_process(_adapter *padapter)
-{
-       return rtw_resume_common(padapter);
-}
-
-
-#else //CONFIG_SUSPEND_REFINE
 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);
        struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv);
        _adapter *padapter = psdpriv->if1;
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct net_device *pnetdev = padapter->pnetdev;
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-               
        int ret = 0;
-#ifdef CONFIG_PLATFORM_SPRD
-       u32 value;
-#endif // CONFIG_PLATFORM_SPRD
-
-#ifdef CONFIG_WOWLAN
-       struct wowlan_ioctl_param poidparam;
        u8 ch, bw, offset;
-       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);
-       pdbgpriv->dbg_suspend_cnt++;
-       pwrpriv->bInSuspend = _TRUE;
-#ifdef CONFIG_PNO_SUPPORT
-       pwrpriv->pno_in_resume = _FALSE;
-#endif
-
-#ifdef CONFIG_WOWLAN
-       if (check_fwstate(pmlmepriv, _FW_LINKED))
-               pwrpriv->wowlan_mode = _TRUE;
-       else
-               pwrpriv->wowlan_mode = _FALSE;
-#endif
-
-#ifdef CONFIG_PNO_SUPPORT
-       pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
-#endif
 
-       while (pwrpriv->bips_processing == _TRUE)
-               rtw_msleep_os(1);
-
-#ifdef CONFIG_IOL_READ_EFUSE_MAP
-       if(!padapter->bup){
-               u8 bMacPwrCtrlOn = _FALSE;
-               rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
-               if(bMacPwrCtrlOn)
-                       rtw_hal_power_off(padapter);
-       }
-#endif
-
-       if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
+       if(padapter->bDriverStopped == _TRUE)
        {
-               DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__
-                       ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved);
-               pdbgpriv->dbg_suspend_error_cnt++;
+               DBG_871X("%s bDriverStopped = %d\n", __FUNCTION__, padapter->bDriverStopped);
                goto exit;
        }
 
-       rtw_ps_deny(padapter, PS_DENY_SUSPEND);
-
-       if(pnetdev) {
-#ifdef CONFIG_WOWLAN
-               if(pwrpriv->wowlan_mode == _TRUE) {
-                       rtw_netif_stop_queue(pnetdev);
-               }
-               else
-#endif
-               {
-                       netif_carrier_off(pnetdev);
-                       rtw_netif_stop_queue(pnetdev);
-               }
-       }
-
-       rtw_cancel_all_timer(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
-       if (padapter->pbuddy_adapter)
-       {
-               rtw_cancel_all_timer(padapter->pbuddy_adapter);
-       }
-#endif // CONFIG_CONCURRENT_MODE
-
-       LeaveAllPowerSaveModeDirect(padapter);
-
-       rtw_stop_cmd_thread(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_CONCURRENT_MODE
-               if (padapter->pbuddy_adapter)
-               {
-                       padapter->pbuddy_adapter->bDriverStopped = _TRUE;       //for stop thread
-                       rtw_stop_drv_threads(padapter->pbuddy_adapter);
-                       padapter->pbuddy_adapter->bDriverStopped = _FALSE;      //for 32k command
-               }
-#endif // CONFIG_CONCURRENT_MODE
-
-               // 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));
-       }
-#endif // CONFIG_WOWLAN
-
-#ifdef CONFIG_BT_COEXIST
-       rtw_btcoex_SuspendNotify(padapter, 1);
-#endif // CONFIG_BT_COEXIST
-
-       rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
-
-#ifdef CONFIG_WOWLAN
-       DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
-
-       if ((pwrpriv->bSupportRemoteWakeup == _TRUE) &&
-               (pwrpriv->wowlan_mode == _TRUE))
-       {
-               if (rtw_port_switch_chk(padapter))
-                       rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
-
-               poidparam.subcode = WOWLAN_ENABLE;
-               padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
-       }
-       else
-#endif // CONFIG_WOWLAN
-       {
-       //s2-1.  issue rtw_disassoc_cmd to fw
-               rtw_disassoc_cmd(padapter, 0, _FALSE);
-       }
-
-       if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_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_to_roam(padapter, 1);
-                       else
-                               rtw_set_to_roam(padapter, 0);
-                       #else // !CONFIG_WOWLAN
-                       rtw_set_to_roam(padapter, 1);
-                       #endif // !CONFIG_WOWLAN
-               }
-       }
-
-#ifdef CONFIG_WOWLAN
-       if (pwrpriv->wowlan_mode == _TRUE)
-       {
-               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);
-               }
-               
-               if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
-                       DBG_871X(FUNC_ADPT_FMT" back to linked union - ch:%u, bw:%u, offset:%u\n",
-                               FUNC_ADPT_ARG(padapter), ch, bw, offset);
-                       set_channel_bwmode(padapter, ch, offset, bw);
-               }
-
-#ifdef CONFIG_POWER_SAVING
-#ifdef CONFIG_PNO_SUPPORT
-               if(pwrpriv->wowlan_pno_enable)
-                       DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
-               else
-#endif //CONFIG_PNO_SUPPORT
-                       rtw_set_ps_mode(padapter, PS_MODE_SELF_DEFINED, 0, 0);
-#endif
-       }
-       else
-#endif // CONFIG_WOWLAN
+       if (pwrpriv->bInSuspend == _TRUE)
        {
-               //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);
-               //s2-5 dev unload and stop thread
-               rtw_dev_unload(padapter);
-
-               if ((rtw_hal_check_ips_status(padapter) == _TRUE)
-                       || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: driver in IPS\n", __FUNCTION__);
-                       LeaveAllPowerSaveMode(padapter);
-                       DBG_871X_LEVEL(_drv_always_, "%s: driver not in IPS\n", __FUNCTION__);
-               }
-
-               if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __FUNCTION__);
-                       rtw_indicate_scan_done(padapter, 1);
-               }
-
-               if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
-               {
-                       DBG_871X_LEVEL(_drv_always_, "%s: fw_under_linking\n", __FUNCTION__);
-                       rtw_indicate_disconnect(padapter);
-               }
-
-               // interface deinit
-               sdio_deinit(adapter_to_dvobj(padapter));
+               DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
+               pdbgpriv->dbg_suspend_error_cnt++;
+               goto exit;
        }
 
-       DBG_871X_LEVEL(_drv_always_, "sdio suspend success in %d ms\n",
-                       rtw_get_passing_time_ms(start_time));
+       ret = rtw_suspend_common(padapter);             
 
 exit:
-
-//#if (defined CONFIG_WOWLAN) || (!(defined ANDROID_2X) && (defined CONFIG_PLATFORM_SPRD))
-#if (defined CONFIG_WOWLAN) 
+#ifdef CONFIG_RTW_SDIO_PM_KEEP_POWER 
+#if (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
@@ -1060,249 +805,26 @@ exit:
                        sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
                }
        }
-#endif         
-
-       DBG_871X("<===  %s return %d.............. in %dms\n", __FUNCTION__
-               , ret, rtw_get_passing_time_ms(start_time));
-
-       _func_exit_;
+#endif 
+#endif
        return ret;
 }
-
-
-
 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();
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
        struct dvobj_priv *psdpriv = padapter->dvobj;
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-#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 {
-               pdbgpriv->dbg_resume_error_cnt++;
-               ret = -1;
-               goto exit;
-       }
-
-#ifdef CONFIG_PNO_SUPPORT
-       pwrpriv->pno_in_resume = _TRUE;
-#endif
-
-#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)
+               
+       if (pwrpriv->bInSuspend == _FALSE)
        {
-               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_close(pnetdev, _TRUE) == 0) {
-               DBG_871X("netdev_close success\n");
-       }
-
-       if(pm_netdev_open(pnetdev,_TRUE) != 0) {
-               ret = -1;
                pdbgpriv->dbg_resume_error_cnt++;
-               goto exit;
+               DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
+               return -1;
        }
-
-       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, "WOWLAN");
-#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);
-
-#ifdef CONFIG_CONCURRENT_MODE
-               if (padapter->pbuddy_adapter)
-               {
-                       padapter->pbuddy_adapter->bDriverStopped = _FALSE;
-                       DBG_871X("%s: wowmode resuming, pbuddy_adapter->DriverStopped:%d\n",
-                               __FUNCTION__, padapter->pbuddy_adapter->bDriverStopped);
-                       rtw_start_drv_threads(padapter->pbuddy_adapter);
-               }
-#endif // CONFIG_CONCURRENT_MODE
-
-               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)
-               {
-                       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;
-               }
-
-               rtw_reset_drv_sw(padapter);
-               pwrpriv->bkeepfwalive = _FALSE;
-
-               DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
-               if(pm_netdev_open(pnetdev,_TRUE) != 0) {
-                       ret = -1;
-                       pdbgpriv->dbg_resume_error_cnt++;
-                       goto exit;
-               }
-
-               netif_device_attach(pnetdev);
-               netif_carrier_on(pnetdev);
-#endif
-       if( padapter->pid[1]!=0) {
-               DBG_871X("pid[1]:%d\n",padapter->pid[1]);
-               rtw_signal_process(padapter->pid[1], SIGUSR2);
-       }       
-
-       if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
-#ifdef CONFIG_WOWLAN
-               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);
-               }
-#else
-               rtw_roaming(padapter, NULL);
-#endif //CONFOG_WOWLAN
-       }
-
-       #ifdef CONFIG_RESUME_IN_WORKQUEUE
-       rtw_unlock_suspend();
-       #endif //CONFIG_RESUME_IN_WORKQUEUE
-
-#ifdef CONFIG_WOWLAN
-       if (pwrpriv->wowlan_wake_reason == Rx_GTK ||
-               pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
-               pwrpriv->wowlan_wake_reason == Rx_DeAuth ||
-               pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
-               rtw_lock_ext_suspend_timeout(8000);
-       }
-
-       if (pwrpriv->wowlan_mode == _TRUE) {
-               pwrpriv->bips_processing = _FALSE;
-               _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
-#ifndef CONFIG_IPS_CHECK_IN_WD
-               rtw_set_pwr_state_check_timer(pwrpriv);
-#endif
-       } else {
-               DBG_871X_LEVEL(_drv_always_, "do not reset timer\n");
-       }
-
-       pwrpriv->wowlan_mode =_FALSE;
-
-       //clean driver side wake up reason.
-       pwrpriv->wowlan_wake_reason = 0;
-#endif //CONFIG_WOWLAN
-
-#ifdef CONFIG_BT_COEXIST
-       rtw_btcoex_SuspendNotify(padapter, 0);
-#endif // CONFIG_BT_COEXIST
-
-exit:
-       if (pwrpriv) {
-               pwrpriv->bInSuspend = _FALSE;
-#ifdef CONFIG_PNO_SUPPORT
-               pwrpriv->pno_in_resume = _FALSE;
-#endif
-       }
-       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;
+       return rtw_resume_common(padapter);
 }
 
-
-#endif
 static int rtw_sdio_resume(struct device *dev)
 {
        struct sdio_func *func =dev_to_sdio_func(dev);
@@ -1314,33 +836,39 @@ static int rtw_sdio_resume(struct device *dev)
        struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
 
        DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
+
        pdbgpriv->dbg_resume_cnt++;
 
-       if(pwrpriv->bInternalAutoSuspend ){
+       if(pwrpriv->bInternalAutoSuspend)
+       {
                ret = rtw_resume_process(padapter);
-       } else {
-#ifdef CONFIG_RESUME_IN_WORKQUEUE
-               rtw_resume_in_workqueue(pwrpriv);
-#else
-               if (rtw_is_earlysuspend_registered(pwrpriv)
-                       #ifdef CONFIG_WOWLAN
-                       && !pwrpriv->wowlan_mode
-                       #endif /* CONFIG_WOWLAN */
-                       #ifdef CONFIG_AP_WOWLAN
-                       && !pwrpriv->wowlan_ap_mode
-                       #endif /* CONFIG_AP_WOWLAN*/
-               ) {
-                       /* jeff: bypass resume here, do in late_resume */
-                       rtw_set_do_late_resume(pwrpriv, _TRUE);
-               } else {
-                       
-                       //rtw_lock_suspend_timeout(4000);
-                       rtw_resume_lock_suspend();
-                       
+       }
+       else
+       {
+               if(pwrpriv->wowlan_mode || pwrpriv->wowlan_ap_mode)
+               {
+                       rtw_resume_lock_suspend();                      
                        ret = rtw_resume_process(padapter);
                        rtw_resume_unlock_suspend();
                }
-#endif /* CONFIG_RESUME_IN_WORKQUEUE */
+               else
+               {
+#ifdef CONFIG_RESUME_IN_WORKQUEUE
+                       rtw_resume_in_workqueue(pwrpriv);
+#else                  
+                       if (rtw_is_earlysuspend_registered(pwrpriv))
+                       {
+                               /* jeff: bypass resume here, do in late_resume */
+                               rtw_set_do_late_resume(pwrpriv, _TRUE);
+                       }       
+                       else
+                       {
+                               rtw_resume_lock_suspend();                      
+                               ret = rtw_resume_process(padapter);
+                               rtw_resume_unlock_suspend();
+                       }
+#endif
+               }
        }
        pmlmeext->last_scan_time = rtw_get_current_time();
        DBG_871X("<========  %s return %d\n", __FUNCTION__, ret);
@@ -1352,13 +880,11 @@ static int rtw_drv_entry(void)
 {
        int ret = 0;
 
-
        DBG_871X_LEVEL(_drv_always_, "module init start\n");
-       DBG_871X_LEVEL(_drv_always_, DRV_NAME" driver version = %s\n", DRIVERVERSION);
+       dump_drv_version(RTW_DBGDUMP);
 #ifdef BTCOEXVERSION
        DBG_871X_LEVEL(_drv_always_, DRV_NAME" BT-Coex version = %s\n", BTCOEXVERSION);
 #endif // BTCOEXVERSION
-       DBG_871X_LEVEL(_drv_always_, "build time: %s %s\n", __DATE__, __TIME__);
 
        ret = platform_wifi_power_on();
        if (ret)
@@ -1422,26 +948,26 @@ static void rtw_drv_halt(void)
 extern int rockchip_wifi_power(int on);
 extern int rockchip_wifi_set_carddetect(int val);
 
-int rockchip_wifi_init_module(void)
+int rockchip_wifi_init_module_rtkwifi(void)
 {
     printk("\n");
     printk("=======================================================\n");
     printk("==== Launching Wi-Fi driver! (Powered by Rockchip) ====\n");
     printk("=======================================================\n");
-    printk("Realtek 8723BS SDIO WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8192_DRV_VERSION);
+    printk("Realtek 8723BS SDIO WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8723BS_DRV_VERSION);
 
     rockchip_wifi_power(1);
     rockchip_wifi_set_carddetect(1);    
     return rtw_drv_entry();
 }
 
-void rockchip_wifi_exit_module(void)
+void rockchip_wifi_exit_module_rtkwifi(void)
 {
     printk("\n");
     printk("=======================================================\n");
     printk("==== Dislaunching Wi-Fi driver! (Powered by Rockchip) ====\n");
     printk("=======================================================\n");
-    printk("Realtek 8723BS SDIO WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8192_DRV_VERSION);
+    printk("Realtek 8723BS SDIO WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8723BS_DRV_VERSION);
 
     rtw_drv_halt();
 
@@ -1449,8 +975,8 @@ void rockchip_wifi_exit_module(void)
     rockchip_wifi_power(0);
 }
 
-EXPORT_SYMBOL(rockchip_wifi_init_module);
-EXPORT_SYMBOL(rockchip_wifi_exit_module);
+EXPORT_SYMBOL(rockchip_wifi_init_module_rtkwifi);
+EXPORT_SYMBOL(rockchip_wifi_exit_module_rtkwifi);
 //module_init(rtw_drv_entry);
 //module_exit(rtw_drv_halt);
 
index a4cbfd895c3831cb9dbce955e403479d985c0860..faa2c14a1f9f5d6f8aad96c18483ea91472b72a1 100755 (executable)
@@ -474,17 +474,15 @@ static const struct ieee80211_regdomain *_rtw_regdomain_select(struct
 #endif
 }
 
-typedef void (*reg_notifier_func) (struct wiphy *, struct regulatory_request *);
-
-static int _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
+static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
                                struct wiphy *wiphy,
-                               int (*reg_notifier) (struct wiphy * wiphy,
+                               void (*reg_notifier) (struct wiphy * wiphy,
                                                     struct regulatory_request *
                                                     request))
 {
        const struct ieee80211_regdomain *regd;
 
-       wiphy->reg_notifier = (reg_notifier_func) reg_notifier;
+       wiphy->reg_notifier = reg_notifier;
 
        wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
        wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY;
@@ -497,7 +495,6 @@ static int _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
        _rtw_reg_apply_flags(wiphy);
        _rtw_reg_apply_radar_flags(wiphy);
        _rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
-       return 0;
 }
 
 static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
@@ -512,7 +509,7 @@ static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
 }
 
 int rtw_regd_init(_adapter * padapter,
-                 int (*reg_notifier) (struct wiphy * wiphy,
+                 void (*reg_notifier) (struct wiphy * wiphy,
                                       struct regulatory_request * request))
 {
        //struct registry_priv  *registrypriv = &padapter->registrypriv;
@@ -538,12 +535,12 @@ int rtw_regd_init(_adapter * padapter,
        return 0;
 }
 
-int rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
 {
        struct rtw_regulatory *reg = NULL;
 
        DBG_8192C("%s\n", __func__);
 
-       return _rtw_reg_notifier_apply(wiphy, request, reg);
+       _rtw_reg_notifier_apply(wiphy, request, reg);
 }
-#endif //CONFIG_IOCTL_CFG80211
+#endif //CONFIG_IOCTL_CFG80211
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 42ef54a..ca92861
@@ -1,13 +1,13 @@
 /*
  * Yongle Lai @ Rockchip
  */
-#ifndef _WIFI_VERSION_H_
-#define _WIFI_VERSION_H_
+#ifndef WIFI_VERSION_H
+#define WIFI_VERSION_H
 
 /*
- * Broadcom BCM4319 driver version.
+ * Marvell MV8686 driver version.
  */
-#define RTL8192_DRV_VERSION "3.00.WFD"
+#define RTL8723BS_DRV_VERSION "4.00.WFD"
 
 #endif /* WIFI_VERSION_H */
 
index 495059839dcdda9a92f95251d9d527120c00c0ce..1df08fd273fd4bd5d354a392321e74b9a07d736f 100755 (executable)
@@ -143,11 +143,11 @@ int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u3
                for(i=0; i<8; i++)
                {
                        pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
-                       if(pxmitbuf->pxmit_urb[i] == NULL) 
-                       {
-                               DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
-                               return _FAIL;    
-                       }
+                    if(pxmitbuf->pxmit_urb[i] == NULL) 
+                    {
+                       DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
+                       return _FAIL;    
+                    }
                }
 #endif
        }
@@ -304,6 +304,8 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
        int i;
        s32     res;
 
+       DBG_COUNTER(padapter->tx_logs.os_tx_m2u);
+
        _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
        phead = &pstapriv->asoc_list;
        plist = get_next(phead);
@@ -324,14 +326,22 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
        for (i = 0; i < chk_alive_num; i++) {
                psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
                if(!(psta->state &_FW_LINKED))
+               {
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_fw_linked);
                        continue;               
+               }
                
                /* avoid come from STA1 and send back STA1 */ 
                if (_rtw_memcmp(psta->hwaddr, &skb->data[6], 6) == _TRUE
                        || _rtw_memcmp(psta->hwaddr, null_addr, 6) == _TRUE
                        || _rtw_memcmp(psta->hwaddr, bc_addr, 6) == _TRUE
                )
+               {
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_self);
                        continue;
+               }
+
+               DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry);
 
                newskb = rtw_skb_copy(skb);
 
@@ -339,11 +349,13 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
                        _rtw_memcpy(newskb->data, psta->hwaddr, 6);
                        res = rtw_xmit(padapter, &newskb);
                        if (res < 0) {
+                               DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_xmit);
                                DBG_871X("%s()-%d: rtw_xmit() return error!\n", __FUNCTION__, __LINE__);
                                pxmitpriv->tx_drop++;
                                rtw_skb_free(newskb);
                        }
                } else {
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_skb);
                        DBG_871X("%s-%d: rtw_skb_copy() failed!\n", __FUNCTION__, __LINE__);
                        pxmitpriv->tx_drop++;
                        //rtw_skb_free(skb);
@@ -372,9 +384,11 @@ int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
 
 _func_enter_;
 
+       DBG_COUNTER(padapter->tx_logs.os_tx);
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n"));
 
        if (rtw_if_up(padapter) == _FALSE) {
+               DBG_COUNTER(padapter->tx_logs.os_tx_err_up);
                RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n"));
                #ifdef DBG_TX_DROP_FRAME
                DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__);
@@ -388,7 +402,11 @@ _func_enter_;
        if ( !rtw_mc2u_disable
                && check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
                && ( IP_MCAST_MAC(pkt->data)
-                       || ICMPV6_MCAST_MAC(pkt->data) )
+                       || ICMPV6_MCAST_MAC(pkt->data)
+                       #ifdef CONFIG_TX_BCAST2UNI
+                       || is_broadcast_mac_addr(pkt->data)
+                       #endif
+                       )
                && (padapter->registrypriv.wifi_spec == 0)
                )
        {
@@ -400,6 +418,7 @@ _func_enter_;
                } else {
                        //DBG_871X("Stop M2U(%d, %d)! ", pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmitbuf_cnt);
                        //DBG_871X("!m2u );
+                       DBG_COUNTER(padapter->tx_logs.os_tx_m2u_stop);
                }
        }       
 #endif // CONFIG_TX_MCAST2UNI  
@@ -429,8 +448,13 @@ _func_exit_;
 
 int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
 {
-       if (pkt)
+       int ret = 0;
+
+       if (pkt) {
                rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, pkt->truesize);
-       return _rtw_xmit_entry(pkt, pnetdev);
+               ret = _rtw_xmit_entry(pkt, pnetdev);
+       }
+
+       return ret;
 }
 
index 2bc978a896ff2be080dcc65b86c448f4517a751e..97a904bab3c3ddf880a7f58342479c3551c50969 100755 (executable)
@@ -379,7 +379,9 @@ struct rtw_mem_stat {
 };
 
 struct rtw_mem_stat rtw_mem_type_stat[mstat_tf_idx(MSTAT_TYPE_MAX)];
+#ifdef RTW_MEM_FUNC_STAT
 struct rtw_mem_stat rtw_mem_func_stat[mstat_ff_idx(MSTAT_FUNC_MAX)];
+#endif
 
 char *MSTAT_TYPE_str[] = {
        "VIR",
@@ -388,6 +390,7 @@ char *MSTAT_TYPE_str[] = {
        "USB",
 };
 
+#ifdef RTW_MEM_FUNC_STAT
 char *MSTAT_FUNC_str[] = {
        "UNSP",
        "IO",
@@ -396,12 +399,15 @@ char *MSTAT_FUNC_str[] = {
        "TX",
        "RX",
 };
+#endif
 
 void rtw_mstat_dump(void *sel)
 {
        int i;
        int value_t[4][mstat_tf_idx(MSTAT_TYPE_MAX)];
+#ifdef RTW_MEM_FUNC_STAT
        int value_f[4][mstat_ff_idx(MSTAT_FUNC_MAX)];
+#endif
        
        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;
@@ -413,12 +419,14 @@ void rtw_mstat_dump(void *sel)
                value_t[3][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_err_cnt));
        }
 
+       #ifdef RTW_MEM_FUNC_STAT
        for(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {
                value_f[0][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc));
                value_f[1][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].peak));
                value_f[2][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_cnt));
                value_f[3][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_err_cnt));
        }
+       #endif
 
        DBG_871X_SEL_NL(sel, "===================== MSTAT =====================\n");
        DBG_871X_SEL_NL(sel, "%4s %10s %10s %10s %10s\n", "TAG", "alloc", "peak", "aloc_cnt", "err_cnt");
@@ -426,10 +434,12 @@ void rtw_mstat_dump(void *sel)
        for(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {
                DBG_871X_SEL_NL(sel, "%4s %10d %10d %10d %10d\n", MSTAT_TYPE_str[i], value_t[0][i], value_t[1][i], value_t[2][i], value_t[3][i]);
        }
+       #ifdef RTW_MEM_FUNC_STAT
        DBG_871X_SEL_NL(sel, "-------------------------------------------------\n");
        for(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {
                DBG_871X_SEL_NL(sel, "%4s %10d %10d %10d %10d\n", MSTAT_FUNC_str[i], value_f[0][i], value_f[1][i], value_f[2][i], value_f[3][i]);
        }
+       #endif
 }
 
 void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz)
@@ -446,12 +456,14 @@ void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 s
                        ATOMIC_SET(&(rtw_mem_type_stat[i].alloc_cnt), 0);
                        ATOMIC_SET(&(rtw_mem_type_stat[i].alloc_err_cnt), 0);
                }
+               #ifdef RTW_MEM_FUNC_STAT
                for(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {
                        ATOMIC_SET(&(rtw_mem_func_stat[i].alloc), 0);
                        ATOMIC_SET(&(rtw_mem_func_stat[i].peak), 0);
                        ATOMIC_SET(&(rtw_mem_func_stat[i].alloc_cnt), 0);
                        ATOMIC_SET(&(rtw_mem_func_stat[i].alloc_err_cnt), 0);
                }
+               #endif
        }
 
        switch(status) {
@@ -462,25 +474,29 @@ void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 s
                        if (peak<alloc)
                                ATOMIC_SET(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak), alloc);
 
+                       #ifdef RTW_MEM_FUNC_STAT
                        ATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));
                        alloc = ATOMIC_ADD_RETURN(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);
                        peak=ATOMIC_READ(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak));
                        if (peak<alloc)
                                ATOMIC_SET(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak), alloc);
+                       #endif
                        break;
 
                case MSTAT_ALLOC_FAIL:
                        ATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_err_cnt));
-
+                       #ifdef RTW_MEM_FUNC_STAT
                        ATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_err_cnt));
+                       #endif
                        break;
 
                case MSTAT_FREE:
                        ATOMIC_DEC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));
                        ATOMIC_SUB(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);
-
+                       #ifdef RTW_MEM_FUNC_STAT
                        ATOMIC_DEC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));
                        ATOMIC_SUB(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);
+                       #endif
                        break;
        };
 
@@ -490,11 +506,41 @@ void rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 s
        //}
 }
 
+#ifndef SIZE_MAX
+       #define SIZE_MAX (~(size_t)0)
+#endif
+
+struct mstat_sniff_rule {
+       enum mstat_f flags;
+       size_t lb;
+       size_t hb;
+};
+
+struct mstat_sniff_rule mstat_sniff_rules[] = {
+       {MSTAT_TYPE_PHY, 4097, SIZE_MAX},
+};
+
+int mstat_sniff_rule_num = sizeof(mstat_sniff_rules)/sizeof(struct mstat_sniff_rule);
+
+bool match_mstat_sniff_rules(const enum mstat_f flags, const size_t size)
+{
+       int i;
+       for (i = 0; i<mstat_sniff_rule_num; i++) {
+               if (mstat_sniff_rules[i].flags == flags
+                               && mstat_sniff_rules[i].lb <= size
+                               && mstat_sniff_rules[i].hb >= size)
+                       return _TRUE;
+       }
+
+       return _FALSE;
+}
 
 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));
+
+       if (match_mstat_sniff_rules(flags, sz))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
        
        p=_rtw_vmalloc((sz));
 
@@ -510,8 +556,10 @@ inline u8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, c
 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)); 
-       
+
+       if (match_mstat_sniff_rules(flags, sz))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
+
        p=_rtw_zvmalloc((sz)); 
 
        rtw_mstat_update(
@@ -525,8 +573,10 @@ inline u8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func,
 
 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));
-       
+
+       if (match_mstat_sniff_rules(flags, sz))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
+
        _rtw_vmfree((pbuf), (sz)); 
 
        rtw_mstat_update(
@@ -540,14 +590,11 @@ inline u8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, co
 {
        u8 *p;
 
-       //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)); 
+       if (match_mstat_sniff_rules(flags, sz))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
 
        p=_rtw_malloc((sz));
-       
+
        rtw_mstat_update(
                flags
                , p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL
@@ -561,11 +608,8 @@ inline u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, c
 {
        u8 *p;
 
-       //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));
+       if (match_mstat_sniff_rules(flags, sz))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
 
        p = _rtw_zmalloc((sz));
 
@@ -580,12 +624,9 @@ inline u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, c
 
 inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)
 {
-       //if(sz>=153 && sz<=306) 
-       //      DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz));
+       if (match_mstat_sniff_rules(flags, sz))
+               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_mstat_update(
@@ -605,7 +646,7 @@ inline struct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f
        if(skb)
                truesize = skb->truesize;
 
-       if(!skb || truesize < size /*|| size > 4096*/)
+       if(!skb || truesize < size || match_mstat_sniff_rules(flags, truesize))
                DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\n", func, line, __FUNCTION__, size, skb, truesize);
 
        rtw_mstat_update(
@@ -621,11 +662,11 @@ inline void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, cons
 {
        unsigned int truesize = skb->truesize;
 
-       //if(truesize > 4096)
-       //      DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
+       if(match_mstat_sniff_rules(flags, truesize))
+               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
@@ -643,7 +684,7 @@ inline struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum ms
        if(skb_cp)
                cp_truesize = skb_cp->truesize;
 
-       if(!skb_cp || cp_truesize != truesize /*||cp_truesize > 4096*/)
+       if(!skb_cp || cp_truesize < truesize || match_mstat_sniff_rules(flags, cp_truesize))
                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(
@@ -665,7 +706,7 @@ inline struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f
        if(skb_cl)
                cl_truesize = skb_cl->truesize;
 
-       if(!skb_cl || cl_truesize != truesize /*|| cl_truesize > 4096*/)
+       if(!skb_cl || cl_truesize < truesize || match_mstat_sniff_rules(flags, cl_truesize))
                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(
@@ -682,8 +723,8 @@ inline int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat
        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);
+       if(match_mstat_sniff_rules(flags, truesize))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s, truesize=%u\n", func, line, __FUNCTION__, truesize);
 
        ret = _rtw_netif_rx(ndev, skb);
        
@@ -708,8 +749,10 @@ inline void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flag
 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);
-       
+
+       if(match_mstat_sniff_rules(flags, size))
+               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(
@@ -723,7 +766,9 @@ inline void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_a
 
 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);
+
+       if(match_mstat_sniff_rules(flags, size))
+               DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, size);
 
        _rtw_usb_buffer_free(dev, size, addr, dma);
 
@@ -2102,13 +2147,14 @@ RETURN:
 int rtw_change_ifname(_adapter *padapter, const char *ifname)
 {
        struct net_device *pnetdev;
-       struct net_device *cur_pnetdev = padapter->pnetdev;
+       struct net_device *cur_pnetdev;
        struct rereg_nd_name_data *rereg_priv;
        int ret;
 
        if(!padapter)
                goto error;
 
+       cur_pnetdev = padapter->pnetdev;
        rereg_priv = &padapter->rereg_nd_name_priv;
        
        //free the old_pnetdev
index 480652676695e0e278bed5691c60cafd96e37361..d384141eba0c8112870087e8deebb666e26f27ee 100755 (executable)
@@ -69,20 +69,27 @@ int platform_wifi_power_on(void)
        } else {\r
                sdc_id = val.val;\r
                DBG_871X("----- %s sdc_id: %d, mod_sel: %d\n", __FUNCTION__, sdc_id, mod_sel);\r
-               wifi_pm_power(1);\r
-               mdelay(10);\r
+\r
 #if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\r
                sw_mci_rescan_card(sdc_id, 1);\r
 #elif defined(CONFIG_PLATFORM_ARM_SUN8I)\r
                sunxi_mci_rescan_card(sdc_id, 1);\r
 #endif\r
+               mdelay(100);\r
+               wifi_pm_power(1);\r
+\r
                DBG_871X("%s: power up, rescan card.\n", __FUNCTION__);\r
        }\r
 \r
 #ifdef CONFIG_GPIO_WAKEUP\r
+#ifdef CONFIG_RTL8723B\r
        type = script_get_item("wifi_para", "rtl8723bs_wl_host_wake", &val);\r
+#endif\r
+#ifdef CONFIG_RTL8188E\r
+       type = script_get_item("wifi_para", "rtl8189es_host_wake", &val);\r
+#endif\r
        if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) {\r
-               DBG_871X("has no rtl8723bs_wl_wake_host\n");\r
+               DBG_871X("No definition of wake up host PIN\n");\r
                ret = -1;\r
        } else {\r
                gpio_eint_wlan = val.gpio.gpio;\r
@@ -100,12 +107,14 @@ int platform_wifi_power_on(void)
 void platform_wifi_power_off(void)\r
 {\r
 #ifdef CONFIG_MMC\r
-       wifi_pm_power(0);\r
 #if defined(CONFIG_PLATFORM_ARM_SUN6I) ||defined(CONFIG_PLATFORM_ARM_SUN7I)\r
        sw_mci_rescan_card(sdc_id, 0);\r
 #elif defined(CONFIG_PLATFORM_ARM_SUN8I)\r
        sunxi_mci_rescan_card(sdc_id, 0);\r
 #endif\r
+       mdelay(100);\r
+       wifi_pm_power(0);\r
+\r
        DBG_871X("%s: remove card, power off.\n", __FUNCTION__);\r
 #endif // CONFIG_MMC\r
 }\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/platform/platform_ARM_WMT_sdio.c b/drivers/net/wireless/rockchip_wlan/rtl8723bs/platform/platform_ARM_WMT_sdio.c
new file mode 100755 (executable)
index 0000000..62e5825
--- /dev/null
@@ -0,0 +1,51 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2013 Realtek Corporation. All rights reserved.\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#include <drv_types.h>\r
+#include <mach/wmt_iomux.h>\r
+#include <linux/gpio.h>\r
+\r
+extern void wmt_detect_sdio2(void);\r
+extern void force_remove_sdio2(void);\r
+\r
+int platform_wifi_power_on(void)\r
+{\r
+       int err = 0;\r
+       err = gpio_request(WMT_PIN_GP62_SUSGPIO1, "wifi_chip_en");\r
+       if (err < 0){\r
+               printk("request gpio for rtl8188eu failed!\n");\r
+               return err;\r
+       }\r
+       gpio_direction_output(WMT_PIN_GP62_SUSGPIO1, 0);//pull sus_gpio1 to 0 to open vcc_wifi.\r
+       printk("power on rtl8189.\n");\r
+       msleep(500);\r
+       wmt_detect_sdio2();\r
+       printk("[rtl8189es] %s: new card, power on.\n", __FUNCTION__);\r
+       return err;\r
+}\r
+\r
+void platform_wifi_power_off(void)\r
+{\r
+       force_remove_sdio2();\r
+\r
+       gpio_direction_output(WMT_PIN_GP62_SUSGPIO1, 1);//pull sus_gpio1 to 1 to close vcc_wifi.\r
+       printk("power off rtl8189.\n");\r
+       gpio_free(WMT_PIN_GP62_SUSGPIO1);\r
+       printk("[rtl8189es] %s: remove card, power off.\n", __FUNCTION__);\r
+}\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/runwpa b/drivers/net/wireless/rockchip_wlan/rtl8723bs/runwpa
new file mode 100755 (executable)
index 0000000..f825e8b
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+if [ "`which iwconfig`" = "" ] ; then 
+       echo "WARNING:Wireless tool not exist!"
+       echo "        Please install it!"
+       exit
+else
+       if [ `uname -r | cut -d. -f2` -eq 4 ]; then
+               wpa_supplicant -D ipw -c wpa1.conf -i wlan0     
+       else
+       if [ `iwconfig -v |awk '{print $4}' | head -n 1` -lt  18 ] ; then
+               wpa_supplicant -D ipw -c wpa1.conf -i wlan0  
+       else      
+               wpa_supplicant -D wext -c wpa1.conf -i wlan0 
+       fi
+
+       fi
+fi
+
+
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723bs/wlan0dhcp b/drivers/net/wireless/rockchip_wlan/rtl8723bs/wlan0dhcp
new file mode 100755 (executable)
index 0000000..6043382
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+var0=`ps aux|awk '/dhclient wlan0/'|awk '$11!="awk"{print $2}'`
+
+kill $var0
+cp ifcfg-wlan0 /etc/sysconfig/network-scripts/
+
+dhclient wlan0
+
+var1=`ifconfig wlan0 |awk '/inet/{print $2}'|awk -F: '{print $2}'`
+
+
+rm -f /etc/sysconfig/network-scripts/ifcfg-wlan0
+
+echo "get ip: $var1"
+