From 7c9ab6fe6fa61a6a2986c1785409de3f8638d80e Mon Sep 17 00:00:00 2001 From: kimocoder Date: Sat, 9 Nov 2019 18:53:04 +0000 Subject: [PATCH] Add a bunch of VID/PID's + Add 8814/8821AU support --- Makefile | 6 +- core/rtw_ap.c | 4 +- core/rtw_rf.c | 2 +- dkms.conf | 2 +- hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c | 93 + hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h | 33 + hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c | 90 + hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h | 33 + hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c | 1754 +++ hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h | 164 + hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c | 564 + hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h | 112 + hal/phydm/halrf/rtl8814a/halrf_8814a_win.c | 528 + hal/phydm/halrf/rtl8814a/halrf_8814a_win.h | 106 + hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c | 557 + hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h | 58 + hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c | 316 + hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h | 53 + hal/phydm/halrf/rtl8821a/halrf_8821a_win.c | 1046 ++ hal/phydm/halrf/rtl8821a/halrf_8821a_win.h | 72 + hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c | 731 ++ hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h | 42 + hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c | 773 ++ hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h | 41 + .../halrf/rtl8821a/halrf_iqk_8821a_win.c | 774 ++ .../halrf/rtl8821a/halrf_iqk_8821a_win.h | 42 + hal/phydm/phydm.c | 2 + hal/phydm/phydm_debug.h | 4 +- hal/phydm/phydm_hwconfig.c | 14 +- hal/phydm/rtl8814a/hal8814areg_odm.h | 47 + hal/phydm/rtl8814a/halhwimg8814a_bb.c | 4489 +++++++ hal/phydm/rtl8814a/halhwimg8814a_bb.h | 99 + hal/phydm/rtl8814a/halhwimg8814a_fw.h | 56 + hal/phydm/rtl8814a/halhwimg8814a_mac.c | 325 + hal/phydm/rtl8814a/halhwimg8814a_mac.h | 39 + hal/phydm/rtl8814a/halhwimg8814a_rf.c | 8846 +++++++++++++ hal/phydm/rtl8814a/halhwimg8814a_rf.h | 149 + hal/phydm/rtl8814a/halphyrf_8814a_ap.c | 1754 +++ hal/phydm/rtl8814a/halphyrf_8814a_ap.h | 164 + hal/phydm/rtl8814a/halphyrf_8814a_win.c | 528 + hal/phydm/rtl8814a/halphyrf_8814a_win.h | 106 + hal/phydm/rtl8814a/phydm_regconfig8814a.c | 219 + hal/phydm/rtl8814a/phydm_regconfig8814a.h | 109 + hal/phydm/rtl8814a/phydm_rtl8814a.c | 503 + hal/phydm/rtl8814a/phydm_rtl8814a.h | 78 + hal/phydm/rtl8814a/version_rtl8814a.h | 10 + hal/phydm/rtl8821a/halhwimg8821a_bb.c | 923 ++ hal/phydm/rtl8821a/halhwimg8821a_bb.h | 83 + hal/phydm/rtl8821a/halhwimg8821a_mac.c | 279 + hal/phydm/rtl8821a/halhwimg8821a_mac.h | 33 + hal/phydm/rtl8821a/halhwimg8821a_rf.c | 5457 ++++++++ hal/phydm/rtl8821a/halhwimg8821a_rf.h | 143 + hal/phydm/rtl8821a/phydm_regconfig8821a.c | 206 + hal/phydm/rtl8821a/phydm_regconfig8821a.h | 90 + hal/phydm/rtl8821a/phydm_rtl8821a.c | 129 + hal/phydm/rtl8821a/phydm_rtl8821a.h | 31 + hal/phydm/rtl8821a/version_rtl8821a.h | 24 + hal/rtl8812a/rtl8812a_phycfg.c | 2 + hal/rtl8812a/usb/usb_halinit.c | 2 +- hal/rtl8814a/Hal8814PwrSeq.c | 98 + hal/rtl8814a/hal8814a_fw.c | 7741 ++++++++++++ hal/rtl8814a/rtl8814a_cmd.c | 1515 +++ hal/rtl8814a/rtl8814a_dm.c | 420 + hal/rtl8814a/rtl8814a_hal_init.c | 6769 ++++++++++ hal/rtl8814a/rtl8814a_phycfg.c | 3027 +++++ hal/rtl8814a/rtl8814a_rf6052.c | 210 + hal/rtl8814a/rtl8814a_rxdesc.c | 68 + hal/rtl8814a/rtl8814a_sreset.c | 114 + hal/rtl8814a/rtl8814a_xmit.c | 515 + hal/rtl8814a/usb/rtl8814au_led.c | 147 + hal/rtl8814a/usb/rtl8814au_recv.c | 34 + hal/rtl8814a/usb/rtl8814au_xmit.c | 1121 ++ hal/rtl8814a/usb/usb_halinit.c | 2416 ++++ hal/rtl8814a/usb/usb_ops_linux.c | 314 + include/hal_data.h | 2 + include/rtl8814a_hal.h | 4 +- include/rtl8814a_spec.h | 8 + os_dep/linux/ioctl_cfg80211.c | 31 +- os_dep/linux/ioctl_cfg80211.c.orig | 10260 ++++++++++++++++ 79 files changed, 67733 insertions(+), 20 deletions(-) create mode 100644 hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c create mode 100644 hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h create mode 100644 hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c create mode 100644 hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h create mode 100644 hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c create mode 100644 hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h create mode 100644 hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c create mode 100644 hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h create mode 100644 hal/phydm/halrf/rtl8814a/halrf_8814a_win.c create mode 100644 hal/phydm/halrf/rtl8814a/halrf_8814a_win.h create mode 100644 hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c create mode 100644 hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h create mode 100644 hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c create mode 100644 hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h create mode 100644 hal/phydm/halrf/rtl8821a/halrf_8821a_win.c create mode 100644 hal/phydm/halrf/rtl8821a/halrf_8821a_win.h create mode 100644 hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c create mode 100644 hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h create mode 100644 hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c create mode 100644 hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h create mode 100644 hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c create mode 100644 hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h create mode 100644 hal/phydm/rtl8814a/hal8814areg_odm.h create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_bb.c create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_bb.h create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_fw.h create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_mac.c create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_mac.h create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_rf.c create mode 100644 hal/phydm/rtl8814a/halhwimg8814a_rf.h create mode 100644 hal/phydm/rtl8814a/halphyrf_8814a_ap.c create mode 100644 hal/phydm/rtl8814a/halphyrf_8814a_ap.h create mode 100644 hal/phydm/rtl8814a/halphyrf_8814a_win.c create mode 100644 hal/phydm/rtl8814a/halphyrf_8814a_win.h create mode 100644 hal/phydm/rtl8814a/phydm_regconfig8814a.c create mode 100644 hal/phydm/rtl8814a/phydm_regconfig8814a.h create mode 100644 hal/phydm/rtl8814a/phydm_rtl8814a.c create mode 100644 hal/phydm/rtl8814a/phydm_rtl8814a.h create mode 100644 hal/phydm/rtl8814a/version_rtl8814a.h create mode 100644 hal/phydm/rtl8821a/halhwimg8821a_bb.c create mode 100644 hal/phydm/rtl8821a/halhwimg8821a_bb.h create mode 100644 hal/phydm/rtl8821a/halhwimg8821a_mac.c create mode 100644 hal/phydm/rtl8821a/halhwimg8821a_mac.h create mode 100644 hal/phydm/rtl8821a/halhwimg8821a_rf.c create mode 100644 hal/phydm/rtl8821a/halhwimg8821a_rf.h create mode 100644 hal/phydm/rtl8821a/phydm_regconfig8821a.c create mode 100644 hal/phydm/rtl8821a/phydm_regconfig8821a.h create mode 100644 hal/phydm/rtl8821a/phydm_rtl8821a.c create mode 100644 hal/phydm/rtl8821a/phydm_rtl8821a.h create mode 100644 hal/phydm/rtl8821a/version_rtl8821a.h create mode 100644 hal/rtl8814a/Hal8814PwrSeq.c create mode 100644 hal/rtl8814a/hal8814a_fw.c create mode 100644 hal/rtl8814a/rtl8814a_cmd.c create mode 100644 hal/rtl8814a/rtl8814a_dm.c create mode 100644 hal/rtl8814a/rtl8814a_hal_init.c create mode 100644 hal/rtl8814a/rtl8814a_phycfg.c create mode 100644 hal/rtl8814a/rtl8814a_rf6052.c create mode 100644 hal/rtl8814a/rtl8814a_rxdesc.c create mode 100644 hal/rtl8814a/rtl8814a_sreset.c create mode 100644 hal/rtl8814a/rtl8814a_xmit.c create mode 100644 hal/rtl8814a/usb/rtl8814au_led.c create mode 100644 hal/rtl8814a/usb/rtl8814au_recv.c create mode 100644 hal/rtl8814a/usb/rtl8814au_xmit.c create mode 100644 hal/rtl8814a/usb/usb_halinit.c create mode 100644 hal/rtl8814a/usb/usb_ops_linux.c create mode 100644 os_dep/linux/ioctl_cfg80211.c.orig diff --git a/Makefile b/Makefile index 12e90b2..88ffd93 100755 --- a/Makefile +++ b/Makefile @@ -37,8 +37,8 @@ EXTRA_LDFLAGS += --strip-debug ########################## WIFI IC ############################ CONFIG_RTL8812A = y -CONFIG_RTL8821A = n -CONFIG_RTL8814A = n +CONFIG_RTL8821A = y +CONFIG_RTL8814A = y ######################### Interface ########################### CONFIG_USB_HCI = y ########################## Features ########################### @@ -188,7 +188,7 @@ ifeq ($(CONFIG_PCI_HCI), y) HCI_NAME = pci endif -ifeq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A)_$(CONFIG_RTL8814A), y_n_n) +ifeq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A)_$(CONFIG_RTL8814A), y_y_y) EXTRA_CFLAGS += -DDRV_NAME=\"rtl88xxau\" ifeq ($(CONFIG_USB_HCI), y) diff --git a/core/rtw_ap.c b/core/rtw_ap.c index 1f8081c..956754d 100644 --- a/core/rtw_ap.c +++ b/core/rtw_ap.c @@ -2428,9 +2428,9 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) /* Parsing VHT OPERATION IE */ if (vht_cap == _TRUE - && MLME_IS_MESH(padapter) /* allow only mesh temporarily before VHT IE checking is ready */ ) { - rtw_check_for_vht20(padapter, ie + _BEACON_IE_OFFSET_, pbss_network->IELength - _BEACON_IE_OFFSET_); + if(MLME_IS_MESH(padapter)) /* allow only mesh temporarily before VHT IE checking is ready */ + rtw_check_for_vht20(padapter, ie + _BEACON_IE_OFFSET_, pbss_network->IELength - _BEACON_IE_OFFSET_); pmlmepriv->ori_vht_en = 1; pmlmepriv->vhtpriv.vht_option = _TRUE; } else if (REGSTY_IS_11AC_AUTO(pregistrypriv)) { diff --git a/core/rtw_rf.c b/core/rtw_rf.c index fa851e4..ab4c318 100644 --- a/core/rtw_rf.c +++ b/core/rtw_rf.c @@ -1238,7 +1238,7 @@ exit: void rtw_rf_set_tx_gain_offset(_adapter *adapter, u8 path, s8 offset) { -#if !defined(CONFIG_RTL8814A) && !defined(CONFIG_RTL8822B) && !defined(CONFIG_RTL8821C) +#if defined(CONFIG_RTL8821A) u8 write_value; #endif u8 target_path = 0; diff --git a/dkms.conf b/dkms.conf index fa7b103..5e0a617 100644 --- a/dkms.conf +++ b/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME="realtek-rtl88xxau" -PACKAGE_VERSION="5.6.4.2~20191031" +PACKAGE_VERSION="5.6.4.2~20191108" CLEAN="'make' clean" BUILT_MODULE_NAME[0]=88XXau PROCS_NUM=`nproc` diff --git a/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c b/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c new file mode 100644 index 0000000..22f793c --- /dev/null +++ b/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c @@ -0,0 +1,93 @@ +/****************************************************************************** +* +* 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 + +#include "HalEfuseMask8814A_PCIE.h" + +/****************************************************************************** +* MPCIE.TXT +******************************************************************************/ + +u1Byte Array_MP_8814A_MPCIE[] = { + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xF3, + 0xFF, + 0x10, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + +}; + +u2Byte +EFUSE_GetArrayLen_MP_8814A_MPCIE(VOID) +{ + return sizeof(Array_MP_8814A_MPCIE)/sizeof(u1Byte); +} + +VOID +EFUSE_GetMaskArray_MP_8814A_MPCIE(pu1Byte Array) +{ + u2Byte len = EFUSE_GetArrayLen_MP_8814A_MPCIE(), i = 0; + + for (i = 0; i < len; ++i) + Array[i] = Array_MP_8814A_MPCIE[i]; +} + +BOOLEAN +EFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte Offset) +{ + int r = Offset/16; + int c = (Offset%16) / 2; + int result = 0; + + if (c < 4) /*Upper double word*/ + result = (Array_MP_8814A_MPCIE[r] & (0x10 << c)); + else + result = (Array_MP_8814A_MPCIE[r] & (0x01 << (c-4))); + + return (result > 0) ? 0 : 1; +} + diff --git a/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h b/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h new file mode 100644 index 0000000..8b51c1b --- /dev/null +++ b/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h @@ -0,0 +1,33 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + + +/****************************************************************************** +* MPCIE.TXT +******************************************************************************/ + + +u2Byte EFUSE_GetArrayLen_MP_8814A_MPCIE(VOID); + +VOID EFUSE_GetMaskArray_MP_8814A_MPCIE(pu1Byte Array); + +BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte Offset); + + diff --git a/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c b/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c new file mode 100644 index 0000000..cd80e92 --- /dev/null +++ b/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c @@ -0,0 +1,90 @@ +/****************************************************************************** +* +* 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 + +#include "HalEfuseMask8814A_USB.h" + +/****************************************************************************** +* MUSB.TXT +******************************************************************************/ + +u1Byte Array_MP_8814A_MUSB[] = { + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xF3, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0x70, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + +}; + +u2Byte EFUSE_GetArrayLen_MP_8814A_MUSB(VOID) +{ + return sizeof(Array_MP_8814A_MUSB)/sizeof(u1Byte); +} + +VOID EFUSE_GetMaskArray_MP_8814A_MUSB(pu1Byte Array) +{ + u2Byte len = EFUSE_GetArrayLen_MP_8814A_MUSB(), i = 0; + + for (i = 0; i < len; ++i) + Array[i] = Array_MP_8814A_MUSB[i]; +} + +BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte Offset) +{ + int r = Offset/16; + int c = (Offset%16) / 2; + int result = 0; + + if (c < 4) /*Upper double word*/ + result = (Array_MP_8814A_MUSB[r] & (0x10 << c)); + else + result = (Array_MP_8814A_MUSB[r] & (0x01 << (c-4))); + + return (result > 0) ? 0 : 1; +} + diff --git a/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h b/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h new file mode 100644 index 0000000..4262400 --- /dev/null +++ b/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h @@ -0,0 +1,33 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + + + +/****************************************************************************** +* MUSB.TXT +******************************************************************************/ + + +u2Byte EFUSE_GetArrayLen_MP_8814A_MUSB(VOID); + +VOID EFUSE_GetMaskArray_MP_8814A_MUSB(pu1Byte Array); + +BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte Offset); + diff --git a/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c b/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c new file mode 100644 index 0000000..238df1b --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c @@ -0,0 +1,1754 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#if !defined(__ECOS) && !defined(CONFIG_COMPAT_WIRELESS) +#include "mp_precomp.h" +#else +#include "../mp_precomp.h" +#endif +#include "../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX8814A 6 + +/*---------------------------Define Local Constant---------------------------*/ + + +//3============================================================ +//3 Tx Power Tracking +//3============================================================ + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath + ) +{ + s1Byte UpperBound = 10, LowerBound = -5; // 4'b1010 = 10 + s1Byte Final_RF_Index = 0; + BOOLEAN bPositive = FALSE; + u4Byte bitMask = 0; + u1Byte Final_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -9dB + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + if(Method == MIX_MODE) //normal Tx power tracking + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("is 8814 MP chip\n")); + bitMask = BIT19; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; + + if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not + bPositive = TRUE; + else + bPositive = FALSE; + + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive); + + bitMask = BIT18|BIT17|BIT16|BIT15; + Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/ + + } + + if(Final_RF_Index > UpperBound) //Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB + { + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); + + if(Final_OFDM_Swing_Index > TxScalingUpperBound) // bb swing upper bound = +2dB + Final_OFDM_Swing_Index = TxScalingUpperBound; + + return Final_OFDM_Swing_Index; + } + else if(Final_RF_Index < LowerBound) // lower bound = -5dB + { + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound)); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex - ((LowerBound<<1) - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); + + if(Final_OFDM_Swing_Index < TxScalingLowerBound) // bb swing lower bound = -10dB + Final_OFDM_Swing_Index = TxScalingLowerBound; + return Final_OFDM_Swing_Index; + } + else // normal case + { + + if(bPositive == TRUE) + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index); //set RF Reg0x55 per path + else + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; + return Final_OFDM_Swing_Index; + } + + return FALSE; +} + + +VOID +ODM_TxPwrTrackSetPwr8814A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER Adapter = pDM_Odm->Adapter; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); +#endif + u1Byte Final_OFDM_Swing_Index = 0; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); + + Final_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath); + } + else if(Method == TSSI_MODE) + { + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); + } + else if(Method == BBSWING) // use for mp driver clean power tracking status + { + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); + + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); + } + + if((Method == MIX_MODE) || (Method == BBSWING)) + { + switch(RFPath) + { + case ODM_RF_PATH_A: + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case ODM_RF_PATH_B: + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case ODM_RF_PATH_C: + + ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case ODM_RF_PATH_D: + + ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + default: + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Wrong Path name!!!! \n")); + + break; + } + } + return; +} // ODM_TxPwrTrackSetPwr8814A + +VOID +GetDeltaSwingTable_8814A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + u2Byte rate = *(pDM_Odm->pForcedDataRate); + u1Byte channel = *(pDM_Odm->pChannel); + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(rate)) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; + } else { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; + } + } else if ( 36 <= channel && channel <= 64) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; + } else if ( 100 <= channel && channel <= 140) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; + } else if ( 149 <= channel && channel <= 173) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; + } else { + *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; + *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; + } + + return; +} + + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_C, + OUT pu1Byte *TemperatureDOWN_C, + OUT pu1Byte *TemperatureUP_D, + OUT pu1Byte *TemperatureDOWN_D + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + u2Byte rate = *(pDM_Odm->pForcedDataRate); + u1Byte channel = *(pDM_Odm->pChannel); + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(rate)) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; + } else { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; + } + } else if ( 36 <= channel && channel <= 64) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; + } else if ( 100 <= channel && channel <= 140) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; + } else if ( 149 <= channel && channel <= 173) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; + } else { + *TemperatureUP_C = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; + *TemperatureUP_D = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; + } + + return; +} + + +void ConfigureTxpowerTrack_8814A( + IN PTXPWRTRACK_CFG pConfig + ) +{ + pConfig->SwingTableSize_CCK = ODM_CCK_TABLE_SIZE; + pConfig->SwingTableSize_OFDM = ODM_OFDM_TABLE_SIZE; + pConfig->Threshold_IQK = 8; + pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; + pConfig->RfPathCount = MAX_PATH_NUM_8814A; + pConfig->ThermalRegAddr = RF_T_METER_8814A; + + pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; + pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; + pConfig->DoIQK = DoIQK_8814A; + pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; + pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; +} + + + +//1 7. IQK + + + +// +// 2011/07/26 MH Add an API for testing IQK fail case. +// +// MP Already declare in odm.c +#if 0 //!(DM_ODM_SUPPORT_TYPE & ODM_WIN) +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,COMP_INIT, 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,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", + Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState)); + return FALSE; + } + */ + return TRUE; +} +#endif + +VOID + _PHY_SaveADDARegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN pu4Byte ADDABackup, + IN u4Byte RegisterNum + ) +{ + u4Byte i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif + + if (ODM_CheckPowerStatus(pAdapter) == FALSE) + return; +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save ADDA parameters.\n")); + for( i = 0 ; i < RegisterNum ; i++){ + ADDABackup[i] = ODM_GetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord); + } +} + + +VOID + _PHY_SaveMACRegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte MACReg, + IN pu4Byte MACBackup + ) +{ + u4Byte i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save MAC parameters.\n")); + for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + MACBackup[i] = ODM_Read1Byte(pDM_Odm, MACReg[i]); + } + MACBackup[i] = ODM_Read4Byte(pDM_Odm, MACReg[i]); + +} + + +VOID + _PHY_ReloadADDARegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN pu4Byte ADDABackup, + IN u4Byte RegiesterNum + ) +{ + u4Byte i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload ADDA power saving parameters !\n")); + for(i = 0 ; i < RegiesterNum; i++) + { + ODM_SetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord, ADDABackup[i]); + } +} + +VOID + _PHY_ReloadMACRegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte MACReg, + IN pu4Byte MACBackup + ) +{ + u4Byte i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload MAC parameters !\n")); + for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)MACBackup[i]); + } + ODM_Write4Byte(pDM_Odm, MACReg[i], MACBackup[i]); +} + + + +VOID + _PHY_MACSettingCalibration_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte MACReg, + IN pu4Byte MACBackup + ) +{ + u4Byte i = 0; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n")); + + ODM_Write1Byte(pDM_Odm, MACReg[i], 0x3F); + + for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ + ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i]&(~BIT3))); + } + ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i]&(~BIT5))); + +} + +#if 0 +#define BW_20M 0 +#define BW_40M 1 +#define BW_80M 2 +#endif + +VOID + phy_LCCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN is2T + ) +{ + u4Byte /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0; + u4Byte cnt; + + //Check continuous TX and Packet TX + u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; + + // Backup RF reg18. + + if((reg0x914 & 0x70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0xFF); + + //3 3. Read RF reg18 + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + //3 4. Set LC calibration begin bit15 + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000, 0x1); + + ODM_delay_ms(100); + + for (cnt = 0; cnt < 100; cnt++) { + if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) + break; + ODM_delay_ms(10); + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); + + + //3 Restore original situation + if((reg0x914 & 70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0x00); + + // Recover channel number + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); +} + +//Analog Pre-distortion calibration +#define APK_BB_REG_NUM 8 +#define APK_CURVE_REG_NUM 4 +#define PATH_NUM 2 + +VOID + phy_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta, + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + u4Byte regD[PATH_NUM]; + u4Byte tmpReg, index, offset, apkbound; + u1Byte path, i, pathbound = PATH_NUM; + u4Byte BB_backup[APK_BB_REG_NUM]; + u4Byte BB_REG[APK_BB_REG_NUM] = { + rFPGA1_TxBlock, rOFDM0_TRxPathEnable, + rFPGA0_RFMOD, rOFDM0_TRMuxPar, + rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW, + rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE }; + u4Byte BB_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x00204000 }; + u4Byte BB_normal_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x22204000 }; + + u4Byte AFE_backup[IQK_ADDA_REG_NUM]; + u4Byte AFE_REG[IQK_ADDA_REG_NUM] = { + rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, + rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, + rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, + rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + + u4Byte MAC_backup[IQK_MAC_REG_NUM]; + u4Byte MAC_REG[IQK_MAC_REG_NUM] = { + REG_TXPAUSE, REG_BCN_CTRL, + REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; + + u4Byte APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, + {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} + }; + + u4Byte APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings + {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} + }; + + u4Byte APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, + {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} + }; + + u4Byte APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} + }; + + u4Byte AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u4Byte APK_offset[PATH_NUM] = { + rConfig_AntA, rConfig_AntB}; + + u4Byte APK_normal_offset[PATH_NUM] = { + rConfig_Pmpd_AntA, rConfig_Pmpd_AntB}; + + u4Byte APK_value[PATH_NUM] = { + 0x92fc0000, 0x12fc0000}; + + u4Byte APK_normal_value[PATH_NUM] = { + 0x92680000, 0x12680000}; + + s1Byte APK_delta_mapping[APK_BB_REG_NUM][13] = { + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} + }; + + u4Byte APK_normal_setting_value_1[13] = { + 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, + 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, + 0x12680000, 0x00880000, 0x00880000 + }; + + u4Byte APK_normal_setting_value_2[16] = { + 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, + 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, + 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, + 0x00050006 + }; + + u4Byte APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a + // u4Byte AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; + + s4Byte BB_offset, delta_V, delta_offset; + +#if defined(MP_DRIVER) && (MP_DRIVER == 1) +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); +#else + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); +#endif + pMptCtx->APK_bound[0] = 45; + pMptCtx->APK_bound[1] = 52; + +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_APCalibrate_8814A() delta %d\n", delta)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AP Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); + if(!is2T) + pathbound = 1; + + //2 FOR NORMAL CHIP SETTINGS + + // Temporarily do not allow normal driver to do the following settings because these offset + // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal + // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the + // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. +#if !defined(MP_DRIVER) || (MP_DRIVER != 1) + return; +#endif + //settings adjust for normal chip + for(index = 0; index < PATH_NUM; index ++) + { + APK_offset[index] = APK_normal_offset[index]; + APK_value[index] = APK_normal_value[index]; + AFE_on_off[index] = 0x6fdb25a4; + } + + for(index = 0; index < APK_BB_REG_NUM; index ++) + { + for(path = 0; path < pathbound; path++) + { + APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; + APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; + } + BB_AP_MODE[index] = BB_normal_AP_MODE[index]; + } + + apkbound = 6; + + //save BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0) //skip + continue; + BB_backup[index] = ODM_GetBBReg(pDM_Odm, BB_REG[index], bMaskDWord); + } + + //save MAC default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_SaveMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); + + //save AFE default value + _PHY_SaveADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#else + _PHY_SaveMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); + + //save AFE default value + _PHY_SaveADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#endif + + for(path = 0; path < pathbound; path++) + { + + + if(path == RF_PATH_A) + { + //path A APK + //load APK setting + //path-A + offset = rPdp_AntA; + for(index = 0; index < 11; index ++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); + + offset = rConfig_AntA; + for(; index < 13; index ++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + + //path A + offset = rPdp_AntA; + for(index = 0; index < 16; index++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + } + else if(path == RF_PATH_B) + { + //path B APK + //load APK setting + //path-B + offset = rPdp_AntB; + for(index = 0; index < 10; index ++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); + + offset = rConfig_AntA; + index = 11; + for(; index < 13; index ++) //offset 0xb68, 0xb6c + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + + //path B + offset = 0xb60; + for(index = 0; index < 16; index++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0); + } + + //save RF default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + regD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord); +#else + regD[path] = ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord); +#endif + + //Path A AFE all on, path B AFE All off or vise versa + for(index = 0; index < IQK_ADDA_REG_NUM ; index++) + ODM_SetBBReg(pDM_Odm, AFE_REG[index], bMaskDWord, AFE_on_off[path]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xe70 %x\n", ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord))); + + //BB to AP mode + if(path == 0) + { + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + + if(index == 0) //skip + continue; + else if (index < 5) + ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); + else if (BB_REG[index] == 0x870) + ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); + else + ODM_SetBBReg(pDM_Odm, BB_REG[index], BIT10, 0x0); + } + + ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00); + ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00); + } + else //path B + { + ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00); + ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00); + + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x800 %x\n", ODM_GetBBReg(pDM_Odm, 0x800, bMaskDWord))); + + //MAC settings +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_MACSettingCalibration_8814A(pAdapter, MAC_REG, MAC_backup); +#else + _PHY_MACSettingCalibration_8814A(pDM_Odm, MAC_REG, MAC_backup); +#endif + + if(path == RF_PATH_A) //Path B to standby mode + { + ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000); + } + else //Path A to standby mode + { + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20103); + } + + delta_offset = ((delta+14)/2); + if(delta_offset < 0) + delta_offset = 0; + else if (delta_offset > 12) + delta_offset = 12; + + //AP calibration + for(index = 0; index < APK_BB_REG_NUM; index++) + { + if(index != 1) //only DO PA11+PAD01001, AP RF setting + continue; + + tmpReg = APK_RF_init_value[path][index]; +#if 1 + if(!pDM_Odm->RFCalibrateInfo.bAPKThermalMeterIgnore) + { + BB_offset = (tmpReg & 0xF0000) >> 16; + + if(!(tmpReg & BIT15)) //sign bit 0 + { + BB_offset = -BB_offset; + } + + delta_V = APK_delta_mapping[index][delta_offset]; + + BB_offset += delta_V; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() APK index %d tmpReg 0x%x delta_V %d delta_offset %d\n", index, tmpReg, (int)delta_V, (int)delta_offset)); + + if(BB_offset < 0) + { + tmpReg = tmpReg & (~BIT15); + BB_offset = -BB_offset; + } + else + { + tmpReg = tmpReg | BIT15; + } + tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); + } +#endif + + ODM_SetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord, 0x8992e); +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, path, RF_IPA_A, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, path, RF_AC, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord))); +#else + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", ODM_GetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", ODM_GetRFReg(pDM_Odm, path, RF_AC, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord))); +#endif + + // PA11+PAD01111, one shot + i = 0; + do + { + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); + { + ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); + ODM_delay_ms(3); + ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[1]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); + + ODM_delay_ms(20); + } + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + if(path == RF_PATH_A) + tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000); + else + tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0xF8000000); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xbd8[25:21] %x\n", tmpReg)); + + + i++; + } + while(tmpReg > apkbound && i < 4); + + APK_result[path][index] = tmpReg; + } + } + + //reload MAC default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_ReloadMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); +#else + _PHY_ReloadMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); +#endif + + //reload BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + + if(index == 0) //skip + continue; + ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]); + } + + //reload AFE default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_ReloadADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#else + _PHY_ReloadADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#endif + + //reload RF path default value + for(path = 0; path < pathbound; path++) + { + ODM_SetRFReg(pDM_Odm, path, 0xd, bMaskDWord, regD[path]); + if(path == RF_PATH_B) + { + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101); + } + + //note no index == 0 + if (APK_result[path][1] > 6) + APK_result[path][1] = 6; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("\n")); + + + for(path = 0; path < pathbound; path++) + { + ODM_SetRFReg(pDM_Odm, path, 0x3, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); + if(path == RF_PATH_A) + ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); + else + ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + ODM_SetRFReg(pDM_Odm, path, RF_BS_PA_APSET_G9_G11, bMaskDWord, + ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); +#endif + } + + pDM_Odm->RFCalibrateInfo.bAPKdone = TRUE; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_APCalibrate_8814A()\n")); +} + + + + + + +VOID +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ) +{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); + phy_LCCalibrate_8814A(pDM_Odm, TRUE); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); +} + +VOID + PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif +#ifdef DISABLE_BB_RF + return; +#endif + + return; +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) + if(!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)) + { + return; + } +#endif + +#if defined(FOR_BRAZIL_PRETEST) && (FOR_BRAZIL_PRETEST != 1) + if(pDM_Odm->RFCalibrateInfo.bAPKdone) +#endif + return; + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + if(IS_92C_SERIAL( pHalData->VersionID)){ + phy_APCalibrate_8814A(pAdapter, delta, TRUE); + } + else +#endif + { + // For 88C 1T1R +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + phy_APCalibrate_8814A(pAdapter, delta, FALSE); +#else + phy_APCalibrate_8814A(pDM_Odm, delta, FALSE); +#endif + } +} + VOID phy_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + if(!pAdapter->bHWInitReady) +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + if(pAdapter->hw_init_completed == _FALSE) +#endif + { + u1Byte u1bTmp; + u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; + ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); + //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); + ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + +#endif + + if(is2T) //92C + { + if(bMain) + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A + else + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT + } + else //88C + { + + if(bMain) + ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x2); //Main + else + ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x1); //Aux + } +} + VOID PHY_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#ifdef DISABLE_BB_RF + return; +#endif + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + if (IS_92C_SERIAL(pHalData->VersionID)) + { + phy_SetRFPathSwitch_8814A(pAdapter, bMain, TRUE); + } + else +#endif + { + // For 88C 1T1R +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + phy_SetRFPathSwitch_8814A(pAdapter, bMain, FALSE); +#else + phy_SetRFPathSwitch_8814A(pDM_Odm, bMain, FALSE); +#endif + } +} + + +#define DP_BB_REG_NUM 7 +#define DP_RF_REG_NUM 1 +#define DP_RETRY_LIMIT 10 +#define DP_PATH_NUM 2 +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + + + + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +//digital predistortion +VOID + phy_DigitalPredistortion_8814A( +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PADAPTER pAdapter, +#else + IN PDM_ODM_T pDM_Odm, +#endif + IN BOOLEAN is2T + ) +{ +#if (RT_PLATFORM == PLATFORM_WINDOWS) +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + + u4Byte tmpReg, tmpReg2, index, i; + u1Byte path, pathbound = PATH_NUM; + u4Byte AFE_backup[IQK_ADDA_REG_NUM]; + u4Byte AFE_REG[IQK_ADDA_REG_NUM] = { + rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, + rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, + rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, + rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + + u4Byte BB_backup[DP_BB_REG_NUM]; + u4Byte BB_REG[DP_BB_REG_NUM] = { + rOFDM0_TRxPathEnable, rFPGA0_RFMOD, + rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, + rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, + rFPGA0_XB_RFInterfaceOE}; + u4Byte BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, + 0x0, 0x0, 0x0}; + + u4Byte RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; + u4Byte RF_REG[DP_RF_REG_NUM] = { + RF_TXBIAS_A}; + + u4Byte MAC_backup[IQK_MAC_REG_NUM]; + u4Byte MAC_REG[IQK_MAC_REG_NUM] = { + REG_TXPAUSE, REG_BCN_CTRL, + REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; + + u4Byte Tx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = { + {0x1e1e1e1e, 0x03901e1e}, + {0x18181818, 0x03901818}, + {0x0e0e0e0e, 0x03900e0e} + }; + + u4Byte AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u1Byte RetryCount = 0; + + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_DigitalPredistortion_8814A()\n")); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_DigitalPredistortion_8814A for %s %s\n", (is2T ? "2T2R" : "1T1R"))); + + //save BB default value + for(index=0; index tx_agc 1f ~11 + // PA gain = 11 & PAD2 => tx_agc 10~0e + // PA gain = 01 => tx_agc 0b~0d + // PA gain = 00 => tx_agc 0a~00 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 3; index++) + ODM_SetBBReg(pDM_Odm, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]); + ODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, Tx_AGC[i][1]); + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + ODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02097098); + ODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path A + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x80047788); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x00047788); + ODM_delay_ms(50); + } + + //PA gain = 11 => tx_agc = 1a + for(index = 0; index < 3; index++) + ODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, 0x34343434); + ODM_SetBBReg(pDM_Odm,0xe08+index*4, bMaskDWord, 0x03903434); + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, 0x34343434); + + //==================================== + // PAGE_B for Path-A DPK setting + //==================================== + // open inner loopback @ b00[19]:10 od 0xb00 0x01097018 + ODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02017098); + ODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000); + + //rf_lpbk_setup + //1.rf 00:5205a, rf 0d:0e52c + ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0c, bMaskDWord, 0x8992b); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0d, bMaskDWord, 0x0e52c); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bMaskDWord, 0x5205a ); + + //----send one shot signal----// + // Path A + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + + while(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathAOK) + { + //----read back measurement results----// + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c297018); + tmpReg = ODM_GetBBReg(pDM_Odm, 0xbe0, bMaskDWord); + ODM_delay_ms(10); + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c29701f); + tmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbe8, bMaskDWord); + ODM_delay_ms(10); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff ) + { + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098); + + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + RetryCount++; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A DPK RetryCount %d 0xbe0[31:16] %x 0xbe8[31:16] %x\n", RetryCount, tmpReg, tmpReg2)); + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A DPK Sucess\n")); + pDM_Odm->RFCalibrateInfo.bDPPathAOK = TRUE; + break; + } + } + RetryCount = 0; + + //DPP path A + if(pDM_Odm->RFCalibrateInfo.bDPPathAOK) + { + // DP settings + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x01017098); + ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + + for(i=rPdp_AntA; i<=0xb3c; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A ofsset = 0x%x\n", i)); + } + + //pwsf + ODM_SetBBReg(pDM_Odm, 0xb40, bMaskDWord, 0x40404040); + ODM_SetBBReg(pDM_Odm, 0xb44, bMaskDWord, 0x28324040); + ODM_SetBBReg(pDM_Odm, 0xb48, bMaskDWord, 0x10141920); + + for(i=0xb4c; i<=0xb5c; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c); + } + + //TX_AGC boundary + ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + } + else + { + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x00000000); + } + + //DPK path B + if(is2T) + { + //Path A to standby mode + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); + + // LUTs => tx_agc + // PA gain = 11 & PAD1, => tx_agc 1f ~11 + // PA gain = 11 & PAD2, => tx_agc 10 ~0e + // PA gain = 01 => tx_agc 0b ~0d + // PA gain = 00 => tx_agc 0a ~00 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02097098); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path B + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntB, bMaskDWord, 0x80047788); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x00047788); + ODM_delay_ms(50); + } + + // PA gain = 11 => tx_agc = 1a + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, 0x34343434); + + // PAGE_B for Path-B DPK setting + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); + + // RF lpbk switches on + ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x0101000f); + ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x01120103); + + //Path-B RF lpbk + ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0c, bMaskDWord, 0x8992b); + ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0d, bMaskDWord, 0x0e52c); + ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x5205a); + + //----send one shot signal----// + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + + while(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathBOK) + { + //----read back measurement results----// + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c297018); + tmpReg = ODM_GetBBReg(pDM_Odm, 0xbf0, bMaskDWord); + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c29701f); + tmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbf8, bMaskDWord); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff) + { + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098); + + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + RetryCount++; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B DPK RetryCount %d 0xbf0[31:16] %x, 0xbf8[31:16] %x\n", RetryCount , tmpReg, tmpReg2)); + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B DPK Success\n")); + pDM_Odm->RFCalibrateInfo.bDPPathBOK = TRUE; + break; + } + } + + //DPP path B + if(pDM_Odm->RFCalibrateInfo.bDPPathBOK) + { + // DP setting + // LUT by SRAM + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x01017098); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x776d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); + + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + for(i=0xb60; i<=0xb9c; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B ofsset = 0x%x\n", i)); + } + + // PWSF + ODM_SetBBReg(pDM_Odm, 0xba0, bMaskDWord, 0x40404040); + ODM_SetBBReg(pDM_Odm, 0xba4, bMaskDWord, 0x28324050); + ODM_SetBBReg(pDM_Odm, 0xba8, bMaskDWord, 0x0c141920); + + for(i=0xbac; i<=0xbbc; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c); + } + + // tx_agc boundary + ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + } + else + { + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x00000000); + } + } + + //reload BB default value + for(index=0; indexRFCalibrateInfo.bDPdone = TRUE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_DigitalPredistortion_8814A()\n")); +#endif +} + +VOID + phy_DigitalPredistortion_8814A_8814A( +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PADAPTER pAdapter +#else + IN PDM_ODM_T pDM_Odm +#endif + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif +#if DISABLE_BB_RF + return; +#endif + + return; + + if(pDM_Odm->RFCalibrateInfo.bDPdone) + return; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + + if(IS_92C_SERIAL( pHalData->VersionID)){ + phy_DigitalPredistortion_8814A(pAdapter, TRUE); + } + else +#endif + { + // For 88C 1T1R + phy_DigitalPredistortion_8814A(pAdapter, FALSE); + } +} + + + +//return value TRUE => Main; FALSE => Aux + + BOOLEAN phy_QueryRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + if(!pAdapter->bHWInitReady) + { + u1Byte u1bTmp; + u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; + ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); + //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); + ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) // + { + if(ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) + return TRUE; + else + return FALSE; + } + else + { + if((ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT4|BIT3) == 0x0) || + (ODM_GetBBReg(pDM_Odm, rConfig_ram64x16, BIT31) == 0x0)) + return TRUE; + else + return FALSE; + } +} + + + +//return value TRUE => Main; FALSE => Aux + BOOLEAN PHY_QueryRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm +#else + IN PADAPTER pAdapter +#endif + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DISABLE_BB_RF + return TRUE; +#endif +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + + //if(IS_92C_SERIAL( pHalData->VersionID)){ + if(IS_2T2R( pHalData->VersionID)){ + return phy_QueryRFPathSwitch_8814A(pAdapter, TRUE); + } + else +#endif + { + // For 88C 1T1R +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + return phy_QueryRFPathSwitch_8814A(pAdapter, FALSE); +#else + return phy_QueryRFPathSwitch_8814A(pDM_Odm, FALSE); +#endif + } +} +#endif + + diff --git a/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h b/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h new file mode 100644 index 0000000..46eaa80 --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h @@ -0,0 +1,164 @@ +/****************************************************************************** + * + * 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_PHY_RF_8814A_H__ +#define __HAL_PHY_RF_8814A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define IQK_DELAY_TIME_8814A 10 //ms +#define index_mapping_NUM_8814A 15 +#define AVG_THERMAL_NUM_8814A 4 +#define RF_T_METER_8814A 0x42 +#define MAX_PATH_NUM_8814A 4 + +#include "../halphyrf_ap.h" + + +void ConfigureTxpowerTrack_8814A( + PTXPWRTRACK_CFG pConfig + ); + +VOID +GetDeltaSwingTable_8814A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ); + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_C, + OUT pu1Byte *TemperatureDOWN_C, + OUT pu1Byte *TemperatureUP_D, + OUT pu1Byte *TemperatureDOWN_D + ); + +VOID +ConfigureTxpowerTrack_8814A( + IN PTXPWRTRACK_CFG pConfig + ); + + +VOID +ODM_TxPwrTrackSetPwr8814A( + IN PDM_ODM_T pDM_Odm, + IN PWRTRACK_METHOD Method, + IN u1Byte RFPath, + IN u1Byte ChannelMappedIndex + ); + + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath + ); + + +// +// LC calibrate +// +void +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm +); + +void +phy_LCCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN is2T +); + + +// +// AP calibrate +// +void +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta); +void +PHY_DigitalPredistortion_8814A( IN PADAPTER pAdapter); + + +#if 0 //FOR_8814_IQK +VOID +_PHY_SaveADDARegisters( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN pu4Byte ADDABackup, + IN u4Byte RegisterNum + ); + +VOID +_PHY_PathADDAOn( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN BOOLEAN isPathAOn, + IN BOOLEAN is2T + ); + +VOID +_PHY_MACSettingCalibration( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte MACReg, + IN pu4Byte MACBackup + ); + + + +VOID +_PHY_PathAStandBy( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm +#else + IN PADAPTER pAdapter +#endif + ); + +#endif + + +#endif // #ifndef __HAL_PHY_RF_8814A_H__ + diff --git a/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c b/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c new file mode 100644 index 0000000..09c65ed --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c @@ -0,0 +1,564 @@ +/****************************************************************************** + * + * 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 "mp_precomp.h" +#include "../../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX_8814A 6 + +/*---------------------------Define Local Constant---------------------------*/ + +//3============================================================ +//3 Tx Power Tracking +//3============================================================ + + +// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010 + +u8 +CheckRFGainOffset( + struct dm_struct *pDM_Odm, + enum pwrtrack_method Method, + u8 RFPath + ) +{ + s1Byte UpperBound = 10, LowerBound = -5; // 4'b1010 = 10 + s1Byte Final_RF_Index = 0; + BOOLEAN bPositive = FALSE; + u32 bitMask = 0; + u8 Final_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -10dB + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + if(Method == MIX_MODE) //normal Tx power tracking + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("is 8814 MP chip\n")); + bitMask = BIT19; + prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] = prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] + prf_calibrate_info->kfree_offset[RFPath]; + + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("=========================== [Path-%d] TXBB Offset============================\n", RFPath)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("absolute_ofdm_swing_idx[RFPath](%d) = absolute_ofdm_swing_idx[RFPath](%d) + kfree_offset[RFPath](%d), RFPath=%d\n", prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], prf_calibrate_info->kfree_offset[RFPath], RFPath)); + + if (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] >= 0) /* check if RF_Index is positive or not*/ + bPositive = TRUE; + else + bPositive = FALSE; + + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive); + + bitMask = BIT18|BIT17|BIT16|BIT15; + Final_RF_Index = prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/ + + } + + if(Final_RF_Index > UpperBound) //Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB + { + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index + (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] - (UpperBound << 1)); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) = default_ofdm_index(%d) + (absolute_ofdm_swing_idx[RFPath](%d) - (UpperBound(%d) << 1)), RFPath=%d\n", Final_OFDM_Swing_Index, prf_calibrate_info->default_ofdm_index, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], UpperBound, RFPath)); + + if (Final_OFDM_Swing_Index > TxScalingUpperBound) { /* bb swing upper bound = +2dB */ + Final_OFDM_Swing_Index = TxScalingUpperBound; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) > TxScalingUpperBound(%d) Final_OFDM_Swing_Index = TxScalingUpperBound\n", Final_OFDM_Swing_Index, TxScalingUpperBound)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); + } + + return Final_OFDM_Swing_Index; + } + else if(Final_RF_Index < LowerBound) // lower bound = -5dB + { + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound)); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index - ((LowerBound<<1) - prf_calibrate_info->absolute_ofdm_swing_idx[RFPath]); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) = default_ofdm_index(%d) - ((LowerBound(%d)<<1) - absolute_ofdm_swing_idx[RFPath](%d)), RFPath=%d\n", Final_OFDM_Swing_Index, prf_calibrate_info->default_ofdm_index, LowerBound, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], RFPath)); + + if (Final_OFDM_Swing_Index < TxScalingLowerBound) { /* BB swing lower bound = -10dB */ + Final_OFDM_Swing_Index = TxScalingLowerBound; + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) > TxScalingLowerBound(%d) Final_OFDM_Swing_Index = TxScalingLowerBound\n", Final_OFDM_Swing_Index, TxScalingLowerBound)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); + } + return Final_OFDM_Swing_Index; + } + else // normal case + { + + if(bPositive == TRUE) + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index); //set RF Reg0x55 per path + else + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index + (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath])%2; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) = default_ofdm_index(%d) + (absolute_ofdm_swing_idx[RFPath])//2(%d), RFPath=%d\n", Final_OFDM_Swing_Index, prf_calibrate_info->default_ofdm_index, (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath])%2, RFPath)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); + + return Final_OFDM_Swing_Index; + } + + return FALSE; +} + + +VOID +ODM_TxPwrTrackSetPwr8814A( + IN PVOID pDM_VOID, + enum pwrtrack_method Method, + u8 RFPath, + u8 ChannelMappedIndex + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + PADAPTER Adapter = pDM_Odm->adapter; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + u8 Final_OFDM_Swing_Index = 0; + + if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("prf_calibrate_info->default_ofdm_index=%d, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath]=%d, RF_Path = %d\n", + prf_calibrate_info->default_ofdm_index, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], RFPath)); + + Final_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath); + } + else if(Method == TSSI_MODE) + { + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); + } + else if(Method == BBSWING) // use for mp driver clean power tracking status + { + prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] = prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] + prf_calibrate_info->kfree_offset[RFPath]; + + Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index + (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath]); + + odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); + } + + if((Method == MIX_MODE) || (Method == BBSWING)) + { + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("=========================== [Path-%d] BBSWING Offset============================\n", RFPath)); + + switch(RFPath) + { + case RF_PATH_A: + + odm_set_bb_reg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case RF_PATH_B: + + odm_set_bb_reg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case RF_PATH_C: + + odm_set_bb_reg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case RF_PATH_D: + + odm_set_bb_reg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + default: + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Wrong Path name!!!! \n")); + + break; + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); + } + return; +} // ODM_TxPwrTrackSetPwr8814A + + +VOID +GetDeltaSwingTable_8814A( + IN PVOID pDM_VOID, + u8* *TemperatureUP_A, + u8* *TemperatureDOWN_A, + u8* *TemperatureUP_B, + u8* *TemperatureDOWN_B + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + PADAPTER Adapter = pDM_Odm->adapter; + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxRate = 0xFF; + u8 channel = pHalData->current_channel; + + + if (*(pDM_Odm->mp_mode) == TRUE) { + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &(Adapter->mpt_ctx); + + TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); + #endif + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx); + + TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); + #endif + #endif + } else { + u2Byte rate = *(pDM_Odm->forced_data_rate); + + if (!rate) { /*auto rate*/ + if (pDM_Odm->tx_rate != 0xFF) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->tx_rate); + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + TxRate = hw_rate_to_m_rate(pDM_Odm->tx_rate); + #endif + } + } else { /*force rate*/ + TxRate = (u8)rate; + } + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); + + if (1 <= channel && channel <= 14) { + if (IS_CCK_RATE(TxRate)) { + *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p; + *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n; + *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p; + *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n; + } else { + *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_2ga_p; + *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_2ga_n; + *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_2gb_p; + *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_2gb_n; + } + } else if (36 <= channel && channel <= 64) { + *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_5ga_p[0]; + *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_5ga_n[0]; + *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_5gb_p[0]; + *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_5gb_n[0]; + } else if (100 <= channel && channel <= 144) { + *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_5ga_p[1]; + *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_5ga_n[1]; + *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_5gb_p[1]; + *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_5gb_n[1]; + } else if (149 <= channel && channel <= 173) { + *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_5ga_p[2]; + *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_5ga_n[2]; + *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_5gb_p[2]; + *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_5gb_n[2]; + } else { + *TemperatureUP_A = (u8*)delta_swing_table_idx_2ga_p_8188e; + *TemperatureDOWN_A = (u8*)delta_swing_table_idx_2ga_n_8188e; + *TemperatureUP_B = (u8*)delta_swing_table_idx_2ga_p_8188e; + *TemperatureDOWN_B = (u8*)delta_swing_table_idx_2ga_n_8188e; + } + + + + return; +} + + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PVOID pDM_VOID, + u8* *TemperatureUP_C, + u8* *TemperatureDOWN_C, + u8* *TemperatureUP_D, + u8* *TemperatureDOWN_D + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + PADAPTER Adapter = pDM_Odm->adapter; + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxRate = 0xFF; + u8 channel = pHalData->current_channel; + + + if (*(pDM_Odm->mp_mode) == TRUE) { + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &(Adapter->mpt_ctx); + + TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); + #endif + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx); + + TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); + #endif + #endif + } else { + u2Byte rate = *(pDM_Odm->forced_data_rate); + + if (!rate) { /*auto rate*/ + if (pDM_Odm->tx_rate != 0xFF) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->tx_rate); + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + TxRate = hw_rate_to_m_rate(pDM_Odm->tx_rate); + #endif + } + } else { /*force rate*/ + TxRate = (u8)rate; + } + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(TxRate)) { + *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p; + *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n; + *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p; + *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n; + } else { + *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_2gc_p; + *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_2gc_n; + *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_2gd_p; + *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_2gd_n; + } + } else if (36 <= channel && channel <= 64) { + *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_5gc_p[0]; + *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_5gc_n[0]; + *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_5gd_p[0]; + *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_5gd_n[0]; + } else if (100 <= channel && channel <= 144) { + *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_5gc_p[1]; + *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_5gc_n[1]; + *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_5gd_p[1]; + *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_5gd_n[1]; + } else if (149 <= channel && channel <= 173) { + *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_5gc_p[2]; + *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_5gc_n[2]; + *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_5gd_p[2]; + *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_5gd_n[2]; + } else { + *TemperatureUP_C = (u8*)delta_swing_table_idx_2ga_p_8188e; + *TemperatureDOWN_C = (u8*)delta_swing_table_idx_2ga_n_8188e; + *TemperatureUP_D = (u8*)delta_swing_table_idx_2ga_p_8188e; + *TemperatureDOWN_D = (u8*)delta_swing_table_idx_2ga_n_8188e; + } + + return; +} + +void configure_txpower_track_8814a( + struct txpwrtrack_cfg *pConfig + ) +{ + pConfig->swing_table_size_cck = CCK_TABLE_SIZE; + pConfig->swing_table_size_ofdm = OFDM_TABLE_SIZE; + pConfig->threshold_iqk = 8; + pConfig->average_thermal_num = AVG_THERMAL_NUM_8814A; + pConfig->rf_path_count = MAX_PATH_NUM_8814A; + pConfig->thermal_reg_addr = RF_T_METER_88E; + + pConfig->odm_tx_pwr_track_set_pwr = ODM_TxPwrTrackSetPwr8814A; + pConfig->do_iqk = DoIQK_8814A; + pConfig->phy_lc_calibrate = phy_lc_calibrate_8814a; + pConfig->get_delta_swing_table = GetDeltaSwingTable_8814A; + pConfig->get_delta_swing_table8814only = GetDeltaSwingTable_8814A_PathCD; +} + +VOID +_phy_lc_calibrate_8814a( + IN struct dm_struct * pDM_Odm, + IN BOOLEAN is2T + ) +{ + u32 /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0, cnt; + + //Check continuous TX and Packet TX + u32 reg0x914 = odm_read_4byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; + + // Backup RF reg18. + + if((reg0x914 & 0x70000) == 0) + odm_write_1byte(pDM_Odm, REG_TXPAUSE, 0xFF); + + //3 3. Read RF reg18 + LC_Cal = odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + //3 4. Set LC calibration begin bit15 + odm_set_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x1b126); + + ODM_delay_ms(100); + + for (cnt = 0; cnt < 100; cnt++) { + if (odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) + break; + ODM_delay_ms(10); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); + + odm_set_rf_reg( pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x13126); + odm_set_rf_reg( pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x13124); + //3 Restore original situation + if((reg0x914 & 70000) == 0) + odm_write_1byte(pDM_Odm, REG_TXPAUSE, 0x00); + + // Recover channel number + odm_set_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); + + //DbgPrint("Call %s\n", __FUNCTION__); +} + + +VOID +phy_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN struct dm_struct * pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta, + IN BOOLEAN is2T + ) +{ +} + + +VOID +phy_lc_calibrate_8814a( + IN PVOID pDM_VOID + ) +{ + BOOLEAN bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE; + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER pAdapter = pDM_Odm->adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if (MP_DRIVER == 1) +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->mpt_ctx); + bStartContTx = pMptCtx->bStartContTx; + bSingleTone = pMptCtx->bSingleTone; + bCarrierSuppression = pMptCtx->bCarrierSuppression; +#else + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx); +#endif +#endif +#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); + +//#if (MP_DRIVER == 1) + _phy_lc_calibrate_8814a(pDM_Odm, TRUE); +//#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); + +} + +VOID +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN struct dm_struct * pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ) +{ + +} + + +VOID +PHY_DPCalibrate_8814A( + IN struct dm_struct * pDM_Odm + ) +{ +} + + +BOOLEAN +phy_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter + ) +{ + return TRUE; +} + + +BOOLEAN PHY_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DISABLE_BB_RF + return TRUE; +#endif + + return phy_QueryRFPathSwitch_8814A(pAdapter); +} + + +VOID _phy_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN struct dm_struct * pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ +} +VOID phy_set_rf_path_switch_8814a( +#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) + IN struct dm_struct * pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN boolean bMain + ) +{ +} + + + + + diff --git a/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h b/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h new file mode 100644 index 0000000..1f885b3 --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h @@ -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 + * + * + ******************************************************************************/ + +#ifndef __HAL_PHY_RF_8814A_H__ +#define __HAL_PHY_RF_8814A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define AVG_THERMAL_NUM_8814A 4 +#define RF_T_METER_8814A 0x42 + +#include "../halphyrf_ce.h" + +void configure_txpower_track_8814a( + struct txpwrtrack_cfg *pConfig + ); + +VOID +GetDeltaSwingTable_8814A( + IN PVOID pDM_VOID, + u8* *TemperatureUP_A, + u8* *TemperatureDOWN_A, + u8* *TemperatureUP_B, + u8* *TemperatureDOWN_B + ); + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PVOID pDM_VOID, + u8* *TemperatureUP_C, + u8* *TemperatureDOWN_C, + u8* *TemperatureUP_D, + u8* *TemperatureDOWN_D + ); + +VOID +ODM_TxPwrTrackSetPwr8814A( + IN PVOID pDM_VOID, + enum pwrtrack_method Method, + u8 RFPath, + u8 ChannelMappedIndex + ); + +u8 +CheckRFGainOffset( + struct dm_struct *pDM_Odm, + enum pwrtrack_method Method, + u8 RFPath + ); + +VOID +phy_iq_calibrate_8814a( + IN PVOID pDM_VOID, + boolean bReCovery + ); + +// +// LC calibrate +// +void +phy_lc_calibrate_8814a( + IN PVOID pDM_VOID + ); + +// +// AP calibrate +// +void +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + struct dm_struct * pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ); + + +VOID +PHY_DPCalibrate_8814A( + struct dm_struct * pDM_Odm + ); + + +VOID phy_set_rf_path_switch_8814a( +#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) + struct dm_struct * pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + boolean bMain + ); + + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + diff --git a/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c b/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c new file mode 100644 index 0000000..eb91c4d --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c @@ -0,0 +1,528 @@ +/****************************************************************************** + * + * 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 "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX_8814A 6 + +/*---------------------------Define Local Constant---------------------------*/ + +//3============================================================ +//3 Tx Power Tracking +//3============================================================ + +// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010 + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + u1Byte RFPath + ) +{ + u1Byte UpperBound = 10; // 4'b1010 = 10 + u1Byte Final_RF_Index = 0; + BOOLEAN bPositive = FALSE; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not + { + Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; + bPositive = TRUE; + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); + } + else + { + Final_RF_Index = (-1)*pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; + bPositive = FALSE; + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); + } + + if(bPositive == TRUE) + { + if(Final_RF_Index >= UpperBound) + { + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, UpperBound); //set RF Reg0x55 per path + return UpperBound; + } + else + { + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path + return Final_RF_Index; + } + } + else + { + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path + return Final_RF_Index; + + } + + return FALSE; + +} + + + + +VOID +ODM_TxPwrTrackSetPwr8814A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ) +{ + u1Byte Final_OFDM_Swing_Index = 0; + u1Byte Final_CCK_Swing_Index = 0; + u1Byte Final_RF_Index = 0; + u1Byte UpperBound = 10, TxScalingUpperBound = 28; // Upperbound = 4'b1010, TxScalingUpperBound = +2 dB + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + + if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pRFCalibrateInfo->DefaultOfdmIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); + + Final_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; + + Final_RF_Index = CheckRFGainOffset(pDM_Odm, RFPath); // check if Final_RF_Index >= 10 + + if((Final_RF_Index == UpperBound) && (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)) // check BBSW is not over +2dB + { + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); + if(Final_OFDM_Swing_Index > TxScalingUpperBound) + Final_OFDM_Swing_Index = TxScalingUpperBound; + } + + switch(RFPath) + { + case ODM_RF_PATH_A: + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + case ODM_RF_PATH_B: + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + case ODM_RF_PATH_C: + + ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + case ODM_RF_PATH_D: + + ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + default: + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Wrong Path name!!!! \n")); + + break; + } + + + } + + return; +} // ODM_TxPwrTrackSetPwr8814A + + +VOID +GetDeltaSwingTable_8814A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte TxRate = 0xFF; + u1Byte channel = pHalData->CurrentChannel; + + + if (pDM_Odm->mp_mode == TRUE) { + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #endif + } else { + u2Byte rate = *(pDM_Odm->pForcedDataRate); + + if (!rate) { /*auto rate*/ + if (rate != 0xFF) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + TxRate = HwRateToMRate(pDM_Odm->TxRate); + #endif + } + } else { /*force rate*/ + TxRate = (u1Byte)rate; + } + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); + + if (1 <= channel && channel <= 14) { + if (IS_CCK_RATE(TxRate)) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; + } else { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; + } + } else if (36 <= channel && channel <= 64) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; + } else if (100 <= channel && channel <= 144) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; + } else if (149 <= channel && channel <= 173) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; + } else { + *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + } + + + return; +} + + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_C, + OUT pu1Byte *TemperatureDOWN_C, + OUT pu1Byte *TemperatureUP_D, + OUT pu1Byte *TemperatureDOWN_D + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte TxRate = 0xFF; + u1Byte channel = pHalData->CurrentChannel; + + if (pDM_Odm->mp_mode == TRUE) { + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #endif + } else { + u2Byte rate = *(pDM_Odm->pForcedDataRate); + + if (!rate) { /*auto rate*/ + if (rate != 0xFF) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + TxRate = HwRateToMRate(pDM_Odm->TxRate); + #endif + } + } else { /*force rate*/ + TxRate = (u1Byte)rate; + } + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); + + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(TxRate)) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; + } else { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; + } + } else if (36 <= channel && channel <= 64) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; + } else if (100 <= channel && channel <= 144) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; + } else if (149 <= channel && channel <= 173) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; + } else { + *TemperatureUP_C = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + *TemperatureUP_D = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + } + + + return; +} + +void ConfigureTxpowerTrack_8814A( + PTXPWRTRACK_CFG pConfig + ) +{ + pConfig->SwingTableSize_CCK = CCK_TABLE_SIZE; + pConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE; + pConfig->Threshold_IQK = 8; + pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; + pConfig->RfPathCount = MAX_PATH_NUM_8814A; + pConfig->ThermalRegAddr = RF_T_METER_88E; + + pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; + pConfig->DoIQK = DoIQK_8814A; + pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; + pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; + pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; +} + +VOID +phy_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm, + IN BOOLEAN is2T + ) +{ + u4Byte LC_Cal = 0, cnt; + + //Check continuous TX and Packet TX + u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; + + // Backup RF reg18. + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + if((reg0x914 & 0x70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0xFF); + + //3 3. Read RF reg18 + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + //3 4. Set LC calibration begin bit15 + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); + + ODM_delay_ms(100); + + for (cnt = 0; cnt < 100; cnt++) { + if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) + break; + ODM_delay_ms(10); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); + + + + //3 Restore original situation + if((reg0x914 & 70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0x00); + + // Recover channel number + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); + + DbgPrint("Call %s\n", __FUNCTION__); +} + + +VOID +phy_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta, + IN BOOLEAN is2T + ) +{ +} + + +VOID +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ) +{ + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER pAdapter = pDM_Odm->Adapter; + +#if (MP_DRIVER == 1) +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); +#else + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); +#endif +#endif +#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); + +//#if (MP_DRIVER == 1) + phy_LCCalibrate_8814A(pDM_Odm, TRUE); +//#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); + +} + +VOID +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ) +{ + +} + + +VOID +PHY_DPCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ) +{ +} + + +BOOLEAN +phy_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter + ) +{ + return TRUE; +} + + +BOOLEAN PHY_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter + ) +{ + +#if DISABLE_BB_RF + return TRUE; +#endif + + return phy_QueryRFPathSwitch_8814A(pAdapter); +} + + +VOID phy_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ +} +VOID PHY_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ) +{ +} + + + + +#else /* (RTL8814A_SUPPORT == 0)*/ +VOID +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ){} + +VOID +PHY_IQCalibrate_8814A( + IN PDM_ODM_T pDM_Odm, + IN BOOLEAN bReCovery + ){} +#endif /* (RTL8814A_SUPPORT == 0)*/ diff --git a/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h b/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h new file mode 100644 index 0000000..658d6f0 --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h @@ -0,0 +1,106 @@ +/****************************************************************************** + * + * 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_PHY_RF_8814A_H__ +#define __HAL_PHY_RF_8814A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define AVG_THERMAL_NUM_8814A 4 + +#include "halphyrf_win.h" + +void ConfigureTxpowerTrack_8814A( + PTXPWRTRACK_CFG pConfig + ); + +VOID +GetDeltaSwingTable_8814A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ); + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_C, + OUT pu1Byte *TemperatureDOWN_C, + OUT pu1Byte *TemperatureUP_D, + OUT pu1Byte *TemperatureDOWN_D + ); + + +VOID +ODM_TxPwrTrackSetPwr8814A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ); + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + u1Byte RFPath + ); + + +// +// LC calibrate +// +void +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ); + +// +// AP calibrate +// +void +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ); + + +VOID +PHY_DPCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ); + + +VOID PHY_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ); + + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + diff --git a/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c b/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c new file mode 100644 index 0000000..e019df3 --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c @@ -0,0 +1,557 @@ +/****************************************************************************** + * + * 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 "mp_precomp.h" +#include "../../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ + + +/*---------------------------Define Local Constant---------------------------*/ + + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void DoIQK_8814A( + void* pDM_VOID, + u8 DeltaThermalIndex, + u8 ThermalValue, + u8 Threshold + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + + odm_reset_iqk_result(pDM_Odm); + + pDM_Odm->rf_calibrate_info.thermal_value_iqk= ThermalValue; + + phy_iq_calibrate_8814a(pDM_Odm, FALSE); + +} +#else +/*Originally pConfig->DoIQK is hooked PHY_IQCalibrate_8814A, but DoIQK_8814A and PHY_IQCalibrate_8814A have different arguments*/ +void DoIQK_8814A( + void* pDM_VOID, + u8 DeltaThermalIndex, + u8 ThermalValue, + u8 Threshold + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + boolean bReCovery = (boolean) DeltaThermalIndex; + + phy_iq_calibrate_8814a(pDM_Odm, bReCovery); +} +#endif +//1 7. IQK + +VOID +_IQK_BackupMacBB_8814A( + IN struct dm_struct * pDM_Odm, + u32* MAC_backup, + u32* BB_backup, + u32* Backup_MAC_REG, + u32* Backup_BB_REG + ) +{ + u32 i; + //save MACBB default value + for (i = 0; i < MAC_REG_NUM_8814; i++){ + MAC_backup[i] = odm_read_4byte(pDM_Odm, Backup_MAC_REG[i]); + } + for (i = 0; i < BB_REG_NUM_8814; i++){ + BB_backup[i] = odm_read_4byte(pDM_Odm, Backup_BB_REG[i]); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupMacBB Success!!!!\n")); +} + + +VOID +_IQK_BackupRF_8814A( + IN struct dm_struct * pDM_Odm, + u32 RF_backup[][4], + u32* Backup_RF_REG + ) +{ + u32 i; + //Save RF Parameters + for (i = 0; i < RF_REG_NUM_8814; i++){ + RF_backup[i][RF_PATH_A] = odm_get_rf_reg(pDM_Odm, RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask); + RF_backup[i][RF_PATH_B] = odm_get_rf_reg(pDM_Odm, RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask); + RF_backup[i][RF_PATH_C] = odm_get_rf_reg(pDM_Odm, RF_PATH_C, Backup_RF_REG[i], bRFRegOffsetMask); + RF_backup[i][RF_PATH_D] = odm_get_rf_reg(pDM_Odm, RF_PATH_D, Backup_RF_REG[i], bRFRegOffsetMask); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupRF Success!!!!\n")); +} + + +VOID +_IQK_AFESetting_8814A( + IN struct dm_struct * pDM_Odm, + IN boolean Do_IQK + ) +{ + if(Do_IQK) + { + // IQK AFE Setting RX_WAIT_CCA mode + odm_write_4byte(pDM_Odm, 0xc60, 0x0e808003); + odm_write_4byte(pDM_Odm, 0xe60, 0x0e808003); + odm_write_4byte(pDM_Odm, 0x1860, 0x0e808003); + odm_write_4byte(pDM_Odm, 0x1a60, 0x0e808003); + odm_set_bb_reg(pDM_Odm, 0x90c, BIT(13), 0x1); + + odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x3); + odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x0); + + odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x1); + odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x0); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AFE IQK mode Success!!!!\n")); + } + else + { + odm_write_4byte(pDM_Odm, 0xc60, 0x07808003); + odm_write_4byte(pDM_Odm, 0xe60, 0x07808003); + odm_write_4byte(pDM_Odm, 0x1860, 0x07808003); + odm_write_4byte(pDM_Odm, 0x1a60, 0x07808003); + odm_set_bb_reg(pDM_Odm, 0x90c, BIT(13), 0x1); + + odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x3); + odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x0); + + odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x1); + odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x0); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AFE Normal mode Success!!!!\n")); + } + +} + + +VOID +_IQK_RestoreMacBB_8814A( + IN struct dm_struct * pDM_Odm, + u32* MAC_backup, + u32* BB_backup, + u32* Backup_MAC_REG, + u32* Backup_BB_REG + ) +{ + u32 i; + //Reload MacBB Parameters + for (i = 0; i < MAC_REG_NUM_8814; i++){ + odm_write_4byte(pDM_Odm, Backup_MAC_REG[i], MAC_backup[i]); + } + for (i = 0; i < BB_REG_NUM_8814; i++){ + odm_write_4byte(pDM_Odm, Backup_BB_REG[i], BB_backup[i]); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); +} + +VOID +_IQK_RestoreRF_8814A( + IN struct dm_struct * pDM_Odm, + u32* Backup_RF_REG, + u32 RF_backup[][4] + ) +{ + u32 i; + + odm_set_rf_reg(pDM_Odm, RF_PATH_A, 0xef, bRFRegOffsetMask, 0x0); + odm_set_rf_reg(pDM_Odm, RF_PATH_B, 0xef, bRFRegOffsetMask, 0x0); + odm_set_rf_reg(pDM_Odm, RF_PATH_C, 0xef, bRFRegOffsetMask, 0x0); + odm_set_rf_reg(pDM_Odm, RF_PATH_D, 0xef, bRFRegOffsetMask, 0x0); + + for (i = 0; i < RF_REG_NUM_8814; i++){ + odm_set_rf_reg(pDM_Odm, RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_A]); + odm_set_rf_reg(pDM_Odm, RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_B]); + odm_set_rf_reg(pDM_Odm, RF_PATH_C, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_C]); + odm_set_rf_reg(pDM_Odm, RF_PATH_D, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_D]); + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Success!!!!\n")); + +} + +VOID +PHY_ResetIQKResult_8814A( + IN struct dm_struct * pDM_Odm +) +{ + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000); + odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000002); + odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000004); + odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000006); + odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); + odm_write_4byte(pDM_Odm, 0xc10, 0x100); + odm_write_4byte(pDM_Odm, 0xe10, 0x100); + odm_write_4byte(pDM_Odm, 0x1810, 0x100); + odm_write_4byte(pDM_Odm, 0x1a10, 0x100); +} + +VOID +_IQK_ResetNCTL_8814A( + IN struct dm_struct * pDM_Odm +) +{ + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000); + odm_write_4byte(pDM_Odm, 0x1b80, 0x00000006); + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000); + odm_write_4byte(pDM_Odm, 0x1b80, 0x00000002); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("ResetNCTL Success!!!!\n")); +} + +VOID +_IQK_ConfigureMAC_8814A( + IN struct dm_struct * pDM_Odm + ) +{ + // ========MAC register setting======== + odm_write_1byte(pDM_Odm, 0x522, 0x3f); + odm_set_bb_reg(pDM_Odm, 0x550, BIT(11)|BIT(3), 0x0); + odm_write_1byte(pDM_Odm, 0x808, 0x00); // RX ante off + odm_set_bb_reg(pDM_Odm, 0x838, 0xf, 0xe); // CCA off + odm_set_bb_reg(pDM_Odm, 0xa14, BIT(9)|BIT(8), 0x3); // CCK RX Path off + odm_write_4byte(pDM_Odm, 0xcb0, 0x77777777); + odm_write_4byte(pDM_Odm, 0xeb0, 0x77777777); + odm_write_4byte(pDM_Odm, 0x18b4, 0x77777777); + odm_write_4byte(pDM_Odm, 0x1ab4, 0x77777777); + odm_set_bb_reg(pDM_Odm, 0x1abc, 0x0ff00000, 0x77); + /*by YN*/ + odm_set_bb_reg(pDM_Odm, 0xcbc, 0xf, 0x0); +} + +VOID +_LOK_One_Shot( + IN void* pDM_VOID +) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + struct dm_iqk_info * pIQK_info = &pDM_Odm->IQK_info; + u8 Path = 0, delay_count = 0, ii; + boolean LOK_notready = FALSE; + u32 LOK_temp1 = 0, LOK_temp2 = 0; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("============ LOK ============\n")); + for(Path =0; Path <=3; Path++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("==========S%d LOK ==========\n", Path)); + + odm_set_bb_reg(pDM_Odm, 0x9a4, BIT(21)|BIT(20), Path); // ADC Clock source + odm_write_4byte(pDM_Odm, 0x1b00, (0xf8000001|(1<<(4+Path)))); // LOK: CMD ID = 0 {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081} + ODM_delay_ms(LOK_delay); + delay_count = 0; + LOK_notready = TRUE; + + while(LOK_notready){ + LOK_notready = (boolean) odm_get_bb_reg(pDM_Odm, 0x1b00, BIT(0)); + ODM_delay_ms(1); + delay_count++; + if(delay_count >= 10){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, + ("S%d LOK timeout!!!\n", Path)); + + _IQK_ResetNCTL_8814A(pDM_Odm); + break; + } + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("S%d ==> delay_count = 0x%d\n", Path, delay_count)); + + if(!LOK_notready){ + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000|(Path<<1)); + odm_write_4byte(pDM_Odm, 0x1bd4, 0x003f0001); + LOK_temp2 = (odm_get_bb_reg(pDM_Odm, 0x1bfc, 0x003e0000)+0x10)&0x1f; + LOK_temp1 = (odm_get_bb_reg(pDM_Odm, 0x1bfc, 0x0000003e)+0x10)&0x1f; + + for(ii = 1; ii<5; ii++){ + LOK_temp1 = LOK_temp1 + ((LOK_temp1 & BIT(4-ii))<<(ii*2)); + LOK_temp2 = LOK_temp2 + ((LOK_temp2 & BIT(4-ii))<<(ii*2)); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("LOK_temp1 = 0x%x, LOK_temp2 = 0x%x\n", LOK_temp1>>4, LOK_temp2>>4)); + + odm_set_rf_reg(pDM_Odm, Path, 0x8, 0x07c00, LOK_temp1>>4); + odm_set_rf_reg(pDM_Odm, Path, 0x8, 0xf8000, LOK_temp2>>4); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("==>S%d fill LOK\n", Path)); + + } + else{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("==>S%d LOK Fail!!!\n", Path)); + odm_set_rf_reg(pDM_Odm, Path, 0x8, bRFRegOffsetMask, 0x08400); + } + pIQK_info->lok_fail[Path] = LOK_notready; + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, + ("LOK0_notready = %d, LOK1_notready = %d, LOK2_notready = %d, LOK3_notready = %d\n", + pIQK_info->lok_fail[0], pIQK_info->lok_fail[1], pIQK_info->lok_fail[2], pIQK_info->lok_fail[3])); +} + +VOID +_IQK_One_Shot( + IN void* pDM_VOID +) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + struct dm_iqk_info * pIQK_info = &pDM_Odm->IQK_info; + u8 Path = 0, delay_count = 0, cal_retry = 0, idx; + boolean notready = TRUE, fail = TRUE; + u32 IQK_CMD; + u16 IQK_Apply[4] = {0xc94, 0xe94, 0x1894, 0x1a94}; + + for(idx = 0; idx <= 1; idx++){ // ii = 0:TXK , 1: RXK + + if(idx == TX_IQK){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, + ("============ WBTXIQK ============\n")); + } + else if(idx == RX_IQK){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, + ("============ WBRXIQK ============\n")); + } + + for(Path =0; Path <=3; Path++){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("==========S%d IQK ==========\n", Path)); + cal_retry = 0; + fail = TRUE; + while(fail){ + odm_set_bb_reg(pDM_Odm, 0x9a4, BIT(21)|BIT(20), Path); + if(idx == TX_IQK){ + IQK_CMD = (0xf8000001|(*pDM_Odm->band_width+3)<<8|(1<<(4+Path))); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("TXK_Trigger = 0x%x\n", IQK_CMD)); + /* + {0xf8000311, 0xf8000321, 0xf8000341, 0xf8000381} ==> 20 WBTXK (CMD = 3) + {0xf8000411, 0xf8000421, 0xf8000441, 0xf8000481} ==> 40 WBTXK (CMD = 4) + {0xf8000511, 0xf8000521, 0xf8000541, 0xf8000581} ==> 80 WBTXK (CMD = 5) + */ + odm_write_4byte(pDM_Odm, 0x1b00, IQK_CMD); + } + else if(idx == RX_IQK){ + IQK_CMD = (0xf8000001|(9-*pDM_Odm->band_width)<<8|(1<<(4+Path))); + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("TXK_Trigger = 0x%x\n", IQK_CMD)); + /* + {0xf8000911, 0xf8000921, 0xf8000941, 0xf8000981} ==> 20 WBRXK (CMD = 9) + {0xf8000811, 0xf8000821, 0xf8000841, 0xf8000881} ==> 40 WBRXK (CMD = 8) + {0xf8000711, 0xf8000721, 0xf8000741, 0xf8000781} ==> 80 WBRXK (CMD = 7) + */ + odm_write_4byte(pDM_Odm, 0x1b00, IQK_CMD); + } + + ODM_delay_ms(WBIQK_delay); + + delay_count = 0; + notready = TRUE; + while(notready){ + notready = (boolean) odm_get_bb_reg(pDM_Odm, 0x1b00, BIT(0)); + if(!notready){ + fail = (boolean) odm_get_bb_reg(pDM_Odm, 0x1b08, BIT(26)); + break; + } + ODM_delay_ms(1); + delay_count++; + if(delay_count >= 20){ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, + ("S%d IQK timeout!!!\n", Path)); + _IQK_ResetNCTL_8814A(pDM_Odm); + break; + } + } + if(fail) + cal_retry++; + if(cal_retry >3 ) + break; + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("S%d ==> 0x1b00 = 0x%x\n", Path, odm_read_4byte(pDM_Odm, 0x1b00))); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("S%d ==> 0x1b08 = 0x%x\n", Path, odm_read_4byte(pDM_Odm, 0x1b08))); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("S%d ==> delay_count = 0x%d, cal_retry = %x\n", Path, delay_count, cal_retry)); + + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000|(Path<<1)); + if(!fail){ + if(idx == TX_IQK){ + pIQK_info->iqc_matrix[idx][Path] = odm_read_4byte(pDM_Odm, 0x1b38); + } + else if(idx == RX_IQK){ + odm_write_4byte(pDM_Odm, 0x1b3c, 0x20000000); + pIQK_info->iqc_matrix[idx][Path] = odm_read_4byte(pDM_Odm, 0x1b3c); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, + ("S%d_IQC = 0x%x\n", Path, pIQK_info->iqc_matrix[idx][Path])); + + } + + if(idx == RX_IQK){ + if(pIQK_info->iqk_fail[TX_IQK][Path] == FALSE) // TXIQK success in RXIQK + odm_write_4byte( pDM_Odm, 0x1b38, pIQK_info->iqc_matrix[TX_IQK][Path]); + else + odm_set_bb_reg(pDM_Odm, IQK_Apply[Path], BIT0, 0x0); + + if(fail) // RXIQK Fail + odm_set_bb_reg(pDM_Odm, IQK_Apply[Path], (BIT11|BIT10), 0x0); + } + + pIQK_info->iqk_fail[idx][Path] = fail; + + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, + ("IQK0_fail = %d, IQK1_fail = %d, IQK2_fail = %d, IQK3_fail = %d\n", + pIQK_info->iqk_fail[idx][0], pIQK_info->iqk_fail[idx][1], pIQK_info->iqk_fail[idx][2], pIQK_info->iqk_fail[idx][3])); + } +} + +VOID +_IQK_Tx_8814A( + IN struct dm_struct * pDM_Odm, + IN u8 chnlIdx + ) +{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BandWidth = %d, ExtPA2G = %d\n", *pDM_Odm->p_band_width, pDM_Odm->ext_pa)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Interface = %d, pBandType = %d\n", pDM_Odm->support_interface, *pDM_Odm->p_band_type)); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("CutVersion = %x\n", pDM_Odm->cut_version)); + + odm_set_rf_reg(pDM_Odm, RF_PATH_A, 0x58, BIT(19), 0x1); + odm_set_rf_reg(pDM_Odm, RF_PATH_B, 0x58, BIT(19), 0x1); + odm_set_rf_reg(pDM_Odm, RF_PATH_C, 0x58, BIT(19), 0x1); + odm_set_rf_reg(pDM_Odm, RF_PATH_D, 0x58, BIT(19), 0x1); + + odm_set_bb_reg(pDM_Odm, 0xc94, (BIT11|BIT10|BIT0), 0x401); + odm_set_bb_reg(pDM_Odm, 0xe94, (BIT11|BIT10|BIT0), 0x401); + odm_set_bb_reg(pDM_Odm, 0x1894, (BIT11|BIT10|BIT0), 0x401); + odm_set_bb_reg(pDM_Odm, 0x1a94, (BIT11|BIT10|BIT0), 0x401); + + if(*pDM_Odm->band_type == ODM_BAND_5G) + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000ff1); + else + odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000ef1); + + ODM_delay_ms(1); + + odm_write_4byte(pDM_Odm, 0x810, 0x20101063); + odm_write_4byte(pDM_Odm, 0x90c, 0x0B00C000); + + _LOK_One_Shot(pDM_Odm); + _IQK_One_Shot(pDM_Odm); + +} + +VOID +_phy_iq_calibrate_8814a( + IN struct dm_struct * pDM_Odm, + IN u8 Channel + ) +{ + + u32 MAC_backup[MAC_REG_NUM_8814], BB_backup[BB_REG_NUM_8814], RF_backup[RF_REG_NUM_8814][4]; + u32 Backup_MAC_REG[MAC_REG_NUM_8814] = {0x520, 0x550}; + u32 Backup_BB_REG[BB_REG_NUM_8814] = {0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0, + 0x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc}; + u32 Backup_RF_REG[RF_REG_NUM_8814] = {0x0, 0x8f}; + u8 chnlIdx = odm_get_right_chnl_place_for_iqk(Channel); + + _IQK_BackupMacBB_8814A(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG); + _IQK_AFESetting_8814A(pDM_Odm,TRUE); + _IQK_BackupRF_8814A(pDM_Odm, RF_backup, Backup_RF_REG); + _IQK_ConfigureMAC_8814A(pDM_Odm); + _IQK_Tx_8814A(pDM_Odm, chnlIdx); + _IQK_ResetNCTL_8814A(pDM_Odm); //for 3-wire to BB use + _IQK_AFESetting_8814A(pDM_Odm,FALSE); + _IQK_RestoreMacBB_8814A(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG); + _IQK_RestoreRF_8814A(pDM_Odm, Backup_RF_REG, RF_backup); +} + +/*IQK version:v1.1*/ +/*update 0xcbc setting*/ + + +VOID +phy_iq_calibrate_8814a( + IN void* pDM_VOID, + IN boolean bReCovery + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER pAdapter = pDM_Odm->adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + #if (MP_DRIVER == 1) + #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); + #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx); + #endif + #endif//(MP_DRIVER == 1) + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) + if (odm_check_power_status(pAdapter) == FALSE) + return; + #endif + + #if MP_DRIVER == 1 + if( pMptCtx->is_single_tone || pMptCtx->is_carrier_suppression ) + return; + #endif + +#endif + #if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) + _phy_iq_calibrate_8814a(pDM_Odm, pHalData->current_channel); + /*DBG_871X("%s,%d, do IQK %u ms\n", __func__, __LINE__, rtw_get_passing_time_ms(time_iqk));*/ + #else + _phy_iq_calibrate_8814a(pDM_Odm, *pDM_Odm->pChannel); + #endif +} + +VOID +PHY_IQCalibrate_8814A_Init( + IN void* pDM_VOID + ) +{ + struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; + struct dm_iqk_info *pIQK_info = &pDM_Odm->IQK_info; + u8 ii, jj; + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("=====>PHY_IQCalibrate_8814A_Init\n")); + for(jj = 0; jj < 2; jj++){ + for(ii = 0; ii < NUM; ii++){ + pIQK_info->lok_fail[ii] = TRUE; + pIQK_info->iqk_fail[jj][ii] = TRUE; + pIQK_info->iqc_matrix[jj][ii] = 0x20000000; + } + } +} + diff --git a/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h b/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h new file mode 100644 index 0000000..15d9cf0 --- /dev/null +++ b/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * 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 __PHYDM_IQK_8814A_H__ +#define __PHYDM_IQK_8814A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define MAC_REG_NUM_8814 2 +#define BB_REG_NUM_8814 13 +#define RF_REG_NUM_8814 2 +/*---------------------------End Define Parameters-------------------------------*/ + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +VOID +DoIQK_8814A( + PVOID pDM_VOID, + u8 DeltaThermalIndex, + u8 ThermalValue, + u8 Threshold + ); +#else +VOID +DoIQK_8814A( + PVOID pDM_VOID, + u8 DeltaThermalIndex, + u8 ThermalValue, + u8 Threshold + ); +#endif + +VOID +phy_iq_calibrate_8814a( + IN PVOID pDM_VOID, + boolean bReCovery + ); + +VOID +PHY_IQCalibrate_8814A_Init( + IN PVOID pDM_VOID + ); + + #endif /* #ifndef __PHYDM_IQK_8814A_H__*/ diff --git a/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c b/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c new file mode 100644 index 0000000..87a3d4f --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.c @@ -0,0 +1,316 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#include "mp_precomp.h" +#include "../../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +/* 2010/04/25 MH Define the max tx power tracking tx agc power. */ +#define ODM_TXPWRTRACK_MAX_IDX8821A 6 + +/*---------------------------Define Local Constant---------------------------*/ + + +/* 3 ============================================================ + * 3 Tx Power Tracking + * 3 ============================================================ */ +void halrf_rf_lna_setting_8821a( + struct dm_struct *dm, + enum halrf_lna_set type +) +{ + /*phydm_disable_lna*/ + if (type == HALRF_LNA_DISABLE) { + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x1); + odm_set_rf_reg(dm, RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/ + odm_set_rf_reg(dm, RF_PATH_A, 0x31, 0xfffff, 0x0002f); + odm_set_rf_reg(dm, RF_PATH_A, 0x32, 0xfffff, 0xfb09b); /*disable LNA*/ + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x0); + } else if (type == HALRF_LNA_ENABLE) { + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x1); + odm_set_rf_reg(dm, RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/ + odm_set_rf_reg(dm, RF_PATH_A, 0x31, 0xfffff, 0x0002f); + odm_set_rf_reg(dm, RF_PATH_A, 0x32, 0xfffff, 0xfb0bb); /*disable LNA*/ + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x0); + } +} +void +odm_tx_pwr_track_set_pwr8821a( + void *dm_void, + enum pwrtrack_method method, + u8 rf_path, + u8 channel_mapped_index +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + struct _ADAPTER *adapter = dm->adapter; + PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter); + + u8 pwr_tracking_limit = 26; /* +1.0dB */ + u8 tx_rate = 0xFF; + u8 final_ofdm_swing_index = 0; + u8 final_cck_swing_index = 0; + u8 i = 0; + u32 final_bb_swing_idx[1]; + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + struct _hal_rf_ *rf = &(dm->rf_table); + + if (*(dm->mp_mode) == true) { +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (MP_DRIVER == 1) + PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx); + + tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index); +#endif +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) +#ifdef CONFIG_MP_INCLUDED + PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx); + + tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index); +#endif +#endif +#endif + } else { + u16 rate = *(dm->forced_data_rate); + + if (!rate) { /*auto rate*/ +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + if (dm->number_linked_client != 0) + tx_rate = hw_rate_to_m_rate(dm->tx_rate); + else + tx_rate = rf->p_rate_index; +#endif + } else /*force rate*/ + tx_rate = (u8)rate; + } + + //PHYDM_DBG(dm, DBG_COMP_MCC, "Power Tracking tx_rate=0x%X\n", tx_rate); + //PHYDM_DBG(dm, DBG_COMP_MCC, "===>odm_tx_pwr_track_set_pwr8821a\n"); + + if (tx_rate != 0xFF) { + /* 2 CCK */ + if (((tx_rate >= MGN_1M) && (tx_rate <= MGN_5_5M)) || (tx_rate == MGN_11M)) + pwr_tracking_limit = 32; /* +4dB */ + /* 2 OFDM */ + else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M)) + pwr_tracking_limit = 30; /* +3dB */ + else if (tx_rate == MGN_54M) + pwr_tracking_limit = 28; /* +2dB */ + /* 2 HT */ + else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2)) /* QPSK/BPSK */ + pwr_tracking_limit = 34; /* +5dB */ + else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4)) /* 16QAM */ + pwr_tracking_limit = 30; /* +3dB */ + else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7)) /* 64QAM */ + pwr_tracking_limit = 28; /* +2dB */ + + /* 2 VHT */ + else if ((tx_rate >= MGN_VHT1SS_MCS0) && (tx_rate <= MGN_VHT1SS_MCS2)) /* QPSK/BPSK */ + pwr_tracking_limit = 34; /* +5dB */ + else if ((tx_rate >= MGN_VHT1SS_MCS3) && (tx_rate <= MGN_VHT1SS_MCS4)) /* 16QAM */ + pwr_tracking_limit = 30; /* +3dB */ + else if ((tx_rate >= MGN_VHT1SS_MCS5) && (tx_rate <= MGN_VHT1SS_MCS6)) /* 64QAM */ + pwr_tracking_limit = 28; /* +2dB */ + else if (tx_rate == MGN_VHT1SS_MCS7) /* 64QAM */ + pwr_tracking_limit = 26; /* +1dB */ + else if (tx_rate == MGN_VHT1SS_MCS8) /* 256QAM */ + pwr_tracking_limit = 24; /* +0dB */ + else if (tx_rate == MGN_VHT1SS_MCS9) /* 256QAM */ + pwr_tracking_limit = 22; /* -1dB */ + + else + pwr_tracking_limit = 24; + } + //PHYDM_DBG(dm, DBG_COMP_MCC, "tx_rate=0x%x, pwr_tracking_limit=%d\n", tx_rate, pwr_tracking_limit); + + if (method == BBSWING) { + if (rf_path == RF_PATH_A) { + final_bb_swing_idx[RF_PATH_A] = (dm->rf_calibrate_info.OFDM_index[RF_PATH_A] > pwr_tracking_limit) ? pwr_tracking_limit : dm->rf_calibrate_info.OFDM_index[RF_PATH_A]; + /*PHYDM_DBG(dm, DBG_COMP_MCC, "dm->rf_calibrate_info.OFDM_index[RF_PATH_A]=%d, dm->RealBbSwingIdx[RF_PATH_A]=%d\n", + dm->rf_calibrate_info.OFDM_index[RF_PATH_A], final_bb_swing_idx[RF_PATH_A]);*/ + + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[final_bb_swing_idx[RF_PATH_A]]); + } + } else if (method == MIX_MODE) { + /*PHYDM_DBG(dm, DBG_COMP_MCC, "cali_info->default_ofdm_index=%d, cali_info->absolute_ofdm_swing_idx[rf_path]=%d, rf_path = %d\n", + cali_info->default_ofdm_index, cali_info->absolute_ofdm_swing_idx[rf_path], rf_path);*/ + + final_cck_swing_index = cali_info->default_cck_index + cali_info->absolute_ofdm_swing_idx[rf_path]; + final_ofdm_swing_index = cali_info->default_ofdm_index + cali_info->absolute_ofdm_swing_idx[rf_path]; + + if (rf_path == RF_PATH_A) { + if (final_ofdm_swing_index > pwr_tracking_limit) { /*BBSwing higher then Limit*/ + cali_info->remnant_cck_swing_idx = final_cck_swing_index - pwr_tracking_limit; + cali_info->remnant_ofdm_swing_idx[rf_path] = final_ofdm_swing_index - pwr_tracking_limit; + + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[pwr_tracking_limit]); + + cali_info->modify_tx_agc_flag_path_a = true; + + phy_set_tx_power_level_by_path(adapter, *dm->channel, RF_PATH_A); + + //PHYDM_DBG(dm, DBG_COMP_MCC, "******Path_A Over BBSwing Limit, pwr_tracking_limit = %d, Remnant tx_agc value = %d\n", pwr_tracking_limit, cali_info->remnant_ofdm_swing_idx[rf_path]); + } else if (final_ofdm_swing_index <= 0) { + cali_info->remnant_cck_swing_idx = final_cck_swing_index; + cali_info->remnant_ofdm_swing_idx[rf_path] = final_ofdm_swing_index; + + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[0]); + + cali_info->modify_tx_agc_flag_path_a = true; + + phy_set_tx_power_level_by_path(adapter, *dm->channel, RF_PATH_A); + + //PHYDM_DBG(dm, DBG_COMP_MCC, "******Path_A Lower then BBSwing lower bound 0, Remnant tx_agc value = %d\n", cali_info->remnant_ofdm_swing_idx[rf_path]); + } else { + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[final_ofdm_swing_index]); + + //PHYDM_DBG(dm, DBG_COMP_MCC, "******Path_A Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index); + + if (cali_info->modify_tx_agc_flag_path_a) { /*If tx_agc has changed, reset tx_agc again*/ + cali_info->remnant_cck_swing_idx = 0; + cali_info->remnant_ofdm_swing_idx[rf_path] = 0; + + phy_set_tx_power_level_by_path(adapter, *dm->channel, RF_PATH_A); + + cali_info->modify_tx_agc_flag_path_a = false; + + PHYDM_DBG(dm, DBG_COMP_MCC, "******Path_A dm->Modify_TxAGC_Flag = false\n"); + } + } + } + } else + return; +} /* odm_TxPwrTrackSetPwr88E */ + +void +get_delta_swing_table_8821a( + void *dm_void, + u8 **temperature_up_a, + u8 **temperature_down_a, + u8 **temperature_up_b, + u8 **temperature_down_b +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + struct _ADAPTER *adapter = dm->adapter; + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + struct _hal_rf_ *rf = &(dm->rf_table); + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); + u8 tx_rate = 0xFF; + u8 channel = *dm->channel; + + if (*(dm->mp_mode) == true) { +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (MP_DRIVER == 1) + PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx); + + tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index); +#endif +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) +#ifdef CONFIG_MP_INCLUDED + PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx); + + tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index); +#endif +#endif +#endif + } else { + u16 rate = *(dm->forced_data_rate); + + if (!rate) { /*auto rate*/ +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + if (dm->number_linked_client != 0) + tx_rate = hw_rate_to_m_rate(dm->tx_rate); + else + tx_rate = rf->p_rate_index; +#endif + } else /*force rate*/ + tx_rate = (u8)rate; + } + + //PHYDM_DBG(dm, DBG_COMP_MCC, "Power Tracking tx_rate=0x%X\n", tx_rate); + + + if (1 <= channel && channel <= 14) { + if (IS_CCK_RATE(tx_rate)) { + *temperature_up_a = cali_info->delta_swing_table_idx_2g_cck_a_p; + *temperature_down_a = cali_info->delta_swing_table_idx_2g_cck_a_n; + *temperature_up_b = cali_info->delta_swing_table_idx_2g_cck_b_p; + *temperature_down_b = cali_info->delta_swing_table_idx_2g_cck_b_n; + } else { + *temperature_up_a = cali_info->delta_swing_table_idx_2ga_p; + *temperature_down_a = cali_info->delta_swing_table_idx_2ga_n; + *temperature_up_b = cali_info->delta_swing_table_idx_2gb_p; + *temperature_down_b = cali_info->delta_swing_table_idx_2gb_n; + } + } else if (36 <= channel && channel <= 64) { + *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[0]; + *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[0]; + *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[0]; + *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[0]; + } else if (100 <= channel && channel <= 144) { + *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[1]; + *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[1]; + *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[1]; + *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[1]; + } else if (149 <= channel && channel <= 177) { + *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[2]; + *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[2]; + *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[2]; + *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[2]; + } else { + *temperature_up_a = (u8 *)delta_swing_table_idx_2ga_p_8188e; + *temperature_down_a = (u8 *)delta_swing_table_idx_2ga_n_8188e; + *temperature_up_b = (u8 *)delta_swing_table_idx_2ga_p_8188e; + *temperature_down_b = (u8 *)delta_swing_table_idx_2ga_n_8188e; + } + + return; +} + +void configure_txpower_track_8821a( + struct txpwrtrack_cfg *config +) +{ + config->swing_table_size_cck = TXSCALE_TABLE_SIZE; + config->swing_table_size_ofdm = TXSCALE_TABLE_SIZE; + config->threshold_iqk = IQK_THRESHOLD; + config->average_thermal_num = AVG_THERMAL_NUM_8812A; + config->rf_path_count = MAX_PATH_NUM_8821A; + config->thermal_reg_addr = RF_T_METER_8812A; + + config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr8821a; + config->do_iqk = do_iqk_8821a; + config->phy_lc_calibrate = halrf_lck_trigger; + config->get_delta_swing_table = get_delta_swing_table_8821a; +} + +void +phy_lc_calibrate_8821a( + void *dm_void +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + + phy_lc_calibrate_8812a(dm); +} diff --git a/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h b/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h new file mode 100644 index 0000000..684852a --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_8821a_ce.h @@ -0,0 +1,53 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#ifndef __HAL_PHY_RF_8821A_H__ +#define __HAL_PHY_RF_8821A_H__ + +/*--------------------------Define Parameters-------------------------------*/ + +void configure_txpower_track_8821a( + struct txpwrtrack_cfg *config +); + +void +odm_tx_pwr_track_set_pwr8821a( + void *dm_void, + enum pwrtrack_method method, + u8 rf_path, + u8 channel_mapped_index +); + +void +phy_lc_calibrate_8821a( + void *dm_void +); + +void +get_delta_swing_table_8821a( + void *dm_void, + u8 **temperature_up_a, + u8 **temperature_down_a, + u8 **temperature_up_b, + u8 **temperature_down_b +); + +void +halrf_rf_lna_setting_8821a( + struct dm_struct *dm, + enum halrf_lna_set type +); + +#endif /* #ifndef __HAL_PHY_RF_8821A_H__ */ diff --git a/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c b/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c new file mode 100644 index 0000000..cfb7592 --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_8821a_win.c @@ -0,0 +1,1046 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#include "mp_precomp.h" + +#if RT_PLATFORM==PLATFORM_MACOSX +#include "phydm_precomp.h" +#else +#include "../phydm_precomp.h" +#endif + + + +/*---------------------------Define Local Constant---------------------------*/ +/* 2010/04/25 MH Define the max tx power tracking tx agc power. */ +#define ODM_TXPWRTRACK_MAX_IDX8821A 6 + +/*---------------------------Define Local Constant---------------------------*/ + + +/* 3 ============================================================ + * 3 Tx Power Tracking + * 3 ============================================================ */ + +void halrf_rf_lna_setting_8821a( + struct dm_struct *dm, + enum halrf_lna_set type +) +{ + /*phydm_disable_lna*/ + if (type == HALRF_LNA_DISABLE) { + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x1); + odm_set_rf_reg(dm, RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/ + odm_set_rf_reg(dm, RF_PATH_A, 0x31, 0xfffff, 0x0002f); + odm_set_rf_reg(dm, RF_PATH_A, 0x32, 0xfffff, 0xfb09b); /*disable LNA*/ + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x0); + } else if (type == HALRF_LNA_ENABLE) { + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x1); + odm_set_rf_reg(dm, RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/ + odm_set_rf_reg(dm, RF_PATH_A, 0x31, 0xfffff, 0x0002f); + odm_set_rf_reg(dm, RF_PATH_A, 0x32, 0xfffff, 0xfb0bb); /*disable LNA*/ + odm_set_rf_reg(dm, RF_PATH_A, 0xef, 0x80000, 0x0); + } +} + + +void set_iqk_matrix_8821a( + struct dm_struct *dm, + u8 OFDM_index, + u8 rf_path, + s32 iqk_result_x, + s32 iqk_result_y +) +{ + s32 ele_A = 0, ele_D, ele_C = 0, value32; + + ele_D = (ofdm_swing_table_new[OFDM_index] & 0xFFC00000) >> 22; + + /* new element A = element D x X */ + if ((iqk_result_x != 0) && (*(dm->band_type) == ODM_BAND_2_4G)) { + if ((iqk_result_x & 0x00000200) != 0) /* consider minus */ + iqk_result_x = iqk_result_x | 0xFFFFFC00; + ele_A = ((iqk_result_x * ele_D) >> 8) & 0x000003FF; + + /* new element C = element D x Y */ + if ((iqk_result_y & 0x00000200) != 0) + iqk_result_y = iqk_result_y | 0xFFFFFC00; + ele_C = ((iqk_result_y * ele_D) >> 8) & 0x000003FF; + + if (rf_path == RF_PATH_A) + switch (rf_path) { + case RF_PATH_A: + /* wirte new elements A, C, D to regC80 and regC94, element B is always 0 */ + value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A; + odm_set_bb_reg(dm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD, value32); + + value32 = (ele_C & 0x000003C0) >> 6; + odm_set_bb_reg(dm, REG_OFDM_0_XC_TX_AFE, MASKH4BITS, value32); + + value32 = ((iqk_result_x * ele_D) >> 7) & 0x01; + odm_set_bb_reg(dm, REG_OFDM_0_ECCA_THRESHOLD, BIT(24), value32); + break; + default: + break; + } + } else { + switch (rf_path) { + case RF_PATH_A: + odm_set_bb_reg(dm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD, ofdm_swing_table_new[OFDM_index]); + odm_set_bb_reg(dm, REG_OFDM_0_XC_TX_AFE, MASKH4BITS, 0x00); + odm_set_bb_reg(dm, REG_OFDM_0_ECCA_THRESHOLD, BIT(24), 0x00); + break; + + default: + break; + } + } + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xeb4 = 0x%x 0xebc = 0x%x\n", + (u32)iqk_result_x, (u32)iqk_result_y, (u32)ele_A, (u32)ele_C, (u32)ele_D, (u32)iqk_result_x, (u32)iqk_result_y); +} + +void do_iqk_8821a( + void *dm_void, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + + odm_reset_iqk_result(dm); + dm->rf_calibrate_info.thermal_value_iqk = thermal_value; + halrf_iqk_trigger(dm, false); +} + + +void +odm_tx_pwr_track_set_pwr8821a( + void *dm_void, + enum pwrtrack_method method, + u8 rf_path, + u8 channel_mapped_index +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + PADAPTER adapter = (PADAPTER)dm->adapter; + + u8 pwr_tracking_limit = 26; /* +1.0dB */ + u8 tx_rate = 0xFF; + u8 final_ofdm_swing_index = 0; + u8 final_cck_swing_index = 0; + u32 final_bb_swing_idx[1]; + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + + if (*(dm->mp_mode) == true) { +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (MP_DRIVER == 1) + PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx); + + tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex); +#endif +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) +#ifdef CONFIG_MP_INCLUDED + PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx); + + tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index); +#endif +#endif +#endif + } else { + u16 rate = *(dm->forced_data_rate); + + if (!rate) { /*auto rate*/ +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + tx_rate = hw_rate_to_m_rate(dm->tx_rate); +#endif + } else /*force rate*/ + tx_rate = (u8)rate; + } + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "Power Tracking tx_rate=0x%X\n", tx_rate); + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "===>odm_tx_pwr_track_set_pwr8821a\n"); + + if (tx_rate != 0xFF) { + /* 2 CCK */ + if (((tx_rate >= MGN_1M) && (tx_rate <= MGN_5_5M)) || (tx_rate == MGN_11M)) + pwr_tracking_limit = 32; /* +4dB */ + /* 2 OFDM */ + else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M)) + pwr_tracking_limit = 30; /* +3dB */ + else if (tx_rate == MGN_54M) + pwr_tracking_limit = 28; /* +2dB */ + /* 2 HT */ + else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2)) /* QPSK/BPSK */ + pwr_tracking_limit = 34; /* +5dB */ + else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4)) /* 16QAM */ + pwr_tracking_limit = 30; /* +3dB */ + else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7)) /* 64QAM */ + pwr_tracking_limit = 28; /* +2dB */ + + /* 2 VHT */ + else if ((tx_rate >= MGN_VHT1SS_MCS0) && (tx_rate <= MGN_VHT1SS_MCS2)) /* QPSK/BPSK */ + pwr_tracking_limit = 34; /* +5dB */ + else if ((tx_rate >= MGN_VHT1SS_MCS3) && (tx_rate <= MGN_VHT1SS_MCS4)) /* 16QAM */ + pwr_tracking_limit = 30; /* +3dB */ + else if ((tx_rate >= MGN_VHT1SS_MCS5) && (tx_rate <= MGN_VHT1SS_MCS6)) /* 64QAM */ + pwr_tracking_limit = 28; /* +2dB */ + else if (tx_rate == MGN_VHT1SS_MCS7) /* 64QAM */ + pwr_tracking_limit = 26; /* +1dB */ + else if (tx_rate == MGN_VHT1SS_MCS8) /* 256QAM */ + pwr_tracking_limit = 24; /* +0dB */ + else if (tx_rate == MGN_VHT1SS_MCS9) /* 256QAM */ + pwr_tracking_limit = 22; /* -1dB */ + + else + pwr_tracking_limit = 24; + } + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "tx_rate=0x%x, pwr_tracking_limit=%d\n", tx_rate, pwr_tracking_limit); + + if (method == BBSWING) { + if (rf_path == RF_PATH_A) { + final_bb_swing_idx[RF_PATH_A] = (cali_info->OFDM_index[RF_PATH_A] > pwr_tracking_limit) ? pwr_tracking_limit : cali_info->OFDM_index[RF_PATH_A]; + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "cali_info->OFDM_index[RF_PATH_A]=%d, dm->RealBbSwingIdx[RF_PATH_A]=%d\n", + cali_info->OFDM_index[RF_PATH_A], final_bb_swing_idx[RF_PATH_A]); + + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[final_bb_swing_idx[RF_PATH_A]]); + } + } else if (method == MIX_MODE) { + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "cali_info->default_ofdm_index=%d, cali_info->absolute_ofdm_swing_idx[rf_path]=%d, rf_path = %d\n", + cali_info->default_ofdm_index, cali_info->absolute_ofdm_swing_idx[rf_path], rf_path); + + final_cck_swing_index = cali_info->default_cck_index + cali_info->absolute_ofdm_swing_idx[rf_path]; + final_ofdm_swing_index = cali_info->default_ofdm_index + cali_info->absolute_ofdm_swing_idx[rf_path]; + + if (rf_path == RF_PATH_A) { + if (final_ofdm_swing_index > pwr_tracking_limit) { /* BBSwing higher then Limit */ + cali_info->remnant_cck_swing_idx = final_cck_swing_index - pwr_tracking_limit; + cali_info->remnant_ofdm_swing_idx[rf_path] = final_ofdm_swing_index - pwr_tracking_limit; + + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[pwr_tracking_limit]); + + cali_info->modify_tx_agc_flag_path_a = true; + + PHY_SetTxPowerLevelByPath(adapter, *dm->channel, RF_PATH_A); + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "******Path_A Over BBSwing Limit, pwr_tracking_limit = %d, Remnant tx_agc value = %d\n", pwr_tracking_limit, cali_info->remnant_ofdm_swing_idx[rf_path]); + } else if (final_ofdm_swing_index < 0) { + cali_info->remnant_cck_swing_idx = final_cck_swing_index; + cali_info->remnant_ofdm_swing_idx[rf_path] = final_ofdm_swing_index; + + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[0]); + + cali_info->modify_tx_agc_flag_path_a = true; + + PHY_SetTxPowerLevelByPath(adapter, *dm->channel, RF_PATH_A); + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "******Path_A Lower then BBSwing lower bound 0, Remnant tx_agc value = %d\n", cali_info->remnant_ofdm_swing_idx[rf_path]); + } else { + odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[final_ofdm_swing_index]); + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "******Path_A Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index); + + if (cali_info->modify_tx_agc_flag_path_a) { /* If tx_agc has changed, reset tx_agc again */ + cali_info->remnant_cck_swing_idx = 0; + cali_info->remnant_ofdm_swing_idx[rf_path] = 0; + + PHY_SetTxPowerLevelByPath(adapter, *dm->channel, RF_PATH_A); + + cali_info->modify_tx_agc_flag_path_a = false; + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "******Path_A dm->Modify_TxAGC_Flag = false\n"); + } + } + } + } else + return; +} /* odm_TxPwrTrackSetPwr88E */ + +void +get_delta_swing_table_8821a( + void *dm_void, + u8 **temperature_up_a, + u8 **temperature_down_a, + u8 **temperature_up_b, + u8 **temperature_down_b +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + PADAPTER adapter = (PADAPTER)dm->adapter; + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + u8 tx_rate = 0xFF; + u8 channel = *dm->channel; + + if (*(dm->mp_mode) == true) { +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) +#if (MP_DRIVER == 1) + PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx); + + tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex); +#endif +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) +#ifdef CONFIG_MP_INCLUDED + PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx); + + tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index); +#endif +#endif +#endif + } else { + u16 rate = *(dm->forced_data_rate); + + if (!rate) { /*auto rate*/ +#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate); +#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + tx_rate = hw_rate_to_m_rate(dm->tx_rate); +#endif + } else /*force rate*/ + tx_rate = (u8)rate; + } + + PHYDM_DBG(dm, ODM_COMP_TX_PWR_TRACK, "Power Tracking tx_rate=0x%X\n", tx_rate); + + + if (1 <= channel && channel <= 14) { + if (IS_CCK_RATE(tx_rate)) { + *temperature_up_a = cali_info->delta_swing_table_idx_2g_cck_a_p; + *temperature_down_a = cali_info->delta_swing_table_idx_2g_cck_a_n; + *temperature_up_b = cali_info->delta_swing_table_idx_2g_cck_b_p; + *temperature_down_b = cali_info->delta_swing_table_idx_2g_cck_b_n; + } else { + *temperature_up_a = cali_info->delta_swing_table_idx_2ga_p; + *temperature_down_a = cali_info->delta_swing_table_idx_2ga_n; + *temperature_up_b = cali_info->delta_swing_table_idx_2gb_p; + *temperature_down_b = cali_info->delta_swing_table_idx_2gb_n; + } + } else if (36 <= channel && channel <= 64) { + *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[0]; + *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[0]; + *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[0]; + *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[0]; + } else if (100 <= channel && channel <= 144) { + *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[1]; + *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[1]; + *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[1]; + *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[1]; + } else if (149 <= channel && channel <= 177) { + *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[2]; + *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[2]; + *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[2]; + *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[2]; + } else { + *temperature_up_a = (u8 *)delta_swing_table_idx_2ga_p_8188e; + *temperature_down_a = (u8 *)delta_swing_table_idx_2ga_n_8188e; + *temperature_up_b = (u8 *)delta_swing_table_idx_2ga_p_8188e; + *temperature_down_b = (u8 *)delta_swing_table_idx_2ga_n_8188e; + } + + return; +} + +void configure_txpower_track_8821a( + struct txpwrtrack_cfg *config +) +{ + config->swing_table_size_cck = TXSCALE_TABLE_SIZE; + config->swing_table_size_ofdm = TXSCALE_TABLE_SIZE; + config->threshold_iqk = IQK_THRESHOLD; + config->average_thermal_num = AVG_THERMAL_NUM_8812A; + config->rf_path_count = MAX_PATH_NUM_8821A; + config->thermal_reg_addr = RF_T_METER_8812A; + + config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr8821a; + config->do_iqk = do_iqk_8821a; + config->phy_lc_calibrate = phy_lc_calibrate_8821a; + config->get_delta_swing_table = get_delta_swing_table_8821a; +} + +/* 1 7. IQK */ +#define MAX_TOLERANCE 5 +#define IQK_DELAY_TIME 1 /* ms */ + +void _iqk_rx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int RX_X, + unsigned int RX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, RX_X >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, RX_Y >> 1); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X >> 1, RX_Y >> 1); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xc10 = %x ====>fill to IQC\n", odm_read_4byte(dm, 0xc10)); + } + break; + default: + break; + }; +} + +void _iqk_tx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int TX_X, + unsigned int TX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_set_bb_reg(dm, 0xccc, 0x000007ff, TX_Y); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, TX_X); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", odm_get_bb_reg(dm, 0xcd4, 0x000007ff), odm_get_bb_reg(dm, 0xccc, 0x000007ff)); + } + break; + default: + break; + }; +} + +void _iqk_backup_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* save MACBB default value */ + for (i = 0; i < MACBB_NUM; i++) + MACBB_backup[i] = odm_read_4byte(dm, backup_macbb_reg[i]); + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupMacBB Success!!!!\n"); +} +void _iqk_backup_rf_8821a( + struct dm_struct *dm, + u32 *RFA_backup, + u32 *RFB_backup, + u32 *backup_rf_reg, + u32 RF_NUM +) +{ + + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save RF Parameters */ + for (i = 0; i < RF_NUM; i++) + RFA_backup[i] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], MASKDWORD); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupRF Success!!!!\n"); +} +void _iqk_backup_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + AFE_backup[i] = odm_read_4byte(dm, backup_afe_reg[i]); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupAFE Success!!!!\n"); +} +void _iqk_restore_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload MacBB Parameters */ + for (i = 0; i < MACBB_NUM; i++) + odm_write_4byte(dm, backup_macbb_reg[i], MACBB_backup[i]); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreMacBB Success!!!!\n"); +} +void _iqk_restore_rf_8821a( + struct dm_struct *dm, + enum rf_path path, + u32 *backup_rf_reg, + u32 *RF_backup, + u32 RF_REG_NUM +) +{ + u32 i; + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + for (i = 0; i < RF_REG_NUM; i++) + odm_set_rf_reg(dm, (enum rf_path)path, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i]); + + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreRF path A Success!!!!\n"); + } + break; + default: + break; + } +} +void _iqk_restore_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + odm_write_4byte(dm, backup_afe_reg[i], AFE_backup[i]); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x0); + odm_write_4byte(dm, 0xc84, 0x0); + odm_write_4byte(dm, 0xc88, 0x0); + odm_write_4byte(dm, 0xc8c, 0x3c000000); + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xc94, 0x00000000); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_write_4byte(dm, 0xcb8, 0x0); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreAFE Success!!!!\n"); +} + + +void _iqk_configure_mac_8821a( + struct dm_struct *dm +) +{ + /* ========MAC register setting======== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_write_1byte(dm, 0x522, 0x3f); + odm_set_bb_reg(dm, 0x550, BIT(11) | BIT(3), 0x0); + odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */ + odm_set_bb_reg(dm, 0x838, 0xf, 0xc); /* CCA off */ + odm_write_1byte(dm, 0xa07, 0xf); /* CCK RX path off */ +} + +#define cal_num 3 + +void _iqk_tx_8821a( + struct dm_struct *dm, + enum rf_path path +) +{ + u32 TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0; + int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, tx_average = 0, rx_average = 0, rx_iqk_loop = 0, RX_X_temp = 0, RX_Y_temp = 0; + int TX_X0[cal_num], TX_Y0[cal_num], RX_X0[2][cal_num], RX_Y0[2][cal_num]; + boolean TX0IQKOK = false, RX0IQKOK = false; + int i, ii, dx = 0, dy = 0, TX_finish = 0, RX_finish1 = 0, RX_finish2 = 0; + + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "band_width = %d, support_interface = %d, ext_pa = %d, ext_pa_5g = %d\n", *dm->band_width, dm->support_interface, dm->ext_pa, dm->ext_pa_5g); + + while (cal < cal_num) { + switch (path) { + case RF_PATH_A: + { + /* path-A LOK */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* ========path-A AFE all on======== */ + /* Port 0 DAC/ADC on */ + odm_write_4byte(dm, 0xc60, 0x77777777); + odm_write_4byte(dm, 0xc64, 0x77777777); + + odm_write_4byte(dm, 0xc68, 0x19791979); + + odm_set_bb_reg(dm, 0xc00, 0xf, 0x4);/* hardware 3-wire off */ + + /* LOK setting */ + /* ====== LOK ====== */ + /* 1. DAC/ADC sampling rate (160 MHz) */ + odm_set_bb_reg(dm, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7); + + /* 2. LoK RF setting (at BW = 20M) */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80002); + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403f4); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x68163e96); + else + odm_write_4byte(dm, 0xc8c, 0x28163e96); + + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] N SI/PI iqk_dpk module */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0x58, 0x7fe00, odm_get_rf_reg(dm, (enum rf_path)path, 0x8, 0xffc00)); + switch (*dm->band_width) { + case 1: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x1); + } + break; + case 2: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x0); + } + break; + default: + break; + + } + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + /* 3. TX RF setting */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403e3); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x40163e96); + else + odm_write_4byte(dm, 0xc8c, 0x00163e96); + + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] SI/PIiqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + TX_X0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + TX_Y0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + + + if (TX0IQKOK == false) + break; /* TXK fail, Don't do RXK */ + + /* ====== RX IQK ====== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* 1. RX RF setting */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x30000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0002f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xfffbb); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x88001); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d8); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + + odm_set_bb_reg(dm, 0x978, 0x03FF8000, (TX_X0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, 0x000007FF, (TX_Y0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, BIT(31), 0x1); + odm_set_bb_reg(dm, 0x97c, BIT(31), 0x0); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_write_4byte(dm, 0x984, 0x0046a911); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x38008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x18008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xc88, 0x02140119); + + if (dm->support_interface == 1) { + rx_iqk_loop = 2; /* for 2% fail; */ + } else + rx_iqk_loop = 1; + for (i = 0; i < rx_iqk_loop; i++) { + if (dm->support_interface == 1) + if (i == 0) + odm_write_4byte(dm, 0xc8c, 0x28161100); /* Good */ + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] SI/PI iqk_dpk module */ + + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============RXIQK Check============== */ + RX_fail = odm_get_bb_reg(dm, 0xd00, BIT(11)); + if (RX_fail == 0) { + /* + dbg_print("====== RXIQK (%d) ======", i); + odm_write_4byte(dm, 0xcb8, 0x05000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x06000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + dbg_print("reg1 = %d, reg2 = %d", reg1, reg2); + image_power = (reg2<<32)+reg1; + dbg_print("Before PW = %d\n", image_power); + odm_write_4byte(dm, 0xcb8, 0x07000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x08000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + image_power = (reg2<<32)+reg1; + dbg_print("After PW = %d\n", image_power); + */ + + odm_write_4byte(dm, 0xcb8, 0x06000000); + RX_X0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x08000000); + RX_Y0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + RX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x200 >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, 0x0 >> 1); + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + + } + } else { + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK) + tx_average++; + if (RX0IQKOK) + rx_average++; + } + break; + default: + break; + } + cal++; + } + /* FillIQK Result */ + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "========Path_A =======\n"); + if (tx_average == 0) + break; + + for (i = 0; i < tx_average; i++) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i]) >> 21 & 0x000007ff, i, (TX_Y0[i]) >> 21 & 0x000007ff); + for (i = 0; i < tx_average; i++) { + for (ii = i + 1; ii < tx_average; ii++) { + dx = (TX_X0[i] >> 21) - (TX_X0[ii] >> 21); + if (dx < 3 && dx > -3) { + dy = (TX_Y0[i] >> 21) - (TX_Y0[ii] >> 21); + if (dy < 3 && dy > -3) { + TX_X = ((TX_X0[i] >> 21) + (TX_X0[ii] >> 21)) / 2; + TX_Y = ((TX_Y0[i] >> 21) + (TX_Y0[ii] >> 21)) / 2; + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + + if (TX_finish == 1) + _iqk_tx_fill_iqc_8821a(dm, path, TX_X, TX_Y); + else + _iqk_tx_fill_iqc_8821a(dm, path, 0x200, 0x0); + + if (rx_average == 0) + break; + + for (i = 0; i < rx_average; i++) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X0[0][%d] = %x ;; RX_Y0[0][%d] = %x\n", i, (RX_X0[0][i]) >> 21 & 0x000007ff, i, (RX_Y0[0][i]) >> 21 & 0x000007ff); + if (rx_iqk_loop == 2) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X0[1][%d] = %x ;; RX_Y0[1][%d] = %x\n", i, (RX_X0[1][i]) >> 21 & 0x000007ff, i, (RX_Y0[1][i]) >> 21 & 0x000007ff); + } + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[0][i] >> 21) - (RX_X0[0][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[0][i] >> 21) - (RX_Y0[0][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X_temp = ((RX_X0[0][i] >> 21) + (RX_X0[0][ii] >> 21)) / 2; + RX_Y_temp = ((RX_Y0[0][i] >> 21) + (RX_Y0[0][ii] >> 21)) / 2; + RX_finish1 = 1; + break; + } + } + } + if (RX_finish1 == 1) { + RX_X = RX_X_temp; + RX_Y = RX_Y_temp; + break; + } + } + if (rx_iqk_loop == 2) { + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[1][i] >> 21) - (RX_X0[1][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[1][i] >> 21) - (RX_Y0[1][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X = ((RX_X0[1][i] >> 21) + (RX_X0[1][ii] >> 21)) / 2; + RX_Y = ((RX_Y0[1][i] >> 21) + (RX_Y0[1][ii] >> 21)) / 2; + RX_finish2 = 1; + break; + } + } + } + if (RX_finish2 == 1) + break; + } + if (RX_finish1 && RX_finish2) { + RX_X = (RX_X + RX_X_temp) / 2; + RX_Y = (RX_Y + RX_Y_temp) / 2; + } + } + if (RX_finish1 || RX_finish1) + _iqk_rx_fill_iqc_8821a(dm, path, RX_X, RX_Y); + else + _iqk_rx_fill_iqc_8821a(dm, path, 0x200, 0x0); + } + break; + default: + break; + } +} + +#define MACBB_REG_NUM 8 +#define AFE_REG_NUM 4 +#define RF_REG_NUM 3 + +void +_phy_iq_calibrate_by_fw_8821a( + struct dm_struct *dm +) +{ + PADAPTER adapter = (PADAPTER)dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA((adapter)); + u8 iqk_cmd[3] = {hal_data->CurrentChannel, 0x0, 0x0}; + u8 buf1 = 0x0; + u8 buf2 = 0x0; + + /* Byte 2, Bit 4 ~ Bit 5 : band_type */ + if (hal_data->CurrentBandType) + buf1 = 0x2 << 4; + else + buf1 = 0x1 << 4; + + /* Byte 2, Bit 0 ~ Bit 3 : bandwidth */ + if (hal_data->CurrentChannelBW == CHANNEL_WIDTH_20) + buf2 = 0x1; + else if (hal_data->CurrentChannelBW == CHANNEL_WIDTH_40) + buf2 = 0x1 << 1; + else if (hal_data->CurrentChannelBW == CHANNEL_WIDTH_80) + buf2 = 0x1 << 2; + else + buf2 = 0x1 << 3; + + iqk_cmd[1] = buf1 | buf2; + iqk_cmd[2] = hal_data->ExternalPA_5G | hal_data->ExternalLNA_5G << 1; + + + RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Start ==\n")); + hal_data->IQK_StartTimer = 0; + hal_data->IQK_StartTimer = PlatformGetCurrentTime(); + RT_TRACE(COMP_MP, DBG_LOUD, ("== start_time: %u\n", hal_data->IQK_StartTimer)); + +#if (H2C_USE_IO_THREAD == 1) + FW8821A_FillH2cCommand(adapter, 0x45, 3, iqk_cmd); +#else + FillH2CCommand8821A(adapter, 0x45, 3, iqk_cmd); +#endif +} + +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +) +{ + u32 MACBB_backup[MACBB_REG_NUM], AFE_backup[AFE_REG_NUM], RFA_backup[RF_REG_NUM], RFB_backup[RF_REG_NUM]; + u32 backup_macbb_reg[MACBB_REG_NUM] = {0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c}; + u32 backup_afe_reg[AFE_REG_NUM] = {0xc5c, 0xc60, 0xc64, 0xc68}; + u32 backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0}; + + _iqk_backup_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM); + _iqk_backup_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM); + _iqk_backup_rf_8821a(dm, RFA_backup, RFB_backup, backup_rf_reg, RF_REG_NUM); + + _iqk_configure_mac_8821a(dm); + _iqk_tx_8821a(dm, RF_PATH_A); + _iqk_restore_rf_8821a(dm, RF_PATH_A, backup_rf_reg, RFA_backup, RF_REG_NUM); + + _iqk_restore_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM); + _iqk_restore_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM); + + /* _IQK_Exit_8821A(dm); */ + /* _IQK_TX_CheckResult_8821A */ + +} + +void +phy_reset_iqk_result_8821a( + struct dm_struct *dm +) +{ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + odm_write_4byte(dm, 0xce8, 0x0); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x100); +} + +/*for win*/ +/*IQK:0x1*/ +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +) +{ + + struct dm_struct *dm = (struct dm_struct *)dm_void; + u32 counter = 0; + + if (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) { + _phy_iq_calibrate_by_fw_8821a(dm); + for (counter = 0; counter < 10; counter++) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK PROGRESS == #%d\n", counter); + ODM_delay_ms(50); + if (!dm->rf_calibrate_info.is_iqk_in_progress) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK RETURN FROM WAITING ==\n"); + break; + } + } + if (dm->rf_calibrate_info.is_iqk_in_progress) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK TIMEOUT (Still in progress after 500ms) ==\n"); + } else + _phy_iq_calibrate_8821a(dm); +} + + +void +phy_lc_calibrate_8821a( + void *dm_void +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + + phy_lc_calibrate_8812a(dm); +} diff --git a/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h b/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h new file mode 100644 index 0000000..2f50dac --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_8821a_win.h @@ -0,0 +1,72 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#ifndef __HAL_PHY_RF_8821A_H__ +#define __HAL_PHY_RF_8821A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define IQK_DELAY_TIME_8821A 10 /* ms */ +#define index_mapping_NUM_8821A 15 +#define AVG_THERMAL_NUM_8821A 4 +#define RF_T_METER_8821A 0x42 + +void configure_txpower_track_8821a( + struct txpwrtrack_cfg *config +); + +void do_iqk_8821a( + void *dm_void, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +); + +void +odm_tx_pwr_track_set_pwr8821a( + void *dm_void, + enum pwrtrack_method method, + u8 rf_path, + u8 channel_mapped_index +); + +/* 1 7. IQK */ + +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +); + +void +phy_lc_calibrate_8821a( + IN void *dm_void +); + +void +get_delta_swing_table_8821a( + void *dm_void, + u8 **temperature_up_a, + u8 **temperature_down_a, + u8 **temperature_up_b, + u8 **temperature_down_b +); + +void +halrf_rf_lna_setting_8821a( + struct dm_struct *dm, + enum phydm_lna_set type +); + +#endif /* #ifndef __HAL_PHY_RF_8821A_H__ */ diff --git a/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c new file mode 100644 index 0000000..c98cbc0 --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.c @@ -0,0 +1,731 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#include "mp_precomp.h" +#include "../../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +#define cal_num_8821A 3 +#define MACBB_REG_NUM_8821A 8 +#define AFE_REG_NUM_8821A 4 +#define RF_REG_NUM_8821A 3 +/*---------------------------Define Local Constant---------------------------*/ +void _iqk_rx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int RX_X, + unsigned int RX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, RX_X >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, (RX_Y >> 1) & 0x000003ff); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X >> 1, RX_Y >> 1); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xc10 = %x ====>fill to IQC\n", odm_read_4byte(dm, 0xc10)); + } + break; + default: + break; + }; +} + +void _iqk_tx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int TX_X, + unsigned int TX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_set_bb_reg(dm, 0xccc, 0x000007ff, TX_Y); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, TX_X); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", odm_get_bb_reg(dm, 0xcd4, 0x000007ff), odm_get_bb_reg(dm, 0xccc, 0x000007ff)); + } + break; + default: + break; + }; +} + +void _iqk_backup_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* save MACBB default value */ + for (i = 0; i < MACBB_NUM; i++) + MACBB_backup[i] = odm_read_4byte(dm, backup_macbb_reg[i]); + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupMacBB Success!!!!\n"); +} + +void _iqk_backup_rf_8821a( + struct dm_struct *dm, + u32 *RFA_backup, + u32 *RFB_backup, + u32 *backup_rf_reg, + u32 RF_NUM +) +{ + + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save RF Parameters */ + for (i = 0; i < RF_NUM; i++) + RFA_backup[i] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], MASKDWORD); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupRF Success!!!!\n"); +} + +void _iqk_backup_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + AFE_backup[i] = odm_read_4byte(dm, backup_afe_reg[i]); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupAFE Success!!!!\n"); +} + +void _iqk_restore_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload MacBB Parameters */ + for (i = 0; i < MACBB_NUM; i++) + odm_write_4byte(dm, backup_macbb_reg[i], MACBB_backup[i]); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreMacBB Success!!!!\n"); +} + +void _iqk_restore_rf_8821a( + struct dm_struct *dm, + enum rf_path path, + u32 *backup_rf_reg, + u32 *RF_backup, + u32 RF_REG_NUM +) +{ + u32 i; + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + for (i = 0; i < RF_REG_NUM; i++) + odm_set_rf_reg(dm, (enum rf_path)path, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i]); + + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreRF path A Success!!!!\n"); + } + break; + default: + break; + } +} + +void _iqk_restore_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + odm_write_4byte(dm, backup_afe_reg[i], AFE_backup[i]); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x0); + odm_write_4byte(dm, 0xc84, 0x0); + odm_write_4byte(dm, 0xc88, 0x0); + odm_write_4byte(dm, 0xc8c, 0x3c000000); + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xc94, 0x00000000); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_write_4byte(dm, 0xcb8, 0x0); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreAFE Success!!!!\n"); +} + +void _iqk_configure_mac_8821a( + struct dm_struct *dm +) +{ + /* ========MAC register setting======== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_write_1byte(dm, 0x522, 0x3f); + odm_set_bb_reg(dm, 0x550, BIT(11) | BIT(3), 0x0); + odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */ + odm_set_bb_reg(dm, 0x838, 0xf, 0xc); /* CCA off */ + odm_write_1byte(dm, 0xa07, 0xf); /* CCK RX path off */ +} + +void _iqk_tx_8821a( + struct dm_struct *dm, + enum rf_path path +) +{ + u32 TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0; + int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, tx_average = 0, rx_average = 0, rx_iqk_loop = 0, RX_X_temp = 0, RX_Y_temp = 0; + int TX_X0[cal_num_8821A], TX_Y0[cal_num_8821A], RX_X0[2][cal_num_8821A], RX_Y0[2][cal_num_8821A]; + boolean TX0IQKOK = false, RX0IQKOK = false; + boolean VDF_enable = false; + int i, k, VDF_Y[3], VDF_X[3], tx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish1 = 0, RX_finish2 = 0; + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "band_width = %d, support_interface = %d, ext_pa = %d, ext_pa_5g = %d\n", *dm->band_width, dm->support_interface, dm->ext_pa, dm->ext_pa_5g); + if (*dm->band_width == 2) + VDF_enable = true; + + while (cal < cal_num_8821A) { + switch (path) { + case RF_PATH_A: + { + /* path-A LOK */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* ========path-A AFE all on======== */ + /* Port 0 DAC/ADC on */ + odm_write_4byte(dm, 0xc60, 0x77777777); + odm_write_4byte(dm, 0xc64, 0x77777777); + + odm_write_4byte(dm, 0xc68, 0x19791979); + + odm_set_bb_reg(dm, 0xc00, 0xf, 0x4);/* hardware 3-wire off */ + + /* LOK setting */ + /* ====== LOK ====== */ + /* 1. DAC/ADC sampling rate (160 MHz) */ + odm_set_bb_reg(dm, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7); + + /* 2. LoK RF setting (at BW = 20M) */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80002); + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403f4); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x68163e96); + else + odm_write_4byte(dm, 0xc8c, 0x28163e96); + + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0x58, 0x7fe00, + odm_get_rf_reg(dm, (enum rf_path)path, 0x8, 0xffc00)); + switch (*dm->band_width) { + case 1: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x1); + } + break; + case 2: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x0); + } + break; + default: + break; + } + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + /* 3. TX RF setting */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403e3); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x40163e96); + else + odm_write_4byte(dm, 0xc8c, 0x00163e96); + + if (VDF_enable == 1) { + for (k = 0; k <= 2; k++) { + switch (k) { + case 0: + { + odm_write_4byte(dm, 0xc80, 0x18008c38);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c38);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); + } + break; + case 1: + { + odm_set_bb_reg(dm, 0xc80, BIT(28), 0x0); + odm_set_bb_reg(dm, 0xc84, BIT(28), 0x0); + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); + } + break; + case 2: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1] >> 21 & 0x00007ff, VDF_Y[0] >> 21 & 0x00007ff); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1] >> 21 & 0x00007ff, VDF_X[0] >> 21 & 0x00007ff); + tx_dt[cal] = (VDF_Y[1] >> 20) - (VDF_Y[0] >> 20); + tx_dt[cal] = ((16 * tx_dt[cal]) * 10000 / 15708); + tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0)); + odm_write_4byte(dm, 0xc80, 0x18008c20);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c20);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x1); + odm_set_bb_reg(dm, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff); + } + break; + } + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + VDF_X[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + VDF_Y[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + if (k == 3) { + TX_X0[cal] = VDF_X[k - 1] ; + TX_Y0[cal] = VDF_Y[k - 1]; + } + } else { + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + TX_X0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + TX_Y0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK == false) + break; /* TXK fail, Don't do RXK */ + + /* ====== RX IQK ====== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* 1. RX RF setting */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x30000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0002f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xfffbb); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x88001); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d8); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + + if ((get_bonding_type_8881A() == BOND_8881AM) && (dm->ext_pa_5g) && (dm->ext_lna_5g)) { + odm_set_rf_reg(dm, (enum rf_path)path, 0xdf, 0x00800, 0x1); + odm_set_rf_reg(dm, (enum rf_path)path, 0x56, 0x003e0, 0x1); + } + + odm_set_bb_reg(dm, 0x978, 0x03FF8000, (TX_X0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, 0x000007FF, (TX_Y0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, BIT(31), 0x1); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0x978 = 0x%x\n", odm_get_bb_reg(dm, 0x978, MASKDWORD)); + odm_set_bb_reg(dm, 0x97c, BIT(31), 0x0); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_write_4byte(dm, 0x984, 0x0046a911); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x38008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x18008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xc88, 0x02140119); + + if (dm->support_interface == 1) { + rx_iqk_loop = 2; /* for 2% fail; */ + } else + rx_iqk_loop = 1; + for (i = 0; i < rx_iqk_loop; i++) { + if (dm->support_interface == 1) + if (i == 0) { + if ((get_bonding_type_8881A() == BOND_8881AM) && (dm->ext_pa_5g) && (dm->ext_lna_5g)) + odm_write_4byte(dm, 0xc8c, 0x28161800); /* Good */ + else + odm_write_4byte(dm, 0xc8c, 0x28161100); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xc8c (i=0) = 0x%x\n", odm_get_bb_reg(dm, 0xc8c, MASKDWORD)); + } else { + if ((get_bonding_type_8881A() == BOND_8881AM) && (dm->ext_pa_5g) && (dm->ext_lna_5g)) + odm_write_4byte(dm, 0xc8c, 0x28160c00); + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xc8c = 0x%x\n", odm_get_bb_reg(dm, 0xc8c, MASKDWORD)); + } + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + odm_set_rf_reg(dm, RF_PATH_A, 0xdf, 0x00800, 0x0); + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============RXIQK Check============== */ + RX_fail = odm_get_bb_reg(dm, 0xd00, BIT(11)); + if (RX_fail == 0) { + /* + dbg_print("====== RXIQK (%d) ======", i); + odm_write_4byte(dm, 0xcb8, 0x05000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x06000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + dbg_print("reg1 = %d, reg2 = %d", reg1, reg2); + image_power = (reg2<<32)+reg1; + dbg_print("Before PW = %d\n", image_power); + odm_write_4byte(dm, 0xcb8, 0x07000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x08000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + image_power = (reg2<<32)+reg1; + dbg_print("After PW = %d\n", image_power); + */ + + odm_write_4byte(dm, 0xcb8, 0x06000000); + RX_X0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x08000000); + RX_Y0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + RX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x200 >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, 0x0 >> 1); + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + + } + } else { + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK) + tx_average++; + if (RX0IQKOK) + rx_average++; + } + break; + default: + break; + } + cal++; + } + /* FillIQK Result */ + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "========Path_A =======\n"); + if (tx_average == 0) + break; + + for (i = 0; i < tx_average; i++) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i]) >> 21 & 0x000007ff, i, (TX_Y0[i]) >> 21 & 0x000007ff); + for (i = 0; i < tx_average; i++) { + for (ii = i + 1; ii < tx_average; ii++) { + dx = (TX_X0[i] >> 21) - (TX_X0[ii] >> 21); + if (dx < 3 && dx > -3) { + dy = (TX_Y0[i] >> 21) - (TX_Y0[ii] >> 21); + if (dy < 3 && dy > -3) { + TX_X = ((TX_X0[i] >> 21) + (TX_X0[ii] >> 21)) / 2; + TX_Y = ((TX_Y0[i] >> 21) + (TX_Y0[ii] >> 21)) / 2; + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + + if (TX_finish == 1) + _iqk_tx_fill_iqc_8821a(dm, path, TX_X, TX_Y); + else + _iqk_tx_fill_iqc_8821a(dm, path, 0x200, 0x0); + + if (rx_average == 0) + break; + + for (i = 0; i < rx_average; i++) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X0[0][%d] = %x ;; RX_Y0[0][%d] = %x\n", i, (RX_X0[0][i]) >> 21 & 0x000007ff, i, (RX_Y0[0][i]) >> 21 & 0x000007ff); + if (rx_iqk_loop == 2) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X0[1][%d] = %x ;; RX_Y0[1][%d] = %x\n", i, (RX_X0[1][i]) >> 21 & 0x000007ff, i, (RX_Y0[1][i]) >> 21 & 0x000007ff); + } + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[0][i] >> 21) - (RX_X0[0][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[0][i] >> 21) - (RX_Y0[0][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X_temp = ((RX_X0[0][i] >> 21) + (RX_X0[0][ii] >> 21)) / 2; + RX_Y_temp = ((RX_Y0[0][i] >> 21) + (RX_Y0[0][ii] >> 21)) / 2; + RX_finish1 = 1; + break; + } + } + } + if (RX_finish1 == 1) { + RX_X = RX_X_temp; + RX_Y = RX_Y_temp; + break; + } + } + if (rx_iqk_loop == 2) { + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[1][i] >> 21) - (RX_X0[1][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[1][i] >> 21) - (RX_Y0[1][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X = ((RX_X0[1][i] >> 21) + (RX_X0[1][ii] >> 21)) / 2; + RX_Y = ((RX_Y0[1][i] >> 21) + (RX_Y0[1][ii] >> 21)) / 2; + RX_finish2 = 1; + break; + } + } + } + if (RX_finish2 == 1) + break; + } + if (RX_finish1 && RX_finish2) { + RX_X = (RX_X + RX_X_temp) / 2; + RX_Y = (RX_Y + RX_Y_temp) / 2; + } + } + if (RX_finish1 || RX_finish2) + _iqk_rx_fill_iqc_8821a(dm, path, RX_X, RX_Y); + else + _iqk_rx_fill_iqc_8821a(dm, path, 0x200, 0x0); + } + break; + default: + break; + } + +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + if (!TX0IQKOK) + panic_printk("[IQK] please check TXIQK\n"); + if (!RX0IQKOK) + panic_printk("[IQK] please check RXIQK\n"); +#endif +} + + +/*IQK: 0x1*/ +/*1. add IQK debug message*/ +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +) +{ + u32 MACBB_backup[MACBB_REG_NUM_8821A], AFE_backup[AFE_REG_NUM_8821A], RFA_backup[RF_REG_NUM_8821A], RFB_backup[RF_REG_NUM_8821A]; + u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = {0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c}; + u32 backup_afe_reg[AFE_REG_NUM_8821A] = {0xc5c, 0xc60, 0xc64, 0xc68}; + u32 backup_rf_reg[RF_REG_NUM_8821A] = {0x65, 0x8f, 0x0}; + + _iqk_backup_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); + _iqk_backup_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); + _iqk_backup_rf_8821a(dm, RFA_backup, RFB_backup, backup_rf_reg, RF_REG_NUM_8821A); + + _iqk_configure_mac_8821a(dm); + _iqk_tx_8821a(dm, RF_PATH_A); + + _iqk_restore_rf_8821a(dm, RF_PATH_A, backup_rf_reg, RFA_backup, RF_REG_NUM_8821A); + _iqk_restore_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); + _iqk_restore_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); +} + +void +phy_reset_iqk_result_8821a( + struct dm_struct *dm +) +{ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + odm_write_4byte(dm, 0xce8, 0x0); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x100); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, 0x0); +} + +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + u32 counter = 0; + + _phy_iq_calibrate_8821a(dm); +} \ No newline at end of file diff --git a/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h new file mode 100644 index 0000000..82cbf62 --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ap.h @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#ifndef __PHYDM_IQK_8821A_H__ +#define __PHYDM_IQK_8821A_H__ + +/*--------------------------Define Parameters-------------------------------*/ + + +/*---------------------------End Define Parameters-------------------------------*/ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void +do_iqk_8821a( + struct dm_struct *dm, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +); +void +phy_iq_calibrate_8821a( + struct dm_struct *dm, + boolean is_recovery +); +#else +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +); +#endif +#endif /* #ifndef __PHYDM_IQK_8821A_H__ */ diff --git a/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c new file mode 100644 index 0000000..b6491ba --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c @@ -0,0 +1,773 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#include "mp_precomp.h" +#include "../../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +#define cal_num_8821A 3 +#define MACBB_REG_NUM_8821A 8 +#define AFE_REG_NUM_8821A 4 +#define RF_REG_NUM_8821A 3 +/*---------------------------Define Local Constant---------------------------*/ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void do_iqk_8821a( + void *dm_void, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + dm->rf_calibrate_info.thermal_value_iqk = thermal_value; + halrf_iqk_trigger(dm, false); +} +#endif +void _iqk_rx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int RX_X, + unsigned int RX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, RX_X >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, (RX_Y >> 1) & 0x000003ff); + PHYDM_DBG(dm, DBG_COMP_MCC, "RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X >> 1, RX_Y >> 1); + PHYDM_DBG(dm, DBG_COMP_MCC, "0xc10 = %x ====>fill to IQC\n", odm_read_4byte(dm, 0xc10)); + } + break; + default: + break; + }; +} + +void _iqk_tx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int TX_X, + unsigned int TX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_set_bb_reg(dm, 0xccc, 0x000007ff, TX_Y); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, TX_X); + PHYDM_DBG(dm, DBG_COMP_MCC, "TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y); + PHYDM_DBG(dm, DBG_COMP_MCC, "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", odm_get_bb_reg(dm, 0xcd4, 0x000007ff), odm_get_bb_reg(dm, 0xccc, 0x000007ff)); + } + break; + default: + break; + }; +} + +void _iqk_backup_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* save MACBB default value */ + for (i = 0; i < MACBB_NUM; i++) + MACBB_backup[i] = odm_read_4byte(dm, backup_macbb_reg[i]); + + PHYDM_DBG(dm, DBG_COMP_MCC, "BackupMacBB Success!!!!\n"); +} + +void _iqk_backup_rf_8821a( + struct dm_struct *dm, + u32 *RFA_backup, + u32 *RFB_backup, + u32 *backup_rf_reg, + u32 RF_NUM +) +{ + + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save RF Parameters */ + for (i = 0; i < RF_NUM; i++) + RFA_backup[i] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], MASKDWORD); + PHYDM_DBG(dm, DBG_COMP_MCC, "BackupRF Success!!!!\n"); +} + +void _iqk_backup_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + AFE_backup[i] = odm_read_4byte(dm, backup_afe_reg[i]); + PHYDM_DBG(dm, DBG_COMP_MCC, "BackupAFE Success!!!!\n"); +} + +void _iqk_restore_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload MacBB Parameters */ + for (i = 0; i < MACBB_NUM; i++) + odm_write_4byte(dm, backup_macbb_reg[i], MACBB_backup[i]); + PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreMacBB Success!!!!\n"); +} + +void _iqk_restore_rf_8821a( + struct dm_struct *dm, + enum rf_path path, + u32 *backup_rf_reg, + u32 *RF_backup, + u32 RF_REG_NUM +) +{ + u32 i; + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + for (i = 0; i < RF_REG_NUM; i++) + odm_set_rf_reg(dm, (enum rf_path)path, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i]); + + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreRF path A Success!!!!\n"); + } + break; + default: + break; + } +} + +void _iqk_restore_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + odm_write_4byte(dm, backup_afe_reg[i], AFE_backup[i]); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x0); + odm_write_4byte(dm, 0xc84, 0x0); + odm_write_4byte(dm, 0xc88, 0x0); + odm_write_4byte(dm, 0xc8c, 0x3c000000); + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xc94, 0x00000000); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_write_4byte(dm, 0xcb8, 0x0); + PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreAFE Success!!!!\n"); +} + +void _iqk_configure_mac_8821a( + struct dm_struct *dm +) +{ + /* ========MAC register setting======== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_write_1byte(dm, 0x522, 0x3f); + odm_set_bb_reg(dm, 0x550, BIT(11) | BIT(3), 0x0); + odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */ + odm_set_bb_reg(dm, 0x838, 0xf, 0xc); /* CCA off */ + odm_write_1byte(dm, 0xa07, 0xf); /* CCK RX path off */ +} + +void _iqk_tx_8821a( + struct dm_struct *dm, + enum rf_path path +) +{ + u32 TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0; + int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, tx_average = 0, rx_average = 0, rx_iqk_loop = 0, RX_X_temp = 0, RX_Y_temp = 0; + int TX_X0[cal_num_8821A], TX_Y0[cal_num_8821A], RX_X0[2][cal_num_8821A], RX_Y0[2][cal_num_8821A]; + boolean TX0IQKOK = false, RX0IQKOK = false; + boolean VDF_enable = false; + int i, k, VDF_Y[3], VDF_X[3], tx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish1 = 0, RX_finish2 = 0; + + PHYDM_DBG(dm, DBG_COMP_MCC, "band_width = %d, support_interface = %d, ext_pa = %d, ext_pa_5g = %d\n", *dm->band_width, dm->support_interface, dm->ext_pa, dm->ext_pa_5g); + if (*dm->band_width == 2) + VDF_enable = true; + + while (cal < cal_num_8821A) { + switch (path) { + case RF_PATH_A: + { + /* path-A LOK */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* ========path-A AFE all on======== */ + /* Port 0 DAC/ADC on */ + odm_write_4byte(dm, 0xc60, 0x77777777); + odm_write_4byte(dm, 0xc64, 0x77777777); + + odm_write_4byte(dm, 0xc68, 0x19791979); + + odm_set_bb_reg(dm, 0xc00, 0xf, 0x4);/* hardware 3-wire off */ + + /* LOK setting */ + /* ====== LOK ====== */ + /* 1. DAC/ADC sampling rate (160 MHz) */ + odm_set_bb_reg(dm, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7); + + /* 2. LoK RF setting (at BW = 20M) */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80002); + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + + if (dm->rf_calibrate_info.is_iqk_pa_off == 1) + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3ec3); + else + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403f4); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x68163e96); + else + odm_write_4byte(dm, 0xc8c, 0x28163e96); + + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20]iqk_dpk module */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0x58, 0x7fe00, odm_get_rf_reg(dm, (enum rf_path)path, 0x8, 0xffc00)); + switch (*dm->band_width) { + case 1: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x1); + } + break; + case 2: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x0); + } + break; + default: + break; + } + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + /* 3. TX RF setting */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + + if (dm->rf_calibrate_info.is_iqk_pa_off == 1) + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3ec3); + else + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403e3); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x40163e96); + else + odm_write_4byte(dm, 0xc8c, 0x00163e96); + + if (VDF_enable == 1) { + for (k = 0; k <= 2; k++) { + switch (k) { + case 0: + { + odm_write_4byte(dm, 0xc80, 0x18008c38);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c38);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); + } + break; + case 1: + { + odm_set_bb_reg(dm, 0xc80, BIT(28), 0x0); + odm_set_bb_reg(dm, 0xc84, BIT(28), 0x0); + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); + } + break; + case 2: + { + PHYDM_DBG(dm, DBG_COMP_MCC, "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1] >> 21 & 0x00007ff, VDF_Y[0] >> 21 & 0x00007ff); + PHYDM_DBG(dm, DBG_COMP_MCC, "VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1] >> 21 & 0x00007ff, VDF_X[0] >> 21 & 0x00007ff); + tx_dt[cal] = (VDF_Y[1] >> 20) - (VDF_Y[0] >> 20); + tx_dt[cal] = ((16 * tx_dt[cal]) * 10000 / 15708); + tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0)); + odm_write_4byte(dm, 0xc80, 0x18008c20);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c20);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x1); + odm_set_bb_reg(dm, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff); + } + break; + } + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] iqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + VDF_X[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + VDF_Y[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + if (k == 3) { + TX_X0[cal] = VDF_X[k - 1] ; + TX_Y0[cal] = VDF_Y[k - 1]; + } + } else { + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] iqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + TX_X0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + TX_Y0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK == false) + break; /* TXK fail, Don't do RXK */ + + /* ====== RX IQK ====== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* 1. RX RF setting */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x30000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0002f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xfffbb); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x88001); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d8); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + + odm_set_bb_reg(dm, 0x978, 0x03FF8000, (TX_X0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, 0x000007FF, (TX_Y0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, BIT(31), 0x1); + odm_set_bb_reg(dm, 0x97c, BIT(31), 0x0); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_write_4byte(dm, 0x984, 0x0046a911); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x38008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x18008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xc88, 0x02140119); + + if (dm->support_interface == 1) { + rx_iqk_loop = 2; /* for 2% fail; */ + } else + rx_iqk_loop = 1; + for (i = 0; i < rx_iqk_loop; i++) { + if (dm->support_interface == 1) + if (i == 0) + odm_write_4byte(dm, 0xc8c, 0x28161100); /* Good */ + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] iqk_dpk module */ + + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============RXIQK Check============== */ + RX_fail = odm_get_bb_reg(dm, 0xd00, BIT(11)); + if (RX_fail == 0) { + /* + dbg_print("====== RXIQK (%d) ======", i); + odm_write_4byte(dm, 0xcb8, 0x05000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x06000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + dbg_print("reg1 = %d, reg2 = %d", reg1, reg2); + image_power = (reg2<<32)+reg1; + dbg_print("Before PW = %d\n", image_power); + odm_write_4byte(dm, 0xcb8, 0x07000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x08000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + image_power = (reg2<<32)+reg1; + dbg_print("After PW = %d\n", image_power); + */ + + odm_write_4byte(dm, 0xcb8, 0x06000000); + RX_X0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x08000000); + RX_Y0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + RX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x200 >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, 0x0 >> 1); + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + + } + } else { + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK) + tx_average++; + if (RX0IQKOK) + rx_average++; + } + break; + default: + break; + } + cal++; + } + /* FillIQK Result */ + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, DBG_COMP_MCC, "========Path_A =======\n"); + if (tx_average == 0) + break; + + for (i = 0; i < tx_average; i++) + PHYDM_DBG(dm, DBG_COMP_MCC, "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i]) >> 21 & 0x000007ff, i, (TX_Y0[i]) >> 21 & 0x000007ff); + for (i = 0; i < tx_average; i++) { + for (ii = i + 1; ii < tx_average; ii++) { + dx = (TX_X0[i] >> 21) - (TX_X0[ii] >> 21); + if (dx < 3 && dx > -3) { + dy = (TX_Y0[i] >> 21) - (TX_Y0[ii] >> 21); + if (dy < 3 && dy > -3) { + TX_X = ((TX_X0[i] >> 21) + (TX_X0[ii] >> 21)) / 2; + TX_Y = ((TX_Y0[i] >> 21) + (TX_Y0[ii] >> 21)) / 2; + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + + if (TX_finish == 1) + _iqk_tx_fill_iqc_8821a(dm, path, TX_X, TX_Y); + else + _iqk_tx_fill_iqc_8821a(dm, path, 0x200, 0x0); + + if (rx_average == 0) + break; + + for (i = 0; i < rx_average; i++) { + PHYDM_DBG(dm, DBG_COMP_MCC, "RX_X0[0][%d] = %x ;; RX_Y0[0][%d] = %x\n", i, (RX_X0[0][i]) >> 21 & 0x000007ff, i, (RX_Y0[0][i]) >> 21 & 0x000007ff); + if (rx_iqk_loop == 2) { + PHYDM_DBG(dm, DBG_COMP_MCC, "RX_X0[1][%d] = %x ;; RX_Y0[1][%d] = %x\n", i, (RX_X0[1][i]) >> 21 & 0x000007ff, i, (RX_Y0[1][i]) >> 21 & 0x000007ff); + } + } + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[0][i] >> 21) - (RX_X0[0][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[0][i] >> 21) - (RX_Y0[0][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X_temp = ((RX_X0[0][i] >> 21) + (RX_X0[0][ii] >> 21)) / 2; + RX_Y_temp = ((RX_Y0[0][i] >> 21) + (RX_Y0[0][ii] >> 21)) / 2; + RX_finish1 = 1; + break; + } + } + } + if (RX_finish1 == 1) { + RX_X = RX_X_temp; + RX_Y = RX_Y_temp; + break; + } + } + if (rx_iqk_loop == 2) { + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[1][i] >> 21) - (RX_X0[1][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[1][i] >> 21) - (RX_Y0[1][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X = ((RX_X0[1][i] >> 21) + (RX_X0[1][ii] >> 21)) / 2; + RX_Y = ((RX_Y0[1][i] >> 21) + (RX_Y0[1][ii] >> 21)) / 2; + RX_finish2 = 1; + break; + } + } + } + if (RX_finish2 == 1) + break; + } + if (RX_finish1 && RX_finish2) { + RX_X = (RX_X + RX_X_temp) / 2; + RX_Y = (RX_Y + RX_Y_temp) / 2; + } + } + if (RX_finish1 || RX_finish2) + _iqk_rx_fill_iqc_8821a(dm, path, RX_X, RX_Y); + else + _iqk_rx_fill_iqc_8821a(dm, path, 0x200, 0x0); + } + break; + default: + break; + } +} + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void +_phy_iq_calibrate_by_fw_8821a( + struct dm_struct *dm +) +{ + + u8 iqk_cmd[3] = { *dm->channel, 0x0, 0x0}; + u8 buf1 = 0x0; + u8 buf2 = 0x0; + PHYDM_DBG(dm, DBG_COMP_MCC, "channel: %d\n", *dm->channel); + + + /* Byte 2, Bit 4 ~ Bit 5 : band_type */ + if (*dm->band_type == ODM_BAND_5G) + buf1 = 0x2 << 4; + else + buf1 = 0x1 << 4; + + /* Byte 2, Bit 0 ~ Bit 3 : bandwidth */ + if (*dm->band_width == CHANNEL_WIDTH_20) + buf2 = 0x1; + else if (*dm->band_width == CHANNEL_WIDTH_40) + buf2 = 0x1 << 1; + else if (*dm->band_width == CHANNEL_WIDTH_80) + buf2 = 0x1 << 2; + else + buf2 = 0x1 << 3; + + iqk_cmd[1] = buf1 | buf2; + iqk_cmd[2] = dm->ext_pa_5g | dm->ext_lna_5g << 1; + + odm_fill_h2c_cmd(dm, ODM_H2C_IQ_CALIBRATION, 3, iqk_cmd); +} +#endif + +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +) +{ + u32 MACBB_backup[MACBB_REG_NUM_8821A], AFE_backup[AFE_REG_NUM_8821A], RFA_backup[RF_REG_NUM_8821A], RFB_backup[RF_REG_NUM_8821A]; + u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = {0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c}; + u32 backup_afe_reg[AFE_REG_NUM_8821A] = {0xc5c, 0xc60, 0xc64, 0xc68}; + u32 backup_rf_reg[RF_REG_NUM_8821A] = {0x65, 0x8f, 0x0}; + + _iqk_backup_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); + _iqk_backup_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); + _iqk_backup_rf_8821a(dm, RFA_backup, RFB_backup, backup_rf_reg, RF_REG_NUM_8821A); + + _iqk_configure_mac_8821a(dm); + _iqk_tx_8821a(dm, RF_PATH_A); + + _iqk_restore_rf_8821a(dm, RF_PATH_A, backup_rf_reg, RFA_backup, RF_REG_NUM_8821A); + _iqk_restore_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); + _iqk_restore_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); +} + +void +phy_reset_iqk_result_8821a( + struct dm_struct *dm +) +{ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + odm_write_4byte(dm, 0xce8, 0x0); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x100); +} + + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +/*IQK: 0x1*/ +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + u32 counter = 0; + + if ((dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) && !(*(dm->mp_mode))) { + _phy_iq_calibrate_by_fw_8821a(dm); + phydm_iqk_wait(dm, 500); + if (dm->rf_calibrate_info.is_iqk_in_progress) { + PHYDM_DBG(dm, DBG_COMP_MCC, "== FW IQK TIMEOUT (Still in progress after 500ms) ==\n"); + } + } else + _phy_iq_calibrate_8821a(dm); +} +#endif diff --git a/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h new file mode 100644 index 0000000..23d61e5 --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#ifndef __PHYDM_IQK_8821A_H__ +#define __PHYDM_IQK_8821A_H__ + +/*--------------------------Define Parameters-------------------------------*/ + +/*---------------------------End Define Parameters-------------------------------*/ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void +do_iqk_8821a( + void *dm_void, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +); +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +); +#else +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +); +#endif +#endif /* #ifndef __PHYDM_IQK_8821A_H__ */ diff --git a/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c new file mode 100644 index 0000000..e1c267a --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.c @@ -0,0 +1,774 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#include "mp_precomp.h" +#include "../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +#define cal_num_8821A 3 +#define MACBB_REG_NUM_8821A 8 +#define AFE_REG_NUM_8821A 4 +#define RF_REG_NUM_8821A 3 +/*---------------------------Define Local Constant---------------------------*/ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void do_iqk_8821a( + struct dm_struct *dm, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +) +{ + dm->rf_calibrate_info.thermal_value_iqk = thermal_value; + halrf_iqk_trigger(dm, false); +} +#endif +void _iqk_rx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int RX_X, + unsigned int RX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, RX_X >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, (RX_Y >> 1) & 0x000003ff); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X >> 1, RX_Y >> 1); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xc10 = %x ====>fill to IQC\n", odm_read_4byte(dm, 0xc10)); + } + break; + default: + break; + }; +} + +void _iqk_tx_fill_iqc_8821a( + struct dm_struct *dm, + enum rf_path path, + unsigned int TX_X, + unsigned int TX_Y +) +{ + switch (path) { + case RF_PATH_A: + { + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_set_bb_reg(dm, 0xccc, 0x000007ff, TX_Y); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, TX_X); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", odm_get_bb_reg(dm, 0xcd4, 0x000007ff), odm_get_bb_reg(dm, 0xccc, 0x000007ff)); + } + break; + default: + break; + }; +} + +void _iqk_backup_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* save MACBB default value */ + for (i = 0; i < MACBB_NUM; i++) + MACBB_backup[i] = odm_read_4byte(dm, backup_macbb_reg[i]); + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupMacBB Success!!!!\n"); +} + +void _iqk_backup_rf_8821a( + struct dm_struct *dm, + u32 *RFA_backup, + u32 *RFB_backup, + u32 *backup_rf_reg, + u32 RF_NUM +) +{ + + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save RF Parameters */ + for (i = 0; i < RF_NUM; i++) + RFA_backup[i] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], MASKDWORD); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupRF Success!!!!\n"); +} + +void _iqk_backup_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Save AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + AFE_backup[i] = odm_read_4byte(dm, backup_afe_reg[i]); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "BackupAFE Success!!!!\n"); +} + +void _iqk_restore_mac_bb_8821a( + struct dm_struct *dm, + u32 *MACBB_backup, + u32 *backup_macbb_reg, + u32 MACBB_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload MacBB Parameters */ + for (i = 0; i < MACBB_NUM; i++) + odm_write_4byte(dm, backup_macbb_reg[i], MACBB_backup[i]); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreMacBB Success!!!!\n"); +} + +void _iqk_restore_rf_8821a( + struct dm_struct *dm, + enum rf_path path, + u32 *backup_rf_reg, + u32 *RF_backup, + u32 RF_REG_NUM +) +{ + u32 i; + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + for (i = 0; i < RF_REG_NUM; i++) + odm_set_rf_reg(dm, (enum rf_path)path, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i]); + + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreRF path A Success!!!!\n"); + } + break; + default: + break; + } +} + +void _iqk_restore_afe_8821a( + struct dm_struct *dm, + u32 *AFE_backup, + u32 *backup_afe_reg, + u32 AFE_NUM +) +{ + u32 i; + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* Reload AFE Parameters */ + for (i = 0; i < AFE_NUM; i++) + odm_write_4byte(dm, backup_afe_reg[i], AFE_backup[i]); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x0); + odm_write_4byte(dm, 0xc84, 0x0); + odm_write_4byte(dm, 0xc88, 0x0); + odm_write_4byte(dm, 0xc8c, 0x3c000000); + odm_write_4byte(dm, 0xc90, 0x00000080); + odm_write_4byte(dm, 0xc94, 0x00000000); + odm_write_4byte(dm, 0xcc4, 0x20040000); + odm_write_4byte(dm, 0xcc8, 0x20000000); + odm_write_4byte(dm, 0xcb8, 0x0); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RestoreAFE Success!!!!\n"); +} + +void _iqk_configure_mac_8821a( + struct dm_struct *dm +) +{ + /* ========MAC register setting======== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_write_1byte(dm, 0x522, 0x3f); + odm_set_bb_reg(dm, 0x550, BIT(11) | BIT(3), 0x0); + odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */ + odm_set_bb_reg(dm, 0x838, 0xf, 0xc); /* CCA off */ + odm_write_1byte(dm, 0xa07, 0xf); /* CCK RX path off */ +} + +void _iqk_tx_8821a( + struct dm_struct *dm, + enum rf_path path +) +{ + u32 TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0; + int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, tx_average = 0, rx_average = 0, rx_iqk_loop = 0, RX_X_temp = 0, RX_Y_temp = 0; + int TX_X0[cal_num_8821A], TX_Y0[cal_num_8821A], RX_X0[2][cal_num_8821A], RX_Y0[2][cal_num_8821A]; + boolean TX0IQKOK = false, RX0IQKOK = false; + boolean VDF_enable = false; + int i, k, VDF_Y[3], VDF_X[3], tx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish1 = 0, RX_finish2 = 0; + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "band_width = %d, support_interface = %d, ext_pa = %d, ext_pa_5g = %d\n", *dm->band_width, dm->support_interface, dm->ext_pa, dm->ext_pa_5g); + if (*dm->band_width == 2) + VDF_enable = true; + + while (cal < cal_num_8821A) { + switch (path) { + case RF_PATH_A: + { + /* path-A LOK */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* ========path-A AFE all on======== */ + /* Port 0 DAC/ADC on */ + odm_write_4byte(dm, 0xc60, 0x77777777); + odm_write_4byte(dm, 0xc64, 0x77777777); + + odm_write_4byte(dm, 0xc68, 0x19791979); + + odm_set_bb_reg(dm, 0xc00, 0xf, 0x4);/* hardware 3-wire off */ + + /* LOK setting */ + /* ====== LOK ====== */ + /* 1. DAC/ADC sampling rate (160 MHz) */ + odm_set_bb_reg(dm, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7); + + /* 2. LoK RF setting (at BW = 20M) */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80002); + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403f4); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x68163e96); + else + odm_write_4byte(dm, 0xc8c, 0x28163e96); + + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0x58, 0x7fe00, + odm_get_rf_reg(dm, (enum rf_path)path, 0x8, 0xffc00)); + + switch (*dm->band_width) { + case 1: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x1); + } + break; + case 2: + { + odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x0); + } + break; + default: + break; + } + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + /* 3. TX RF setting */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); + odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ + odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ + odm_write_4byte(dm, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + + if (dm->ext_pa_5g) + odm_write_4byte(dm, 0xc88, 0x821403f7); + else + odm_write_4byte(dm, 0xc88, 0x821403e3); + + if (*dm->band_type == ODM_BAND_5G) + odm_write_4byte(dm, 0xc8c, 0x40163e96); + else + odm_write_4byte(dm, 0xc8c, 0x00163e96); + + if (VDF_enable == 1) { + for (k = 0; k <= 2; k++) { + switch (k) { + case 0: + { + odm_write_4byte(dm, 0xc80, 0x18008c38);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c38);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); + } + break; + case 1: + { + odm_set_bb_reg(dm, 0xc80, BIT(28), 0x0); + odm_set_bb_reg(dm, 0xc84, BIT(28), 0x0); + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); + } + break; + case 2: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1] >> 21 & 0x00007ff, VDF_Y[0] >> 21 & 0x00007ff); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1] >> 21 & 0x00007ff, VDF_X[0] >> 21 & 0x00007ff); + tx_dt[cal] = (VDF_Y[1] >> 20) - (VDF_Y[0] >> 20); + tx_dt[cal] = ((16 * tx_dt[cal]) * 10000 / 15708); + tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0)); + odm_write_4byte(dm, 0xc80, 0x18008c20);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c20);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_set_bb_reg(dm, 0xce8, BIT(31), 0x1); + odm_set_bb_reg(dm, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff); + } + break; + } + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + VDF_X[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + VDF_Y[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + if (k == 3) { + TX_X0[cal] = VDF_X[k - 1] ; + TX_Y0[cal] = VDF_Y[k - 1]; + } + } else { + odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============TXIQK Check============== */ + TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); + + if (~TX_fail) { + odm_write_4byte(dm, 0xcb8, 0x02000000); + TX_X0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x04000000); + TX_Y0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + TX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } else { + TX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK == false) + break; /* TXK fail, Don't do RXK */ + + /* ====== RX IQK ====== */ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + /* 1. RX RF setting */ + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x30000); + odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0002f); + odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xfffbb); + odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x88001); + odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d8); + odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); + + odm_set_bb_reg(dm, 0x978, 0x03FF8000, (TX_X0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, 0x000007FF, (TX_Y0[cal]) >> 21 & 0x000007ff); + odm_set_bb_reg(dm, 0x978, BIT(31), 0x1); + odm_set_bb_reg(dm, 0x97c, BIT(31), 0x0); + odm_write_4byte(dm, 0x90c, 0x00008000); + odm_write_4byte(dm, 0x984, 0x0046a911); + + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_write_4byte(dm, 0xc80, 0x38008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ + odm_write_4byte(dm, 0xc84, 0x18008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ + odm_write_4byte(dm, 0xc88, 0x02140119); + + if (dm->support_interface == 1) { + rx_iqk_loop = 2; /* for 2% fail; */ + } else + rx_iqk_loop = 1; + for (i = 0; i < rx_iqk_loop; i++) { + if (dm->support_interface == 1) + if (i == 0) + odm_write_4byte(dm, 0xc8c, 0x28161100); /* Good */ + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + else + odm_write_4byte(dm, 0xc8c, 0x28160d00); + + odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] ±N SI/PI ¨Ï¥ÎÅv¤Áµ¹ iqk_dpk module */ + + cal_retry = 0; + while (1) { + /* one shot */ + odm_write_4byte(dm, 0x980, 0xfa000000); + odm_write_4byte(dm, 0x980, 0xf8000000); + + ODM_delay_ms(10); /* delay 10ms */ + odm_write_4byte(dm, 0xcb8, 0x00000000); + delay_count = 0; + while (1) { + IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); + if ((~IQK_ready) || (delay_count > 20)) + break; + else { + ODM_delay_ms(1); + delay_count++; + } + } + + if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ + /* ============RXIQK Check============== */ + RX_fail = odm_get_bb_reg(dm, 0xd00, BIT(11)); + if (RX_fail == 0) { + /* + dbg_print("====== RXIQK (%d) ======", i); + odm_write_4byte(dm, 0xcb8, 0x05000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x06000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + dbg_print("reg1 = %d, reg2 = %d", reg1, reg2); + image_power = (reg2<<32)+reg1; + dbg_print("Before PW = %d\n", image_power); + odm_write_4byte(dm, 0xcb8, 0x07000000); + reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); + odm_write_4byte(dm, 0xcb8, 0x08000000); + reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); + image_power = (reg2<<32)+reg1; + dbg_print("After PW = %d\n", image_power); + */ + + odm_write_4byte(dm, 0xcb8, 0x06000000); + RX_X0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + odm_write_4byte(dm, 0xcb8, 0x08000000); + RX_Y0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; + RX0IQKOK = true; + break; + } else { + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x200 >> 1); + odm_set_bb_reg(dm, 0xc10, 0x03ff0000, 0x0 >> 1); + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + + } + } else { + RX0IQKOK = false; + cal_retry++; + if (cal_retry == 10) + break; + } + } + } + + if (TX0IQKOK) + tx_average++; + if (RX0IQKOK) + rx_average++; + } + break; + default: + break; + } + cal++; + } + /* FillIQK Result */ + switch (path) { + case RF_PATH_A: + { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "========Path_A =======\n"); + if (tx_average == 0) + break; + + for (i = 0; i < tx_average; i++) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i]) >> 21 & 0x000007ff, i, (TX_Y0[i]) >> 21 & 0x000007ff); + for (i = 0; i < tx_average; i++) { + for (ii = i + 1; ii < tx_average; ii++) { + dx = (TX_X0[i] >> 21) - (TX_X0[ii] >> 21); + if (dx < 3 && dx > -3) { + dy = (TX_Y0[i] >> 21) - (TX_Y0[ii] >> 21); + if (dy < 3 && dy > -3) { + TX_X = ((TX_X0[i] >> 21) + (TX_X0[ii] >> 21)) / 2; + TX_Y = ((TX_Y0[i] >> 21) + (TX_Y0[ii] >> 21)) / 2; + TX_finish = 1; + break; + } + } + } + if (TX_finish == 1) + break; + } + + if (TX_finish == 1) + _iqk_tx_fill_iqc_8821a(dm, path, TX_X, TX_Y); + else + _iqk_tx_fill_iqc_8821a(dm, path, 0x200, 0x0); + + if (rx_average == 0) + break; + + for (i = 0; i < rx_average; i++) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X0[0][%d] = %x ;; RX_Y0[0][%d] = %x\n", i, (RX_X0[0][i]) >> 21 & 0x000007ff, i, (RX_Y0[0][i]) >> 21 & 0x000007ff); + if (rx_iqk_loop == 2) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "RX_X0[1][%d] = %x ;; RX_Y0[1][%d] = %x\n", i, (RX_X0[1][i]) >> 21 & 0x000007ff, i, (RX_Y0[1][i]) >> 21 & 0x000007ff); + } + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[0][i] >> 21) - (RX_X0[0][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[0][i] >> 21) - (RX_Y0[0][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X_temp = ((RX_X0[0][i] >> 21) + (RX_X0[0][ii] >> 21)) / 2; + RX_Y_temp = ((RX_Y0[0][i] >> 21) + (RX_Y0[0][ii] >> 21)) / 2; + RX_finish1 = 1; + break; + } + } + } + if (RX_finish1 == 1) { + RX_X = RX_X_temp; + RX_Y = RX_Y_temp; + break; + } + } + if (rx_iqk_loop == 2) { + for (i = 0; i < rx_average; i++) { + for (ii = i + 1; ii < rx_average; ii++) { + dx = (RX_X0[1][i] >> 21) - (RX_X0[1][ii] >> 21); + if (dx < 4 && dx > -4) { + dy = (RX_Y0[1][i] >> 21) - (RX_Y0[1][ii] >> 21); + if (dy < 4 && dy > -4) { + RX_X = ((RX_X0[1][i] >> 21) + (RX_X0[1][ii] >> 21)) / 2; + RX_Y = ((RX_Y0[1][i] >> 21) + (RX_Y0[1][ii] >> 21)) / 2; + RX_finish2 = 1; + break; + } + } + } + if (RX_finish2 == 1) + break; + } + if (RX_finish1 && RX_finish2) { + RX_X = (RX_X + RX_X_temp) / 2; + RX_Y = (RX_Y + RX_Y_temp) / 2; + } + } + if (RX_finish1 || RX_finish2) + _iqk_rx_fill_iqc_8821a(dm, path, RX_X, RX_Y); + else + _iqk_rx_fill_iqc_8821a(dm, path, 0x200, 0x0); + } + break; + default: + break; + } +} + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void +_phy_iq_calibrate_by_fw_8821a( + struct dm_struct *dm +) +{ + + u8 iqk_cmd[3] = { *dm->channel, 0x0, 0x0}; + u8 buf1 = 0x0; + u8 buf2 = 0x0; + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "channel: %d\n", *dm->channel); + + + /* Byte 2, Bit 4 ~ Bit 5 : band_type */ + if (*dm->band_type == ODM_BAND_5G) + buf1 = 0x2 << 4; + else + buf1 = 0x1 << 4; + + /* Byte 2, Bit 0 ~ Bit 3 : bandwidth */ + if (*dm->band_width == CHANNEL_WIDTH_20) + buf2 = 0x1; + else if (*dm->band_width == CHANNEL_WIDTH_40) + buf2 = 0x1 << 1; + else if (*dm->band_width == CHANNEL_WIDTH_80) + buf2 = 0x1 << 2; + else + buf2 = 0x1 << 3; + + iqk_cmd[1] = buf1 | buf2; + iqk_cmd[2] = dm->ext_pa_5g | dm->ext_lna_5g << 1; + + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK Start ==\n"); + dm->rf_calibrate_info.iqk_start_time = 0; + dm->rf_calibrate_info.iqk_start_time = odm_get_current_time(dm); + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== start_time: %lld\n", dm->rf_calibrate_info.iqk_start_time); + odm_fill_h2c_cmd(dm, ODM_H2C_IQ_CALIBRATION, 3, iqk_cmd); + + +} +#endif + +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +) +{ + u32 MACBB_backup[MACBB_REG_NUM_8821A], AFE_backup[AFE_REG_NUM_8821A], RFA_backup[RF_REG_NUM_8821A], RFB_backup[RF_REG_NUM_8821A]; + u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = {0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c}; + u32 backup_afe_reg[AFE_REG_NUM_8821A] = {0xc5c, 0xc60, 0xc64, 0xc68}; + u32 backup_rf_reg[RF_REG_NUM_8821A] = {0x65, 0x8f, 0x0}; + + _iqk_backup_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); + _iqk_backup_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); + _iqk_backup_rf_8821a(dm, RFA_backup, RFB_backup, backup_rf_reg, RF_REG_NUM_8821A); + + _iqk_configure_mac_8821a(dm); + _iqk_tx_8821a(dm, RF_PATH_A); + + _iqk_restore_rf_8821a(dm, RF_PATH_A, backup_rf_reg, RFA_backup, RF_REG_NUM_8821A); + _iqk_restore_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); + _iqk_restore_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); +} + +void +phy_reset_iqk_result_8821a( + struct dm_struct *dm +) +{ + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ + odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); + odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); + odm_write_4byte(dm, 0xce8, 0x0); + odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ + odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x100); +} + + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + u32 counter = 0; + + if ((dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) && !(*(dm->mp_mode))) { + _phy_iq_calibrate_by_fw_8821a(dm); + for (counter = 0; counter < 10; counter++) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK PROGRESS == #%d\n", counter); + ODM_delay_ms(50); + if (!dm->rf_calibrate_info.is_iqk_in_progress) { + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK RETURN FROM WAITING ==\n"); + break; + } + } + if (dm->rf_calibrate_info.is_iqk_in_progress) + PHYDM_DBG(dm, ODM_COMP_CALIBRATION, "== FW IQK TIMEOUT (Still in progress after 500ms) ==\n"); + } else + _phy_iq_calibrate_8821a(dm); +} +#endif diff --git a/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h new file mode 100644 index 0000000..d325102 --- /dev/null +++ b/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_win.h @@ -0,0 +1,42 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#ifndef __PHYDM_IQK_8821A_H__ +#define __PHYDM_IQK_8821A_H__ + +/*--------------------------Define Parameters-------------------------------*/ + + +/*---------------------------End Define Parameters-------------------------------*/ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) +void +do_iqk_8821a( + struct dm_struct *dm, + u8 delta_thermal_index, + u8 thermal_value, + u8 threshold +); +void +phy_iq_calibrate_8821a( + void *dm_void, + boolean is_recovery +); +#else +void +_phy_iq_calibrate_8821a( + struct dm_struct *dm +); +#endif +#endif /* #ifndef __PHYDM_IQK_8821A_H__ */ diff --git a/hal/phydm/phydm.c b/hal/phydm/phydm.c index d50e3cb..ae10b23 100644 --- a/hal/phydm/phydm.c +++ b/hal/phydm/phydm.c @@ -489,10 +489,12 @@ void phydm_hw_setting(struct dm_struct *dm) odm_hw_setting_8821a(dm); #endif +#if 0 /* TODO: implementation done but may not work and do nothing with current flags. Commenting the code to match previous version behavior*/ #if (RTL8814A_SUPPORT == 1) if (dm->support_ic_type & ODM_RTL8814A) phydm_hwsetting_8814a(dm); #endif +#endif #if (RTL8822B_SUPPORT == 1) if (dm->support_ic_type & ODM_RTL8822B) diff --git a/hal/phydm/phydm_debug.h b/hal/phydm/phydm_debug.h index 660f48f..a795f30 100644 --- a/hal/phydm/phydm_debug.h +++ b/hal/phydm/phydm_debug.h @@ -276,6 +276,8 @@ static __inline void PHYDM_DBG_F(PDM_ODM_T dm, int comp, char *fmt, ...) } while (0) #endif +#define ODM_RT_TRACE(dm, comp, level, fmt) + #else /*@#if DBG*/ #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) static __inline void PHYDM_DBG(struct dm_struct *dm, int comp, char *fmt, ...) @@ -309,7 +311,7 @@ static __inline void PHYDM_DBG_F(struct dm_struct *dm, int comp, char *fmt, ...) #define PHYDM_DBG_F(dm, comp, fmt, args...) #endif #define PHYDM_PRINT_ADDR(dm, comp, title_str, ptr) - +#define ODM_RT_TRACE(dm, comp, level, fmt) #endif #define DBGPORT_PRI_3 3 /*@Debug function (the highest priority)*/ diff --git a/hal/phydm/phydm_hwconfig.c b/hal/phydm/phydm_hwconfig.c index 3522817..d41fd11 100644 --- a/hal/phydm/phydm_hwconfig.c +++ b/hal/phydm/phydm_hwconfig.c @@ -189,7 +189,7 @@ odm_config_rf_with_header_file(struct dm_struct *dm, else if (e_rf_path == RF_PATH_D) READ_AND_CONFIG_MP(8814a, _radiod); } else if (config_type == CONFIG_RF_TXPWR_LMT) { - if (dm->rfe_type == 0) + /*if (dm->rfe_type == 0) READ_AND_CONFIG_MP(8814a, _txpwr_lmt_type0); else if (dm->rfe_type == 1) READ_AND_CONFIG_MP(8814a, _txpwr_lmt_type1); @@ -203,7 +203,7 @@ odm_config_rf_with_header_file(struct dm_struct *dm, READ_AND_CONFIG_MP(8814a, _txpwr_lmt_type7); else if (dm->rfe_type == 8) READ_AND_CONFIG_MP(8814a, _txpwr_lmt_type8); - else + else*/ READ_AND_CONFIG_MP(8814a, _txpwr_lmt); } } @@ -572,14 +572,14 @@ odm_config_rf_with_tx_pwr_track_header_file(struct dm_struct *dm) READ_AND_CONFIG_MP(8814a, _txpowertrack_type2); else if (dm->rfe_type == 5) READ_AND_CONFIG_MP(8814a, _txpowertrack_type5); - else if (dm->rfe_type == 7) + /*else if (dm->rfe_type == 7) READ_AND_CONFIG_MP(8814a, _txpowertrack_type7); else if (dm->rfe_type == 8) - READ_AND_CONFIG_MP(8814a, _txpowertrack_type8); + READ_AND_CONFIG_MP(8814a, _txpowertrack_type8);*/ else READ_AND_CONFIG_MP(8814a, _txpowertrack); - READ_AND_CONFIG_MP(8814a, _txpowertssi); + //READ_AND_CONFIG_MP(8814a, _txpowertssi); } #endif #if RTL8703B_SUPPORT @@ -914,7 +914,7 @@ odm_config_bb_with_header_file(struct dm_struct *dm, else if (config_type == CONFIG_BB_AGC_TAB) READ_AND_CONFIG_MP(8814a, _agc_tab); else if (config_type == CONFIG_BB_PHY_REG_PG) { - if (dm->rfe_type == 0) + /*if (dm->rfe_type == 0) READ_AND_CONFIG_MP(8814a, _phy_reg_pg_type0); else if (dm->rfe_type == 2) READ_AND_CONFIG_MP(8814a, _phy_reg_pg_type2); @@ -928,7 +928,7 @@ odm_config_bb_with_header_file(struct dm_struct *dm, READ_AND_CONFIG_MP(8814a, _phy_reg_pg_type7); else if (dm->rfe_type == 8) READ_AND_CONFIG_MP(8814a, _phy_reg_pg_type8); - else + else*/ READ_AND_CONFIG_MP(8814a, _phy_reg_pg); } else if (config_type == CONFIG_BB_PHY_REG_MP) READ_AND_CONFIG_MP(8814a, _phy_reg_mp); diff --git a/hal/phydm/rtl8814a/hal8814areg_odm.h b/hal/phydm/rtl8814a/hal8814areg_odm.h new file mode 100644 index 0000000..1cd4030 --- /dev/null +++ b/hal/phydm/rtl8814a/hal8814areg_odm.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +//============================================================ +/* File Name: hal8814areg_odm.h */ +// +// Description: +// +// This file is for RTL8814A register definition. +// +// +//============================================================ +#ifndef __HAL_8814A_REG_H__ +#define __HAL_8814A_REG_H__ + +// +// Register Definition +// +#define TRX_ANTDIV_PATH 0x860 +#define RX_ANTDIV_PATH 0xb2c +#define ODM_R_A_AGC_CORE1_8814A 0xc50 + + +// +// Bitmap Definition +// +#define BIT_FA_RESET_8814A BIT0 + + +#endif + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_bb.c b/hal/phydm/rtl8814a/halhwimg8814a_bb.c new file mode 100644 index 0000000..85e2f3f --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_bb.c @@ -0,0 +1,4489 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.19*/ +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) +static BOOLEAN +CheckPositive( + struct dm_struct *pDM_Odm, + const u32 Condition1, + const u32 Condition2, + const u32 Condition3, + const u32 Condition4 +) +{ + u1Byte _BoardType = ((pDM_Odm->board_type & BIT4) >> 4) << 0 | /* _GLNA*/ + ((pDM_Odm->board_type & BIT3) >> 3) << 1 | /* _GPA*/ + ((pDM_Odm->board_type & BIT7) >> 7) << 2 | /* _ALNA*/ + ((pDM_Odm->board_type & BIT6) >> 6) << 3 | /* _APA */ + ((pDM_Odm->board_type & BIT2) >> 2) << 4; /* _BT*/ + + u32 cond1 = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4; + u32 driver1 = pDM_Odm->cut_version << 24 | + (pDM_Odm->support_interface & 0xF0) << 16 | + pDM_Odm->support_platform << 16 | + pDM_Odm->package_type << 12 | + (pDM_Odm->support_interface & 0x0F) << 8 | + _BoardType; + + u32 driver2 = (pDM_Odm->type_glna & 0xFF) << 0 | + (pDM_Odm->type_gpa & 0xFF) << 8 | + (pDM_Odm->type_alna & 0xFF) << 16 | + (pDM_Odm->type_apa & 0xFF) << 24; + +u32 driver3 = 0; + + u32 driver4 = (pDM_Odm->type_glna & 0xFF00) >> 8 | + (pDM_Odm->type_gpa & 0xFF00) | + (pDM_Odm->type_alna & 0xFF00) << 8 | + (pDM_Odm->type_apa & 0xFF00) << 16; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + "===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + "===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + " (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->support_platform, pDM_Odm->support_interface); + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + " (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->board_type, pDM_Odm->package_type); + + + /*============== Value Defined Check ===============*/ + /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ + + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + return FALSE; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return FALSE; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u32 bitMask = 0; + + if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ + return TRUE; + + if ((cond1 & BIT0) != 0) /*GLNA*/ + bitMask |= 0x000000FF; + if ((cond1 & BIT1) != 0) /*GPA*/ + bitMask |= 0x0000FF00; + if ((cond1 & BIT2) != 0) /*ALNA*/ + bitMask |= 0x00FF0000; + if ((cond1 & BIT3) != 0) /*APA*/ + bitMask |= 0xFF000000; + + if (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask))) /* BoardType of each RF path is matched*/ + return TRUE; + else + return FALSE; + } else + return FALSE; +} +static BOOLEAN +CheckNegative( + struct dm_struct *pDM_Odm, + const u32 Condition1, + const u32 Condition2 +) +{ + return TRUE; +} + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +u32 Array_MP_8814A_AGC_TAB[] = { + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x81C, 0xFE000003, + 0x81C, 0xFF000003, + 0x81C, 0xFE020003, + 0x81C, 0xFD040003, + 0x81C, 0xFC060003, + 0x81C, 0xFB080003, + 0x81C, 0xFA0A0003, + 0x81C, 0xF90C0003, + 0x81C, 0xF80E0003, + 0x81C, 0xF7100003, + 0x81C, 0xF6120003, + 0x81C, 0xF5140003, + 0x81C, 0xF4160003, + 0x81C, 0xF3180003, + 0x81C, 0xF21A0003, + 0x81C, 0xF11C0003, + 0x81C, 0xF01E0003, + 0x81C, 0xEF200003, + 0x81C, 0xEE220003, + 0x81C, 0xED240003, + 0x81C, 0xEC260003, + 0x81C, 0xEB280003, + 0x81C, 0xEA2A0003, + 0x81C, 0xE92C0003, + 0x81C, 0xE82E0003, + 0x81C, 0xE7300003, + 0x81C, 0xE6320003, + 0x81C, 0xE5340003, + 0x81C, 0xE4360003, + 0x81C, 0xE3380003, + 0x81C, 0xC53A0003, + 0x81C, 0xC43C0003, + 0x81C, 0xC33E0003, + 0x81C, 0xC2400003, + 0x81C, 0xC1420003, + 0x81C, 0xA8440003, + 0x81C, 0xA7460003, + 0x81C, 0xA6480003, + 0x81C, 0xA54A0003, + 0x81C, 0xA44C0003, + 0x81C, 0xA34E0003, + 0x81C, 0xA2500003, + 0x81C, 0x65520003, + 0x81C, 0x64540003, + 0x81C, 0x63560003, + 0x81C, 0x62580003, + 0x81C, 0x615A0003, + 0x81C, 0x475C0003, + 0x81C, 0x465E0003, + 0x81C, 0x45600003, + 0x81C, 0x44620003, + 0x81C, 0x43640003, + 0x81C, 0x42660003, + 0x81C, 0x41680003, + 0x81C, 0x416A0003, + 0x81C, 0x416C0003, + 0x81C, 0x416E0003, + 0x81C, 0x41700003, + 0x81C, 0x41720003, + 0x81C, 0x41740003, + 0x81C, 0x41760003, + 0x81C, 0x41780003, + 0x81C, 0x417A0003, + 0x81C, 0x417C0003, + 0x81C, 0x417E0003, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x81C, 0xFE000003, + 0x81C, 0xFE000003, + 0x81C, 0xFD020003, + 0x81C, 0xFC040003, + 0x81C, 0xFB060003, + 0x81C, 0xFA080003, + 0x81C, 0xF90A0003, + 0x81C, 0xF80C0003, + 0x81C, 0xF70E0003, + 0x81C, 0xF6100003, + 0x81C, 0xF5120003, + 0x81C, 0xF4140003, + 0x81C, 0xF3160003, + 0x81C, 0xF2180003, + 0x81C, 0xF11A0003, + 0x81C, 0xF01C0003, + 0x81C, 0xEF1E0003, + 0x81C, 0xEE200003, + 0x81C, 0xED220003, + 0x81C, 0xEC240003, + 0x81C, 0xEB260003, + 0x81C, 0xEA280003, + 0x81C, 0xE92A0003, + 0x81C, 0xE82C0003, + 0x81C, 0xE72E0003, + 0x81C, 0xE6300003, + 0x81C, 0xE5320003, + 0x81C, 0xE4340003, + 0x81C, 0xE3360003, + 0x81C, 0xC6380003, + 0x81C, 0xC53A0003, + 0x81C, 0xC43C0003, + 0x81C, 0xC33E0003, + 0x81C, 0xC2400003, + 0x81C, 0xA9420003, + 0x81C, 0xA8440003, + 0x81C, 0xA7460003, + 0x81C, 0xA6480003, + 0x81C, 0xA54A0003, + 0x81C, 0xA44C0003, + 0x81C, 0xA34E0003, + 0x81C, 0x66500003, + 0x81C, 0x65520003, + 0x81C, 0x64540003, + 0x81C, 0x63560003, + 0x81C, 0x49580003, + 0x81C, 0x485A0003, + 0x81C, 0x475C0003, + 0x81C, 0x465E0003, + 0x81C, 0x45600003, + 0x81C, 0x44620003, + 0x81C, 0x43640003, + 0x81C, 0x42660003, + 0x81C, 0x41680003, + 0x81C, 0x416A0003, + 0x81C, 0x416C0003, + 0x81C, 0x416E0003, + 0x81C, 0x41700003, + 0x81C, 0x41720003, + 0x81C, 0x41740003, + 0x81C, 0x41760003, + 0x81C, 0x41780003, + 0x81C, 0x417A0003, + 0x81C, 0x417C0003, + 0x81C, 0x417E0003, + 0xA0000000, 0x00000000, + 0x81C, 0xFF000003, + 0x81C, 0xFE020003, + 0x81C, 0xFD040003, + 0x81C, 0xFC060003, + 0x81C, 0xFB080003, + 0x81C, 0xFA0A0003, + 0x81C, 0xF90C0003, + 0x81C, 0xF80E0003, + 0x81C, 0xF7100003, + 0x81C, 0xF6120003, + 0x81C, 0xF5140003, + 0x81C, 0xF4160003, + 0x81C, 0xF3180003, + 0x81C, 0xF21A0003, + 0x81C, 0xF11C0003, + 0x81C, 0xF01E0003, + 0x81C, 0xEF200003, + 0x81C, 0xEE220003, + 0x81C, 0xED240003, + 0x81C, 0xCF260003, + 0x81C, 0xCE280003, + 0x81C, 0xCD2A0003, + 0x81C, 0xCC2C0003, + 0x81C, 0xCB2E0003, + 0x81C, 0xCA300003, + 0x81C, 0xC9320003, + 0x81C, 0xC8340003, + 0x81C, 0xC7360003, + 0x81C, 0xC6380003, + 0x81C, 0xC53A0003, + 0x81C, 0xC43C0003, + 0x81C, 0xA63E0003, + 0x81C, 0xA5400003, + 0x81C, 0xA4420003, + 0x81C, 0xA3440003, + 0x81C, 0xA2460003, + 0x81C, 0xA1480003, + 0x81C, 0x864A0003, + 0x81C, 0x854C0003, + 0x81C, 0x844E0003, + 0x81C, 0x83500003, + 0x81C, 0x66520003, + 0x81C, 0x65540003, + 0x81C, 0x64560003, + 0x81C, 0x63580003, + 0x81C, 0x625A0003, + 0x81C, 0x615C0003, + 0x81C, 0x435E0003, + 0x81C, 0x42600003, + 0x81C, 0x41620003, + 0x81C, 0x27640003, + 0x81C, 0x26660003, + 0x81C, 0x25680003, + 0x81C, 0x246A0003, + 0x81C, 0x236C0003, + 0x81C, 0x226E0003, + 0x81C, 0x21700003, + 0x81C, 0x21720003, + 0x81C, 0x21740003, + 0x81C, 0x21760003, + 0x81C, 0x21780003, + 0x81C, 0x217A0003, + 0x81C, 0x217C0003, + 0x81C, 0x217E0003, + 0x81C, 0x217E0003, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x81C, 0xFA000103, + 0x81C, 0xF9020103, + 0x81C, 0xF8040103, + 0x81C, 0xF7060103, + 0x81C, 0xF6080103, + 0x81C, 0xF50A0103, + 0x81C, 0xF40C0103, + 0x81C, 0xF30E0103, + 0x81C, 0xF2100103, + 0x81C, 0xF1120103, + 0x81C, 0xF0140103, + 0x81C, 0xEF160103, + 0x81C, 0xEE180103, + 0x81C, 0xED1A0103, + 0x81C, 0xEC1C0103, + 0x81C, 0xEB1E0103, + 0x81C, 0xEA200103, + 0x81C, 0xE9220103, + 0x81C, 0xE8240103, + 0x81C, 0xE7260103, + 0x81C, 0xE6280103, + 0x81C, 0xE52A0103, + 0x81C, 0xE42C0103, + 0x81C, 0xE32E0103, + 0x81C, 0xE2300103, + 0x81C, 0xE1320103, + 0x81C, 0xA5340103, + 0x81C, 0xA4360103, + 0x81C, 0xA3380103, + 0x81C, 0xA23A0103, + 0x81C, 0xA13C0103, + 0x81C, 0x843E0103, + 0x81C, 0x83400103, + 0x81C, 0x82420103, + 0x81C, 0x81440103, + 0x81C, 0x64460103, + 0x81C, 0x63480103, + 0x81C, 0x624A0103, + 0x81C, 0x614C0103, + 0x81C, 0x454E0103, + 0x81C, 0x44500103, + 0x81C, 0x43520103, + 0x81C, 0x42540103, + 0x81C, 0x41560103, + 0x81C, 0x24580103, + 0x81C, 0x235A0103, + 0x81C, 0x225C0103, + 0x81C, 0x055E0103, + 0x81C, 0x04600103, + 0x81C, 0x03620103, + 0x81C, 0x02640103, + 0x81C, 0x01660103, + 0x81C, 0x01680103, + 0x81C, 0x016A0103, + 0x81C, 0x016C0103, + 0x81C, 0x016E0103, + 0x81C, 0x01700103, + 0x81C, 0x01720103, + 0x81C, 0x01740103, + 0x81C, 0x01760103, + 0x81C, 0x01780103, + 0x81C, 0x017A0103, + 0x81C, 0x017C0103, + 0x81C, 0x017E0103, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x81C, 0xF8000103, + 0x81C, 0xF7020103, + 0x81C, 0xF6040103, + 0x81C, 0xF5060103, + 0x81C, 0xF4080103, + 0x81C, 0xF30A0103, + 0x81C, 0xF20C0103, + 0x81C, 0xF10E0103, + 0x81C, 0xF0100103, + 0x81C, 0xEF120103, + 0x81C, 0xEE140103, + 0x81C, 0xED160103, + 0x81C, 0xEC180103, + 0x81C, 0xEB1A0103, + 0x81C, 0xEA1C0103, + 0x81C, 0xE91E0103, + 0x81C, 0xE8200103, + 0x81C, 0xE7220103, + 0x81C, 0xE6240103, + 0x81C, 0xE5260103, + 0x81C, 0xE4280103, + 0x81C, 0xE32A0103, + 0x81C, 0xE22C0103, + 0x81C, 0xE12E0103, + 0x81C, 0xA5300103, + 0x81C, 0xA4320103, + 0x81C, 0xA3340103, + 0x81C, 0xA2360103, + 0x81C, 0xA1380103, + 0x81C, 0x843A0103, + 0x81C, 0x833C0103, + 0x81C, 0x823E0103, + 0x81C, 0x81400103, + 0x81C, 0x64420103, + 0x81C, 0x63440103, + 0x81C, 0x62460103, + 0x81C, 0x61480103, + 0x81C, 0x454A0103, + 0x81C, 0x444C0103, + 0x81C, 0x434E0103, + 0x81C, 0x42500103, + 0x81C, 0x25520103, + 0x81C, 0x24540103, + 0x81C, 0x23560103, + 0x81C, 0x06580103, + 0x81C, 0x055A0103, + 0x81C, 0x045C0103, + 0x81C, 0x035E0103, + 0x81C, 0x02600103, + 0x81C, 0x01620103, + 0x81C, 0x01640103, + 0x81C, 0x01660103, + 0x81C, 0x01680103, + 0x81C, 0x016A0103, + 0x81C, 0x016C0103, + 0x81C, 0x016E0103, + 0x81C, 0x01700103, + 0x81C, 0x01720103, + 0x81C, 0x01740103, + 0x81C, 0x01760103, + 0x81C, 0x01780103, + 0x81C, 0x017A0103, + 0x81C, 0x017C0103, + 0x81C, 0x017E0103, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x81C, 0xFC000103, + 0x81C, 0xFB020103, + 0x81C, 0xFA040103, + 0x81C, 0xF9060103, + 0x81C, 0xF8080103, + 0x81C, 0xF70A0103, + 0x81C, 0xF60C0103, + 0x81C, 0xF50E0103, + 0x81C, 0xF4100103, + 0x81C, 0xF3120103, + 0x81C, 0xF2140103, + 0x81C, 0xF1160103, + 0x81C, 0xF0180103, + 0x81C, 0xEF1A0103, + 0x81C, 0xEE1C0103, + 0x81C, 0xED1E0103, + 0x81C, 0xEC200103, + 0x81C, 0xEB220103, + 0x81C, 0xEA240103, + 0x81C, 0xE9260103, + 0x81C, 0xE8280103, + 0x81C, 0xE72A0103, + 0x81C, 0xE62C0103, + 0x81C, 0xE52E0103, + 0x81C, 0xE4300103, + 0x81C, 0xE3320103, + 0x81C, 0xE2340103, + 0x81C, 0xE1360103, + 0x81C, 0x87380103, + 0x81C, 0x863A0103, + 0x81C, 0x853C0103, + 0x81C, 0x843E0103, + 0x81C, 0x83400103, + 0x81C, 0x82420103, + 0x81C, 0x81440103, + 0x81C, 0x64460103, + 0x81C, 0x63480103, + 0x81C, 0x624A0103, + 0x81C, 0x464C0103, + 0x81C, 0x454E0103, + 0x81C, 0x44500103, + 0x81C, 0x43520103, + 0x81C, 0x26540103, + 0x81C, 0x25560103, + 0x81C, 0x24580103, + 0x81C, 0x075A0103, + 0x81C, 0x065C0103, + 0x81C, 0x055E0103, + 0x81C, 0x04600103, + 0x81C, 0x03620103, + 0x81C, 0x02640103, + 0x81C, 0x01660103, + 0x81C, 0x01680103, + 0x81C, 0x016A0103, + 0x81C, 0x016C0103, + 0x81C, 0x016E0103, + 0x81C, 0x01700103, + 0x81C, 0x01720103, + 0x81C, 0x01740103, + 0x81C, 0x01760103, + 0x81C, 0x01780103, + 0x81C, 0x017A0103, + 0x81C, 0x017C0103, + 0x81C, 0x017E0103, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x81C, 0xF9000103, + 0x81C, 0xF8020103, + 0x81C, 0xF7040103, + 0x81C, 0xF6060103, + 0x81C, 0xF5080103, + 0x81C, 0xF40A0103, + 0x81C, 0xF30C0103, + 0x81C, 0xF20E0103, + 0x81C, 0xF1100103, + 0x81C, 0xF0120103, + 0x81C, 0xEF140103, + 0x81C, 0xEE160103, + 0x81C, 0xED180103, + 0x81C, 0xEC1A0103, + 0x81C, 0xEB1C0103, + 0x81C, 0xEA1E0103, + 0x81C, 0xE9200103, + 0x81C, 0xE8220103, + 0x81C, 0xE7240103, + 0x81C, 0xE6260103, + 0x81C, 0xE5280103, + 0x81C, 0xE42A0103, + 0x81C, 0xE32C0103, + 0x81C, 0xE22E0103, + 0x81C, 0xA6300103, + 0x81C, 0xA5320103, + 0x81C, 0xA4340103, + 0x81C, 0xA3360103, + 0x81C, 0xA2380103, + 0x81C, 0xA13A0103, + 0x81C, 0x843C0103, + 0x81C, 0x833E0103, + 0x81C, 0x82400103, + 0x81C, 0x81420103, + 0x81C, 0x64440103, + 0x81C, 0x63460103, + 0x81C, 0x62480103, + 0x81C, 0x614A0103, + 0x81C, 0x444C0103, + 0x81C, 0x434E0103, + 0x81C, 0x42500103, + 0x81C, 0x41520103, + 0x81C, 0x25540103, + 0x81C, 0x24560103, + 0x81C, 0x23580103, + 0x81C, 0x225A0103, + 0x81C, 0x055C0103, + 0x81C, 0x045E0103, + 0x81C, 0x03600103, + 0x81C, 0x02620103, + 0x81C, 0x01640103, + 0x81C, 0x01660103, + 0x81C, 0x01680103, + 0x81C, 0x016A0103, + 0x81C, 0x016C0103, + 0x81C, 0x016E0103, + 0x81C, 0x01700103, + 0x81C, 0x01720103, + 0x81C, 0x01740103, + 0x81C, 0x01760103, + 0x81C, 0x01780103, + 0x81C, 0x017A0103, + 0x81C, 0x017C0103, + 0x81C, 0x017E0103, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x81C, 0xFD000103, + 0x81C, 0xFC020103, + 0x81C, 0xFB040103, + 0x81C, 0xFA060103, + 0x81C, 0xF9080103, + 0x81C, 0xF80A0103, + 0x81C, 0xF70C0103, + 0x81C, 0xF60E0103, + 0x81C, 0xF5100103, + 0x81C, 0xF4120103, + 0x81C, 0xF3140103, + 0x81C, 0xF2160103, + 0x81C, 0xF1180103, + 0x81C, 0xF01A0103, + 0x81C, 0xEF1C0103, + 0x81C, 0xEE1E0103, + 0x81C, 0xED200103, + 0x81C, 0xEC220103, + 0x81C, 0xEB240103, + 0x81C, 0xEA260103, + 0x81C, 0xE9280103, + 0x81C, 0xE82A0103, + 0x81C, 0xE72C0103, + 0x81C, 0xE62E0103, + 0x81C, 0xE5300103, + 0x81C, 0xE4320103, + 0x81C, 0xE3340103, + 0x81C, 0xE2360103, + 0x81C, 0xE1380103, + 0x81C, 0xA33A0103, + 0x81C, 0xA23C0103, + 0x81C, 0xA13E0103, + 0x81C, 0x84400103, + 0x81C, 0x83420103, + 0x81C, 0x82440103, + 0x81C, 0x81460103, + 0x81C, 0x64480103, + 0x81C, 0x634A0103, + 0x81C, 0x624C0103, + 0x81C, 0x614E0103, + 0x81C, 0x45500103, + 0x81C, 0x44520103, + 0x81C, 0x43540103, + 0x81C, 0x42560103, + 0x81C, 0x25580103, + 0x81C, 0x245A0103, + 0x81C, 0x235C0103, + 0x81C, 0x065E0103, + 0x81C, 0x05600103, + 0x81C, 0x04620103, + 0x81C, 0x03640103, + 0x81C, 0x02660103, + 0x81C, 0x01680103, + 0x81C, 0x016A0103, + 0x81C, 0x016C0103, + 0x81C, 0x016E0103, + 0x81C, 0x01700103, + 0x81C, 0x01720103, + 0x81C, 0x01740103, + 0x81C, 0x01760103, + 0x81C, 0x01780103, + 0x81C, 0x017A0103, + 0x81C, 0x017C0103, + 0x81C, 0x017E0103, + 0xA0000000, 0x00000000, + 0x81C, 0xFF000103, + 0x81C, 0xFE020103, + 0x81C, 0xFD040103, + 0x81C, 0xFC060103, + 0x81C, 0xFB080103, + 0x81C, 0xFA0A0103, + 0x81C, 0xF90C0103, + 0x81C, 0xF80E0103, + 0x81C, 0xF7100103, + 0x81C, 0xF6120103, + 0x81C, 0xF5140103, + 0x81C, 0xF4160103, + 0x81C, 0xF3180103, + 0x81C, 0xF21A0103, + 0x81C, 0xF11C0103, + 0x81C, 0xF01E0103, + 0x81C, 0xEF200103, + 0x81C, 0xEE220103, + 0x81C, 0xED240103, + 0x81C, 0xEC260103, + 0x81C, 0xEB280103, + 0x81C, 0xEA2A0103, + 0x81C, 0xE92C0103, + 0x81C, 0xE82E0103, + 0x81C, 0xE7300103, + 0x81C, 0xE6320103, + 0x81C, 0xE5340103, + 0x81C, 0xE4360103, + 0x81C, 0xE3380103, + 0x81C, 0xE23A0103, + 0x81C, 0xE13C0103, + 0x81C, 0xA43E0103, + 0x81C, 0xA3400103, + 0x81C, 0xA2420103, + 0x81C, 0xA1440103, + 0x81C, 0x86460103, + 0x81C, 0x85480103, + 0x81C, 0x844A0103, + 0x81C, 0x834C0103, + 0x81C, 0x824E0103, + 0x81C, 0x81500103, + 0x81C, 0x64520103, + 0x81C, 0x63540103, + 0x81C, 0x62560103, + 0x81C, 0x61580103, + 0x81C, 0x435A0103, + 0x81C, 0x425C0103, + 0x81C, 0x415E0103, + 0x81C, 0x25600103, + 0x81C, 0x24620103, + 0x81C, 0x06640103, + 0x81C, 0x05660103, + 0x81C, 0x04680103, + 0x81C, 0x036A0103, + 0x81C, 0x026C0103, + 0x81C, 0x016E0103, + 0x81C, 0x01700103, + 0x81C, 0x01720103, + 0x81C, 0x01740103, + 0x81C, 0x01760103, + 0x81C, 0x01780103, + 0x81C, 0x017A0103, + 0x81C, 0x017C0103, + 0x81C, 0x017E0103, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x81C, 0xFC000203, + 0x81C, 0xFB020203, + 0x81C, 0xFA040203, + 0x81C, 0xF9060203, + 0x81C, 0xF8080203, + 0x81C, 0xF70A0203, + 0x81C, 0xF60C0203, + 0x81C, 0xF50E0203, + 0x81C, 0xF4100203, + 0x81C, 0xF3120203, + 0x81C, 0xF2140203, + 0x81C, 0xF1160203, + 0x81C, 0xF0180203, + 0x81C, 0xEF1A0203, + 0x81C, 0xEE1C0203, + 0x81C, 0xED1E0203, + 0x81C, 0xEC200203, + 0x81C, 0xEB220203, + 0x81C, 0xEA240203, + 0x81C, 0xE9260203, + 0x81C, 0xE8280203, + 0x81C, 0xE72A0203, + 0x81C, 0xE62C0203, + 0x81C, 0xE52E0203, + 0x81C, 0xE4300203, + 0x81C, 0xE3320203, + 0x81C, 0xE2340203, + 0x81C, 0xE1360203, + 0x81C, 0xA5380203, + 0x81C, 0xA43A0203, + 0x81C, 0xA33C0203, + 0x81C, 0x853E0203, + 0x81C, 0x84400203, + 0x81C, 0x83420203, + 0x81C, 0x82440203, + 0x81C, 0x81460203, + 0x81C, 0x64480203, + 0x81C, 0x634A0203, + 0x81C, 0x624C0203, + 0x81C, 0x614E0203, + 0x81C, 0x46500203, + 0x81C, 0x45520203, + 0x81C, 0x44540203, + 0x81C, 0x43560203, + 0x81C, 0x25580203, + 0x81C, 0x245A0203, + 0x81C, 0x235C0203, + 0x81C, 0x075E0203, + 0x81C, 0x06600203, + 0x81C, 0x05620203, + 0x81C, 0x04640203, + 0x81C, 0x03660203, + 0x81C, 0x02680203, + 0x81C, 0x016A0203, + 0x81C, 0x016C0203, + 0x81C, 0x016E0203, + 0x81C, 0x01700203, + 0x81C, 0x01720203, + 0x81C, 0x01740203, + 0x81C, 0x01760203, + 0x81C, 0x01780203, + 0x81C, 0x017A0203, + 0x81C, 0x017C0203, + 0x81C, 0x017E0203, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x81C, 0xF8000203, + 0x81C, 0xF7020203, + 0x81C, 0xF6040203, + 0x81C, 0xF5060203, + 0x81C, 0xF4080203, + 0x81C, 0xF30A0203, + 0x81C, 0xF20C0203, + 0x81C, 0xF10E0203, + 0x81C, 0xF0100203, + 0x81C, 0xEF120203, + 0x81C, 0xEE140203, + 0x81C, 0xED160203, + 0x81C, 0xEC180203, + 0x81C, 0xEB1A0203, + 0x81C, 0xEA1C0203, + 0x81C, 0xE91E0203, + 0x81C, 0xE8200203, + 0x81C, 0xE7220203, + 0x81C, 0xE6240203, + 0x81C, 0xE5260203, + 0x81C, 0xE4280203, + 0x81C, 0xE32A0203, + 0x81C, 0xE22C0203, + 0x81C, 0xE12E0203, + 0x81C, 0xA6300203, + 0x81C, 0xA5320203, + 0x81C, 0xA4340203, + 0x81C, 0xA3360203, + 0x81C, 0xA2380203, + 0x81C, 0x853A0203, + 0x81C, 0x843C0203, + 0x81C, 0x833E0203, + 0x81C, 0x82400203, + 0x81C, 0x81420203, + 0x81C, 0x64440203, + 0x81C, 0x63460203, + 0x81C, 0x62480203, + 0x81C, 0x614A0203, + 0x81C, 0x444C0203, + 0x81C, 0x434E0203, + 0x81C, 0x42500203, + 0x81C, 0x25520203, + 0x81C, 0x24540203, + 0x81C, 0x23560203, + 0x81C, 0x06580203, + 0x81C, 0x055A0203, + 0x81C, 0x045C0203, + 0x81C, 0x035E0203, + 0x81C, 0x02600203, + 0x81C, 0x01620203, + 0x81C, 0x01640203, + 0x81C, 0x01660203, + 0x81C, 0x01680203, + 0x81C, 0x016A0203, + 0x81C, 0x016C0203, + 0x81C, 0x016E0203, + 0x81C, 0x01700203, + 0x81C, 0x01720203, + 0x81C, 0x01740203, + 0x81C, 0x01760203, + 0x81C, 0x01780203, + 0x81C, 0x017A0203, + 0x81C, 0x017C0203, + 0x81C, 0x017E0203, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x81C, 0xFC000203, + 0x81C, 0xFB020203, + 0x81C, 0xFA040203, + 0x81C, 0xF9060203, + 0x81C, 0xF8080203, + 0x81C, 0xF70A0203, + 0x81C, 0xF60C0203, + 0x81C, 0xF50E0203, + 0x81C, 0xF4100203, + 0x81C, 0xF3120203, + 0x81C, 0xF2140203, + 0x81C, 0xF1160203, + 0x81C, 0xF0180203, + 0x81C, 0xEF1A0203, + 0x81C, 0xEE1C0203, + 0x81C, 0xED1E0203, + 0x81C, 0xEC200203, + 0x81C, 0xEB220203, + 0x81C, 0xEA240203, + 0x81C, 0xE9260203, + 0x81C, 0xE8280203, + 0x81C, 0xE72A0203, + 0x81C, 0xE62C0203, + 0x81C, 0xE52E0203, + 0x81C, 0xE4300203, + 0x81C, 0xE3320203, + 0x81C, 0xE2340203, + 0x81C, 0xE1360203, + 0x81C, 0x87380203, + 0x81C, 0x863A0203, + 0x81C, 0x853C0203, + 0x81C, 0x843E0203, + 0x81C, 0x83400203, + 0x81C, 0x82420203, + 0x81C, 0x81440203, + 0x81C, 0x64460203, + 0x81C, 0x63480203, + 0x81C, 0x624A0203, + 0x81C, 0x474C0203, + 0x81C, 0x464E0203, + 0x81C, 0x45500203, + 0x81C, 0x44520203, + 0x81C, 0x43540203, + 0x81C, 0x42560203, + 0x81C, 0x24580203, + 0x81C, 0x235A0203, + 0x81C, 0x075C0203, + 0x81C, 0x065E0203, + 0x81C, 0x05600203, + 0x81C, 0x04620203, + 0x81C, 0x03640203, + 0x81C, 0x02660203, + 0x81C, 0x01680203, + 0x81C, 0x016A0203, + 0x81C, 0x016C0203, + 0x81C, 0x016E0203, + 0x81C, 0x01700203, + 0x81C, 0x01720203, + 0x81C, 0x01740203, + 0x81C, 0x01760203, + 0x81C, 0x01780203, + 0x81C, 0x017A0203, + 0x81C, 0x017C0203, + 0x81C, 0x017E0203, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x81C, 0xF8000203, + 0x81C, 0xF7020203, + 0x81C, 0xF6040203, + 0x81C, 0xF5060203, + 0x81C, 0xF4080203, + 0x81C, 0xF30A0203, + 0x81C, 0xF20C0203, + 0x81C, 0xF10E0203, + 0x81C, 0xF0100203, + 0x81C, 0xEF120203, + 0x81C, 0xEE140203, + 0x81C, 0xED160203, + 0x81C, 0xEC180203, + 0x81C, 0xEB1A0203, + 0x81C, 0xEA1C0203, + 0x81C, 0xE91E0203, + 0x81C, 0xE8200203, + 0x81C, 0xE7220203, + 0x81C, 0xE6240203, + 0x81C, 0xE5260203, + 0x81C, 0xE4280203, + 0x81C, 0xE32A0203, + 0x81C, 0xE22C0203, + 0x81C, 0xE12E0203, + 0x81C, 0xA6300203, + 0x81C, 0xA5320203, + 0x81C, 0xA4340203, + 0x81C, 0xA3360203, + 0x81C, 0xA2380203, + 0x81C, 0xA13A0203, + 0x81C, 0x843C0203, + 0x81C, 0x833E0203, + 0x81C, 0x82400203, + 0x81C, 0x81420203, + 0x81C, 0x64440203, + 0x81C, 0x63460203, + 0x81C, 0x62480203, + 0x81C, 0x614A0203, + 0x81C, 0x444C0203, + 0x81C, 0x434E0203, + 0x81C, 0x42500203, + 0x81C, 0x41520203, + 0x81C, 0x25540203, + 0x81C, 0x24560203, + 0x81C, 0x23580203, + 0x81C, 0x065A0203, + 0x81C, 0x055C0203, + 0x81C, 0x045E0203, + 0x81C, 0x03600203, + 0x81C, 0x02620203, + 0x81C, 0x01640203, + 0x81C, 0x01660203, + 0x81C, 0x01680203, + 0x81C, 0x016A0203, + 0x81C, 0x016C0203, + 0x81C, 0x016E0203, + 0x81C, 0x01700203, + 0x81C, 0x01720203, + 0x81C, 0x01740203, + 0x81C, 0x01760203, + 0x81C, 0x01780203, + 0x81C, 0x017A0203, + 0x81C, 0x017C0203, + 0x81C, 0x017E0203, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x81C, 0xFB000203, + 0x81C, 0xFA020203, + 0x81C, 0xF9040203, + 0x81C, 0xF8060203, + 0x81C, 0xF7080203, + 0x81C, 0xF60A0203, + 0x81C, 0xF50C0203, + 0x81C, 0xF40E0203, + 0x81C, 0xF3100203, + 0x81C, 0xF2120203, + 0x81C, 0xF1140203, + 0x81C, 0xF0160203, + 0x81C, 0xEF180203, + 0x81C, 0xEE1A0203, + 0x81C, 0xED1C0203, + 0x81C, 0xEC1E0203, + 0x81C, 0xEB200203, + 0x81C, 0xEA220203, + 0x81C, 0xE9240203, + 0x81C, 0xE8260203, + 0x81C, 0xE7280203, + 0x81C, 0xE62A0203, + 0x81C, 0xE52C0203, + 0x81C, 0xE42E0203, + 0x81C, 0xE3300203, + 0x81C, 0xE2320203, + 0x81C, 0xE1340203, + 0x81C, 0xA5360203, + 0x81C, 0xA4380203, + 0x81C, 0xA33A0203, + 0x81C, 0xA23C0203, + 0x81C, 0x843E0203, + 0x81C, 0x83400203, + 0x81C, 0x82420203, + 0x81C, 0x81440203, + 0x81C, 0x64460203, + 0x81C, 0x63480203, + 0x81C, 0x624A0203, + 0x81C, 0x614C0203, + 0x81C, 0x474E0203, + 0x81C, 0x46500203, + 0x81C, 0x45520203, + 0x81C, 0x44540203, + 0x81C, 0x43560203, + 0x81C, 0x25580203, + 0x81C, 0x245A0203, + 0x81C, 0x235C0203, + 0x81C, 0x075E0203, + 0x81C, 0x06600203, + 0x81C, 0x05620203, + 0x81C, 0x04640203, + 0x81C, 0x03660203, + 0x81C, 0x02680203, + 0x81C, 0x016A0203, + 0x81C, 0x016C0203, + 0x81C, 0x016E0203, + 0x81C, 0x01700203, + 0x81C, 0x01720203, + 0x81C, 0x01740203, + 0x81C, 0x01760203, + 0x81C, 0x01780203, + 0x81C, 0x017A0203, + 0x81C, 0x017C0203, + 0x81C, 0x017E0203, + 0xA0000000, 0x00000000, + 0x81C, 0xFF000203, + 0x81C, 0xFF020203, + 0x81C, 0xFE040203, + 0x81C, 0xFD060203, + 0x81C, 0xFC080203, + 0x81C, 0xFB0A0203, + 0x81C, 0xFA0C0203, + 0x81C, 0xF90E0203, + 0x81C, 0xF8100203, + 0x81C, 0xF7120203, + 0x81C, 0xF6140203, + 0x81C, 0xF5160203, + 0x81C, 0xF4180203, + 0x81C, 0xF31A0203, + 0x81C, 0xF21C0203, + 0x81C, 0xF11E0203, + 0x81C, 0xF0200203, + 0x81C, 0xEF220203, + 0x81C, 0xEE240203, + 0x81C, 0xED260203, + 0x81C, 0xEC280203, + 0x81C, 0xEB2A0203, + 0x81C, 0xEA2C0203, + 0x81C, 0xE92E0203, + 0x81C, 0xE8300203, + 0x81C, 0xE7320203, + 0x81C, 0xE6340203, + 0x81C, 0xE5360203, + 0x81C, 0xE4380203, + 0x81C, 0xE33A0203, + 0x81C, 0xE23C0203, + 0x81C, 0xE13E0203, + 0x81C, 0xA4400203, + 0x81C, 0xA3420203, + 0x81C, 0xA2440203, + 0x81C, 0xA1460203, + 0x81C, 0x85480203, + 0x81C, 0x844A0203, + 0x81C, 0x834C0203, + 0x81C, 0x824E0203, + 0x81C, 0x81500203, + 0x81C, 0x64520203, + 0x81C, 0x63540203, + 0x81C, 0x62560203, + 0x81C, 0x61580203, + 0x81C, 0x445A0203, + 0x81C, 0x435C0203, + 0x81C, 0x425E0203, + 0x81C, 0x25600203, + 0x81C, 0x24620203, + 0x81C, 0x06640203, + 0x81C, 0x05660203, + 0x81C, 0x04680203, + 0x81C, 0x036A0203, + 0x81C, 0x026C0203, + 0x81C, 0x016E0203, + 0x81C, 0x01700203, + 0x81C, 0x01720203, + 0x81C, 0x01740203, + 0x81C, 0x01760203, + 0x81C, 0x01780203, + 0x81C, 0x017A0203, + 0x81C, 0x017C0203, + 0x81C, 0x017E0203, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x81C, 0xF9000303, + 0x81C, 0xF8020303, + 0x81C, 0xF7040303, + 0x81C, 0xF6060303, + 0x81C, 0xF5080303, + 0x81C, 0xF40A0303, + 0x81C, 0xF30C0303, + 0x81C, 0xF20E0303, + 0x81C, 0xF1100303, + 0x81C, 0xF0120303, + 0x81C, 0xEF140303, + 0x81C, 0xEE160303, + 0x81C, 0xED180303, + 0x81C, 0xEC1A0303, + 0x81C, 0xEB1C0303, + 0x81C, 0xEA1E0303, + 0x81C, 0xE9200303, + 0x81C, 0xE8220303, + 0x81C, 0xE7240303, + 0x81C, 0xE6260303, + 0x81C, 0xE5280303, + 0x81C, 0xE42A0303, + 0x81C, 0xE32C0303, + 0x81C, 0xE22E0303, + 0x81C, 0xE1300303, + 0x81C, 0xA6320303, + 0x81C, 0xA5340303, + 0x81C, 0xA4360303, + 0x81C, 0xA3380303, + 0x81C, 0xA23A0303, + 0x81C, 0xA13C0303, + 0x81C, 0x853E0303, + 0x81C, 0x84400303, + 0x81C, 0x83420303, + 0x81C, 0x82440303, + 0x81C, 0x81460303, + 0x81C, 0x64480303, + 0x81C, 0x634A0303, + 0x81C, 0x624C0303, + 0x81C, 0x614E0303, + 0x81C, 0x44500303, + 0x81C, 0x43520303, + 0x81C, 0x42540303, + 0x81C, 0x41560303, + 0x81C, 0x25580303, + 0x81C, 0x245A0303, + 0x81C, 0x235C0303, + 0x81C, 0x055E0303, + 0x81C, 0x04600303, + 0x81C, 0x03620303, + 0x81C, 0x02640303, + 0x81C, 0x01660303, + 0x81C, 0x01680303, + 0x81C, 0x016A0303, + 0x81C, 0x016C0303, + 0x81C, 0x016E0303, + 0x81C, 0x01700303, + 0x81C, 0x01720303, + 0x81C, 0x01740303, + 0x81C, 0x01760303, + 0x81C, 0x01780303, + 0x81C, 0x017A0303, + 0x81C, 0x017C0303, + 0x81C, 0x017E0303, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x81C, 0xF7000303, + 0x81C, 0xF6020303, + 0x81C, 0xF5040303, + 0x81C, 0xF4060303, + 0x81C, 0xF3080303, + 0x81C, 0xF20A0303, + 0x81C, 0xF10C0303, + 0x81C, 0xF00E0303, + 0x81C, 0xEF100303, + 0x81C, 0xEE120303, + 0x81C, 0xED140303, + 0x81C, 0xEC160303, + 0x81C, 0xEB180303, + 0x81C, 0xEA1A0303, + 0x81C, 0xE91C0303, + 0x81C, 0xE81E0303, + 0x81C, 0xE7200303, + 0x81C, 0xE6220303, + 0x81C, 0xE5240303, + 0x81C, 0xE4260303, + 0x81C, 0xE3280303, + 0x81C, 0xC32A0303, + 0x81C, 0xC22C0303, + 0x81C, 0xC12E0303, + 0x81C, 0xA5300303, + 0x81C, 0xA4320303, + 0x81C, 0xA3340303, + 0x81C, 0xA2360303, + 0x81C, 0xA1380303, + 0x81C, 0x853A0303, + 0x81C, 0x843C0303, + 0x81C, 0x833E0303, + 0x81C, 0x82400303, + 0x81C, 0x81420303, + 0x81C, 0x64440303, + 0x81C, 0x63460303, + 0x81C, 0x62480303, + 0x81C, 0x614A0303, + 0x81C, 0x454C0303, + 0x81C, 0x444E0303, + 0x81C, 0x43500303, + 0x81C, 0x25520303, + 0x81C, 0x24540303, + 0x81C, 0x23560303, + 0x81C, 0x06580303, + 0x81C, 0x055A0303, + 0x81C, 0x045C0303, + 0x81C, 0x035E0303, + 0x81C, 0x02600303, + 0x81C, 0x01620303, + 0x81C, 0x01640303, + 0x81C, 0x01660303, + 0x81C, 0x01680303, + 0x81C, 0x016A0303, + 0x81C, 0x016C0303, + 0x81C, 0x016E0303, + 0x81C, 0x01700303, + 0x81C, 0x01720303, + 0x81C, 0x01740303, + 0x81C, 0x01760303, + 0x81C, 0x01780303, + 0x81C, 0x017A0303, + 0x81C, 0x017C0303, + 0x81C, 0x017E0303, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x81C, 0xF9000303, + 0x81C, 0xF8020303, + 0x81C, 0xF7040303, + 0x81C, 0xF6060303, + 0x81C, 0xF5080303, + 0x81C, 0xF40A0303, + 0x81C, 0xF30C0303, + 0x81C, 0xF20E0303, + 0x81C, 0xF1100303, + 0x81C, 0xF0120303, + 0x81C, 0xEF140303, + 0x81C, 0xEE160303, + 0x81C, 0xED180303, + 0x81C, 0xEC1A0303, + 0x81C, 0xEB1C0303, + 0x81C, 0xEA1E0303, + 0x81C, 0xE9200303, + 0x81C, 0xE8220303, + 0x81C, 0xE7240303, + 0x81C, 0xE6260303, + 0x81C, 0xE5280303, + 0x81C, 0xE42A0303, + 0x81C, 0xE32C0303, + 0x81C, 0xE22E0303, + 0x81C, 0xE1300303, + 0x81C, 0xA4320303, + 0x81C, 0xA3340303, + 0x81C, 0xA2360303, + 0x81C, 0xA1380303, + 0x81C, 0x853A0303, + 0x81C, 0x843C0303, + 0x81C, 0x833E0303, + 0x81C, 0x82400303, + 0x81C, 0x81420303, + 0x81C, 0x64440303, + 0x81C, 0x63460303, + 0x81C, 0x62480303, + 0x81C, 0x614A0303, + 0x81C, 0x444C0303, + 0x81C, 0x434E0303, + 0x81C, 0x42500303, + 0x81C, 0x25520303, + 0x81C, 0x24540303, + 0x81C, 0x23560303, + 0x81C, 0x07580303, + 0x81C, 0x065A0303, + 0x81C, 0x055C0303, + 0x81C, 0x045E0303, + 0x81C, 0x03600303, + 0x81C, 0x02620303, + 0x81C, 0x01640303, + 0x81C, 0x01660303, + 0x81C, 0x01680303, + 0x81C, 0x016A0303, + 0x81C, 0x016C0303, + 0x81C, 0x016E0303, + 0x81C, 0x01700303, + 0x81C, 0x01720303, + 0x81C, 0x01740303, + 0x81C, 0x01760303, + 0x81C, 0x01780303, + 0x81C, 0x017A0303, + 0x81C, 0x017C0303, + 0x81C, 0x017E0303, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x81C, 0xF7000303, + 0x81C, 0xF6020303, + 0x81C, 0xF5040303, + 0x81C, 0xF4060303, + 0x81C, 0xF3080303, + 0x81C, 0xF20A0303, + 0x81C, 0xF10C0303, + 0x81C, 0xF00E0303, + 0x81C, 0xEF100303, + 0x81C, 0xEE120303, + 0x81C, 0xED140303, + 0x81C, 0xEC160303, + 0x81C, 0xEB180303, + 0x81C, 0xEA1A0303, + 0x81C, 0xE91C0303, + 0x81C, 0xE81E0303, + 0x81C, 0xE7200303, + 0x81C, 0xE6220303, + 0x81C, 0xE5240303, + 0x81C, 0xE4260303, + 0x81C, 0xE3280303, + 0x81C, 0xE22A0303, + 0x81C, 0xE12C0303, + 0x81C, 0xA72E0303, + 0x81C, 0xA6300303, + 0x81C, 0xA5320303, + 0x81C, 0xA4340303, + 0x81C, 0xA3360303, + 0x81C, 0xA2380303, + 0x81C, 0xA13A0303, + 0x81C, 0x843C0303, + 0x81C, 0x833E0303, + 0x81C, 0x82400303, + 0x81C, 0x81420303, + 0x81C, 0x64440303, + 0x81C, 0x63460303, + 0x81C, 0x62480303, + 0x81C, 0x614A0303, + 0x81C, 0x454C0303, + 0x81C, 0x444E0303, + 0x81C, 0x43500303, + 0x81C, 0x42520303, + 0x81C, 0x41540303, + 0x81C, 0x24560303, + 0x81C, 0x23580303, + 0x81C, 0x065A0303, + 0x81C, 0x055C0303, + 0x81C, 0x045E0303, + 0x81C, 0x03600303, + 0x81C, 0x02620303, + 0x81C, 0x01640303, + 0x81C, 0x01660303, + 0x81C, 0x01680303, + 0x81C, 0x016A0303, + 0x81C, 0x016C0303, + 0x81C, 0x016E0303, + 0x81C, 0x01700303, + 0x81C, 0x01720303, + 0x81C, 0x01740303, + 0x81C, 0x01760303, + 0x81C, 0x01780303, + 0x81C, 0x017A0303, + 0x81C, 0x017C0303, + 0x81C, 0x017E0303, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x81C, 0xFB000303, + 0x81C, 0xFA020303, + 0x81C, 0xF9040303, + 0x81C, 0xF8060303, + 0x81C, 0xF7080303, + 0x81C, 0xF60A0303, + 0x81C, 0xF50C0303, + 0x81C, 0xF40E0303, + 0x81C, 0xF3100303, + 0x81C, 0xF2120303, + 0x81C, 0xF1140303, + 0x81C, 0xF0160303, + 0x81C, 0xEF180303, + 0x81C, 0xEE1A0303, + 0x81C, 0xED1C0303, + 0x81C, 0xEC1E0303, + 0x81C, 0xEB200303, + 0x81C, 0xEA220303, + 0x81C, 0xE9240303, + 0x81C, 0xE8260303, + 0x81C, 0xE7280303, + 0x81C, 0xE62A0303, + 0x81C, 0xE52C0303, + 0x81C, 0xE42E0303, + 0x81C, 0xE3300303, + 0x81C, 0xE2320303, + 0x81C, 0xE1340303, + 0x81C, 0xC2360303, + 0x81C, 0xC1380303, + 0x81C, 0xA33A0303, + 0x81C, 0xA23C0303, + 0x81C, 0x853E0303, + 0x81C, 0x84400303, + 0x81C, 0x83420303, + 0x81C, 0x66440303, + 0x81C, 0x65460303, + 0x81C, 0x64480303, + 0x81C, 0x634A0303, + 0x81C, 0x624C0303, + 0x81C, 0x614E0303, + 0x81C, 0x45500303, + 0x81C, 0x44520303, + 0x81C, 0x43540303, + 0x81C, 0x42560303, + 0x81C, 0x25580303, + 0x81C, 0x245A0303, + 0x81C, 0x235C0303, + 0x81C, 0x065E0303, + 0x81C, 0x05600303, + 0x81C, 0x04620303, + 0x81C, 0x03640303, + 0x81C, 0x02660303, + 0x81C, 0x01680303, + 0x81C, 0x016A0303, + 0x81C, 0x016C0303, + 0x81C, 0x016E0303, + 0x81C, 0x01700303, + 0x81C, 0x01720303, + 0x81C, 0x01740303, + 0x81C, 0x01760303, + 0x81C, 0x01780303, + 0x81C, 0x017A0303, + 0x81C, 0x017C0303, + 0x81C, 0x017E0303, + 0xA0000000, 0x00000000, + 0x81C, 0xFD000303, + 0x81C, 0xFC020303, + 0x81C, 0xFB040303, + 0x81C, 0xFA060303, + 0x81C, 0xF9080303, + 0x81C, 0xF80A0303, + 0x81C, 0xF70C0303, + 0x81C, 0xF60E0303, + 0x81C, 0xF5100303, + 0x81C, 0xF4120303, + 0x81C, 0xF3140303, + 0x81C, 0xF2160303, + 0x81C, 0xF1180303, + 0x81C, 0xF01A0303, + 0x81C, 0xEF1C0303, + 0x81C, 0xEE1E0303, + 0x81C, 0xED200303, + 0x81C, 0xEC220303, + 0x81C, 0xEB240303, + 0x81C, 0xEA260303, + 0x81C, 0xE9280303, + 0x81C, 0xE82A0303, + 0x81C, 0xE72C0303, + 0x81C, 0xE62E0303, + 0x81C, 0xE5300303, + 0x81C, 0xE4320303, + 0x81C, 0xE3340303, + 0x81C, 0xE2360303, + 0x81C, 0xE1380303, + 0x81C, 0xA53A0303, + 0x81C, 0xA43C0303, + 0x81C, 0xA33E0303, + 0x81C, 0xA2400303, + 0x81C, 0xA1420303, + 0x81C, 0x87440303, + 0x81C, 0x86460303, + 0x81C, 0x85480303, + 0x81C, 0x844A0303, + 0x81C, 0x834C0303, + 0x81C, 0x824E0303, + 0x81C, 0x81500303, + 0x81C, 0x64520303, + 0x81C, 0x63540303, + 0x81C, 0x62560303, + 0x81C, 0x61580303, + 0x81C, 0x435A0303, + 0x81C, 0x425C0303, + 0x81C, 0x415E0303, + 0x81C, 0x07600303, + 0x81C, 0x06620303, + 0x81C, 0x05640303, + 0x81C, 0x04660303, + 0x81C, 0x03680303, + 0x81C, 0x026A0303, + 0x81C, 0x016C0303, + 0x81C, 0x016E0303, + 0x81C, 0x01700303, + 0x81C, 0x01720303, + 0x81C, 0x01740303, + 0x81C, 0x01760303, + 0x81C, 0x01780303, + 0x81C, 0x017A0303, + 0x81C, 0x017C0303, + 0x81C, 0x017E0303, + 0xB0000000, 0x00000000, + 0xC50, 0x00000022, + 0xC50, 0x00000020, + 0xE50, 0x00000022, + 0xE50, 0x00000020, + 0x1850, 0x00000022, + 0x1850, 0x00000020, + 0x1A50, 0x00000022, + 0x1A50, 0x00000020, + +}; + +void +odm_read_and_config_mp_8814a_agc_tab( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u32 ArrayLen = sizeof(Array_MP_8814A_AGC_TAB)/sizeof(u32); + u32* Array = Array_MP_8814A_AGC_TAB; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_AGC_TAB\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigBB_AGC_8814A(pDM_Odm, v1, bMaskDWord, v2); + } + i = i + 2; + } +} + +u32 +ODM_GetVersion_MP_8814A_AGC_TAB(void) +{ + return 85; +} + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +u32 Array_MP_8814A_PHY_REG[] = { + 0x800, 0x9020D010, + 0x804, 0x08011280, + 0x808, 0x0E0282FF, + 0x80C, 0x1000002F, + 0x8000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x810, 0x21101263, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x810, 0x21101263, + 0xA0000000, 0x00000000, + 0x810, 0x20101263, + 0xB0000000, 0x00000000, + 0x814, 0x020C3D10, + 0x818, 0x04A10385, + 0x820, 0x00000000, + 0x824, 0x00033E40, + 0x828, 0x00000000, + 0x82C, 0x73985170, + 0x830, 0x79A0EA08, + 0x834, 0x042E7086, + 0x8000000f, 0x55555555, 0x40000000, 0x00000000, + 0x838, 0x86667640, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x838, 0x86667641, + 0xA0000000, 0x00000000, + 0x838, 0x86667640, + 0xB0000000, 0x00000000, + 0x83C, 0x9798B9B9, + 0x840, 0x17577F60, + 0x844, 0x4BBDFCDE, + 0x848, 0x5CD07F8B, + 0x84C, 0x6CFBF7B5, + 0x850, 0x28834706, + 0x854, 0x0001520C, + 0x858, 0x4060C000, + 0x85C, 0x74210368, + 0x860, 0x6929C321, + 0x864, 0x79727432, + 0x868, 0x8CA7A314, + 0x86C, 0x438C2878, + 0x870, 0x44444444, + 0x874, 0x21612C2E, + 0x878, 0x00003152, + 0x87C, 0x000FC000, + 0x8A0, 0x00000013, + 0x8A4, 0x7F7F7F7F, + 0x8A8, 0xA202033E, + 0x8AC, 0xF40F550A, + 0x8B0, 0x00000600, + 0x8B4, 0x000FC080, + 0x8B8, 0xEC0057FF, + 0x8BC, 0x8CA520C3, + 0x8C0, 0x3FF00020, + 0x8C4, 0x44C00000, + 0x8C8, 0x80025169, + 0x8CC, 0x08250492, + 0x8D0, 0x0000B800, + 0x8D4, 0x940008A0, + 0x8D8, 0x290B5612, + 0x8DC, 0x00000000, + 0x8E0, 0x32316407, + 0x8E4, 0x4A092925, + 0x8E8, 0xFFFFC42C, + 0x8EC, 0x99999999, + 0x8F0, 0x00009999, + 0x8F4, 0x00F80FA1, + 0x8F8, 0x400082C0, + 0x8FC, 0x00000000, + 0x900, 0x00400700, + 0x90C, 0x09004000, + 0x910, 0x0000FC00, + 0x914, 0xD6400404, + 0x918, 0x1C1028C0, + 0x91C, 0x64B11A1C, + 0x920, 0xE0767233, + 0x924, 0x055AA500, + 0x928, 0x4AB0E4E4, + 0x92C, 0xFFFE0000, + 0x930, 0xFFFFFFFE, + 0x934, 0x001FFFFF, + 0x938, 0x00008400, + 0x93C, 0x932C0642, + 0x940, 0x093E9360, + 0x944, 0x08000000, + 0x948, 0x04000000, + 0x950, 0x02010080, + 0x954, 0x86510080, + 0x960, 0x00000000, + 0x964, 0x00000000, + 0x968, 0x00000000, + 0x96C, 0x00000000, + 0x970, 0x801FFFFF, + 0x978, 0x00000000, + 0x97C, 0x00000000, + 0x980, 0x00000000, + 0x984, 0x00000000, + 0x988, 0x00000000, + 0x98C, 0x03440000, + 0x990, 0x27100000, + 0x994, 0xFFFF0100, + 0x998, 0xFFFFFF5C, + 0x99C, 0xFFFFFFFF, + 0x9A0, 0x000000FF, + 0x9A4, 0x00080080, + 0x9A8, 0x0C2F0000, + 0x9AC, 0x00560000, + 0x9B0, 0x81081008, + 0x9B4, 0x00000000, + 0x9B8, 0x01081008, + 0x9BC, 0x01081008, + 0x9D0, 0x00000000, + 0x9D4, 0x00000000, + 0x9D8, 0x00000000, + 0x9DC, 0x00000000, + 0x9E4, 0x00000002, + 0x9E8, 0x000022D5, + 0x9FC, 0xEFFFF7FF, + 0xB00, 0xE3100000, + 0xB04, 0x0000B000, + 0xB0C, 0x31EAA006, + 0xB5C, 0x41CFFFFF, + 0xC00, 0x00000007, + 0xC04, 0x00042020, + 0xC08, 0x80410231, + 0xC0C, 0x00000000, + 0xC10, 0x00000100, + 0xC14, 0x01000000, + 0xC1C, 0x40000053, + 0xC50, 0x00000020, + 0xC54, 0x00000000, + 0x8000000f, 0x55555555, 0x40000000, 0x00000000, + 0xC58, 0x3C0A0C14, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0xC58, 0x3C0A0C14, + 0xA0000000, 0x00000000, + 0xC58, 0x3C020C14, + 0xB0000000, 0x00000000, + 0xC5C, 0x0D000058, + 0xC60, 0x1B800000, + 0xC60, 0x0B800001, + 0xC60, 0x05800002, + 0xC60, 0x07800003, + 0xC60, 0x1A800004, + 0xC60, 0x0B800005, + 0xC60, 0x05800006, + 0xC60, 0x0E800007, + 0xC60, 0x1A800008, + 0xC60, 0x0B800009, + 0xC60, 0x1580000A, + 0xC60, 0x0880000B, + 0xC60, 0x1A80000C, + 0xC60, 0x0B80000D, + 0xC60, 0x0580000E, + 0xC60, 0x0E80000F, + 0xC60, 0x1A800010, + 0xC60, 0x0B800011, + 0xC60, 0x15800012, + 0xC60, 0x08800013, + 0xC60, 0x1A800014, + 0xC60, 0x0B800015, + 0xC60, 0x05800016, + 0xC60, 0x07800017, + 0xC60, 0x1A800018, + 0xC60, 0x0B800019, + 0xC60, 0x1580001A, + 0xC60, 0x0880001B, + 0xC60, 0x1B80001C, + 0xC60, 0x0B80001D, + 0xC60, 0x0580001E, + 0xC60, 0x0780001F, + 0xC60, 0x1B800020, + 0xC60, 0x0B800021, + 0xC60, 0x05800022, + 0xC60, 0x07800023, + 0xC60, 0x1B800024, + 0xC60, 0x0B800025, + 0xC60, 0x05800026, + 0xC60, 0x07800027, + 0xC60, 0x1B800028, + 0xC60, 0x0B800029, + 0xC60, 0x0580002A, + 0xC60, 0x0780002B, + 0xC60, 0x1B800030, + 0xC60, 0x0B800031, + 0xC60, 0x05800032, + 0xC60, 0x00800033, + 0xC60, 0x1B800034, + 0xC60, 0x0B800035, + 0xC60, 0x05800036, + 0xC60, 0x00800037, + 0xC60, 0x1B800038, + 0xC60, 0x0B800039, + 0xC60, 0x0580003A, + 0xC60, 0x0E80803B, + 0xC94, 0x01000401, + 0xC98, 0x00188000, + 0xCA0, 0x00002929, + 0xCA4, 0x08040201, + 0xCA8, 0x80402010, + 0xCAC, 0x77777000, + 0xCB0, 0x54775477, + 0xCB4, 0x54775477, + 0xCB8, 0x00500000, + 0xCBC, 0x77700000, + 0xCC0, 0x00000010, + 0xCC8, 0x00000010, + 0xE00, 0x00000007, + 0xE04, 0x00042020, + 0xE08, 0x80410231, + 0xE0C, 0x00000000, + 0xE10, 0x00000100, + 0xE14, 0x01000000, + 0xE1C, 0x40000053, + 0xE50, 0x00000020, + 0xE54, 0x00000000, + 0x8000000f, 0x55555555, 0x40000000, 0x00000000, + 0xE58, 0x3C0A0C14, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0xE58, 0x3C0A0C14, + 0xA0000000, 0x00000000, + 0xE58, 0x3C020C14, + 0xB0000000, 0x00000000, + 0xE5C, 0x0D000058, + 0xE60, 0x1B800000, + 0xE60, 0x0B800001, + 0xE60, 0x05800002, + 0xE60, 0x07800003, + 0xE60, 0x1A800004, + 0xE60, 0x0B800005, + 0xE60, 0x05800006, + 0xE60, 0x0E800007, + 0xE60, 0x1A800008, + 0xE60, 0x0B800009, + 0xE60, 0x1580000A, + 0xE60, 0x0880000B, + 0xE60, 0x1A80000C, + 0xE60, 0x0B80000D, + 0xE60, 0x0580000E, + 0xE60, 0x0E80000F, + 0xE60, 0x1A800010, + 0xE60, 0x0B800011, + 0xE60, 0x15800012, + 0xE60, 0x08800013, + 0xE60, 0x1A800014, + 0xE60, 0x0B800015, + 0xE60, 0x05800016, + 0xE60, 0x07800017, + 0xE60, 0x1A800018, + 0xE60, 0x0B800019, + 0xE60, 0x1580001A, + 0xE60, 0x0880001B, + 0xE60, 0x1B80001C, + 0xE60, 0x0B80001D, + 0xE60, 0x0580001E, + 0xE60, 0x0780001F, + 0xE60, 0x1B800020, + 0xE60, 0x0B800021, + 0xE60, 0x05800022, + 0xE60, 0x07800023, + 0xE60, 0x1B800024, + 0xE60, 0x0B800025, + 0xE60, 0x05800026, + 0xE60, 0x07800027, + 0xE60, 0x1B800028, + 0xE60, 0x0B800029, + 0xE60, 0x0580002A, + 0xE60, 0x0780002B, + 0xE60, 0x1B800030, + 0xE60, 0x0B800031, + 0xE60, 0x05800032, + 0xE60, 0x00800033, + 0xE60, 0x1B800034, + 0xE60, 0x0B800035, + 0xE60, 0x05800036, + 0xE60, 0x00800037, + 0xE60, 0x1B800038, + 0xE60, 0x0B800039, + 0xE60, 0x0580003A, + 0xE60, 0x0E80803B, + 0xE94, 0x01000401, + 0xE98, 0x00188000, + 0xEA0, 0x00002929, + 0xEA4, 0x08040201, + 0xEA8, 0x80402010, + 0xEAC, 0x77777000, + 0xEB0, 0x54775477, + 0xEB4, 0x54775477, + 0xEB8, 0x00500000, + 0xEBC, 0x77700000, + 0x1800, 0x00000007, + 0x1804, 0x00042020, + 0x1808, 0x80410231, + 0x180C, 0x00000000, + 0x1810, 0x00000100, + 0x1814, 0x01000000, + 0x181C, 0x40000053, + 0x1850, 0x00000020, + 0x1854, 0x00000000, + 0x8000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1858, 0x3C0A0C14, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1858, 0x3C0A0C14, + 0xA0000000, 0x00000000, + 0x1858, 0x3C020C14, + 0xB0000000, 0x00000000, + 0x185C, 0x0D000058, + 0x1860, 0x1B800000, + 0x1860, 0x0B800001, + 0x1860, 0x05800002, + 0x1860, 0x07800003, + 0x1860, 0x1A800004, + 0x1860, 0x0B800005, + 0x1860, 0x05800006, + 0x1860, 0x0E800007, + 0x1860, 0x1A800008, + 0x1860, 0x0B800009, + 0x1860, 0x1580000A, + 0x1860, 0x0880000B, + 0x1860, 0x1A80000C, + 0x1860, 0x0B80000D, + 0x1860, 0x0580000E, + 0x1860, 0x0E80000F, + 0x1860, 0x1A800010, + 0x1860, 0x0B800011, + 0x1860, 0x15800012, + 0x1860, 0x08800013, + 0x1860, 0x1A800014, + 0x1860, 0x0B800015, + 0x1860, 0x05800016, + 0x1860, 0x07800017, + 0x1860, 0x1A800018, + 0x1860, 0x0B800019, + 0x1860, 0x1580001A, + 0x1860, 0x0880001B, + 0x1860, 0x1B80001C, + 0x1860, 0x0B80001D, + 0x1860, 0x0580001E, + 0x1860, 0x0780001F, + 0x1860, 0x1B800020, + 0x1860, 0x0B800021, + 0x1860, 0x05800022, + 0x1860, 0x07800023, + 0x1860, 0x1B800024, + 0x1860, 0x0B800025, + 0x1860, 0x05800026, + 0x1860, 0x07800027, + 0x1860, 0x1B800028, + 0x1860, 0x0B800029, + 0x1860, 0x0580002A, + 0x1860, 0x0780002B, + 0x1860, 0x1B800030, + 0x1860, 0x0B800031, + 0x1860, 0x05800032, + 0x1860, 0x00800033, + 0x1860, 0x1B800034, + 0x1860, 0x0B800035, + 0x1860, 0x05800036, + 0x1860, 0x00800037, + 0x1860, 0x1B800038, + 0x1860, 0x0B800039, + 0x1860, 0x0580003A, + 0x1860, 0x0E80803B, + 0x1894, 0x01000401, + 0x1898, 0x00188000, + 0x18A0, 0x00002929, + 0x18A4, 0x08040201, + 0x18A8, 0x80402010, + 0x18AC, 0x77777000, + 0x18B0, 0x54775477, + 0x18B4, 0x54775477, + 0x18B8, 0x00500000, + 0x18BC, 0x77700000, + 0x1A00, 0x00000007, + 0x1A04, 0x00042020, + 0x1A08, 0x80410231, + 0x1A0C, 0x00000000, + 0x1A10, 0x00000100, + 0x1A14, 0x01000000, + 0x1A1C, 0x40000053, + 0x1A50, 0x00000020, + 0x1A54, 0x00000000, + 0x8000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1A58, 0x3C0A0C14, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1A58, 0x3C0A0C14, + 0xA0000000, 0x00000000, + 0x1A58, 0x3C020C14, + 0xB0000000, 0x00000000, + 0x1A5C, 0x0D000058, + 0x1A60, 0x1B800000, + 0x1A60, 0x0B800001, + 0x1A60, 0x05800002, + 0x1A60, 0x07800003, + 0x1A60, 0x1A800004, + 0x1A60, 0x0B800005, + 0x1A60, 0x05800006, + 0x1A60, 0x0E800007, + 0x1A60, 0x1A800008, + 0x1A60, 0x0B800009, + 0x1A60, 0x1580000A, + 0x1A60, 0x0880000B, + 0x1A60, 0x1A80000C, + 0x1A60, 0x0B80000D, + 0x1A60, 0x0580000E, + 0x1A60, 0x0E80000F, + 0x1A60, 0x1A800010, + 0x1A60, 0x0B800011, + 0x1A60, 0x15800012, + 0x1A60, 0x08800013, + 0x1A60, 0x1A800014, + 0x1A60, 0x0B800015, + 0x1A60, 0x05800016, + 0x1A60, 0x07800017, + 0x1A60, 0x1A800018, + 0x1A60, 0x0B800019, + 0x1A60, 0x1580001A, + 0x1A60, 0x0880001B, + 0x1A60, 0x1B80001C, + 0x1A60, 0x0B80001D, + 0x1A60, 0x0580001E, + 0x1A60, 0x0780001F, + 0x1A60, 0x1B800020, + 0x1A60, 0x0B800021, + 0x1A60, 0x05800022, + 0x1A60, 0x07800023, + 0x1A60, 0x1B800024, + 0x1A60, 0x0B800025, + 0x1A60, 0x05800026, + 0x1A60, 0x07800027, + 0x1A60, 0x1B800028, + 0x1A60, 0x0B800029, + 0x1A60, 0x0580002A, + 0x1A60, 0x0780002B, + 0x1A60, 0x1B800030, + 0x1A60, 0x0B800031, + 0x1A60, 0x05800032, + 0x1A60, 0x00800033, + 0x1A60, 0x1B800034, + 0x1A60, 0x0B800035, + 0x1A60, 0x05800036, + 0x1A60, 0x00800037, + 0x1A60, 0x1B800038, + 0x1A60, 0x0B800039, + 0x1A60, 0x0580003A, + 0x1A60, 0x0E80803B, + 0x1A94, 0x01000401, + 0x1A98, 0x00188000, + 0x1AA0, 0x00002929, + 0x1AA4, 0x08040201, + 0x1AA8, 0x80402010, + 0x1AAC, 0x77777000, + 0x1AB0, 0x54775477, + 0x1AB4, 0x54775477, + 0x1AB8, 0x00500000, + 0x1ABC, 0x77700000, + 0x1904, 0x00030000, + 0x1914, 0x00030000, + 0x1984, 0x03000000, + 0x1988, 0x00000087, + 0x198C, 0x00000007, + 0x1990, 0xFFAA5500, + 0x1994, 0x00000077, + 0x1998, 0x12801000, + 0x1998, 0x12801000, + 0x1998, 0x12801001, + 0x1998, 0x12801002, + 0x1998, 0x12801003, + 0x1998, 0x12801004, + 0x1998, 0x12801005, + 0x1998, 0x12801006, + 0x1998, 0x12801007, + 0x1998, 0x12801008, + 0x1998, 0x12801009, + 0x1998, 0x1280100A, + 0x1998, 0x1280100B, + 0x1998, 0x1280100C, + 0x1998, 0x1280100D, + 0x1998, 0x1280100E, + 0x1998, 0x1280100F, + 0x1998, 0x12801010, + 0x1998, 0x12801011, + 0x1998, 0x12801012, + 0x1998, 0x12801013, + 0x1998, 0x12801014, + 0x1998, 0x12801015, + 0x1998, 0x12801016, + 0x1998, 0x12801017, + 0x1998, 0x12801018, + 0x1998, 0x12801019, + 0x1998, 0x1280101A, + 0x1998, 0x1280101B, + 0x1998, 0x1280101C, + 0x1998, 0x1280101D, + 0x1998, 0x1280101E, + 0x1998, 0x1280101F, + 0x1998, 0x12801020, + 0x1998, 0x12801021, + 0x1998, 0x12801022, + 0x1998, 0x12801023, + 0x1998, 0x1280102C, + 0x1998, 0x1280102D, + 0x1998, 0x1280102E, + 0x1998, 0x1280102F, + 0x1998, 0x12801030, + 0x1998, 0x12801031, + 0x1998, 0x12801032, + 0x1998, 0x12801033, + 0x1998, 0x12801034, + 0x1998, 0x12801035, + 0x1998, 0x12801036, + 0x1998, 0x12801037, + 0x1998, 0x12801038, + 0x1998, 0x12801039, + 0x1998, 0x1280103A, + 0x1998, 0x1280103B, + 0x1998, 0x1280103C, + 0x1998, 0x1280103D, + 0x1998, 0x1280103E, + 0x1998, 0x1280103F, + 0x1998, 0x12801040, + 0x1998, 0x12801041, + 0x1998, 0x12801042, + 0x1998, 0x12801043, + 0x1998, 0x12801044, + 0x1998, 0x12801045, + 0x1998, 0x12801046, + 0x1998, 0x12801047, + 0x1998, 0x12801048, + 0x1998, 0x12801049, + 0x1998, 0x12801100, + 0x1998, 0x12801101, + 0x1998, 0x12801102, + 0x1998, 0x12801103, + 0x1998, 0x12801104, + 0x1998, 0x12801105, + 0x1998, 0x12801106, + 0x1998, 0x12801107, + 0x1998, 0x12801108, + 0x1998, 0x12801109, + 0x1998, 0x1280110A, + 0x1998, 0x1280110B, + 0x1998, 0x1280110C, + 0x1998, 0x1280110D, + 0x1998, 0x1280110E, + 0x1998, 0x1280110F, + 0x1998, 0x12801110, + 0x1998, 0x12801111, + 0x1998, 0x12801112, + 0x1998, 0x12801113, + 0x1998, 0x12801114, + 0x1998, 0x12801115, + 0x1998, 0x12801116, + 0x1998, 0x12801117, + 0x1998, 0x12801118, + 0x1998, 0x12801119, + 0x1998, 0x1280111A, + 0x1998, 0x1280111B, + 0x1998, 0x1280111C, + 0x1998, 0x1280111D, + 0x1998, 0x1280111E, + 0x1998, 0x1280111F, + 0x1998, 0x12801120, + 0x1998, 0x12801121, + 0x1998, 0x12801122, + 0x1998, 0x12801123, + 0x1998, 0x1280112C, + 0x1998, 0x1280112D, + 0x1998, 0x1280112E, + 0x1998, 0x1280112F, + 0x1998, 0x12801130, + 0x1998, 0x12801131, + 0x1998, 0x12801132, + 0x1998, 0x12801133, + 0x1998, 0x12801134, + 0x1998, 0x12801135, + 0x1998, 0x12801136, + 0x1998, 0x12801137, + 0x1998, 0x12801138, + 0x1998, 0x12801139, + 0x1998, 0x1280113A, + 0x1998, 0x1280113B, + 0x1998, 0x1280113C, + 0x1998, 0x1280113D, + 0x1998, 0x1280113E, + 0x1998, 0x1280113F, + 0x1998, 0x12801140, + 0x1998, 0x12801141, + 0x1998, 0x12801142, + 0x1998, 0x12801143, + 0x1998, 0x12801144, + 0x1998, 0x12801145, + 0x1998, 0x12801146, + 0x1998, 0x12801147, + 0x1998, 0x12801148, + 0x1998, 0x12801149, + 0x1998, 0x12801200, + 0x1998, 0x12801201, + 0x1998, 0x12801202, + 0x1998, 0x12801203, + 0x1998, 0x12801204, + 0x1998, 0x12801205, + 0x1998, 0x12801206, + 0x1998, 0x12801207, + 0x1998, 0x12801208, + 0x1998, 0x12801209, + 0x1998, 0x1280120A, + 0x1998, 0x1280120B, + 0x1998, 0x1280120C, + 0x1998, 0x1280120D, + 0x1998, 0x1280120E, + 0x1998, 0x1280120F, + 0x1998, 0x12801210, + 0x1998, 0x12801211, + 0x1998, 0x12801212, + 0x1998, 0x12801213, + 0x1998, 0x12801214, + 0x1998, 0x12801215, + 0x1998, 0x12801216, + 0x1998, 0x12801217, + 0x1998, 0x12801218, + 0x1998, 0x12801219, + 0x1998, 0x1280121A, + 0x1998, 0x1280121B, + 0x1998, 0x1280121C, + 0x1998, 0x1280121D, + 0x1998, 0x1280121E, + 0x1998, 0x1280121F, + 0x1998, 0x12801220, + 0x1998, 0x12801221, + 0x1998, 0x12801222, + 0x1998, 0x12801223, + 0x1998, 0x1280122C, + 0x1998, 0x1280122D, + 0x1998, 0x1280122E, + 0x1998, 0x1280122F, + 0x1998, 0x12801230, + 0x1998, 0x12801231, + 0x1998, 0x12801232, + 0x1998, 0x12801233, + 0x1998, 0x12801234, + 0x1998, 0x12801235, + 0x1998, 0x12801236, + 0x1998, 0x12801237, + 0x1998, 0x12801238, + 0x1998, 0x12801239, + 0x1998, 0x1280123A, + 0x1998, 0x1280123B, + 0x1998, 0x1280123C, + 0x1998, 0x1280123D, + 0x1998, 0x1280123E, + 0x1998, 0x1280123F, + 0x1998, 0x12801240, + 0x1998, 0x12801241, + 0x1998, 0x12801242, + 0x1998, 0x12801243, + 0x1998, 0x12801244, + 0x1998, 0x12801245, + 0x1998, 0x12801246, + 0x1998, 0x12801247, + 0x1998, 0x12801248, + 0x1998, 0x12801249, + 0x1998, 0x12801300, + 0x1998, 0x12801301, + 0x1998, 0x12801302, + 0x1998, 0x12801303, + 0x1998, 0x12801304, + 0x1998, 0x12801305, + 0x1998, 0x12801306, + 0x1998, 0x12801307, + 0x1998, 0x12801308, + 0x1998, 0x12801309, + 0x1998, 0x1280130A, + 0x1998, 0x1280130B, + 0x1998, 0x1280130C, + 0x1998, 0x1280130D, + 0x1998, 0x1280130E, + 0x1998, 0x1280130F, + 0x1998, 0x12801310, + 0x1998, 0x12801311, + 0x1998, 0x12801312, + 0x1998, 0x12801313, + 0x1998, 0x12801314, + 0x1998, 0x12801315, + 0x1998, 0x12801316, + 0x1998, 0x12801317, + 0x1998, 0x12801318, + 0x1998, 0x12801319, + 0x1998, 0x1280131A, + 0x1998, 0x1280131B, + 0x1998, 0x1280131C, + 0x1998, 0x1280131D, + 0x1998, 0x1280131E, + 0x1998, 0x1280131F, + 0x1998, 0x12801320, + 0x1998, 0x12801321, + 0x1998, 0x12801322, + 0x1998, 0x12801323, + 0x1998, 0x1280132C, + 0x1998, 0x1280132D, + 0x1998, 0x1280132E, + 0x1998, 0x1280132F, + 0x1998, 0x12801330, + 0x1998, 0x12801331, + 0x1998, 0x12801332, + 0x1998, 0x12801333, + 0x1998, 0x12801334, + 0x1998, 0x12801335, + 0x1998, 0x12801336, + 0x1998, 0x12801337, + 0x1998, 0x12801338, + 0x1998, 0x12801339, + 0x1998, 0x1280133A, + 0x1998, 0x1280133B, + 0x1998, 0x1280133C, + 0x1998, 0x1280133D, + 0x1998, 0x1280133E, + 0x1998, 0x1280133F, + 0x1998, 0x12801340, + 0x1998, 0x12801341, + 0x1998, 0x12801342, + 0x1998, 0x12801343, + 0x1998, 0x12801344, + 0x1998, 0x12801345, + 0x1998, 0x12801346, + 0x1998, 0x12801347, + 0x1998, 0x12801348, + 0x1998, 0x12801349, + 0x19D4, 0x88888888, + 0x19D8, 0x00000888, + 0xB00, 0xE3100100, + 0xB00, 0xE7100100, + 0xC60, 0x15808002, + 0xC60, 0x01808003, + 0xE60, 0x15808002, + 0xE60, 0x01808003, + 0x1860, 0x15808002, + 0x1860, 0x01808003, + 0x1A60, 0x15808002, + 0x1A60, 0x01808003, + 0xB00, 0xE3100100, + 0xC5C, 0x0D080058, + 0xE5C, 0x0D080058, + 0x185C, 0x0D080058, + 0x1A5C, 0x0D080058, + 0xC5C, 0x0D000058, + 0xE5C, 0x0D000058, + 0x185C, 0x0D000058, + 0x1A5C, 0x0D000058, + 0xC60, 0x05808002, + 0xC60, 0x0E808003, + 0xE60, 0x05808002, + 0xE60, 0x0E808003, + 0x1860, 0x05808002, + 0x1860, 0x0E808003, + 0x1A60, 0x05808002, + 0x1A60, 0x0E808003, + 0xB00, 0xE7100100, + 0xB00, 0xE3100100, + 0xB00, 0xE3100000, + 0x1C38, 0x00000002, + 0xA00, 0x00D047C8, + 0xA04, 0x46FF800C, + 0xA08, 0x8C838300, + 0xA0C, 0x2E7E000F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0030, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00900000, + 0xA70, 0x101FFF00, + 0xA74, 0x00000128, + 0xA78, 0x00000900, + 0xA7C, 0x225B0606, + 0xA80, 0x218075B2, + 0xA84, 0x9C1F8C00, + 0x1B04, 0xE24628D2, + 0x1B10, 0x88010D46, + 0x1B14, 0x00000000, + 0x1B18, 0x00292903, + 0x1B00, 0xF8000000, + 0x1B00, 0xF800D000, + 0x1B00, 0xF801F000, + 0x1B1C, 0xA2123DB2, + 0x1B20, 0x07040001, + 0x1B24, 0x07060807, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B28, 0xC0060324, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0xA0000000, 0x00000000, + 0x1B28, 0xC0060348, + 0xB0000000, 0x00000000, + 0x1B2C, 0x20000003, + 0x1B30, 0x20000000, + 0x1B38, 0x20000000, + 0x1B3C, 0x20000000, + 0x1BD4, 0x00000001, + 0x1B94, 0x80000000, + 0x1B34, 0x00000000, + 0x1B34, 0x00000002, + 0x1B34, 0x00000000, + 0x1B00, 0xF8000002, + 0x1B00, 0xF800D002, + 0x1B00, 0xF801F002, + 0x1B1C, 0xA2123DB2, + 0x1B20, 0x07040001, + 0x1B24, 0x07060807, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B28, 0xC0060324, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0xA0000000, 0x00000000, + 0x1B28, 0xC0060348, + 0xB0000000, 0x00000000, + 0x1B2C, 0x20000003, + 0x1B30, 0x20000000, + 0x1B38, 0x20000000, + 0x1B3C, 0x20000000, + 0x1BD4, 0x00000001, + 0x1B94, 0x80000000, + 0x1B34, 0x00000000, + 0x1B34, 0x00000002, + 0x1B34, 0x00000000, + 0x1B00, 0xF8000004, + 0x1B00, 0xF800D004, + 0x1B00, 0xF801F004, + 0x1B1C, 0xA2123DB2, + 0x1B20, 0x07040001, + 0x1B24, 0x07060807, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B28, 0xC0060324, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0xA0000000, 0x00000000, + 0x1B28, 0xC0060348, + 0xB0000000, 0x00000000, + 0x1B2C, 0x20000003, + 0x1B30, 0x20000000, + 0x1B38, 0x20000000, + 0x1B3C, 0x20000000, + 0x1BD4, 0x00000001, + 0x1B94, 0x80000000, + 0x1B34, 0x00000000, + 0x1B34, 0x00000002, + 0x1B34, 0x00000000, + 0x1B00, 0xF8000006, + 0x1B00, 0xF800D006, + 0x1B00, 0xF801F006, + 0x1B1C, 0xA2123DB2, + 0x1B20, 0x07040001, + 0x1B24, 0x07060807, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B28, 0xC0060324, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B28, 0xC0060324, + 0xA0000000, 0x00000000, + 0x1B28, 0xC0060348, + 0xB0000000, 0x00000000, + 0x1B2C, 0x20000003, + 0x1B30, 0x20000000, + 0x1B38, 0x20000000, + 0x1B3C, 0x20000000, + 0x1BD4, 0x00000001, + 0x1B94, 0x80000000, + 0x1B34, 0x00000000, + 0x1B34, 0x00000002, + 0x1B34, 0x00000000, + 0x1B00, 0xF8000000, + 0x1B80, 0x00000007, + 0x1B80, 0x09060005, + 0x1B80, 0x09060007, + 0x1B80, 0x0FFE0015, + 0x1B80, 0x0FFE0017, + 0x1B80, 0x00240025, + 0x1B80, 0x00240027, + 0x1B80, 0x00040035, + 0x1B80, 0x00040037, + 0x1B80, 0x05C00045, + 0x1B80, 0x05C00047, + 0x1B80, 0x00070055, + 0x1B80, 0x00070057, + 0x1B80, 0x64000065, + 0x1B80, 0x64000067, + 0x1B80, 0x00020075, + 0x1B80, 0x00020077, + 0x1B80, 0x00080085, + 0x1B80, 0x00080087, + 0x1B80, 0x80000095, + 0x1B80, 0x80000097, + 0x1B80, 0x090100A5, + 0x1B80, 0x090100A7, + 0x1B80, 0x0F0200B5, + 0x1B80, 0x0F0200B7, + 0x1B80, 0x002400C5, + 0x1B80, 0x002400C7, + 0x1B80, 0x000400D5, + 0x1B80, 0x000400D7, + 0x1B80, 0x05C000E5, + 0x1B80, 0x05C000E7, + 0x1B80, 0x000700F5, + 0x1B80, 0x000700F7, + 0x1B80, 0x64020105, + 0x1B80, 0x64020107, + 0x1B80, 0x00020115, + 0x1B80, 0x00020117, + 0x1B80, 0x00040125, + 0x1B80, 0x00040127, + 0x1B80, 0x4A000135, + 0x1B80, 0x4A000137, + 0x1B80, 0x4B040145, + 0x1B80, 0x4B040147, + 0x1B80, 0x85030155, + 0x1B80, 0x85030157, + 0x1B80, 0x40010165, + 0x1B80, 0x40010167, + 0x1B80, 0xE0290175, + 0x1B80, 0xE0290177, + 0x1B80, 0x00040185, + 0x1B80, 0x00040187, + 0x1B80, 0x4B050195, + 0x1B80, 0x4B050197, + 0x1B80, 0x860301A5, + 0x1B80, 0x860301A7, + 0x1B80, 0x400301B5, + 0x1B80, 0x400301B7, + 0x1B80, 0xE02901C5, + 0x1B80, 0xE02901C7, + 0x1B80, 0x000401D5, + 0x1B80, 0x000401D7, + 0x1B80, 0x4B0601E5, + 0x1B80, 0x4B0601E7, + 0x1B80, 0x870301F5, + 0x1B80, 0x870301F7, + 0x1B80, 0x40050205, + 0x1B80, 0x40050207, + 0x1B80, 0xE0290215, + 0x1B80, 0xE0290217, + 0x1B80, 0x00040225, + 0x1B80, 0x00040227, + 0x1B80, 0x4B070235, + 0x1B80, 0x4B070237, + 0x1B80, 0x88030245, + 0x1B80, 0x88030247, + 0x1B80, 0x40070255, + 0x1B80, 0x40070257, + 0x1B80, 0xE0290265, + 0x1B80, 0xE0290267, + 0x1B80, 0x4B000275, + 0x1B80, 0x4B000277, + 0x1B80, 0x30000285, + 0x1B80, 0x30000287, + 0x1B80, 0xFE100295, + 0x1B80, 0xFE100297, + 0x1B80, 0xFF1002A5, + 0x1B80, 0xFF1002A7, + 0x1B80, 0xE18602B5, + 0x1B80, 0xE18602B7, + 0x1B80, 0xF00A02C5, + 0x1B80, 0xF00A02C7, + 0x1B80, 0xF10A02D5, + 0x1B80, 0xF10A02D7, + 0x1B80, 0xF20A02E5, + 0x1B80, 0xF20A02E7, + 0x1B80, 0xF30802F5, + 0x1B80, 0xF30802F7, + 0x1B80, 0xF4070305, + 0x1B80, 0xF4070307, + 0x1B80, 0xF5060315, + 0x1B80, 0xF5060317, + 0x1B80, 0xF7060325, + 0x1B80, 0xF7060327, + 0x1B80, 0xF8050335, + 0x1B80, 0xF8050337, + 0x1B80, 0xF9040345, + 0x1B80, 0xF9040347, + 0x1B80, 0x00010355, + 0x1B80, 0x00010357, + 0x1B80, 0x303B0365, + 0x1B80, 0x303B0367, + 0x1B80, 0x30500375, + 0x1B80, 0x30500377, + 0x1B80, 0x305C0385, + 0x1B80, 0x305C0387, + 0x1B80, 0x31D50395, + 0x1B80, 0x31D50397, + 0x1B80, 0x31C503A5, + 0x1B80, 0x31C503A7, + 0x1B80, 0x4D0403B5, + 0x1B80, 0x4D0403B7, + 0x1B80, 0x2EF003C5, + 0x1B80, 0x2EF003C7, + 0x1B80, 0x000203D5, + 0x1B80, 0x000203D7, + 0x1B80, 0x208003E5, + 0x1B80, 0x208003E7, + 0x1B80, 0x000003F5, + 0x1B80, 0x000003F7, + 0x1B80, 0x4D000405, + 0x1B80, 0x4D000407, + 0x1B80, 0x55070415, + 0x1B80, 0x55070417, + 0x1B80, 0xE1230425, + 0x1B80, 0xE1230427, + 0x1B80, 0xE1230435, + 0x1B80, 0xE1230437, + 0x1B80, 0x4D040445, + 0x1B80, 0x4D040447, + 0x1B80, 0x20800455, + 0x1B80, 0x20800457, + 0x1B80, 0x84000465, + 0x1B80, 0x84000467, + 0x1B80, 0x4D000475, + 0x1B80, 0x4D000477, + 0x1B80, 0x550F0485, + 0x1B80, 0x550F0487, + 0x1B80, 0xE1230495, + 0x1B80, 0xE1230497, + 0x1B80, 0x4F0204A5, + 0x1B80, 0x4F0204A7, + 0x1B80, 0x4E0004B5, + 0x1B80, 0x4E0004B7, + 0x1B80, 0x530204C5, + 0x1B80, 0x530204C7, + 0x1B80, 0x520104D5, + 0x1B80, 0x520104D7, + 0x1B80, 0xE12704E5, + 0x1B80, 0xE12704E7, + 0x1B80, 0x000104F5, + 0x1B80, 0x000104F7, + 0x1B80, 0x5C720505, + 0x1B80, 0x5C720507, + 0x1B80, 0xE1320515, + 0x1B80, 0xE1320517, + 0x1B80, 0x54E50525, + 0x1B80, 0x54E50527, + 0x1B80, 0x54BF0535, + 0x1B80, 0x54BF0537, + 0x1B80, 0x54C50545, + 0x1B80, 0x54C50547, + 0x1B80, 0x54BE0555, + 0x1B80, 0x54BE0557, + 0x1B80, 0x54DF0565, + 0x1B80, 0x54DF0567, + 0x1B80, 0x0BA60575, + 0x1B80, 0x0BA60577, + 0x1B80, 0xF3130585, + 0x1B80, 0xF3130587, + 0x1B80, 0xF41E0595, + 0x1B80, 0xF41E0597, + 0x1B80, 0xF53C05A5, + 0x1B80, 0xF53C05A7, + 0x1B80, 0x000105B5, + 0x1B80, 0x000105B7, + 0x1B80, 0x620605C5, + 0x1B80, 0x620605C7, + 0x1B80, 0x600605D5, + 0x1B80, 0x600605D7, + 0x1B80, 0xE1A905E5, + 0x1B80, 0xE1A905E7, + 0x1B80, 0x0C0005F5, + 0x1B80, 0x0C0005F7, + 0x1B80, 0x5C720605, + 0x1B80, 0x5C720607, + 0x1B80, 0xE1320615, + 0x1B80, 0xE1320617, + 0x1B80, 0x5CF10625, + 0x1B80, 0x5CF10627, + 0x1B80, 0x0C010635, + 0x1B80, 0x0C010637, + 0x1B80, 0xF2020645, + 0x1B80, 0xF2020647, + 0x1B80, 0x30D60655, + 0x1B80, 0x30D60657, + 0x1B80, 0x0AC60665, + 0x1B80, 0x0AC60667, + 0x1B80, 0xE1B60675, + 0x1B80, 0xE1B60677, + 0x1B80, 0xE1580685, + 0x1B80, 0xE1580687, + 0x1B80, 0x54E50695, + 0x1B80, 0x54E50697, + 0x1B80, 0x000106A5, + 0x1B80, 0x000106A7, + 0x1B80, 0x560106B5, + 0x1B80, 0x560106B7, + 0x1B80, 0x5CE206C5, + 0x1B80, 0x5CE206C7, + 0x1B80, 0x0AE106D5, + 0x1B80, 0x0AE106D7, + 0x1B80, 0x630C06E5, + 0x1B80, 0x630C06E7, + 0x1B80, 0xE13F06F5, + 0x1B80, 0xE13F06F7, + 0x1B80, 0x00270705, + 0x1B80, 0x00270707, + 0x1B80, 0xE16C0715, + 0x1B80, 0xE16C0717, + 0x1B80, 0x00020725, + 0x1B80, 0x00020727, + 0x1B80, 0x002A0735, + 0x1B80, 0x002A0737, + 0x1B80, 0x07140745, + 0x1B80, 0x07140747, + 0x1B80, 0x00020755, + 0x1B80, 0x00020757, + 0x1B80, 0x30C30765, + 0x1B80, 0x30C30767, + 0x1B80, 0x56010775, + 0x1B80, 0x56010777, + 0x1B80, 0x5CE20785, + 0x1B80, 0x5CE20787, + 0x1B80, 0x0AE10795, + 0x1B80, 0x0AE10797, + 0x1B80, 0x631707A5, + 0x1B80, 0x631707A7, + 0x1B80, 0xE13F07B5, + 0x1B80, 0xE13F07B7, + 0x1B80, 0x002507C5, + 0x1B80, 0x002507C7, + 0x1B80, 0xE16C07D5, + 0x1B80, 0xE16C07D7, + 0x1B80, 0x000207E5, + 0x1B80, 0x000207E7, + 0x1B80, 0x630F07F5, + 0x1B80, 0x630F07F7, + 0x1B80, 0xE13F0805, + 0x1B80, 0xE13F0807, + 0x1B80, 0x63070815, + 0x1B80, 0x63070817, + 0x1B80, 0xE13F0825, + 0x1B80, 0xE13F0827, + 0x1B80, 0x07140835, + 0x1B80, 0x07140837, + 0x1B80, 0x56000845, + 0x1B80, 0x56000847, + 0x1B80, 0x5CF20855, + 0x1B80, 0x5CF20857, + 0x1B80, 0x0AF10865, + 0x1B80, 0x0AF10867, + 0x1B80, 0x07140875, + 0x1B80, 0x07140877, + 0x1B80, 0x07140885, + 0x1B80, 0x07140887, + 0x1B80, 0x630F0895, + 0x1B80, 0x630F0897, + 0x1B80, 0xE13F08A5, + 0x1B80, 0xE13F08A7, + 0x1B80, 0x631708B5, + 0x1B80, 0x631708B7, + 0x1B80, 0xE13F08C5, + 0x1B80, 0xE13F08C7, + 0x1B80, 0x002508D5, + 0x1B80, 0x002508D7, + 0x1B80, 0xE16C08E5, + 0x1B80, 0xE16C08E7, + 0x1B80, 0x000208F5, + 0x1B80, 0x000208F7, + 0x1B80, 0x30C30905, + 0x1B80, 0x30C30907, + 0x1B80, 0xE1A90915, + 0x1B80, 0xE1A90917, + 0x1B80, 0x62060925, + 0x1B80, 0x62060927, + 0x1B80, 0x60060935, + 0x1B80, 0x60060937, + 0x1B80, 0xE1160945, + 0x1B80, 0xE1160947, + 0x1B80, 0x54BE0955, + 0x1B80, 0x54BE0957, + 0x1B80, 0x56010965, + 0x1B80, 0x56010967, + 0x1B80, 0x5CE20975, + 0x1B80, 0x5CE20977, + 0x1B80, 0x0AE10985, + 0x1B80, 0x0AE10987, + 0x1B80, 0x633A0995, + 0x1B80, 0x633A0997, + 0x1B80, 0xE13F09A5, + 0x1B80, 0xE13F09A7, + 0x1B80, 0x633709B5, + 0x1B80, 0x633709B7, + 0x1B80, 0xE13F09C5, + 0x1B80, 0xE13F09C7, + 0x1B80, 0x632F09D5, + 0x1B80, 0x632F09D7, + 0x1B80, 0xE13F09E5, + 0x1B80, 0xE13F09E7, + 0x1B80, 0x632709F5, + 0x1B80, 0x632709F7, + 0x1B80, 0xE13F0A05, + 0x1B80, 0xE13F0A07, + 0x1B80, 0x631F0A15, + 0x1B80, 0x631F0A17, + 0x1B80, 0xE13F0A25, + 0x1B80, 0xE13F0A27, + 0x1B80, 0x63170A35, + 0x1B80, 0x63170A37, + 0x1B80, 0xE13F0A45, + 0x1B80, 0xE13F0A47, + 0x1B80, 0x630F0A55, + 0x1B80, 0x630F0A57, + 0x1B80, 0xE13F0A65, + 0x1B80, 0xE13F0A67, + 0x1B80, 0x63070A75, + 0x1B80, 0x63070A77, + 0x1B80, 0xE13F0A85, + 0x1B80, 0xE13F0A87, + 0x1B80, 0xE16C0A95, + 0x1B80, 0xE16C0A97, + 0x1B80, 0x56000AA5, + 0x1B80, 0x56000AA7, + 0x1B80, 0x5CF20AB5, + 0x1B80, 0x5CF20AB7, + 0x1B80, 0x0AF10AC5, + 0x1B80, 0x0AF10AC7, + 0x1B80, 0xF5040AD5, + 0x1B80, 0xF5040AD7, + 0x1B80, 0xE13F0AE5, + 0x1B80, 0xE13F0AE7, + 0x1B80, 0xE16C0AF5, + 0x1B80, 0xE16C0AF7, + 0x1B80, 0x30B30B05, + 0x1B80, 0x30B30B07, + 0x1B80, 0x07140B15, + 0x1B80, 0x07140B17, + 0x1B80, 0x07140B25, + 0x1B80, 0x07140B27, + 0x1B80, 0x630F0B35, + 0x1B80, 0x630F0B37, + 0x1B80, 0xE13F0B45, + 0x1B80, 0xE13F0B47, + 0x1B80, 0x63170B55, + 0x1B80, 0x63170B57, + 0x1B80, 0xE13F0B65, + 0x1B80, 0xE13F0B67, + 0x1B80, 0x631F0B75, + 0x1B80, 0x631F0B77, + 0x1B80, 0xE13F0B85, + 0x1B80, 0xE13F0B87, + 0x1B80, 0x63270B95, + 0x1B80, 0x63270B97, + 0x1B80, 0xE13F0BA5, + 0x1B80, 0xE13F0BA7, + 0x1B80, 0x632F0BB5, + 0x1B80, 0x632F0BB7, + 0x1B80, 0xE13F0BC5, + 0x1B80, 0xE13F0BC7, + 0x1B80, 0x63370BD5, + 0x1B80, 0x63370BD7, + 0x1B80, 0xE13F0BE5, + 0x1B80, 0xE13F0BE7, + 0x1B80, 0x633A0BF5, + 0x1B80, 0x633A0BF7, + 0x1B80, 0xE13F0C05, + 0x1B80, 0xE13F0C07, + 0x1B80, 0xF60B0C15, + 0x1B80, 0xF60B0C17, + 0x1B80, 0xF7170C25, + 0x1B80, 0xF7170C27, + 0x1B80, 0x4D300C35, + 0x1B80, 0x4D300C37, + 0x1B80, 0x57040C45, + 0x1B80, 0x57040C47, + 0x1B80, 0x57000C55, + 0x1B80, 0x57000C57, + 0x1B80, 0x96000C65, + 0x1B80, 0x96000C67, + 0x1B80, 0x57080C75, + 0x1B80, 0x57080C77, + 0x1B80, 0x57000C85, + 0x1B80, 0x57000C87, + 0x1B80, 0x95000C95, + 0x1B80, 0x95000C97, + 0x1B80, 0x4D000CA5, + 0x1B80, 0x4D000CA7, + 0x1B80, 0x6C070CB5, + 0x1B80, 0x6C070CB7, + 0x1B80, 0x00010CC5, + 0x1B80, 0x00010CC7, + 0x1B80, 0x00220CD5, + 0x1B80, 0x00220CD7, + 0x1B80, 0x06140CE5, + 0x1B80, 0x06140CE7, + 0x1B80, 0xE16C0CF5, + 0x1B80, 0xE16C0CF7, + 0x1B80, 0x00020D05, + 0x1B80, 0x00020D07, + 0x1B80, 0x00250D15, + 0x1B80, 0x00250D17, + 0x1B80, 0x06140D25, + 0x1B80, 0x06140D27, + 0x1B80, 0xE16C0D35, + 0x1B80, 0xE16C0D37, + 0x1B80, 0x00020D45, + 0x1B80, 0x00020D47, + 0x1B80, 0x00010D55, + 0x1B80, 0x00010D57, + 0x1B80, 0x00320D65, + 0x1B80, 0x00320D67, + 0x1B80, 0xE16C0D75, + 0x1B80, 0xE16C0D77, + 0x1B80, 0x00020D85, + 0x1B80, 0x00020D87, + 0x1B80, 0xE1860D95, + 0x1B80, 0xE1860D97, + 0x1B80, 0xE1B60DA5, + 0x1B80, 0xE1B60DA7, + 0x1B80, 0x5CD10DB5, + 0x1B80, 0x5CD10DB7, + 0x1B80, 0x673A0DC5, + 0x1B80, 0x673A0DC7, + 0x1B80, 0xE1230DD5, + 0x1B80, 0xE1230DD7, + 0x1B80, 0xF80B0DE5, + 0x1B80, 0xF80B0DE7, + 0x1B80, 0xF9110DF5, + 0x1B80, 0xF9110DF7, + 0x1B80, 0xE1580E05, + 0x1B80, 0xE1580E07, + 0x1B80, 0x67370E15, + 0x1B80, 0x67370E17, + 0x1B80, 0xE1580E25, + 0x1B80, 0xE1580E27, + 0x1B80, 0x672F0E35, + 0x1B80, 0x672F0E37, + 0x1B80, 0xE1580E45, + 0x1B80, 0xE1580E47, + 0x1B80, 0x67270E55, + 0x1B80, 0x67270E57, + 0x1B80, 0xE1580E65, + 0x1B80, 0xE1580E67, + 0x1B80, 0x671F0E75, + 0x1B80, 0x671F0E77, + 0x1B80, 0xE1580E85, + 0x1B80, 0xE1580E87, + 0x1B80, 0x67170E95, + 0x1B80, 0x67170E97, + 0x1B80, 0xE1580EA5, + 0x1B80, 0xE1580EA7, + 0x1B80, 0xF8020EB5, + 0x1B80, 0xF8020EB7, + 0x1B80, 0x30EE0EC5, + 0x1B80, 0x30EE0EC7, + 0x1B80, 0xE0D10ED5, + 0x1B80, 0xE0D10ED7, + 0x1B80, 0x670F0EE5, + 0x1B80, 0x670F0EE7, + 0x1B80, 0xE1580EF5, + 0x1B80, 0xE1580EF7, + 0x1B80, 0x67070F05, + 0x1B80, 0x67070F07, + 0x1B80, 0xE1580F15, + 0x1B80, 0xE1580F17, + 0x1B80, 0xF9020F25, + 0x1B80, 0xF9020F27, + 0x1B80, 0x30F50F35, + 0x1B80, 0x30F50F37, + 0x1B80, 0xE0CD0F45, + 0x1B80, 0xE0CD0F47, + 0x1B80, 0x06140F55, + 0x1B80, 0x06140F57, + 0x1B80, 0xE16C0F65, + 0x1B80, 0xE16C0F67, + 0x1B80, 0x5CF10F75, + 0x1B80, 0x5CF10F77, + 0x1B80, 0xE1580F85, + 0x1B80, 0xE1580F87, + 0x1B80, 0x06140F95, + 0x1B80, 0x06140F97, + 0x1B80, 0xE16C0FA5, + 0x1B80, 0xE16C0FA7, + 0x1B80, 0xF9020FB5, + 0x1B80, 0xF9020FB7, + 0x1B80, 0x30FF0FC5, + 0x1B80, 0x30FF0FC7, + 0x1B80, 0xE0CD0FD5, + 0x1B80, 0xE0CD0FD7, + 0x1B80, 0x31130FE5, + 0x1B80, 0x31130FE7, + 0x1B80, 0x670F0FF5, + 0x1B80, 0x670F0FF7, + 0x1B80, 0xE1581005, + 0x1B80, 0xE1581007, + 0x1B80, 0x67171015, + 0x1B80, 0x67171017, + 0x1B80, 0xE1581025, + 0x1B80, 0xE1581027, + 0x1B80, 0xF8021035, + 0x1B80, 0xF8021037, + 0x1B80, 0x31071045, + 0x1B80, 0x31071047, + 0x1B80, 0xE0D11055, + 0x1B80, 0xE0D11057, + 0x1B80, 0x31131065, + 0x1B80, 0x31131067, + 0x1B80, 0x670F1075, + 0x1B80, 0x670F1077, + 0x1B80, 0xE1581085, + 0x1B80, 0xE1581087, + 0x1B80, 0x671F1095, + 0x1B80, 0x671F1097, + 0x1B80, 0xE15810A5, + 0x1B80, 0xE15810A7, + 0x1B80, 0x672710B5, + 0x1B80, 0x672710B7, + 0x1B80, 0xE15810C5, + 0x1B80, 0xE15810C7, + 0x1B80, 0x672F10D5, + 0x1B80, 0x672F10D7, + 0x1B80, 0xE15810E5, + 0x1B80, 0xE15810E7, + 0x1B80, 0x673710F5, + 0x1B80, 0x673710F7, + 0x1B80, 0xE1581105, + 0x1B80, 0xE1581107, + 0x1B80, 0x673A1115, + 0x1B80, 0x673A1117, + 0x1B80, 0xE1581125, + 0x1B80, 0xE1581127, + 0x1B80, 0x4D101135, + 0x1B80, 0x4D101137, + 0x1B80, 0x30C41145, + 0x1B80, 0x30C41147, + 0x1B80, 0x00011155, + 0x1B80, 0x00011157, + 0x1B80, 0x6F241165, + 0x1B80, 0x6F241167, + 0x1B80, 0x6E401175, + 0x1B80, 0x6E401177, + 0x1B80, 0x6D001185, + 0x1B80, 0x6D001187, + 0x1B80, 0x55031195, + 0x1B80, 0x55031197, + 0x1B80, 0x312311A5, + 0x1B80, 0x312311A7, + 0x1B80, 0x6F1C11B5, + 0x1B80, 0x6F1C11B7, + 0x1B80, 0x6E4011C5, + 0x1B80, 0x6E4011C7, + 0x1B80, 0x550B11D5, + 0x1B80, 0x550B11D7, + 0x1B80, 0x312311E5, + 0x1B80, 0x312311E7, + 0x1B80, 0x061C11F5, + 0x1B80, 0x061C11F7, + 0x1B80, 0x54DE1205, + 0x1B80, 0x54DE1207, + 0x1B80, 0x06DC1215, + 0x1B80, 0x06DC1217, + 0x1B80, 0x55131225, + 0x1B80, 0x55131227, + 0x1B80, 0x74011235, + 0x1B80, 0x74011237, + 0x1B80, 0x74001245, + 0x1B80, 0x74001247, + 0x1B80, 0x8E001255, + 0x1B80, 0x8E001257, + 0x1B80, 0x00011265, + 0x1B80, 0x00011267, + 0x1B80, 0x57021275, + 0x1B80, 0x57021277, + 0x1B80, 0x57001285, + 0x1B80, 0x57001287, + 0x1B80, 0x97001295, + 0x1B80, 0x97001297, + 0x1B80, 0x000112A5, + 0x1B80, 0x000112A7, + 0x1B80, 0x54BF12B5, + 0x1B80, 0x54BF12B7, + 0x1B80, 0x54C112C5, + 0x1B80, 0x54C112C7, + 0x1B80, 0x54A212D5, + 0x1B80, 0x54A212D7, + 0x1B80, 0x54C012E5, + 0x1B80, 0x54C012E7, + 0x1B80, 0x54A112F5, + 0x1B80, 0x54A112F7, + 0x1B80, 0x54DF1305, + 0x1B80, 0x54DF1307, + 0x1B80, 0x00011315, + 0x1B80, 0x00011317, + 0x1B80, 0x55001325, + 0x1B80, 0x55001327, + 0x1B80, 0xE1231335, + 0x1B80, 0xE1231337, + 0x1B80, 0x54811345, + 0x1B80, 0x54811347, + 0x1B80, 0xE1231355, + 0x1B80, 0xE1231357, + 0x1B80, 0x54801365, + 0x1B80, 0x54801367, + 0x1B80, 0x002A1375, + 0x1B80, 0x002A1377, + 0x1B80, 0xE12B1385, + 0x1B80, 0xE12B1387, + 0x1B80, 0xE1231395, + 0x1B80, 0xE1231397, + 0x1B80, 0x548013A5, + 0x1B80, 0x548013A7, + 0x1B80, 0xE17213B5, + 0x1B80, 0xE17213B7, + 0x1B80, 0xBF3013C5, + 0x1B80, 0xBF3013C7, + 0x1B80, 0x000213D5, + 0x1B80, 0x000213D7, + 0x1B80, 0x302813E5, + 0x1B80, 0x302813E7, + 0x1B80, 0x4F7813F5, + 0x1B80, 0x4F7813F7, + 0x1B80, 0x4E001405, + 0x1B80, 0x4E001407, + 0x1B80, 0x53871415, + 0x1B80, 0x53871417, + 0x1B80, 0x52F11425, + 0x1B80, 0x52F11427, + 0x1B80, 0xE1161435, + 0x1B80, 0xE1161437, + 0x1B80, 0xE11B1445, + 0x1B80, 0xE11B1447, + 0x1B80, 0xE11F1455, + 0x1B80, 0xE11F1457, + 0x1B80, 0xE1271465, + 0x1B80, 0xE1271467, + 0x1B80, 0x54811475, + 0x1B80, 0x54811477, + 0x1B80, 0xE1161485, + 0x1B80, 0xE1161487, + 0x1B80, 0xE11B1495, + 0x1B80, 0xE11B1497, + 0x1B80, 0xE11F14A5, + 0x1B80, 0xE11F14A7, + 0x1B80, 0xE12714B5, + 0x1B80, 0xE12714B7, + 0x1B80, 0x548014C5, + 0x1B80, 0x548014C7, + 0x1B80, 0x002A14D5, + 0x1B80, 0x002A14D7, + 0x1B80, 0xE12B14E5, + 0x1B80, 0xE12B14E7, + 0x1B80, 0xE11614F5, + 0x1B80, 0xE11614F7, + 0x1B80, 0xE11B1505, + 0x1B80, 0xE11B1507, + 0x1B80, 0xE11F1515, + 0x1B80, 0xE11F1517, + 0x1B80, 0xE1271525, + 0x1B80, 0xE1271527, + 0x1B80, 0x54801535, + 0x1B80, 0x54801537, + 0x1B80, 0xE1721545, + 0x1B80, 0xE1721547, + 0x1B80, 0xBF171555, + 0x1B80, 0xBF171557, + 0x1B80, 0x00021565, + 0x1B80, 0x00021567, + 0x1B80, 0x30281575, + 0x1B80, 0x30281577, + 0x1B80, 0x06141585, + 0x1B80, 0x06141587, + 0x1B80, 0x73201595, + 0x1B80, 0x73201597, + 0x1B80, 0x720015A5, + 0x1B80, 0x720015A7, + 0x1B80, 0x710015B5, + 0x1B80, 0x710015B7, + 0x1B80, 0x550115C5, + 0x1B80, 0x550115C7, + 0x1B80, 0xE12315D5, + 0x1B80, 0xE12315D7, + 0x1B80, 0xE12715E5, + 0x1B80, 0xE12715E7, + 0x1B80, 0x548115F5, + 0x1B80, 0x548115F7, + 0x1B80, 0xE1231605, + 0x1B80, 0xE1231607, + 0x1B80, 0xE1271615, + 0x1B80, 0xE1271617, + 0x1B80, 0x54801625, + 0x1B80, 0x54801627, + 0x1B80, 0x002A1635, + 0x1B80, 0x002A1637, + 0x1B80, 0xE12B1645, + 0x1B80, 0xE12B1647, + 0x1B80, 0xE1231655, + 0x1B80, 0xE1231657, + 0x1B80, 0xE1271665, + 0x1B80, 0xE1271667, + 0x1B80, 0x54801675, + 0x1B80, 0x54801677, + 0x1B80, 0xE1721685, + 0x1B80, 0xE1721687, + 0x1B80, 0xBF031695, + 0x1B80, 0xBF031697, + 0x1B80, 0x000216A5, + 0x1B80, 0x000216A7, + 0x1B80, 0x302816B5, + 0x1B80, 0x302816B7, + 0x1B80, 0x54BF16C5, + 0x1B80, 0x54BF16C7, + 0x1B80, 0x54C516D5, + 0x1B80, 0x54C516D7, + 0x1B80, 0x050A16E5, + 0x1B80, 0x050A16E7, + 0x1B80, 0x071416F5, + 0x1B80, 0x071416F7, + 0x1B80, 0x54DF1705, + 0x1B80, 0x54DF1707, + 0x1B80, 0x00011715, + 0x1B80, 0x00011717, + 0x1B80, 0x54BF1725, + 0x1B80, 0x54BF1727, + 0x1B80, 0x54C01735, + 0x1B80, 0x54C01737, + 0x1B80, 0x54A31745, + 0x1B80, 0x54A31747, + 0x1B80, 0x54C11755, + 0x1B80, 0x54C11757, + 0x1B80, 0x54A41765, + 0x1B80, 0x54A41767, + 0x1B80, 0x4C831775, + 0x1B80, 0x4C831777, + 0x1B80, 0x4C031785, + 0x1B80, 0x4C031787, + 0x1B80, 0xBF0B1795, + 0x1B80, 0xBF0B1797, + 0x1B80, 0x54C217A5, + 0x1B80, 0x54C217A7, + 0x1B80, 0x54A417B5, + 0x1B80, 0x54A417B7, + 0x1B80, 0x4C8517C5, + 0x1B80, 0x4C8517C7, + 0x1B80, 0x4C0517D5, + 0x1B80, 0x4C0517D7, + 0x1B80, 0xBF0617E5, + 0x1B80, 0xBF0617E7, + 0x1B80, 0x54C117F5, + 0x1B80, 0x54C117F7, + 0x1B80, 0x54A31805, + 0x1B80, 0x54A31807, + 0x1B80, 0x4C861815, + 0x1B80, 0x4C861817, + 0x1B80, 0x4C061825, + 0x1B80, 0x4C061827, + 0x1B80, 0xBF011835, + 0x1B80, 0xBF011837, + 0x1B80, 0x54DF1845, + 0x1B80, 0x54DF1847, + 0x1B80, 0x00011855, + 0x1B80, 0x00011857, + 0x1B80, 0x00071865, + 0x1B80, 0x00071867, + 0x1B80, 0x54011875, + 0x1B80, 0x54011877, + 0x1B80, 0x00041885, + 0x1B80, 0x00041887, + 0x1B80, 0x56001895, + 0x1B80, 0x56001897, + 0x1B80, 0x5CF218A5, + 0x1B80, 0x5CF218A7, + 0x1B80, 0x630718B5, + 0x1B80, 0x630718B7, + 0x1B80, 0x620418C5, + 0x1B80, 0x620418C7, + 0x1B80, 0x610018D5, + 0x1B80, 0x610018D7, + 0x1B80, 0x670718E5, + 0x1B80, 0x670718E7, + 0x1B80, 0x660618F5, + 0x1B80, 0x660618F7, + 0x1B80, 0x6F201905, + 0x1B80, 0x6F201907, + 0x1B80, 0x6E001915, + 0x1B80, 0x6E001917, + 0x1B80, 0x6D001925, + 0x1B80, 0x6D001927, + 0x1B80, 0x6C031935, + 0x1B80, 0x6C031937, + 0x1B80, 0x73201945, + 0x1B80, 0x73201947, + 0x1B80, 0x72001955, + 0x1B80, 0x72001957, + 0x1B80, 0x71001965, + 0x1B80, 0x71001967, + 0x1B80, 0x7B201975, + 0x1B80, 0x7B201977, + 0x1B80, 0x7A001985, + 0x1B80, 0x7A001987, + 0x1B80, 0x79001995, + 0x1B80, 0x79001997, + 0x1B80, 0x7F2019A5, + 0x1B80, 0x7F2019A7, + 0x1B80, 0x7E0019B5, + 0x1B80, 0x7E0019B7, + 0x1B80, 0x7D0019C5, + 0x1B80, 0x7D0019C7, + 0x1B80, 0x090119D5, + 0x1B80, 0x090119D7, + 0x1B80, 0x0AC619E5, + 0x1B80, 0x0AC619E7, + 0x1B80, 0x0BA619F5, + 0x1B80, 0x0BA619F7, + 0x1B80, 0x0C011A05, + 0x1B80, 0x0C011A07, + 0x1B80, 0x0D021A15, + 0x1B80, 0x0D021A17, + 0x1B80, 0x0E041A25, + 0x1B80, 0x0E041A27, + 0x1B80, 0x0FFF1A35, + 0x1B80, 0x0FFF1A37, + 0x1B80, 0x4D041A45, + 0x1B80, 0x4D041A47, + 0x1B80, 0x28F81A55, + 0x1B80, 0x28F81A57, + 0x1B80, 0xE0001A65, + 0x1B80, 0xE0001A67, + 0x1B80, 0x4D001A75, + 0x1B80, 0x4D001A77, + 0x1B80, 0x00011A85, + 0x1B80, 0x00011A87, + 0x1B80, 0x4D041A95, + 0x1B80, 0x4D041A97, + 0x1B80, 0x2EF81AA5, + 0x1B80, 0x2EF81AA7, + 0x1B80, 0x00021AB5, + 0x1B80, 0x00021AB7, + 0x1B80, 0x23031AC5, + 0x1B80, 0x23031AC7, + 0x1B80, 0x00001AD5, + 0x1B80, 0x00001AD7, + 0x1B80, 0x23131AE5, + 0x1B80, 0x23131AE7, + 0x1B80, 0xE77F1AF5, + 0x1B80, 0xE77F1AF7, + 0x1B80, 0x232F1B05, + 0x1B80, 0x232F1B07, + 0x1B80, 0xEFBF1B15, + 0x1B80, 0xEFBF1B17, + 0x1B80, 0x2EF01B25, + 0x1B80, 0x2EF01B27, + 0x1B80, 0x00021B35, + 0x1B80, 0x00021B37, + 0x1B80, 0x4D001B45, + 0x1B80, 0x4D001B47, + 0x1B80, 0x00011B55, + 0x1B80, 0x00011B57, + 0x1B80, 0x4D041B65, + 0x1B80, 0x4D041B67, + 0x1B80, 0x2EF81B75, + 0x1B80, 0x2EF81B77, + 0x1B80, 0x00021B85, + 0x1B80, 0x00021B87, + 0x1B80, 0x23031B95, + 0x1B80, 0x23031B97, + 0x1B80, 0x00001BA5, + 0x1B80, 0x00001BA7, + 0x1B80, 0x23131BB5, + 0x1B80, 0x23131BB7, + 0x1B80, 0xE77F1BC5, + 0x1B80, 0xE77F1BC7, + 0x1B80, 0x232F1BD5, + 0x1B80, 0x232F1BD7, + 0x1B80, 0xE79F1BE5, + 0x1B80, 0xE79F1BE7, + 0x1B80, 0x2EF01BF5, + 0x1B80, 0x2EF01BF7, + 0x1B80, 0x00021C05, + 0x1B80, 0x00021C07, + 0x1B80, 0x28F81C15, + 0x1B80, 0x28F81C17, + 0x1B80, 0x80001C25, + 0x1B80, 0x80001C27, + 0x1B80, 0x4D001C35, + 0x1B80, 0x4D001C37, + 0x1B80, 0x00011C45, + 0x1B80, 0x00011C47, + 0x1B80, 0x00041C55, + 0x1B80, 0x00041C57, + 0x1B80, 0x6BC01C65, + 0x1B80, 0x6BC01C67, + 0x1B80, 0x4D041C75, + 0x1B80, 0x4D041C77, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x68241C85, + 0x1B80, 0x68241C87, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x68241C85, + 0x1B80, 0x68241C87, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x68241C85, + 0x1B80, 0x68241C87, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x68241C85, + 0x1B80, 0x68241C87, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x68241C85, + 0x1B80, 0x68241C87, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x68241C85, + 0x1B80, 0x68241C87, + 0xA0000000, 0x00000000, + 0x1B80, 0x68481C85, + 0x1B80, 0x68481C87, + 0xB0000000, 0x00000000, + 0x1B80, 0x66061C95, + 0x1B80, 0x66061C97, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x650C1CA5, + 0x1B80, 0x650C1CA7, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x650C1CA5, + 0x1B80, 0x650C1CA7, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x650C1CA5, + 0x1B80, 0x650C1CA7, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x650C1CA5, + 0x1B80, 0x650C1CA7, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x650C1CA5, + 0x1B80, 0x650C1CA7, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x650C1CA5, + 0x1B80, 0x650C1CA7, + 0xA0000000, 0x00000000, + 0x1B80, 0x65041CA5, + 0x1B80, 0x65041CA7, + 0xB0000000, 0x00000000, + 0x1B80, 0x64471CB5, + 0x1B80, 0x64471CB7, + 0x1B80, 0x23411CC5, + 0x1B80, 0x23411CC7, + 0x1B80, 0x100E1CD5, + 0x1B80, 0x100E1CD7, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x60101CE5, + 0x1B80, 0x60101CE7, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x60101CE5, + 0x1B80, 0x60101CE7, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x60101CE5, + 0x1B80, 0x60101CE7, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x60101CE5, + 0x1B80, 0x60101CE7, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x60101CE5, + 0x1B80, 0x60101CE7, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x60101CE5, + 0x1B80, 0x60101CE7, + 0xA0000000, 0x00000000, + 0x1B80, 0x60011CE5, + 0x1B80, 0x60011CE7, + 0xB0000000, 0x00000000, + 0x1B80, 0x23411CF5, + 0x1B80, 0x23411CF7, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x60811D05, + 0x1B80, 0x60811D07, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x60811D05, + 0x1B80, 0x60811D07, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x60811D05, + 0x1B80, 0x60811D07, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x60811D05, + 0x1B80, 0x60811D07, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x60811D05, + 0x1B80, 0x60811D07, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x60811D05, + 0x1B80, 0x60811D07, + 0xA0000000, 0x00000000, + 0x1B80, 0x60611D05, + 0x1B80, 0x60611D07, + 0xB0000000, 0x00000000, + 0x1B80, 0x23411D15, + 0x1B80, 0x23411D17, + 0x1B80, 0x70E11D25, + 0x1B80, 0x70E11D27, + 0x1B80, 0x4D001D35, + 0x1B80, 0x4D001D37, + 0x1B80, 0x00011D45, + 0x1B80, 0x00011D47, + 0x1B80, 0x00041D55, + 0x1B80, 0x00041D57, + 0x1B80, 0x6B401D65, + 0x1B80, 0x6B401D67, + 0x1B80, 0x4D041D75, + 0x1B80, 0x4D041D77, + 0x1B80, 0x68481D85, + 0x1B80, 0x68481D87, + 0x1B80, 0x66061D95, + 0x1B80, 0x66061D97, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x65081DA5, + 0x1B80, 0x65081DA7, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x65181DA5, + 0x1B80, 0x65181DA7, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x65181DA5, + 0x1B80, 0x65181DA7, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x65181DA5, + 0x1B80, 0x65181DA7, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x65181DA5, + 0x1B80, 0x65181DA7, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x65081DA5, + 0x1B80, 0x65081DA7, + 0xA0000000, 0x00000000, + 0x1B80, 0x65081DA5, + 0x1B80, 0x65081DA7, + 0xB0000000, 0x00000000, + 0x1B80, 0x64471DB5, + 0x1B80, 0x64471DB7, + 0x1B80, 0x23411DC5, + 0x1B80, 0x23411DC7, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x11E41DD5, + 0x1B80, 0x11E41DD7, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x11E81DD5, + 0x1B80, 0x11E81DD7, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x11E81DD5, + 0x1B80, 0x11E81DD7, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x11E81DD5, + 0x1B80, 0x11E81DD7, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x11E81DD5, + 0x1B80, 0x11E81DD7, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x11E41DD5, + 0x1B80, 0x11E41DD7, + 0xA0000000, 0x00000000, + 0x1B80, 0x11E41DD5, + 0x1B80, 0x11E41DD7, + 0xB0000000, 0x00000000, + 0x1B80, 0x60011DE5, + 0x1B80, 0x60011DE7, + 0x1B80, 0x23411DF5, + 0x1B80, 0x23411DF7, + 0x8000000c, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x60E11E05, + 0x1B80, 0x60E11E07, + 0x9000000f, 0x55555555, 0x40000000, 0x00000000, + 0x1B80, 0x61E11E05, + 0x1B80, 0x61E11E07, + 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, + 0x1B80, 0x61E11E05, + 0x1B80, 0x61E11E07, + 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, + 0x1B80, 0x61E11E05, + 0x1B80, 0x61E11E07, + 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, + 0x1B80, 0x61E11E05, + 0x1B80, 0x61E11E07, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x1B80, 0x60E11E05, + 0x1B80, 0x60E11E07, + 0xA0000000, 0x00000000, + 0x1B80, 0x60E11E05, + 0x1B80, 0x60E11E07, + 0xB0000000, 0x00000000, + 0x1B80, 0x23411E15, + 0x1B80, 0x23411E17, + 0x1B80, 0x70611E25, + 0x1B80, 0x70611E27, + 0x1B80, 0x4D001E35, + 0x1B80, 0x4D001E37, + 0x1B80, 0x00011E45, + 0x1B80, 0x00011E47, + 0x1B80, 0x00001E55, + 0x1B80, 0x00001E57, + 0x1B80, 0x00001E65, + 0x1B80, 0x00001E67, + 0x1B80, 0x00001E75, + 0x1B80, 0x00001E77, + 0x1B80, 0x00001E85, + 0x1B80, 0x00001E87, + 0x1B80, 0x00001E95, + 0x1B80, 0x00001E97, + 0x1B80, 0x00001EA5, + 0x1B80, 0x00001EA7, + 0x1B80, 0x00001EB5, + 0x1B80, 0x00001EB7, + 0x1B80, 0x00001EC5, + 0x1B80, 0x00001EC7, + 0x1B80, 0x00001ED5, + 0x1B80, 0x00001ED7, + 0x1B80, 0x00001EE5, + 0x1B80, 0x00001EE7, + 0x1B80, 0x00001EF5, + 0x1B80, 0x00001EF7, + 0x1B80, 0x00001F05, + 0x1B80, 0x00001F07, + 0x1B80, 0x00001F15, + 0x1B80, 0x00001F17, + 0x1B80, 0x00001F25, + 0x1B80, 0x00001F27, + 0x1B80, 0x00001F35, + 0x1B80, 0x00001F37, + 0x1B80, 0x00001F45, + 0x1B80, 0x00001F47, + 0x1B80, 0x00001F55, + 0x1B80, 0x00001F57, + 0x1B80, 0x00001F65, + 0x1B80, 0x00001F67, + 0x1B80, 0x00001F75, + 0x1B80, 0x00001F77, + 0x1B80, 0x00001F85, + 0x1B80, 0x00001F87, + 0x1B80, 0x00001F95, + 0x1B80, 0x00001F97, + 0x1B80, 0x00001FA5, + 0x1B80, 0x00001FA7, + 0x1B80, 0x00001FB5, + 0x1B80, 0x00001FB7, + 0x1B80, 0x00001FC5, + 0x1B80, 0x00001FC7, + 0x1B80, 0x00001FD5, + 0x1B80, 0x00001FD7, + 0x1B80, 0x00001FE5, + 0x1B80, 0x00001FE7, + 0x1B80, 0x00001FF5, + 0x1B80, 0x00001FF7, + 0x1B80, 0x00000006, + 0x1B80, 0x00000002, + +}; + +void +odm_read_and_config_mp_8814a_phy_reg( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG)/sizeof(u32); + u32* Array = Array_MP_8814A_PHY_REG; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigBB_PHY_8814A(pDM_Odm, v1, bMaskDWord, v2); + } + i = i + 2; + } +} + +u32 +ODM_GetVersion_MP_8814A_PHY_REG(void) +{ + return 85; +} + +/****************************************************************************** +* PHY_REG_MP.TXT +******************************************************************************/ + +u32 Array_MP_8814A_PHY_REG_MP[] = { + 0x8FC, 0x00000000, + 0x838, 0x86667641, + +}; + +void +odm_read_and_config_mp_8814a_phy_reg_mp( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_MP)/sizeof(u32); + u32* Array = Array_MP_8814A_PHY_REG_MP; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_MP\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigBB_PHY_8814A(pDM_Odm, v1, bMaskDWord, v2); + } + i = i + 2; + } +} + +u32 +ODM_GetVersion_MP_8814A_PHY_REG_MP(void) +{ + return 85; +} + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u32 Array_MP_8814A_PHY_REG_PG[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x34363840, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x42424444, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323638, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303236, + 0, 0, 1, 0x00000c34, 0xffffffff, 0x38404242, + 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283034, + 0, 0, 2, 0x00000cd8, 0xffffffff, 0x36384040, + 0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262832, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303236, + 0, 0, 0, 0x00000c44, 0xffffffff, 0x42422426, + 0, 0, 1, 0x00000c48, 0xffffffff, 0x30343840, + 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, + 0, 0, 2, 0x00000ce0, 0xffffffff, 0x36384040, + 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262832, + 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, + 0, 1, 0, 0x00000e20, 0xffffffff, 0x34363840, + 0, 1, 0, 0x00000e24, 0xffffffff, 0x42424444, + 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323638, + 0, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444, + 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303236, + 0, 1, 1, 0x00000e34, 0xffffffff, 0x38404242, + 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283034, + 0, 1, 2, 0x00000ed8, 0xffffffff, 0x36384040, + 0, 1, 2, 0x00000edc, 0xffffffff, 0x24262832, + 0, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444, + 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303236, + 0, 1, 0, 0x00000e44, 0xffffffff, 0x42422426, + 0, 1, 1, 0x00000e48, 0xffffffff, 0x30343840, + 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, + 0, 1, 2, 0x00000ee0, 0xffffffff, 0x36384040, + 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262832, + 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, + 0, 2, 0, 0x00001820, 0xffffffff, 0x34363840, + 0, 2, 0, 0x00001824, 0xffffffff, 0x42424444, + 0, 2, 0, 0x00001828, 0xffffffff, 0x30323638, + 0, 2, 0, 0x0000182c, 0xffffffff, 0x40424444, + 0, 2, 0, 0x00001830, 0xffffffff, 0x28303236, + 0, 2, 1, 0x00001834, 0xffffffff, 0x38404242, + 0, 2, 1, 0x00001838, 0xffffffff, 0x26283034, + 0, 2, 2, 0x000018d8, 0xffffffff, 0x36384040, + 0, 2, 2, 0x000018dc, 0xffffffff, 0x24262832, + 0, 2, 0, 0x0000183c, 0xffffffff, 0x40424444, + 0, 2, 0, 0x00001840, 0xffffffff, 0x28303236, + 0, 2, 0, 0x00001844, 0xffffffff, 0x42422426, + 0, 2, 1, 0x00001848, 0xffffffff, 0x30343840, + 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, + 0, 2, 2, 0x000018e0, 0xffffffff, 0x36384040, + 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262832, + 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, + 0, 3, 0, 0x00001a20, 0xffffffff, 0x34363840, + 0, 3, 0, 0x00001a24, 0xffffffff, 0x42424444, + 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323638, + 0, 3, 0, 0x00001a2c, 0xffffffff, 0x40424444, + 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303236, + 0, 3, 1, 0x00001a34, 0xffffffff, 0x38404242, + 0, 3, 1, 0x00001a38, 0xffffffff, 0x26283034, + 0, 3, 2, 0x00001ad8, 0xffffffff, 0x36384040, + 0, 3, 2, 0x00001adc, 0xffffffff, 0x24262832, + 0, 3, 0, 0x00001a3c, 0xffffffff, 0x40424444, + 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303236, + 0, 3, 0, 0x00001a44, 0xffffffff, 0x42422426, + 0, 3, 1, 0x00001a48, 0xffffffff, 0x30343840, + 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, + 0, 3, 2, 0x00001ae0, 0xffffffff, 0x36384040, + 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262832, + 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x42424444, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323640, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303236, + 1, 0, 1, 0x00000c34, 0xffffffff, 0x38404242, + 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283034, + 1, 0, 2, 0x00000cd8, 0xffffffff, 0x36384040, + 1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262832, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303236, + 1, 0, 0, 0x00000c44, 0xffffffff, 0x42422426, + 1, 0, 1, 0x00000c48, 0xffffffff, 0x30343840, + 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, + 1, 0, 2, 0x00000ce0, 0xffffffff, 0x36384040, + 1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262832, + 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, + 1, 1, 0, 0x00000e24, 0xffffffff, 0x42424444, + 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323640, + 1, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444, + 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303236, + 1, 1, 1, 0x00000e34, 0xffffffff, 0x38404242, + 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283034, + 1, 1, 2, 0x00000ed8, 0xffffffff, 0x36384040, + 1, 1, 2, 0x00000edc, 0xffffffff, 0x24262832, + 1, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444, + 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303236, + 1, 1, 0, 0x00000e44, 0xffffffff, 0x42422426, + 1, 1, 1, 0x00000e48, 0xffffffff, 0x30343840, + 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, + 1, 1, 2, 0x00000ee0, 0xffffffff, 0x36384040, + 1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262832, + 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, + 1, 2, 0, 0x00001824, 0xffffffff, 0x42424444, + 1, 2, 0, 0x00001828, 0xffffffff, 0x30323640, + 1, 2, 0, 0x0000182c, 0xffffffff, 0x40424444, + 1, 2, 0, 0x00001830, 0xffffffff, 0x28303236, + 1, 2, 1, 0x00001834, 0xffffffff, 0x38404242, + 1, 2, 1, 0x00001838, 0xffffffff, 0x26283034, + 1, 2, 2, 0x000018d8, 0xffffffff, 0x36384040, + 1, 2, 2, 0x000018dc, 0xffffffff, 0x24262832, + 1, 2, 0, 0x0000183c, 0xffffffff, 0x40424444, + 1, 2, 0, 0x00001840, 0xffffffff, 0x28303236, + 1, 2, 0, 0x00001844, 0xffffffff, 0x42422426, + 1, 2, 1, 0x00001848, 0xffffffff, 0x30343840, + 1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, + 1, 2, 2, 0x000018e0, 0xffffffff, 0x36384040, + 1, 2, 2, 0x000018e4, 0xffffffff, 0x24262832, + 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, + 1, 3, 0, 0x00001a24, 0xffffffff, 0x42424444, + 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323640, + 1, 3, 0, 0x00001a2c, 0xffffffff, 0x40424444, + 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303236, + 1, 3, 1, 0x00001a34, 0xffffffff, 0x38404242, + 1, 3, 1, 0x00001a38, 0xffffffff, 0x26283034, + 1, 3, 2, 0x00001ad8, 0xffffffff, 0x36384040, + 1, 3, 2, 0x00001adc, 0xffffffff, 0x24262832, + 1, 3, 0, 0x00001a3c, 0xffffffff, 0x40424444, + 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303236, + 1, 3, 0, 0x00001a44, 0xffffffff, 0x42422426, + 1, 3, 1, 0x00001a48, 0xffffffff, 0x30343840, + 1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, + 1, 3, 2, 0x00001ae0, 0xffffffff, 0x36384040, + 1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262832, + 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022 +}; + +void +odm_read_and_config_mp_8814a_phy_reg_pg( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG)/sizeof(u32); + u32* Array = Array_MP_8814A_PHY_REG_PG; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrByRate = ArrayLen/6; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG\n"); + + pDM_Odm->phy_reg_pg_version = 1; + pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < ArrayLen; i += 6) { + u32 v1 = Array[i]; + u32 v2 = Array[i+1]; + u32 v3 = Array[i+2]; + u32 v4 = Array[i+3]; + u32 v5 = Array[i+4]; + u32 v6 = Array[i+5]; + + odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); +#endif + } +} + + + +/****************************************************************************** +* PHY_REG_PG_Type2.TXT +******************************************************************************/ + +u32 Array_MP_8814A_PHY_REG_PG_Type2[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x36363636, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x36363636, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323436, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x36363636, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, + 0, 0, 1, 0x00000c34, 0xffffffff, 0x34343434, + 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, + 0, 0, 2, 0x00000cd8, 0xffffffff, 0x32323232, + 0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x36363636, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, + 0, 0, 0, 0x00000c44, 0xffffffff, 0x34342426, + 0, 0, 1, 0x00000c48, 0xffffffff, 0x30323434, + 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, + 0, 0, 2, 0x00000ce0, 0xffffffff, 0x32323232, + 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, + 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, + 0, 1, 0, 0x00000e20, 0xffffffff, 0x36363636, + 0, 1, 0, 0x00000e24, 0xffffffff, 0x36363636, + 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323436, + 0, 1, 0, 0x00000e2c, 0xffffffff, 0x36363636, + 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, + 0, 1, 1, 0x00000e34, 0xffffffff, 0x34343434, + 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, + 0, 1, 2, 0x00000ed8, 0xffffffff, 0x32323232, + 0, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, + 0, 1, 0, 0x00000e3c, 0xffffffff, 0x36363636, + 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, + 0, 1, 0, 0x00000e44, 0xffffffff, 0x34342426, + 0, 1, 1, 0x00000e48, 0xffffffff, 0x30323434, + 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, + 0, 1, 2, 0x00000ee0, 0xffffffff, 0x32323232, + 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, + 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, + 0, 2, 0, 0x00001820, 0xffffffff, 0x36363636, + 0, 2, 0, 0x00001824, 0xffffffff, 0x36363636, + 0, 2, 0, 0x00001828, 0xffffffff, 0x30323436, + 0, 2, 0, 0x0000182c, 0xffffffff, 0x36363636, + 0, 2, 0, 0x00001830, 0xffffffff, 0x28303234, + 0, 2, 1, 0x00001834, 0xffffffff, 0x34343434, + 0, 2, 1, 0x00001838, 0xffffffff, 0x26283032, + 0, 2, 2, 0x000018d8, 0xffffffff, 0x32323232, + 0, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, + 0, 2, 0, 0x0000183c, 0xffffffff, 0x36363636, + 0, 2, 0, 0x00001840, 0xffffffff, 0x28303234, + 0, 2, 0, 0x00001844, 0xffffffff, 0x34342426, + 0, 2, 1, 0x00001848, 0xffffffff, 0x30323434, + 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, + 0, 2, 2, 0x000018e0, 0xffffffff, 0x32323232, + 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, + 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, + 0, 3, 0, 0x00001a20, 0xffffffff, 0x36363636, + 0, 3, 0, 0x00001a24, 0xffffffff, 0x36363636, + 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323436, + 0, 3, 0, 0x00001a2c, 0xffffffff, 0x36363636, + 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, + 0, 3, 1, 0x00001a34, 0xffffffff, 0x34343434, + 0, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, + 0, 3, 2, 0x00001ad8, 0xffffffff, 0x32323232, + 0, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, + 0, 3, 0, 0x00001a3c, 0xffffffff, 0x36363636, + 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, + 0, 3, 0, 0x00001a44, 0xffffffff, 0x34342426, + 0, 3, 1, 0x00001a48, 0xffffffff, 0x30323434, + 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, + 0, 3, 2, 0x00001ae0, 0xffffffff, 0x32323232, + 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, + 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x36363636, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323436, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x36363636, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, + 1, 0, 1, 0x00000c34, 0xffffffff, 0x34343434, + 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, + 1, 0, 2, 0x00000cd8, 0xffffffff, 0x32323232, + 1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x36363636, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, + 1, 0, 0, 0x00000c44, 0xffffffff, 0x34342426, + 1, 0, 1, 0x00000c48, 0xffffffff, 0x30323434, + 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, + 1, 0, 2, 0x00000ce0, 0xffffffff, 0x32323232, + 1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, + 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, + 1, 1, 0, 0x00000e24, 0xffffffff, 0x36363636, + 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323436, + 1, 1, 0, 0x00000e2c, 0xffffffff, 0x36363636, + 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, + 1, 1, 1, 0x00000e34, 0xffffffff, 0x34343434, + 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, + 1, 1, 2, 0x00000ed8, 0xffffffff, 0x32323232, + 1, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, + 1, 1, 0, 0x00000e3c, 0xffffffff, 0x36363636, + 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, + 1, 1, 0, 0x00000e44, 0xffffffff, 0x34342426, + 1, 1, 1, 0x00000e48, 0xffffffff, 0x30323434, + 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, + 1, 1, 2, 0x00000ee0, 0xffffffff, 0x32323232, + 1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, + 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, + 1, 2, 0, 0x00001824, 0xffffffff, 0x36363636, + 1, 2, 0, 0x00001828, 0xffffffff, 0x30323436, + 1, 2, 0, 0x0000182c, 0xffffffff, 0x36363636, + 1, 2, 0, 0x00001830, 0xffffffff, 0x28303234, + 1, 2, 1, 0x00001834, 0xffffffff, 0x34343434, + 1, 2, 1, 0x00001838, 0xffffffff, 0x26283032, + 1, 2, 2, 0x000018d8, 0xffffffff, 0x32323232, + 1, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, + 1, 2, 0, 0x0000183c, 0xffffffff, 0x36363636, + 1, 2, 0, 0x00001840, 0xffffffff, 0x28303234, + 1, 2, 0, 0x00001844, 0xffffffff, 0x34342426, + 1, 2, 1, 0x00001848, 0xffffffff, 0x30323434, + 1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, + 1, 2, 2, 0x000018e0, 0xffffffff, 0x32323232, + 1, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, + 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, + 1, 3, 0, 0x00001a24, 0xffffffff, 0x36363636, + 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323436, + 1, 3, 0, 0x00001a2c, 0xffffffff, 0x36363636, + 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, + 1, 3, 1, 0x00001a34, 0xffffffff, 0x34343434, + 1, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, + 1, 3, 2, 0x00001ad8, 0xffffffff, 0x32323232, + 1, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, + 1, 3, 0, 0x00001a3c, 0xffffffff, 0x36363636, + 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, + 1, 3, 0, 0x00001a44, 0xffffffff, 0x34342426, + 1, 3, 1, 0x00001a48, 0xffffffff, 0x30323434, + 1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, + 1, 3, 2, 0x00001ae0, 0xffffffff, 0x32323232, + 1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, + 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022 +}; + +void +odm_read_and_config_mp_8814a_phy_reg_pg_type2( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG_Type2)/sizeof(u32); + u32* Array = Array_MP_8814A_PHY_REG_PG_Type2; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrByRate = ArrayLen/6; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type2\n"); + + pDM_Odm->phy_reg_pg_version = 1; + pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < ArrayLen; i += 6) { + u32 v1 = Array[i]; + u32 v2 = Array[i+1]; + u32 v3 = Array[i+2]; + u32 v4 = Array[i+3]; + u32 v5 = Array[i+4]; + u32 v6 = Array[i+5]; + + odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); +#endif + } +} + + + +/****************************************************************************** +* PHY_REG_PG_Type3.TXT +******************************************************************************/ + +u32 Array_MP_8814A_PHY_REG_PG_Type3[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, + 0, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, + 0, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, + 0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, + 0, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, + 0, 0, 0, 0x00000c44, 0xffffffff, 0x44444040, + 0, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, + 0, 0, 1, 0x00000c4c, 0xffffffff, 0x38384042, + 0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, + 0, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, + 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203636, + 0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848, + 0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, + 0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, + 0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, + 0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, + 0, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, + 0, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, + 0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, + 0, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, + 0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, + 0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, + 0, 1, 0, 0x00000e44, 0xffffffff, 0x44444040, + 0, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, + 0, 1, 1, 0x00000e4c, 0xffffffff, 0x38384042, + 0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, + 0, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, + 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203636, + 0, 2, 0, 0x00001820, 0xffffffff, 0x48484848, + 0, 2, 0, 0x00001824, 0xffffffff, 0x46464646, + 0, 2, 0, 0x00001828, 0xffffffff, 0x44464646, + 0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, + 0, 2, 0, 0x00001830, 0xffffffff, 0x42444646, + 0, 2, 1, 0x00001834, 0xffffffff, 0x44444444, + 0, 2, 1, 0x00001838, 0xffffffff, 0x40424444, + 0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, + 0, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, + 0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, + 0, 2, 0, 0x00001840, 0xffffffff, 0x42444646, + 0, 2, 0, 0x00001844, 0xffffffff, 0x44444040, + 0, 2, 1, 0x00001848, 0xffffffff, 0x44444444, + 0, 2, 1, 0x0000184c, 0xffffffff, 0x38384042, + 0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, + 0, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, + 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20203636, + 0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848, + 0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, + 0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, + 0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, + 0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, + 0, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, + 0, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, + 0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, + 0, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, + 0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, + 0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, + 0, 3, 0, 0x00001a44, 0xffffffff, 0x44444040, + 0, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, + 0, 3, 1, 0x00001a4c, 0xffffffff, 0x38384042, + 0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, + 0, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, + 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203636, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, + 1, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, + 1, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, + 1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, + 1, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, + 1, 0, 0, 0x00000c44, 0xffffffff, 0x44443840, + 1, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, + 1, 0, 1, 0x00000c4c, 0xffffffff, 0x36384042, + 1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, + 1, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, + 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203436, + 1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, + 1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, + 1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, + 1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, + 1, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, + 1, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, + 1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, + 1, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, + 1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, + 1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, + 1, 1, 0, 0x00000e44, 0xffffffff, 0x44443840, + 1, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, + 1, 1, 1, 0x00000e4c, 0xffffffff, 0x36384042, + 1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, + 1, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, + 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203436, + 1, 2, 0, 0x00001824, 0xffffffff, 0x46464646, + 1, 2, 0, 0x00001828, 0xffffffff, 0x44464646, + 1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, + 1, 2, 0, 0x00001830, 0xffffffff, 0x42444646, + 1, 2, 1, 0x00001834, 0xffffffff, 0x44444444, + 1, 2, 1, 0x00001838, 0xffffffff, 0x40424444, + 1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, + 1, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, + 1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, + 1, 2, 0, 0x00001840, 0xffffffff, 0x42444646, + 1, 2, 0, 0x00001844, 0xffffffff, 0x44443840, + 1, 2, 1, 0x00001848, 0xffffffff, 0x44444444, + 1, 2, 1, 0x0000184c, 0xffffffff, 0x36384042, + 1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, + 1, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, + 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20203436, + 1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, + 1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, + 1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, + 1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, + 1, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, + 1, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, + 1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, + 1, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, + 1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, + 1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, + 1, 3, 0, 0x00001a44, 0xffffffff, 0x44443840, + 1, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, + 1, 3, 1, 0x00001a4c, 0xffffffff, 0x36384042, + 1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, + 1, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, + 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203436 +}; + +void +odm_read_and_config_mp_8814a_phy_reg_pg_type3( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG_Type3)/sizeof(u32); + u32* Array = Array_MP_8814A_PHY_REG_PG_Type3; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrByRate = ArrayLen/6; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type3\n"); + + pDM_Odm->phy_reg_pg_version = 1; + pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < ArrayLen; i += 6) { + u32 v1 = Array[i]; + u32 v2 = Array[i+1]; + u32 v3 = Array[i+2]; + u32 v4 = Array[i+3]; + u32 v5 = Array[i+4]; + u32 v6 = Array[i+5]; + + odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); +#endif + } +} + + + +/****************************************************************************** +* PHY_REG_PG_Type5.TXT +******************************************************************************/ + +u32 Array_MP_8814A_PHY_REG_PG_Type5[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, + 0, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, + 0, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, + 0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, + 0, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, + 0, 0, 0, 0x00000c44, 0xffffffff, 0x44444040, + 0, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, + 0, 0, 1, 0x00000c4c, 0xffffffff, 0x38384042, + 0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, + 0, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, + 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203636, + 0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848, + 0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, + 0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, + 0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, + 0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, + 0, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, + 0, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, + 0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, + 0, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, + 0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, + 0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, + 0, 1, 0, 0x00000e44, 0xffffffff, 0x44444040, + 0, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, + 0, 1, 1, 0x00000e4c, 0xffffffff, 0x38384042, + 0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, + 0, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, + 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203636, + 0, 2, 0, 0x00001820, 0xffffffff, 0x48484848, + 0, 2, 0, 0x00001824, 0xffffffff, 0x46464646, + 0, 2, 0, 0x00001828, 0xffffffff, 0x44464646, + 0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, + 0, 2, 0, 0x00001830, 0xffffffff, 0x42444646, + 0, 2, 1, 0x00001834, 0xffffffff, 0x44444444, + 0, 2, 1, 0x00001838, 0xffffffff, 0x40424444, + 0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, + 0, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, + 0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, + 0, 2, 0, 0x00001840, 0xffffffff, 0x42444646, + 0, 2, 0, 0x00001844, 0xffffffff, 0x44444040, + 0, 2, 1, 0x00001848, 0xffffffff, 0x44444444, + 0, 2, 1, 0x0000184c, 0xffffffff, 0x38384042, + 0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, + 0, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, + 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20203636, + 0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848, + 0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, + 0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, + 0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, + 0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, + 0, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, + 0, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, + 0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, + 0, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, + 0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, + 0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, + 0, 3, 0, 0x00001a44, 0xffffffff, 0x44444040, + 0, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, + 0, 3, 1, 0x00001a4c, 0xffffffff, 0x38384042, + 0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, + 0, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, + 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203636, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, + 1, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, + 1, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, + 1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, + 1, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, + 1, 0, 0, 0x00000c44, 0xffffffff, 0x44443840, + 1, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, + 1, 0, 1, 0x00000c4c, 0xffffffff, 0x36384042, + 1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, + 1, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, + 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203436, + 1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, + 1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, + 1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, + 1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, + 1, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, + 1, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, + 1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, + 1, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, + 1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, + 1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, + 1, 1, 0, 0x00000e44, 0xffffffff, 0x44443840, + 1, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, + 1, 1, 1, 0x00000e4c, 0xffffffff, 0x36384042, + 1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, + 1, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, + 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203436, + 1, 2, 0, 0x00001824, 0xffffffff, 0x46464646, + 1, 2, 0, 0x00001828, 0xffffffff, 0x44464646, + 1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, + 1, 2, 0, 0x00001830, 0xffffffff, 0x42444646, + 1, 2, 1, 0x00001834, 0xffffffff, 0x44444444, + 1, 2, 1, 0x00001838, 0xffffffff, 0x40424444, + 1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, + 1, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, + 1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, + 1, 2, 0, 0x00001840, 0xffffffff, 0x42444646, + 1, 2, 0, 0x00001844, 0xffffffff, 0x44443840, + 1, 2, 1, 0x00001848, 0xffffffff, 0x44444444, + 1, 2, 1, 0x0000184c, 0xffffffff, 0x36384042, + 1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, + 1, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, + 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20203436, + 1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, + 1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, + 1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, + 1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, + 1, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, + 1, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, + 1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, + 1, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, + 1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, + 1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, + 1, 3, 0, 0x00001a44, 0xffffffff, 0x44443840, + 1, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, + 1, 3, 1, 0x00001a4c, 0xffffffff, 0x36384042, + 1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, + 1, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, + 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203436 +}; + +void +odm_read_and_config_mp_8814a_phy_reg_pg_type5( + struct dm_struct* pDM_Odm +) +{ + u32 i = 0; + u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG_Type5)/sizeof(u32); + u32* Array = Array_MP_8814A_PHY_REG_PG_Type5; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrByRate = ArrayLen/6; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type5\n"); + + pDM_Odm->phy_reg_pg_version = 1; + pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_RELATIVE_VALUE; + + for (i = 0; i < ArrayLen; i += 6) { + u32 v1 = Array[i]; + u32 v2 = Array[i+1]; + u32 v3 = Array[i+2]; + u32 v4 = Array[i+3]; + u32 v5 = Array[i+4]; + u32 v6 = Array[i+5]; + + odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); +#endif + } +} + + + +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_bb.h b/hal/phydm/rtl8814a/halhwimg8814a_bb.h new file mode 100644 index 0000000..949b6f9 --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_bb.h @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + +/*Image2HeaderVersion: 2.19*/ +#if (RTL8814A_SUPPORT == 1) +#ifndef __INC_MP_BB_HW_IMG_8814A_H +#define __INC_MP_BB_HW_IMG_8814A_H + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_agc_tab(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_AGC_TAB(void); + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_phy_reg(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_PHY_REG(void); + +/****************************************************************************** +* PHY_REG_MP.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_phy_reg_mp(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_PHY_REG_MP(void); + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_phy_reg_pg(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG(void); + +/****************************************************************************** +* PHY_REG_PG_Type2.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_phy_reg_pg_type2(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type2(void); + +/****************************************************************************** +* PHY_REG_PG_Type3.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_phy_reg_pg_type3(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type3(void); + +/****************************************************************************** +* PHY_REG_PG_Type5.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_phy_reg_pg_type5(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct * pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type5(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_fw.h b/hal/phydm/rtl8814a/halhwimg8814a_fw.h new file mode 100644 index 0000000..3f8de12 --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_fw.h @@ -0,0 +1,56 @@ +/****************************************************************************** +* +* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA +* +* +******************************************************************************/ + +#if (RTL8814A_SUPPORT == 1) +#ifndef __INC_MP_FW_HW_IMG_8814A_H +#define __INC_MP_FW_HW_IMG_8814A_H + + +/****************************************************************************** +* FW_AP.TXT +******************************************************************************/ + +void +ODM_ReadFirmware_MP_8814A_FW_AP( + struct dm_struct *pDM_Odm, + u8 *pFirmware, + u32 *pFirmwareSize +); +u4Byte ODM_GetVersion_MP_8814A_FW_AP(void); +extern u32 array_length_mp_8814a_fw_ap; +extern u8 array_mp_8814a_fw_ap[]; + +/****************************************************************************** +* FW_NIC.TXT +******************************************************************************/ + +void +ODM_ReadFirmware_MP_8814A_FW_NIC( + struct dm_struct *pDM_Odm, + u8 *pFirmware, + u32 *pFirmwareSize +); +u4Byte ODM_GetVersion_MP_8814A_FW_NIC(void); +extern u32 array_length_mp_8814a_fw_nic; +extern u8 array_mp_8814a_fw_nic[]; + +#endif +#endif // end of HWIMG_SUPPORT + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_mac.c b/hal/phydm/rtl8814a/halhwimg8814a_mac.c new file mode 100644 index 0000000..0d58670 --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_mac.c @@ -0,0 +1,325 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.19*/ +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) +static BOOLEAN +CheckPositive( + struct dm_struct *pDM_Odm, + u32 Condition1, + u32 Condition2, + u32 Condition3, + u32 Condition4 +) +{ + u1Byte _BoardType = ((pDM_Odm->board_type & BIT4) >> 4) << 0 | /* _GLNA*/ + ((pDM_Odm->board_type & BIT3) >> 3) << 1 | /* _GPA*/ + ((pDM_Odm->board_type & BIT7) >> 7) << 2 | /* _ALNA*/ + ((pDM_Odm->board_type & BIT6) >> 6) << 3 | /* _APA */ + ((pDM_Odm->board_type & BIT2) >> 2) << 4; /* _BT*/ + + u4Byte cond1 = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4; + u4Byte driver1 = pDM_Odm->cut_version << 24 | + (pDM_Odm->support_interface & 0xF0) << 16 | + pDM_Odm->support_platform << 16 | + pDM_Odm->package_type << 12 | + (pDM_Odm->support_interface & 0x0F) << 8 | + _BoardType; + + u4Byte driver2 = (pDM_Odm->type_glna & 0xFF) << 0 | + (pDM_Odm->type_gpa & 0xFF) << 8 | + (pDM_Odm->type_alna & 0xFF) << 16 | + (pDM_Odm->type_apa & 0xFF) << 24; + +u4Byte driver3 = 0; + + u4Byte driver4 = (pDM_Odm->type_glna & 0xFF00) >> 8 | + (pDM_Odm->type_gpa & 0xFF00) | + (pDM_Odm->type_alna & 0xFF00) << 8 | + (pDM_Odm->type_apa & 0xFF00) << 16; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + "===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + "===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + " (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->support_platform, pDM_Odm->support_interface); + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + " (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->board_type, pDM_Odm->package_type); + + + /*============== Value Defined Check ===============*/ + /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ + + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + return FALSE; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return FALSE; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u4Byte bitMask = 0; + + if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ + return TRUE; + + if ((cond1 & BIT0) != 0) /*GLNA*/ + bitMask |= 0x000000FF; + if ((cond1 & BIT1) != 0) /*GPA*/ + bitMask |= 0x0000FF00; + if ((cond1 & BIT2) != 0) /*ALNA*/ + bitMask |= 0x00FF0000; + if ((cond1 & BIT3) != 0) /*APA*/ + bitMask |= 0xFF000000; + + if (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask))) /* BoardType of each RF path is matched*/ + return TRUE; + else + return FALSE; + } else + return FALSE; +} +static BOOLEAN +CheckNegative( + struct dm_struct *pDM_Odm, + u32 Condition1, + u32 Condition2 +) +{ + return TRUE; +} + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u4Byte Array_MP_8814A_MAC_REG[] = { + 0x010, 0x0000007C, + 0x014, 0x000000DB, + 0x016, 0x00000002, + 0x073, 0x00000010, + 0x420, 0x00000080, + 0x421, 0x0000000F, + 0x428, 0x0000000A, + 0x429, 0x00000010, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000007, + 0x437, 0x00000008, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000007, + 0x43F, 0x00000008, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000010, + 0x445, 0x000000F0, + 0x446, 0x00000001, + 0x447, 0x000000FE, + 0x448, 0x00000000, + 0x449, 0x00000000, + 0x44A, 0x00000000, + 0x44B, 0x00000040, + 0x44C, 0x00000010, + 0x44D, 0x000000F0, + 0x44E, 0x0000003F, + 0x44F, 0x00000000, + 0x450, 0x00000000, + 0x451, 0x00000000, + 0x452, 0x00000000, + 0x453, 0x00000040, + 0x45E, 0x00000004, + 0x49C, 0x00000010, + 0x49D, 0x000000F0, + 0x49E, 0x00000000, + 0x49F, 0x00000006, + 0x4A0, 0x000000E0, + 0x4A1, 0x00000003, + 0x4A2, 0x00000000, + 0x4A3, 0x00000040, + 0x4A4, 0x00000015, + 0x4A5, 0x000000F0, + 0x4A6, 0x00000000, + 0x4A7, 0x00000006, + 0x4A8, 0x000000E0, + 0x4A9, 0x00000000, + 0x4AA, 0x00000000, + 0x4AB, 0x00000000, + 0x7DA, 0x00000008, + 0x1448, 0x00000006, + 0x144A, 0x00000006, + 0x144C, 0x00000006, + 0x144E, 0x00000006, + 0x4C8, 0x000000FF, + 0x4C9, 0x00000008, + 0x4CA, 0x0000003C, + 0x4CB, 0x0000003C, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x4CF, 0x00000008, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x516, 0x0000000A, + 0x521, 0x0000002F, + 0x525, 0x0000004F, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55C, 0x00000064, + 0x55D, 0x000000FF, + 0x577, 0x00000003, + 0x5BE, 0x00000064, + 0x604, 0x00000001, + 0x605, 0x00000030, + 0x607, 0x00000001, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x60A, 0x00000000, + 0x60C, 0x00000018, + 0x60D, 0x00000050, + 0x6A0, 0x000000FF, + 0x6A1, 0x000000FF, + 0x6A2, 0x000000FF, + 0x6A3, 0x000000FF, + 0x6A4, 0x000000FF, + 0x6A5, 0x000000FF, + 0x6DE, 0x00000084, + 0x620, 0x000000FF, + 0x621, 0x000000FF, + 0x622, 0x000000FF, + 0x623, 0x000000FF, + 0x624, 0x000000FF, + 0x625, 0x000000FF, + 0x626, 0x000000FF, + 0x627, 0x000000FF, + 0x638, 0x00000064, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x640, 0x00000040, + 0x642, 0x00000040, + 0x643, 0x00000000, + 0x652, 0x000000C8, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + 0x718, 0x00000040, + 0x7D5, 0x000000BC, + 0x7D8, 0x00000028, + 0x7D9, 0x00000000, + 0x7DA, 0x0000000B, + +}; + +void +odm_read_and_config_mp_8814a_mac_reg( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u4Byte ArrayLen = sizeof(Array_MP_8814A_MAC_REG)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8814A_MAC_REG; + + u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_MAC_REG\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigMAC_8814A(pDM_Odm, v1, (u1Byte)v2); + } + i = i + 2; + } +} + +u4Byte +odm_get_version_mp_8814a_mac_reg(void) +{ + return 85; +} + +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_mac.h b/hal/phydm/rtl8814a/halhwimg8814a_mac.h new file mode 100644 index 0000000..94f6a2d --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_mac.h @@ -0,0 +1,39 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + +/*Image2HeaderVersion: 2.19*/ +#if (RTL8814A_SUPPORT == 1) +#ifndef __INC_MP_MAC_HW_IMG_8814A_H +#define __INC_MP_MAC_HW_IMG_8814A_H + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_mac_reg(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte odm_get_version_mp_8814a_mac_reg(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_rf.c b/hal/phydm/rtl8814a/halhwimg8814a_rf.c new file mode 100644 index 0000000..56f0678 --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_rf.c @@ -0,0 +1,8846 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.19*/ +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) +static BOOLEAN +CheckPositive( + struct dm_struct *pDM_Odm, + u32 Condition1, + u32 Condition2, + u32 Condition3, + u32 Condition4 +) +{ + u1Byte _BoardType = ((pDM_Odm->board_type & BIT4) >> 4) << 0 | /* _GLNA*/ + ((pDM_Odm->board_type & BIT3) >> 3) << 1 | /* _GPA*/ + ((pDM_Odm->board_type & BIT7) >> 7) << 2 | /* _ALNA*/ + ((pDM_Odm->board_type & BIT6) >> 6) << 3 | /* _APA */ + ((pDM_Odm->board_type & BIT2) >> 2) << 4; /* _BT*/ + + u4Byte cond1 = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4; + u4Byte driver1 = pDM_Odm->cut_version << 24 | + (pDM_Odm->support_interface & 0xF0) << 16 | + pDM_Odm->support_platform << 16 | + pDM_Odm->package_type << 12 | + (pDM_Odm->support_interface & 0x0F) << 8 | + _BoardType; + + u4Byte driver2 = (pDM_Odm->type_glna & 0xFF) << 0 | + (pDM_Odm->type_gpa & 0xFF) << 8 | + (pDM_Odm->type_alna & 0xFF) << 16 | + (pDM_Odm->type_apa & 0xFF) << 24; + +u4Byte driver3 = 0; + + u4Byte driver4 = (pDM_Odm->type_glna & 0xFF00) >> 8 | + (pDM_Odm->type_gpa & 0xFF00) | + (pDM_Odm->type_alna & 0xFF00) << 8 | + (pDM_Odm->type_apa & 0xFF00) << 16; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + "===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + "===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + " (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->support_platform, pDM_Odm->support_interface); + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, + " (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->board_type, pDM_Odm->package_type); + + + /*============== Value Defined Check ===============*/ + /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ + + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + return FALSE; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return FALSE; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u4Byte bitMask = 0; + + if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ + return TRUE; + + if ((cond1 & BIT0) != 0) /*GLNA*/ + bitMask |= 0x000000FF; + if ((cond1 & BIT1) != 0) /*GPA*/ + bitMask |= 0x0000FF00; + if ((cond1 & BIT2) != 0) /*ALNA*/ + bitMask |= 0x00FF0000; + if ((cond1 & BIT3) != 0) /*APA*/ + bitMask |= 0xFF000000; + + if (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask))) /* BoardType of each RF path is matched*/ + return TRUE; + else + return FALSE; + } else + return FALSE; +} +static BOOLEAN +CheckNegative( + struct dm_struct *pDM_Odm, + u32 Condition1, + u32 Condition2 +) +{ + return TRUE; +} + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +u4Byte Array_MP_8814A_RadioA[] = { + 0x018, 0x00013124, + 0x040, 0x00000C00, + 0x058, 0x00000F98, + 0x07F, 0x00068004, + 0x0B0, 0x000FFFFE, + 0x0B1, 0x0003FF48, + 0x0B2, 0x0006AA3F, + 0x0B3, 0x000FFC9A, + 0x0B4, 0x0000A78F, + 0x0B5, 0x00000A3F, + 0x0B6, 0x0000C09C, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x0B7, 0x00030008, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x0B7, 0x00030008, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x0B7, 0x00030008, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x0B7, 0x00030008, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x0B7, 0x00030008, + 0xA0000000, 0x00000000, + 0x0B7, 0x0003000C, + 0xB0000000, 0x00000000, + 0x0B8, 0x0007400E, + 0x0B9, 0x00008250, + 0x0BA, 0x00050780, + 0x0BB, 0x00000000, + 0x0BC, 0x00040009, + 0x0BD, 0x00000000, + 0x0BE, 0x00000000, + 0x0BF, 0x00000000, + 0x0EF, 0x00020000, + 0x03E, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03F, 0x00030000, + 0xA0000000, 0x00000000, + 0x03F, 0x00030000, + 0xB0000000, 0x00000000, + 0x03E, 0x00020000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03F, 0x00040000, + 0xA0000000, 0x00000000, + 0x03F, 0x00040000, + 0xB0000000, 0x00000000, + 0x03E, 0x00040000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03F, 0x00030000, + 0xA0000000, 0x00000000, + 0x03F, 0x00030000, + 0xB0000000, 0x00000000, + 0x03E, 0x00060000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03F, 0x00030000, + 0xA0000000, 0x00000000, + 0x03F, 0x00030000, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x00010000, + 0x03E, 0x00000000, + 0x03F, 0x00006800, + 0x03E, 0x00000080, + 0x03F, 0x00006000, + 0x03E, 0x00000100, + 0x03F, 0x00004800, + 0x03E, 0x00000180, + 0x03F, 0x00004000, + 0x03E, 0x00000200, + 0x03F, 0x00004000, + 0x03E, 0x00000280, + 0x03F, 0x00002800, + 0x03E, 0x00000300, + 0x03F, 0x00002800, + 0x03E, 0x00000380, + 0x03F, 0x00002000, + 0x0EF, 0x00000000, + 0x0EF, 0x00040000, + 0x03E, 0x00000000, + 0x03F, 0x000000BC, + 0x03E, 0x00000040, + 0x03F, 0x00000053, + 0x03E, 0x00000050, + 0x03F, 0x00000050, + 0x03E, 0x00000060, + 0x03F, 0x00000050, + 0x0EF, 0x00000000, + 0x0EF, 0x00000400, + 0x03E, 0x00000006, + 0x041, 0x000EE080, + 0x03E, 0x00000008, + 0x041, 0x000EE0C0, + 0x03E, 0x0000000A, + 0x041, 0x000EE100, + 0x03E, 0x0000000C, + 0x041, 0x000EE100, + 0x0EF, 0x00000000, + 0x018, 0x00000006, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0xA0000000, 0x00000000, + 0x086, 0x000E4B58, + 0xB0000000, 0x00000000, + 0x80000004, 0x00550000, 0x40000000, 0x00000000, + 0x087, 0x00079F80, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x087, 0x00079F80, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x087, 0x00079F80, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x087, 0x00079F80, + 0xA0000000, 0x00000000, + 0x087, 0x00049F80, + 0xB0000000, 0x00000000, + 0x0DF, 0x00000008, + 0x0EF, 0x00002000, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x03B, 0x0003F19B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x000179C3, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x03B, 0x0003F19B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x000179C3, + 0xA0000000, 0x00000000, + 0x03B, 0x0003F258, + 0x03B, 0x00030A58, + 0x03B, 0x0002FA58, + 0x03B, 0x00022590, + 0x03B, 0x0001FA50, + 0x03B, 0x00010248, + 0x03B, 0x00008240, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000100, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0000ADF6, + 0x034, 0x00009DF3, + 0x034, 0x00008DF0, + 0x034, 0x00007DED, + 0x034, 0x00006DEA, + 0x034, 0x00005CED, + 0x034, 0x00004CEA, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146A, + 0x034, 0x0000006B, + 0xB0000000, 0x00000000, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0008ADF6, + 0x034, 0x00089DF3, + 0x034, 0x00088DF0, + 0x034, 0x00087DED, + 0x034, 0x00086DEA, + 0x034, 0x00085CED, + 0x034, 0x00084CEA, + 0x034, 0x000834EA, + 0x034, 0x000824E7, + 0x034, 0x0008146A, + 0x034, 0x0008006B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x018, 0x0001012A, + 0x081, 0x0007FC00, + 0x089, 0x00050110, + 0x08A, 0x00043E50, + 0x08B, 0x0002E180, + 0x08C, 0x00093C3C, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x085, 0x000F8000, + 0xA0000000, 0x00000000, + 0x085, 0x000F8000, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x08D, 0x000FFFF0, + 0xA0000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0xB0000000, 0x00000000, + 0x0EF, 0x00001000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00024000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03C, 0x00024000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00088000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x00028000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00030023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00028623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00021633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0001C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00010293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00009593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0000078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03B, 0x00078023, + 0x03C, 0x00024000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03B, 0x00078023, + 0x03C, 0x000AC000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03B, 0x00078023, + 0x03C, 0x00024000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03B, 0x00078023, + 0x03C, 0x00088000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03B, 0x00078023, + 0x03C, 0x00024000, + 0xA0000000, 0x00000000, + 0x03B, 0x00078023, + 0x03C, 0x0004C000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00070023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00068623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00061633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0005C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00050293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00049593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0004078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03B, 0x000B8023, + 0x03C, 0x00084000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03B, 0x000B8023, + 0x03C, 0x0008C000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03B, 0x000B8023, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03B, 0x000B8023, + 0x03C, 0x00084000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03B, 0x000B8023, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03B, 0x000B8023, + 0x03C, 0x00004000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B0023, + 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00020000, + 0xA0000000, 0x00000000, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A8623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A1633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0009C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00090293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00089593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0008078B, + 0x03C, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x00000800, + 0x03B, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00000801, + 0xA0000000, 0x00000000, + 0x03A, 0x00000803, + 0xB0000000, 0x00000000, + 0x03B, 0x00040000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00001000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00001801, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000003, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00000003, + 0xA0000000, 0x00000000, + 0x03A, 0x00001000, + 0xB0000000, 0x00000000, + 0x03B, 0x00080000, + 0x03A, 0x00001802, + 0x0EF, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x03C, 0x00000000, + 0x03C, 0x00000400, + 0x03C, 0x00000800, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x00013124, + 0x0EF, 0x00000100, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004A1AD, + 0x034, 0x000491AA, + 0x034, 0x000481A7, + 0x034, 0x000470AA, + 0x034, 0x000460A7, + 0x034, 0x00045049, + 0x034, 0x00044046, + 0x034, 0x00043026, + 0x034, 0x00042009, + 0x034, 0x00041006, + 0x034, 0x00040003, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3EF, + 0x034, 0x000493AF, + 0x034, 0x000483AB, + 0x034, 0x0004718C, + 0x034, 0x00046189, + 0x034, 0x0004506D, + 0x034, 0x0004406A, + 0x034, 0x0004302C, + 0x034, 0x00042029, + 0x034, 0x00041026, + 0x034, 0x00040023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3EF, + 0x034, 0x000493AF, + 0x034, 0x000483AB, + 0x034, 0x0004718C, + 0x034, 0x00046189, + 0x034, 0x0004506D, + 0x034, 0x0004406A, + 0x034, 0x0004302C, + 0x034, 0x00042029, + 0x034, 0x00041026, + 0x034, 0x00040023, + 0xA0000000, 0x00000000, + 0x034, 0x0004AFF1, + 0x034, 0x00049FEE, + 0x034, 0x00048FEB, + 0x034, 0x00047FE8, + 0x034, 0x00046DEA, + 0x034, 0x00045DE7, + 0x034, 0x00044CEA, + 0x034, 0x00043CE7, + 0x034, 0x00042C69, + 0x034, 0x00041C66, + 0x034, 0x00040C28, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002A1AD, + 0x034, 0x000291AA, + 0x034, 0x000281A7, + 0x034, 0x000270AA, + 0x034, 0x000260A7, + 0x034, 0x00025049, + 0x034, 0x00024046, + 0x034, 0x00023026, + 0x034, 0x00022009, + 0x034, 0x00021006, + 0x034, 0x00020003, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EF, + 0x034, 0x000293AC, + 0x034, 0x0002838A, + 0x034, 0x0002718C, + 0x034, 0x00026189, + 0x034, 0x0002506D, + 0x034, 0x0002406A, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x00021026, + 0x034, 0x00020023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EF, + 0x034, 0x000293AC, + 0x034, 0x0002838A, + 0x034, 0x0002718C, + 0x034, 0x00026189, + 0x034, 0x0002506D, + 0x034, 0x0002406A, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x00021026, + 0x034, 0x00020023, + 0xA0000000, 0x00000000, + 0x034, 0x0002AFF1, + 0x034, 0x00029FEE, + 0x034, 0x00028FEB, + 0x034, 0x00027FE8, + 0x034, 0x00026DEA, + 0x034, 0x00025DE7, + 0x034, 0x00024CEA, + 0x034, 0x00023CE7, + 0x034, 0x00022C69, + 0x034, 0x00021C66, + 0x034, 0x00020C28, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EC, + 0x034, 0x0000938C, + 0x034, 0x000081AD, + 0x034, 0x000071AA, + 0x034, 0x000061A7, + 0x034, 0x000050AA, + 0x034, 0x000040A7, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x0000100C, + 0x034, 0x00000009, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EE, + 0x034, 0x000093AC, + 0x034, 0x0000838A, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EE, + 0x034, 0x000093AC, + 0x034, 0x0000838A, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0xA0000000, 0x00000000, + 0x034, 0x0000AFF1, + 0x034, 0x00009FEE, + 0x034, 0x00008FEB, + 0x034, 0x00007FE8, + 0x034, 0x00006DEA, + 0x034, 0x00005DE7, + 0x034, 0x00004CEA, + 0x034, 0x00003CE7, + 0x034, 0x00002C69, + 0x034, 0x00001C66, + 0x034, 0x00000C28, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000CA1AD, + 0x034, 0x000C91AA, + 0x034, 0x000C81A7, + 0x034, 0x000C70AA, + 0x034, 0x000C60A7, + 0x034, 0x000C5049, + 0x034, 0x000C4046, + 0x034, 0x000C3026, + 0x034, 0x000C2009, + 0x034, 0x000C1006, + 0x034, 0x000C0003, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3EF, + 0x034, 0x000C93AF, + 0x034, 0x000C83AB, + 0x034, 0x000C718C, + 0x034, 0x000C6189, + 0x034, 0x000C506D, + 0x034, 0x000C406A, + 0x034, 0x000C302C, + 0x034, 0x000C2029, + 0x034, 0x000C1026, + 0x034, 0x000C0023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3EF, + 0x034, 0x000C93AF, + 0x034, 0x000C83AB, + 0x034, 0x000C718C, + 0x034, 0x000C6189, + 0x034, 0x000C506D, + 0x034, 0x000C406A, + 0x034, 0x000C302C, + 0x034, 0x000C2029, + 0x034, 0x000C1026, + 0x034, 0x000C0023, + 0xA0000000, 0x00000000, + 0x034, 0x000CA794, + 0x034, 0x000C9791, + 0x034, 0x000C878E, + 0x034, 0x000C778B, + 0x034, 0x000C658D, + 0x034, 0x000C558A, + 0x034, 0x000C448D, + 0x034, 0x000C348A, + 0x034, 0x000C244C, + 0x034, 0x000C1449, + 0x034, 0x000C042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000AA1AD, + 0x034, 0x000A91AA, + 0x034, 0x000A81A7, + 0x034, 0x000A70AA, + 0x034, 0x000A60A7, + 0x034, 0x000A5049, + 0x034, 0x000A4046, + 0x034, 0x000A3026, + 0x034, 0x000A2009, + 0x034, 0x000A1006, + 0x034, 0x000A0003, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EF, + 0x034, 0x000A93AC, + 0x034, 0x000A838A, + 0x034, 0x000A718C, + 0x034, 0x000A6189, + 0x034, 0x000A506D, + 0x034, 0x000A406A, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A1026, + 0x034, 0x000A0023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EF, + 0x034, 0x000A93AC, + 0x034, 0x000A838A, + 0x034, 0x000A718C, + 0x034, 0x000A6189, + 0x034, 0x000A506D, + 0x034, 0x000A406A, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A1026, + 0x034, 0x000A0023, + 0xA0000000, 0x00000000, + 0x034, 0x000AA794, + 0x034, 0x000A9791, + 0x034, 0x000A878E, + 0x034, 0x000A778B, + 0x034, 0x000A658D, + 0x034, 0x000A558A, + 0x034, 0x000A448D, + 0x034, 0x000A348A, + 0x034, 0x000A244C, + 0x034, 0x000A1449, + 0x034, 0x000A042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EC, + 0x034, 0x0008938C, + 0x034, 0x000881AD, + 0x034, 0x000871AA, + 0x034, 0x000861A7, + 0x034, 0x000850AA, + 0x034, 0x000840A7, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x0008100C, + 0x034, 0x00080009, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EE, + 0x034, 0x000893AC, + 0x034, 0x0008838A, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EE, + 0x034, 0x000893AC, + 0x034, 0x0008838A, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0xA0000000, 0x00000000, + 0x034, 0x0008A794, + 0x034, 0x00089791, + 0x034, 0x0008878E, + 0x034, 0x0008778B, + 0x034, 0x0008658D, + 0x034, 0x0008558A, + 0x034, 0x0008448D, + 0x034, 0x0008348A, + 0x034, 0x0008244C, + 0x034, 0x00081449, + 0x034, 0x0008042B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0DF, 0x00000001, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0xA0000000, 0x00000000, + 0x035, 0x00000747, + 0x035, 0x00008747, + 0x035, 0x00010747, + 0x035, 0x00020747, + 0x035, 0x00028747, + 0x035, 0x00030747, + 0x035, 0x00040747, + 0x035, 0x00048747, + 0x035, 0x00050747, + 0x035, 0x000805FB, + 0x035, 0x000885FB, + 0x035, 0x000905FB, + 0x035, 0x000A05FB, + 0x035, 0x000A85FB, + 0x035, 0x000B05FB, + 0x035, 0x000C05FB, + 0x035, 0x000C85FB, + 0x035, 0x000D05FB, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0DF, 0x00000001, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00000473, + 0x036, 0x00008473, + 0x036, 0x00010473, + 0x036, 0x00020473, + 0x036, 0x00028473, + 0x036, 0x00030473, + 0x036, 0x00040473, + 0x036, 0x00048473, + 0x036, 0x00050473, + 0x036, 0x00080473, + 0x036, 0x00088473, + 0x036, 0x00090473, + 0x036, 0x000A0473, + 0x036, 0x000A8473, + 0x036, 0x000B0473, + 0x036, 0x000C0473, + 0x036, 0x000C8473, + 0x036, 0x000D0473, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0xA0000000, 0x00000000, + 0x036, 0x00000473, + 0x036, 0x00008473, + 0x036, 0x00010473, + 0x036, 0x00020473, + 0x036, 0x00028473, + 0x036, 0x00030473, + 0x036, 0x00040473, + 0x036, 0x00048473, + 0x036, 0x00050473, + 0x036, 0x00080473, + 0x036, 0x00088473, + 0x036, 0x00090473, + 0x036, 0x000A0473, + 0x036, 0x000A8473, + 0x036, 0x000B0473, + 0x036, 0x000C0473, + 0x036, 0x000C8473, + 0x036, 0x000D0473, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000004, + 0x037, 0x00000000, + 0x038, 0x00005146, + 0x037, 0x00004000, + 0x038, 0x00005146, + 0x037, 0x00008000, + 0x038, 0x00005146, + 0x037, 0x00010000, + 0x038, 0x00005146, + 0x037, 0x00014000, + 0x038, 0x00005146, + 0x037, 0x00018000, + 0x038, 0x00004D4E, + 0x037, 0x0001C000, + 0x038, 0x00004D4E, + 0x037, 0x00020000, + 0x038, 0x00004D4E, + 0x037, 0x00024000, + 0x038, 0x000071C6, + 0x037, 0x00028000, + 0x038, 0x000071C6, + 0x037, 0x0002C000, + 0x038, 0x000071C6, + 0x037, 0x00030000, + 0x038, 0x000071CE, + 0x037, 0x00034000, + 0x038, 0x000071CE, + 0x037, 0x00038000, + 0x038, 0x00005126, + 0x037, 0x0003C000, + 0x038, 0x00005126, + 0x037, 0x00040000, + 0x038, 0x00005126, + 0x037, 0x00044000, + 0x038, 0x00005126, + 0x037, 0x00048000, + 0x038, 0x00005126, + 0x037, 0x00080000, + 0x038, 0x00005ECE, + 0x037, 0x00084000, + 0x038, 0x00005ECE, + 0x037, 0x00088000, + 0x038, 0x00005ECE, + 0x037, 0x00090000, + 0x038, 0x00005ECE, + 0x037, 0x00094000, + 0x038, 0x00005ECE, + 0x037, 0x00098000, + 0x038, 0x00005ECE, + 0x037, 0x0009C000, + 0x038, 0x00005ECE, + 0x037, 0x000A0000, + 0x038, 0x00005ECE, + 0x037, 0x000A4000, + 0x038, 0x00005ECE, + 0x037, 0x000A8000, + 0x038, 0x00005ECE, + 0x037, 0x000AC000, + 0x038, 0x00005ECE, + 0x037, 0x000B0000, + 0x038, 0x00005ECE, + 0x037, 0x000B4000, + 0x038, 0x00005ECE, + 0x037, 0x000B8000, + 0x038, 0x00005ECE, + 0x037, 0x000BC000, + 0x038, 0x00005ECE, + 0x037, 0x000C0000, + 0x038, 0x00005ECE, + 0x037, 0x000C4000, + 0x038, 0x00005ECE, + 0x037, 0x000C8000, + 0x038, 0x00005ECE, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x0000007D, + 0x03C, 0x0000047D, + 0x03C, 0x0000087D, + 0x03C, 0x0000107D, + 0x03C, 0x0000147D, + 0x03C, 0x0000187D, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027D, + 0x03C, 0x0000054A, + 0x03C, 0x00000821, + 0x03C, 0x0000127D, + 0x03C, 0x0000154A, + 0x03C, 0x00001821, + 0x03C, 0x0000227D, + 0x03C, 0x0000254A, + 0x03C, 0x00002821, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027D, + 0x03C, 0x0000054A, + 0x03C, 0x00000821, + 0x03C, 0x0000127D, + 0x03C, 0x0000154A, + 0x03C, 0x00001821, + 0x03C, 0x0000227D, + 0x03C, 0x0000254A, + 0x03C, 0x00002821, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027D, + 0x03C, 0x0000054A, + 0x03C, 0x00000821, + 0x03C, 0x0000127D, + 0x03C, 0x0000154A, + 0x03C, 0x00001821, + 0x03C, 0x0000227D, + 0x03C, 0x0000254A, + 0x03C, 0x00002821, + 0xA0000000, 0x00000000, + 0x03C, 0x0000037E, + 0x03C, 0x00000575, + 0x03C, 0x00000971, + 0x03C, 0x0000127E, + 0x03C, 0x00001575, + 0x03C, 0x00001871, + 0x03C, 0x0000217E, + 0x03C, 0x00002575, + 0x03C, 0x00002871, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x061, 0x000C0D47, + 0x062, 0x0000133C, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0xA0000000, 0x00000000, + 0x063, 0x0007D0E7, + 0xB0000000, 0x00000000, + 0x064, 0x00014FEC, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0xA0000000, 0x00000000, + 0x065, 0x000933FF, + 0xB0000000, 0x00000000, + 0x066, 0x00000040, + 0x057, 0x00050000, + 0x056, 0x00051DF0, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x055, 0x00082061, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x055, 0x00082061, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x055, 0x00082061, + 0xA0000000, 0x00000000, + 0x055, 0x00082060, + 0xB0000000, 0x00000000, + 0x01C, 0x000739D2, + 0x01F, 0x0002295C, + 0x018, 0x0001B126, + 0xFFE, 0x00000000, + 0xFFE, 0x00000000, + 0xFFE, 0x00000000, + 0x018, 0x00013126, + 0x018, 0x00013124, + +}; + +void +odm_read_and_config_mp_8814a_radioa( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioA)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8814A_RadioA; + + u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioA\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigRF_RadioA_8814A(pDM_Odm, v1, v2); + } + i = i + 2; + } +} + +u4Byte +ODM_GetVersion_MP_8814A_RadioA(void) +{ + return 85; +} + +/****************************************************************************** +* RadioB.TXT +******************************************************************************/ + +u4Byte Array_MP_8814A_RadioB[] = { + 0x018, 0x00013124, + 0x040, 0x00000C00, + 0x058, 0x00000F98, + 0x07F, 0x00068004, + 0x018, 0x00000006, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0xA0000000, 0x00000000, + 0x086, 0x000E4B58, + 0xB0000000, 0x00000000, + 0x80000004, 0x00550000, 0x40000000, 0x00000000, + 0x087, 0x00079F80, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x087, 0x00079F80, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x087, 0x00079F80, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x087, 0x00079F80, + 0xA0000000, 0x00000000, + 0x087, 0x00049F80, + 0xB0000000, 0x00000000, + 0x0DF, 0x00000008, + 0x0EF, 0x00002000, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x03B, 0x0003F19B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x00017BC3, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x03B, 0x0003F39B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x00017BC3, + 0xA0000000, 0x00000000, + 0x03B, 0x0003F258, + 0x03B, 0x00030A58, + 0x03B, 0x0002FA58, + 0x03B, 0x00022590, + 0x03B, 0x0001FA50, + 0x03B, 0x00010248, + 0x03B, 0x00008240, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000100, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0000ADF6, + 0x034, 0x00009DF3, + 0x034, 0x00008DF0, + 0x034, 0x00007DED, + 0x034, 0x00006DEA, + 0x034, 0x00005CED, + 0x034, 0x00004CEA, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146A, + 0x034, 0x0000006B, + 0xB0000000, 0x00000000, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0008ADF6, + 0x034, 0x00089DF3, + 0x034, 0x00088DF0, + 0x034, 0x00087DED, + 0x034, 0x00086DEA, + 0x034, 0x00085CED, + 0x034, 0x00084CEA, + 0x034, 0x000834EA, + 0x034, 0x000824E7, + 0x034, 0x0008146A, + 0x034, 0x0008006B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x018, 0x0001012A, + 0x081, 0x0007FC00, + 0x089, 0x00050110, + 0x08A, 0x00043E50, + 0x08B, 0x0002E180, + 0x08C, 0x00093C3C, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x085, 0x000F8000, + 0xA0000000, 0x00000000, + 0x085, 0x000F8000, + 0xB0000000, 0x00000000, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x08D, 0x000FFFF0, + 0xA0000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0xB0000000, 0x00000000, + 0x0EF, 0x00001000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00088000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03C, 0x00084000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00088000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x00040000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00030023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00028623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00021633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0001C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00010293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00009593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0000078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00020000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00060000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00048000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00048000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00070023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00068623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00061633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0005C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00050293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00049593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0004078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00048000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00060000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x0004C000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00044000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x0004C000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B0023, + 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00020000, + 0xA0000000, 0x00000000, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A8623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A1633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0009C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00090293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00089593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0008078B, + 0x03C, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x00000800, + 0x03B, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0xA0000000, 0x00000000, + 0x03A, 0x00000803, + 0xB0000000, 0x00000000, + 0x03B, 0x00040000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00001000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00001001, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00001003, + 0xA0000000, 0x00000000, + 0x03A, 0x00001000, + 0xB0000000, 0x00000000, + 0x03B, 0x00080000, + 0x80000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x00001802, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x03C, 0x00000000, + 0x03C, 0x00000400, + 0x03C, 0x00000800, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x00013124, + 0x0EF, 0x00000100, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004A38C, + 0x034, 0x000491AD, + 0x034, 0x000481AA, + 0x034, 0x000471A7, + 0x034, 0x000460AA, + 0x034, 0x000450A7, + 0x034, 0x0004402C, + 0x034, 0x00043029, + 0x034, 0x0004200C, + 0x034, 0x00041009, + 0x034, 0x00040006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0004A38C, + 0x034, 0x00049389, + 0x034, 0x0004816D, + 0x034, 0x0004716A, + 0x034, 0x0004606D, + 0x034, 0x0004506A, + 0x034, 0x0004402C, + 0x034, 0x00043029, + 0x034, 0x00042026, + 0x034, 0x00041009, + 0x034, 0x00040006, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0004A38B, + 0x034, 0x00049388, + 0x034, 0x0004818B, + 0x034, 0x00047188, + 0x034, 0x0004606D, + 0x034, 0x0004506A, + 0x034, 0x0004402C, + 0x034, 0x00043029, + 0x034, 0x00042026, + 0x034, 0x00041009, + 0x034, 0x00040006, + 0xA0000000, 0x00000000, + 0x034, 0x0004AFF4, + 0x034, 0x00049FF1, + 0x034, 0x00048FEE, + 0x034, 0x00047FEB, + 0x034, 0x00046FE8, + 0x034, 0x00045DEA, + 0x034, 0x00044CED, + 0x034, 0x00043CEA, + 0x034, 0x00042C6C, + 0x034, 0x00041C69, + 0x034, 0x00040C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002A38C, + 0x034, 0x000291AD, + 0x034, 0x000281AA, + 0x034, 0x000271A7, + 0x034, 0x000260AA, + 0x034, 0x000250A7, + 0x034, 0x0002402C, + 0x034, 0x00023029, + 0x034, 0x0002200C, + 0x034, 0x00021009, + 0x034, 0x00020006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EE, + 0x034, 0x000293AC, + 0x034, 0x00028389, + 0x034, 0x0002716D, + 0x034, 0x0002616A, + 0x034, 0x0002506D, + 0x034, 0x0002406A, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x00021026, + 0x034, 0x00020023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EF, + 0x034, 0x000293AD, + 0x034, 0x0002838A, + 0x034, 0x0002718C, + 0x034, 0x00026189, + 0x034, 0x0002506D, + 0x034, 0x0002406A, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x00021026, + 0x034, 0x00020023, + 0xA0000000, 0x00000000, + 0x034, 0x0002AFF4, + 0x034, 0x00029FF1, + 0x034, 0x00028FEE, + 0x034, 0x00027FEB, + 0x034, 0x00026FE8, + 0x034, 0x00025DEA, + 0x034, 0x00024CED, + 0x034, 0x00023CEA, + 0x034, 0x00022C6C, + 0x034, 0x00021C69, + 0x034, 0x00020C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000A38C, + 0x034, 0x000091AD, + 0x034, 0x000081AA, + 0x034, 0x000071A7, + 0x034, 0x000060AA, + 0x034, 0x000050A7, + 0x034, 0x0000402C, + 0x034, 0x00003029, + 0x034, 0x00002026, + 0x034, 0x00001009, + 0x034, 0x00000006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EC, + 0x034, 0x000093AC, + 0x034, 0x000081EC, + 0x034, 0x0000716D, + 0x034, 0x0000616A, + 0x034, 0x0000506D, + 0x034, 0x0000404C, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EF, + 0x034, 0x000093AD, + 0x034, 0x0000838A, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0xA0000000, 0x00000000, + 0x034, 0x0000AFF4, + 0x034, 0x00009FF1, + 0x034, 0x00008FEE, + 0x034, 0x00007FEB, + 0x034, 0x00006FE8, + 0x034, 0x00005DEA, + 0x034, 0x00004CED, + 0x034, 0x00003CEA, + 0x034, 0x00002C6C, + 0x034, 0x00001C69, + 0x034, 0x00000C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000CA38C, + 0x034, 0x000C91AD, + 0x034, 0x000C81AA, + 0x034, 0x000C71A7, + 0x034, 0x000C60AA, + 0x034, 0x000C50A7, + 0x034, 0x000C402C, + 0x034, 0x000C3029, + 0x034, 0x000C200C, + 0x034, 0x000C1009, + 0x034, 0x000C0006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000CA38C, + 0x034, 0x000C9389, + 0x034, 0x000C816D, + 0x034, 0x000C716A, + 0x034, 0x000C606D, + 0x034, 0x000C506A, + 0x034, 0x000C402C, + 0x034, 0x000C3029, + 0x034, 0x000C2026, + 0x034, 0x000C1009, + 0x034, 0x000C0006, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000CA38B, + 0x034, 0x000C9388, + 0x034, 0x000C818B, + 0x034, 0x000C7188, + 0x034, 0x000C606D, + 0x034, 0x000C506A, + 0x034, 0x000C402C, + 0x034, 0x000C3029, + 0x034, 0x000C2026, + 0x034, 0x000C1009, + 0x034, 0x000C0006, + 0xA0000000, 0x00000000, + 0x034, 0x000CA794, + 0x034, 0x000C9791, + 0x034, 0x000C878E, + 0x034, 0x000C778B, + 0x034, 0x000C658D, + 0x034, 0x000C558A, + 0x034, 0x000C448D, + 0x034, 0x000C348A, + 0x034, 0x000C244C, + 0x034, 0x000C1449, + 0x034, 0x000C042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000AA38C, + 0x034, 0x000A91AD, + 0x034, 0x000A81AA, + 0x034, 0x000A71A7, + 0x034, 0x000A60AA, + 0x034, 0x000A50A7, + 0x034, 0x000A402C, + 0x034, 0x000A3029, + 0x034, 0x000A200C, + 0x034, 0x000A1009, + 0x034, 0x000A0006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EE, + 0x034, 0x000A93AC, + 0x034, 0x000A8389, + 0x034, 0x000A716D, + 0x034, 0x000A616A, + 0x034, 0x000A506D, + 0x034, 0x000A406A, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A1026, + 0x034, 0x000A0023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EF, + 0x034, 0x000A93AD, + 0x034, 0x000A838A, + 0x034, 0x000A718C, + 0x034, 0x000A6189, + 0x034, 0x000A506D, + 0x034, 0x000A406A, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A1026, + 0x034, 0x000A0023, + 0xA0000000, 0x00000000, + 0x034, 0x000AA794, + 0x034, 0x000A9791, + 0x034, 0x000A878E, + 0x034, 0x000A778B, + 0x034, 0x000A658D, + 0x034, 0x000A558A, + 0x034, 0x000A448D, + 0x034, 0x000A348A, + 0x034, 0x000A244C, + 0x034, 0x000A1449, + 0x034, 0x000A042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0008A38C, + 0x034, 0x000891AD, + 0x034, 0x000881AA, + 0x034, 0x000871A7, + 0x034, 0x000860AA, + 0x034, 0x000850A7, + 0x034, 0x0008402C, + 0x034, 0x00083029, + 0x034, 0x00082026, + 0x034, 0x00081009, + 0x034, 0x00080006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EC, + 0x034, 0x000893AC, + 0x034, 0x000881EC, + 0x034, 0x0008716D, + 0x034, 0x0008616A, + 0x034, 0x0008506D, + 0x034, 0x0008404C, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EF, + 0x034, 0x000893AD, + 0x034, 0x0008838A, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0xA0000000, 0x00000000, + 0x034, 0x0008A794, + 0x034, 0x00089791, + 0x034, 0x0008878E, + 0x034, 0x0008778B, + 0x034, 0x0008658D, + 0x034, 0x0008558A, + 0x034, 0x0008448D, + 0x034, 0x0008348A, + 0x034, 0x0008244C, + 0x034, 0x00081449, + 0x034, 0x0008042B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0xA0000000, 0x00000000, + 0x0DF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0xA0000000, 0x00000000, + 0x035, 0x00000484, + 0x035, 0x00008484, + 0x035, 0x00010484, + 0x035, 0x00020584, + 0x035, 0x00028584, + 0x035, 0x00030584, + 0x035, 0x00040584, + 0x035, 0x00048584, + 0x035, 0x00050584, + 0x035, 0x000805FB, + 0x035, 0x000885FB, + 0x035, 0x000905FB, + 0x035, 0x000A05FB, + 0x035, 0x000A85FB, + 0x035, 0x000B05FB, + 0x035, 0x000C05FB, + 0x035, 0x000C85FB, + 0x035, 0x000D05FB, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0xA0000000, 0x00000000, + 0x0DF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00000473, + 0x036, 0x00008473, + 0x036, 0x00010473, + 0x036, 0x00020473, + 0x036, 0x00028473, + 0x036, 0x00030473, + 0x036, 0x00040473, + 0x036, 0x00048473, + 0x036, 0x00050473, + 0x036, 0x00080473, + 0x036, 0x00088473, + 0x036, 0x00090473, + 0x036, 0x000A0473, + 0x036, 0x000A8473, + 0x036, 0x000B0473, + 0x036, 0x000C0473, + 0x036, 0x000C8473, + 0x036, 0x000D0473, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0xA0000000, 0x00000000, + 0x036, 0x00000474, + 0x036, 0x00008474, + 0x036, 0x00010474, + 0x036, 0x00020474, + 0x036, 0x00028474, + 0x036, 0x00030474, + 0x036, 0x00040474, + 0x036, 0x00048474, + 0x036, 0x00050474, + 0x036, 0x00080474, + 0x036, 0x00088474, + 0x036, 0x00090474, + 0x036, 0x000A0474, + 0x036, 0x000A8474, + 0x036, 0x000B0474, + 0x036, 0x000C0474, + 0x036, 0x000C8474, + 0x036, 0x000D0474, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000004, + 0x037, 0x00000000, + 0x038, 0x0000514E, + 0x037, 0x00004000, + 0x038, 0x0000514E, + 0x037, 0x00008000, + 0x038, 0x0000514E, + 0x037, 0x00010000, + 0x038, 0x0000514E, + 0x037, 0x00014000, + 0x038, 0x0000514E, + 0x037, 0x00018000, + 0x038, 0x0000514E, + 0x037, 0x0001C000, + 0x038, 0x0000514E, + 0x037, 0x00020000, + 0x038, 0x0000514E, + 0x037, 0x00024000, + 0x038, 0x0000514E, + 0x037, 0x00028000, + 0x038, 0x0000514E, + 0x037, 0x0002C000, + 0x038, 0x0000714E, + 0x037, 0x00030000, + 0x038, 0x0000514E, + 0x037, 0x00034000, + 0x038, 0x0000514E, + 0x037, 0x00038000, + 0x038, 0x0000514E, + 0x037, 0x0003C000, + 0x038, 0x0000514E, + 0x037, 0x00040000, + 0x038, 0x0000514E, + 0x037, 0x00044000, + 0x038, 0x0000514E, + 0x037, 0x00048000, + 0x038, 0x0000514E, + 0x037, 0x00080000, + 0x038, 0x00005ECE, + 0x037, 0x00084000, + 0x038, 0x00005ECE, + 0x037, 0x00088000, + 0x038, 0x00005ECE, + 0x037, 0x00090000, + 0x038, 0x00005ECE, + 0x037, 0x00094000, + 0x038, 0x00005ECE, + 0x037, 0x00098000, + 0x038, 0x00005ECE, + 0x037, 0x0009C000, + 0x038, 0x00005ECE, + 0x037, 0x000A0000, + 0x038, 0x00005ECE, + 0x037, 0x000A4000, + 0x038, 0x00005ECE, + 0x037, 0x000A8000, + 0x038, 0x00005ECE, + 0x037, 0x000AC000, + 0x038, 0x00005ECE, + 0x037, 0x000B0000, + 0x038, 0x00005ECE, + 0x037, 0x000B4000, + 0x038, 0x00005ECE, + 0x037, 0x000B8000, + 0x038, 0x00005ECE, + 0x037, 0x000BC000, + 0x038, 0x00005ECE, + 0x037, 0x000C0000, + 0x038, 0x00005ECE, + 0x037, 0x000C4000, + 0x038, 0x00005ECE, + 0x037, 0x000C8000, + 0x038, 0x00005ECE, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x0000007D, + 0x03C, 0x0000047D, + 0x03C, 0x0000087D, + 0x03C, 0x0000107D, + 0x03C, 0x0000147D, + 0x03C, 0x0000187D, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027E, + 0x03C, 0x00000546, + 0x03C, 0x00000821, + 0x03C, 0x0000127E, + 0x03C, 0x00001546, + 0x03C, 0x00001821, + 0x03C, 0x0000227E, + 0x03C, 0x00002546, + 0x03C, 0x00002821, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027E, + 0x03C, 0x00000546, + 0x03C, 0x00000821, + 0x03C, 0x0000127E, + 0x03C, 0x00001546, + 0x03C, 0x00001821, + 0x03C, 0x0000227E, + 0x03C, 0x00002546, + 0x03C, 0x00002821, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027E, + 0x03C, 0x00000546, + 0x03C, 0x00000821, + 0x03C, 0x0000127E, + 0x03C, 0x00001546, + 0x03C, 0x00001821, + 0x03C, 0x0000227E, + 0x03C, 0x00002546, + 0x03C, 0x00002821, + 0xA0000000, 0x00000000, + 0x03C, 0x0000037E, + 0x03C, 0x00000575, + 0x03C, 0x00000971, + 0x03C, 0x0000127E, + 0x03C, 0x00001575, + 0x03C, 0x00001871, + 0x03C, 0x0000217E, + 0x03C, 0x00002575, + 0x03C, 0x00002871, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x061, 0x000C0D47, + 0x062, 0x0000133C, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0xA0000000, 0x00000000, + 0x063, 0x0007D0E7, + 0xB0000000, 0x00000000, + 0x064, 0x00014FEC, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0xA0000000, 0x00000000, + 0x065, 0x000923FF, + 0xB0000000, 0x00000000, + 0x066, 0x00000040, + 0x057, 0x00050000, + 0x056, 0x00051DF0, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x055, 0x00082060, + 0xB0000000, 0x00000000, + +}; + +void +odm_read_and_config_mp_8814a_radiob( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioB)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8814A_RadioB; + + u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioB\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigRF_RadioB_8814A(pDM_Odm, v1, v2); + } + i = i + 2; + } +} + +u4Byte +ODM_GetVersion_MP_8814A_RadioB(void) +{ + return 85; +} + +/****************************************************************************** +* RadioC.TXT +******************************************************************************/ + +u4Byte Array_MP_8814A_RadioC[] = { + 0x018, 0x00013124, + 0x040, 0x00000C00, + 0x058, 0x00000F98, + 0x07F, 0x00068004, + 0x018, 0x00000006, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0x087, 0x00079F80, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0x087, 0x00079F80, + 0xA0000000, 0x00000000, + 0x086, 0x000E4B58, + 0x087, 0x00049F80, + 0xB0000000, 0x00000000, + 0x0DF, 0x00000008, + 0x0EF, 0x00002000, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x03B, 0x0003F19B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x00017823, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x03B, 0x0003F19B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x00017823, + 0xA0000000, 0x00000000, + 0x03B, 0x0003F258, + 0x03B, 0x00030A58, + 0x03B, 0x0002FA58, + 0x03B, 0x00022590, + 0x03B, 0x0001FA50, + 0x03B, 0x00010248, + 0x03B, 0x00008240, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000100, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0000ADF6, + 0x034, 0x00009DF3, + 0x034, 0x00008DF0, + 0x034, 0x00007DED, + 0x034, 0x00006DEA, + 0x034, 0x00005CED, + 0x034, 0x00004CEA, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146A, + 0x034, 0x0000006B, + 0xB0000000, 0x00000000, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0008ADF6, + 0x034, 0x00089DF3, + 0x034, 0x00088DF0, + 0x034, 0x00087DED, + 0x034, 0x00086DEA, + 0x034, 0x00085CED, + 0x034, 0x00084CEA, + 0x034, 0x000834EA, + 0x034, 0x000824E7, + 0x034, 0x0008146A, + 0x034, 0x0008006B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x018, 0x0001012A, + 0x081, 0x0007FC00, + 0x089, 0x00050110, + 0x08A, 0x00043E50, + 0x08B, 0x0002E180, + 0x08C, 0x00093C3C, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x085, 0x000F8000, + 0xA0000000, 0x00000000, + 0x085, 0x000F8000, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x08D, 0x000FFFF0, + 0xA0000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0xB0000000, 0x00000000, + 0x0EF, 0x00001000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x0006C000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03C, 0x000D4000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03C, 0x00080000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00088000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x000A0000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00030023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00028623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00021633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0001C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00010293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00009593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0000078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x0004C000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00084000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00080000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00028000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00070023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00068623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00061633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0005C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00050293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00049593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0004078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00024000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00060000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00080000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00024000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B0023, + 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00020000, + 0xA0000000, 0x00000000, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A8623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A1633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0009C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00090293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00089593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0008078B, + 0x03C, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x00000800, + 0x03B, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00000000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00001803, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00001803, + 0xA0000000, 0x00000000, + 0x03A, 0x00000803, + 0xB0000000, 0x00000000, + 0x03B, 0x00040000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00001000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00000800, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00000803, + 0xA0000000, 0x00000000, + 0x03A, 0x00001000, + 0xB0000000, 0x00000000, + 0x03B, 0x00080000, + 0x80000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x00001802, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x03C, 0x00000000, + 0x03C, 0x00000400, + 0x03C, 0x00000800, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x018, 0x00013124, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x018, 0x00013124, + 0xA0000000, 0x00000000, + 0x018, 0x00013124, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000100, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004A38C, + 0x034, 0x000491AD, + 0x034, 0x000481AA, + 0x034, 0x000471A7, + 0x034, 0x000460AA, + 0x034, 0x000450A7, + 0x034, 0x0004402C, + 0x034, 0x00043029, + 0x034, 0x0004200C, + 0x034, 0x00041009, + 0x034, 0x00040006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3EF, + 0x034, 0x000493AD, + 0x034, 0x0004838A, + 0x034, 0x0004718C, + 0x034, 0x00046189, + 0x034, 0x0004506D, + 0x034, 0x0004404C, + 0x034, 0x0004302C, + 0x034, 0x00042029, + 0x034, 0x00041026, + 0x034, 0x00040023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3EF, + 0x034, 0x000493AD, + 0x034, 0x0004838A, + 0x034, 0x0004718C, + 0x034, 0x00046189, + 0x034, 0x0004506D, + 0x034, 0x0004404C, + 0x034, 0x0004302C, + 0x034, 0x00042029, + 0x034, 0x00041026, + 0x034, 0x00040023, + 0xA0000000, 0x00000000, + 0x034, 0x0004AFF4, + 0x034, 0x00049FF1, + 0x034, 0x00048FEE, + 0x034, 0x00047FEB, + 0x034, 0x00046FE8, + 0x034, 0x00045DEA, + 0x034, 0x00044CED, + 0x034, 0x00043CEA, + 0x034, 0x00042C6C, + 0x034, 0x00041C69, + 0x034, 0x00040C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EC, + 0x034, 0x0002938C, + 0x034, 0x000281AD, + 0x034, 0x000271AA, + 0x034, 0x000261A7, + 0x034, 0x000250AA, + 0x034, 0x000240A7, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x0002100C, + 0x034, 0x00020009, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EC, + 0x034, 0x0002936D, + 0x034, 0x0002836A, + 0x034, 0x0002716D, + 0x034, 0x0002616A, + 0x034, 0x0002506D, + 0x034, 0x0002406A, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x00021026, + 0x034, 0x00020023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EC, + 0x034, 0x000293AC, + 0x034, 0x0002838A, + 0x034, 0x0002718C, + 0x034, 0x00026189, + 0x034, 0x0002506D, + 0x034, 0x0002406A, + 0x034, 0x0002302C, + 0x034, 0x00022029, + 0x034, 0x00021026, + 0x034, 0x00020023, + 0xA0000000, 0x00000000, + 0x034, 0x0002AFF4, + 0x034, 0x00029FF1, + 0x034, 0x00028FEE, + 0x034, 0x00027FEB, + 0x034, 0x00026FE8, + 0x034, 0x00025DEA, + 0x034, 0x00024CED, + 0x034, 0x00023CEA, + 0x034, 0x00022C6C, + 0x034, 0x00021C69, + 0x034, 0x00020C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000A38C, + 0x034, 0x000091AD, + 0x034, 0x000081AA, + 0x034, 0x000071A7, + 0x034, 0x000060AA, + 0x034, 0x000050A7, + 0x034, 0x0000402C, + 0x034, 0x00003029, + 0x034, 0x0000200C, + 0x034, 0x00001009, + 0x034, 0x00000006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EE, + 0x034, 0x000093AB, + 0x034, 0x00008389, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EE, + 0x034, 0x000093AB, + 0x034, 0x00008389, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0xA0000000, 0x00000000, + 0x034, 0x0000AFF4, + 0x034, 0x00009FF1, + 0x034, 0x00008FEE, + 0x034, 0x00007FEB, + 0x034, 0x00006FE8, + 0x034, 0x00005DEA, + 0x034, 0x00004CED, + 0x034, 0x00003CEA, + 0x034, 0x00002C6C, + 0x034, 0x00001C69, + 0x034, 0x00000C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000CA38C, + 0x034, 0x000C91AD, + 0x034, 0x000C81AA, + 0x034, 0x000C71A7, + 0x034, 0x000C60AA, + 0x034, 0x000C50A7, + 0x034, 0x000C402C, + 0x034, 0x000C3029, + 0x034, 0x000C200C, + 0x034, 0x000C1009, + 0x034, 0x000C0006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3EF, + 0x034, 0x000C93AD, + 0x034, 0x000C838A, + 0x034, 0x000C718C, + 0x034, 0x000C6189, + 0x034, 0x000C506D, + 0x034, 0x000C404C, + 0x034, 0x000C302C, + 0x034, 0x000C2029, + 0x034, 0x000C1026, + 0x034, 0x000C0023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3EF, + 0x034, 0x000C93AD, + 0x034, 0x000C838A, + 0x034, 0x000C718C, + 0x034, 0x000C6189, + 0x034, 0x000C506D, + 0x034, 0x000C404C, + 0x034, 0x000C302C, + 0x034, 0x000C2029, + 0x034, 0x000C1026, + 0x034, 0x000C0023, + 0xA0000000, 0x00000000, + 0x034, 0x000CA794, + 0x034, 0x000C9791, + 0x034, 0x000C878E, + 0x034, 0x000C778B, + 0x034, 0x000C658D, + 0x034, 0x000C558A, + 0x034, 0x000C448D, + 0x034, 0x000C348A, + 0x034, 0x000C244C, + 0x034, 0x000C1449, + 0x034, 0x000C042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EC, + 0x034, 0x000A938C, + 0x034, 0x000A81AD, + 0x034, 0x000A71AA, + 0x034, 0x000A61A7, + 0x034, 0x000A50AA, + 0x034, 0x000A40A7, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A100C, + 0x034, 0x000A0009, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EC, + 0x034, 0x000A936D, + 0x034, 0x000A836A, + 0x034, 0x000A716D, + 0x034, 0x000A616A, + 0x034, 0x000A506D, + 0x034, 0x000A406A, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A1026, + 0x034, 0x000A0023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EC, + 0x034, 0x000A93AC, + 0x034, 0x000A838A, + 0x034, 0x000A718C, + 0x034, 0x000A6189, + 0x034, 0x000A506D, + 0x034, 0x000A406A, + 0x034, 0x000A302C, + 0x034, 0x000A2029, + 0x034, 0x000A1026, + 0x034, 0x000A0023, + 0xA0000000, 0x00000000, + 0x034, 0x000AA794, + 0x034, 0x000A9791, + 0x034, 0x000A878E, + 0x034, 0x000A778B, + 0x034, 0x000A658D, + 0x034, 0x000A558A, + 0x034, 0x000A448D, + 0x034, 0x000A348A, + 0x034, 0x000A244C, + 0x034, 0x000A1449, + 0x034, 0x000A042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0008A38C, + 0x034, 0x000891AD, + 0x034, 0x000881AA, + 0x034, 0x000871A7, + 0x034, 0x000860AA, + 0x034, 0x000850A7, + 0x034, 0x0008402C, + 0x034, 0x00083029, + 0x034, 0x0008200C, + 0x034, 0x00081009, + 0x034, 0x00000006, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EE, + 0x034, 0x000893AB, + 0x034, 0x00088389, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EE, + 0x034, 0x000893AB, + 0x034, 0x00088389, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0xA0000000, 0x00000000, + 0x034, 0x0008A794, + 0x034, 0x00089791, + 0x034, 0x0008878E, + 0x034, 0x0008778B, + 0x034, 0x0008658D, + 0x034, 0x0008558A, + 0x034, 0x0008448D, + 0x034, 0x0008348A, + 0x034, 0x0008244C, + 0x034, 0x00081449, + 0x034, 0x0008042B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0xA0000000, 0x00000000, + 0x0DF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0xA0000000, 0x00000000, + 0x035, 0x00000484, + 0x035, 0x00008484, + 0x035, 0x00010484, + 0x035, 0x00020584, + 0x035, 0x00028584, + 0x035, 0x00030584, + 0x035, 0x00040584, + 0x035, 0x00048584, + 0x035, 0x00050584, + 0x035, 0x000805FB, + 0x035, 0x000885FB, + 0x035, 0x000905FB, + 0x035, 0x000A05FB, + 0x035, 0x000A85FB, + 0x035, 0x000B05FB, + 0x035, 0x000C05FB, + 0x035, 0x000C85FB, + 0x035, 0x000D05FB, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0xA0000000, 0x00000000, + 0x0DF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00000473, + 0x036, 0x00008473, + 0x036, 0x00010473, + 0x036, 0x00020473, + 0x036, 0x00028473, + 0x036, 0x00030473, + 0x036, 0x00040473, + 0x036, 0x00048473, + 0x036, 0x00050473, + 0x036, 0x00080473, + 0x036, 0x00088473, + 0x036, 0x00090473, + 0x036, 0x000A0473, + 0x036, 0x000A8473, + 0x036, 0x000B0473, + 0x036, 0x000C0473, + 0x036, 0x000C8473, + 0x036, 0x000D0473, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0xA0000000, 0x00000000, + 0x036, 0x00000474, + 0x036, 0x00008474, + 0x036, 0x00010474, + 0x036, 0x00020474, + 0x036, 0x00028474, + 0x036, 0x00030474, + 0x036, 0x00040474, + 0x036, 0x00048474, + 0x036, 0x00050474, + 0x036, 0x00080474, + 0x036, 0x00088474, + 0x036, 0x00090474, + 0x036, 0x000A0474, + 0x036, 0x000A8474, + 0x036, 0x000B0474, + 0x036, 0x000C0474, + 0x036, 0x000C8474, + 0x036, 0x000D0474, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000004, + 0x037, 0x00000000, + 0x038, 0x0000514E, + 0x037, 0x00004000, + 0x038, 0x0000514E, + 0x037, 0x00008000, + 0x038, 0x0000514E, + 0x037, 0x00010000, + 0x038, 0x0000514E, + 0x037, 0x00014000, + 0x038, 0x0000514E, + 0x037, 0x00018000, + 0x038, 0x0000514E, + 0x037, 0x0001C000, + 0x038, 0x0000514E, + 0x037, 0x00020000, + 0x038, 0x0000514E, + 0x037, 0x00024000, + 0x038, 0x0000514E, + 0x037, 0x00028000, + 0x038, 0x0000514E, + 0x037, 0x0002C000, + 0x038, 0x0000714E, + 0x037, 0x00030000, + 0x038, 0x0000514E, + 0x037, 0x00034000, + 0x038, 0x0000514E, + 0x037, 0x00038000, + 0x038, 0x0000514E, + 0x037, 0x0003C000, + 0x038, 0x0000514E, + 0x037, 0x00040000, + 0x038, 0x0000514E, + 0x037, 0x00044000, + 0x038, 0x0000514E, + 0x037, 0x00048000, + 0x038, 0x0000514E, + 0x037, 0x00080000, + 0x038, 0x00005ECE, + 0x037, 0x00084000, + 0x038, 0x00005ECE, + 0x037, 0x00088000, + 0x038, 0x00005ECE, + 0x037, 0x00090000, + 0x038, 0x00005ECE, + 0x037, 0x00094000, + 0x038, 0x00005ECE, + 0x037, 0x00098000, + 0x038, 0x00005ECE, + 0x037, 0x0009C000, + 0x038, 0x00005ECE, + 0x037, 0x000A0000, + 0x038, 0x00005ECE, + 0x037, 0x000A4000, + 0x038, 0x00005ECE, + 0x037, 0x000A8000, + 0x038, 0x00005ECE, + 0x037, 0x000AC000, + 0x038, 0x00005ECE, + 0x037, 0x000B0000, + 0x038, 0x00005ECE, + 0x037, 0x000B4000, + 0x038, 0x00005ECE, + 0x037, 0x000B8000, + 0x038, 0x00005ECE, + 0x037, 0x000BC000, + 0x038, 0x00005ECE, + 0x037, 0x000C0000, + 0x038, 0x00005ECE, + 0x037, 0x000C4000, + 0x038, 0x00005ECE, + 0x037, 0x000C8000, + 0x038, 0x00005ECE, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x0000007D, + 0x03C, 0x0000047D, + 0x03C, 0x0000087D, + 0x03C, 0x0000107D, + 0x03C, 0x0000147D, + 0x03C, 0x0000187D, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027D, + 0x03C, 0x00000541, + 0x03C, 0x00000821, + 0x03C, 0x0000127D, + 0x03C, 0x00001541, + 0x03C, 0x00001821, + 0x03C, 0x0000227D, + 0x03C, 0x00002541, + 0x03C, 0x00002821, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027D, + 0x03C, 0x00000546, + 0x03C, 0x00000821, + 0x03C, 0x0000127D, + 0x03C, 0x00001546, + 0x03C, 0x00001821, + 0x03C, 0x0000227D, + 0x03C, 0x00002546, + 0x03C, 0x00002821, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027D, + 0x03C, 0x00000546, + 0x03C, 0x00000821, + 0x03C, 0x0000127D, + 0x03C, 0x00001546, + 0x03C, 0x00001821, + 0x03C, 0x0000227D, + 0x03C, 0x00002546, + 0x03C, 0x00002821, + 0xA0000000, 0x00000000, + 0x03C, 0x0000037E, + 0x03C, 0x00000575, + 0x03C, 0x00000971, + 0x03C, 0x0000127E, + 0x03C, 0x00001575, + 0x03C, 0x00001871, + 0x03C, 0x0000217E, + 0x03C, 0x00002575, + 0x03C, 0x00002871, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x061, 0x000C0D47, + 0x062, 0x0000133C, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0xA0000000, 0x00000000, + 0x063, 0x0007D0E7, + 0xB0000000, 0x00000000, + 0x064, 0x00014FEC, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0xA0000000, 0x00000000, + 0x065, 0x000923FF, + 0xB0000000, 0x00000000, + 0x066, 0x00000040, + 0x057, 0x00050000, + 0x056, 0x00051DF0, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x055, 0x00082060, + 0xB0000000, 0x00000000, + +}; + +void +odm_read_and_config_mp_8814a_radioc( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioC)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8814A_RadioC; + + u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioC\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigRF_RadioC_8814A(pDM_Odm, v1, v2); + } + i = i + 2; + } +} + +u4Byte +ODM_GetVersion_MP_8814A_RadioC(void) +{ + return 85; +} + +/****************************************************************************** +* RadioD.TXT +******************************************************************************/ + +u4Byte Array_MP_8814A_RadioD[] = { + 0x018, 0x00013124, + 0x040, 0x00000C00, + 0x058, 0x00000F98, + 0x07F, 0x00068004, + 0x018, 0x00000006, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0x087, 0x00079F80, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x086, 0x000E335A, + 0x087, 0x00079F80, + 0xA0000000, 0x00000000, + 0x086, 0x000E4B58, + 0x087, 0x00049F80, + 0xB0000000, 0x00000000, + 0x0DF, 0x00000008, + 0x0EF, 0x00002000, + 0x80000001, 0x00000055, 0x40000000, 0x00000000, + 0x03B, 0x0003F19B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x00017803, + 0x90000001, 0x000000aa, 0x40000000, 0x00000000, + 0x03B, 0x0003F09B, + 0x03B, 0x00037A5B, + 0x03B, 0x0002A433, + 0x03B, 0x00027BD3, + 0x03B, 0x0001F80B, + 0x03B, 0x00017803, + 0xA0000000, 0x00000000, + 0x03B, 0x0003F258, + 0x03B, 0x00030A58, + 0x03B, 0x0002FA58, + 0x03B, 0x00022590, + 0x03B, 0x0001FA50, + 0x03B, 0x00010248, + 0x03B, 0x00008240, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000100, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0000ADF6, + 0x034, 0x00009DF3, + 0x034, 0x00008DF0, + 0x034, 0x00007DED, + 0x034, 0x00006DEA, + 0x034, 0x00005CED, + 0x034, 0x00004CEA, + 0x034, 0x000034EA, + 0x034, 0x000024E7, + 0x034, 0x0000146A, + 0x034, 0x0000006B, + 0xB0000000, 0x00000000, + 0x80000002, 0x00005500, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, + 0x034, 0x0000A0D0, + 0x034, 0x000090CD, + 0x034, 0x000080CA, + 0x034, 0x0000704D, + 0x034, 0x0000604A, + 0x034, 0x00005047, + 0x034, 0x0000400A, + 0x034, 0x00003007, + 0x034, 0x00002004, + 0x034, 0x00001001, + 0x034, 0x00000001, + 0xA0000000, 0x00000000, + 0x034, 0x0008ADF6, + 0x034, 0x00089DF3, + 0x034, 0x00088DF0, + 0x034, 0x00087DED, + 0x034, 0x00086DEA, + 0x034, 0x00085CED, + 0x034, 0x00084CEA, + 0x034, 0x000834EA, + 0x034, 0x000824E7, + 0x034, 0x0008146A, + 0x034, 0x0008006B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000192, + 0x035, 0x00008192, + 0x035, 0x00010192, + 0x036, 0x00000024, + 0x036, 0x00008024, + 0x036, 0x00010024, + 0x036, 0x00018024, + 0x0EF, 0x00000000, + 0x051, 0x00000C21, + 0x052, 0x000006D9, + 0x053, 0x000FC649, + 0x054, 0x0000017E, + 0x018, 0x0001012A, + 0x081, 0x0007FC00, + 0x089, 0x00050110, + 0x08A, 0x00043E50, + 0x08B, 0x0002E180, + 0x08C, 0x00093C3C, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x085, 0x000F8000, + 0xA0000000, 0x00000000, + 0x085, 0x000F8000, + 0xB0000000, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x08D, 0x000FFFF0, + 0xA0000000, 0x00000000, + 0x08D, 0x000FFFF0, + 0xB0000000, 0x00000000, + 0x0EF, 0x00001000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x03C, 0x00044000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x03C, 0x00048000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x03C, 0x00088000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00038023, + 0x03C, 0x00048000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00030023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00028623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00021633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0001C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00010293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00009593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0000078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00020000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00020000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00044000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00078023, + 0x03C, 0x00024000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00070023, + 0x03C, 0x00048000, + 0x03A, 0x0000013C, + 0x03B, 0x00068623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00061633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0005C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00050293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00049593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0004078B, + 0x03C, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00004000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00060000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00024000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00000000, + 0xA0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B8023, + 0x03C, 0x00004000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000B0023, + 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03C, 0x00020000, + 0xA0000000, 0x00000000, + 0x03C, 0x00020000, + 0xB0000000, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A8623, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x000A1633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x0009C633, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00090293, + 0x03C, 0x00000000, + 0x03A, 0x0000013C, + 0x03B, 0x00089593, + 0x03C, 0x00000000, + 0x03A, 0x00000148, + 0x03B, 0x0008078B, + 0x03C, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x00000800, + 0x03B, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x00000803, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00000803, + 0xA0000000, 0x00000000, + 0x03A, 0x00000803, + 0xB0000000, 0x00000000, + 0x03B, 0x00040000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x03A, 0x00001000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x03A, 0x00001002, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x03A, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x03A, 0x00001000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0x03A, 0x00000001, + 0xA0000000, 0x00000000, + 0x03A, 0x00001000, + 0xB0000000, 0x00000000, + 0x03B, 0x00080000, + 0x03A, 0x00001802, + 0x0EF, 0x00000000, + 0x80000004, 0x00000000, 0x40000000, 0x00000000, + 0x90000004, 0x00550000, 0x40000000, 0x00000000, + 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, + 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, + 0x90000004, 0x00000000, 0x40000000, 0x00550000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x03C, 0x00000000, + 0x03C, 0x00000400, + 0x03C, 0x00000800, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x00013124, + 0x0EF, 0x00000100, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3EB, + 0x034, 0x0004938B, + 0x034, 0x000481AC, + 0x034, 0x000471A9, + 0x034, 0x000460AC, + 0x034, 0x000450A9, + 0x034, 0x0004402E, + 0x034, 0x0004302B, + 0x034, 0x00042028, + 0x034, 0x0004100B, + 0x034, 0x00040008, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3AD, + 0x034, 0x0004938A, + 0x034, 0x0004818C, + 0x034, 0x00047189, + 0x034, 0x0004606D, + 0x034, 0x0004506A, + 0x034, 0x0004402C, + 0x034, 0x00043029, + 0x034, 0x00042026, + 0x034, 0x00041009, + 0x034, 0x00040006, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0004A3AD, + 0x034, 0x0004938A, + 0x034, 0x0004818C, + 0x034, 0x00047189, + 0x034, 0x0004606D, + 0x034, 0x0004506A, + 0x034, 0x0004402C, + 0x034, 0x00043029, + 0x034, 0x00042026, + 0x034, 0x00041009, + 0x034, 0x00040006, + 0xA0000000, 0x00000000, + 0x034, 0x0004AFF4, + 0x034, 0x00049FF1, + 0x034, 0x00048FEE, + 0x034, 0x00047FEB, + 0x034, 0x00046FE8, + 0x034, 0x00045DEA, + 0x034, 0x00044CED, + 0x034, 0x00043CEA, + 0x034, 0x00042C6C, + 0x034, 0x00041C69, + 0x034, 0x00040C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3EE, + 0x034, 0x000293EB, + 0x034, 0x0002838B, + 0x034, 0x000271AC, + 0x034, 0x000261A9, + 0x034, 0x000250AC, + 0x034, 0x000240A9, + 0x034, 0x000230A6, + 0x034, 0x0002202C, + 0x034, 0x00021029, + 0x034, 0x00020026, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3AD, + 0x034, 0x0002938A, + 0x034, 0x0002818C, + 0x034, 0x00027189, + 0x034, 0x0002606D, + 0x034, 0x0002504C, + 0x034, 0x0002402C, + 0x034, 0x00023029, + 0x034, 0x00022026, + 0x034, 0x00021023, + 0x034, 0x00020006, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0002A3AD, + 0x034, 0x0002938A, + 0x034, 0x0002818C, + 0x034, 0x00027189, + 0x034, 0x0002606D, + 0x034, 0x0002504C, + 0x034, 0x0002402C, + 0x034, 0x00023029, + 0x034, 0x00022026, + 0x034, 0x00021023, + 0x034, 0x00020006, + 0xA0000000, 0x00000000, + 0x034, 0x0002AFF4, + 0x034, 0x00029FF1, + 0x034, 0x00028FEE, + 0x034, 0x00027FEB, + 0x034, 0x00026FE8, + 0x034, 0x00025DEA, + 0x034, 0x00024CED, + 0x034, 0x00023CEA, + 0x034, 0x00022C6C, + 0x034, 0x00021C69, + 0x034, 0x00020C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EF, + 0x034, 0x000093EC, + 0x034, 0x0000838C, + 0x034, 0x000071AD, + 0x034, 0x000061AA, + 0x034, 0x000050AD, + 0x034, 0x000040AA, + 0x034, 0x0000306A, + 0x034, 0x0000202D, + 0x034, 0x0000102A, + 0x034, 0x00000027, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EE, + 0x034, 0x000093AC, + 0x034, 0x0000838A, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0000A3EE, + 0x034, 0x000093AC, + 0x034, 0x0000838A, + 0x034, 0x0000718C, + 0x034, 0x00006189, + 0x034, 0x0000506D, + 0x034, 0x0000406A, + 0x034, 0x0000302C, + 0x034, 0x00002029, + 0x034, 0x00001026, + 0x034, 0x00000023, + 0xA0000000, 0x00000000, + 0x034, 0x0000AFF4, + 0x034, 0x00009FF1, + 0x034, 0x00008FEE, + 0x034, 0x00007FEB, + 0x034, 0x00006FE8, + 0x034, 0x00005DEA, + 0x034, 0x00004CED, + 0x034, 0x00003CEA, + 0x034, 0x00002C6C, + 0x034, 0x00001C69, + 0x034, 0x00000C2B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3EB, + 0x034, 0x000C938B, + 0x034, 0x000C81AC, + 0x034, 0x000C71A9, + 0x034, 0x000C60AC, + 0x034, 0x000C50A9, + 0x034, 0x000C402E, + 0x034, 0x000C302B, + 0x034, 0x000C2028, + 0x034, 0x000C100B, + 0x034, 0x000C0008, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3AD, + 0x034, 0x000C938A, + 0x034, 0x000C818C, + 0x034, 0x000C7189, + 0x034, 0x000C606D, + 0x034, 0x000C506A, + 0x034, 0x000C402C, + 0x034, 0x000C3029, + 0x034, 0x000C2026, + 0x034, 0x000C1009, + 0x034, 0x000C0006, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000CA3AD, + 0x034, 0x000C938A, + 0x034, 0x000C818C, + 0x034, 0x000C7189, + 0x034, 0x000C606D, + 0x034, 0x000C506A, + 0x034, 0x000C402C, + 0x034, 0x000C3029, + 0x034, 0x000C2026, + 0x034, 0x000C1009, + 0x034, 0x000C0006, + 0xA0000000, 0x00000000, + 0x034, 0x000CA794, + 0x034, 0x000C9791, + 0x034, 0x000C878E, + 0x034, 0x000C778B, + 0x034, 0x000C658D, + 0x034, 0x000C558A, + 0x034, 0x000C448D, + 0x034, 0x000C348A, + 0x034, 0x000C244C, + 0x034, 0x000C1449, + 0x034, 0x000C042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3EE, + 0x034, 0x000A93EB, + 0x034, 0x000A838B, + 0x034, 0x000A71AC, + 0x034, 0x000A61A9, + 0x034, 0x000A50AC, + 0x034, 0x000A40A9, + 0x034, 0x000A30A6, + 0x034, 0x000A202C, + 0x034, 0x000A1029, + 0x034, 0x000A0026, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3AD, + 0x034, 0x000A938A, + 0x034, 0x000A818C, + 0x034, 0x000A7189, + 0x034, 0x000A606D, + 0x034, 0x000A504C, + 0x034, 0x000A402C, + 0x034, 0x000A3029, + 0x034, 0x000A2026, + 0x034, 0x000A1023, + 0x034, 0x000A0006, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x000AA3AD, + 0x034, 0x000A938A, + 0x034, 0x000A818C, + 0x034, 0x000A7189, + 0x034, 0x000A606D, + 0x034, 0x000A504C, + 0x034, 0x000A402C, + 0x034, 0x000A3029, + 0x034, 0x000A2026, + 0x034, 0x000A1023, + 0x034, 0x000A0006, + 0xA0000000, 0x00000000, + 0x034, 0x000AA794, + 0x034, 0x000A9791, + 0x034, 0x000A878E, + 0x034, 0x000A778B, + 0x034, 0x000A658D, + 0x034, 0x000A558A, + 0x034, 0x000A448D, + 0x034, 0x000A348A, + 0x034, 0x000A244C, + 0x034, 0x000A1449, + 0x034, 0x000A042B, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EF, + 0x034, 0x000893EC, + 0x034, 0x0008838C, + 0x034, 0x000871AD, + 0x034, 0x000861AA, + 0x034, 0x000850AD, + 0x034, 0x000840AA, + 0x034, 0x0008306A, + 0x034, 0x0008202D, + 0x034, 0x0008102A, + 0x034, 0x00080027, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EE, + 0x034, 0x000893AC, + 0x034, 0x0008838A, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x034, 0x0008A3EE, + 0x034, 0x000893AC, + 0x034, 0x0008838A, + 0x034, 0x0008718C, + 0x034, 0x00086189, + 0x034, 0x0008506D, + 0x034, 0x0008406A, + 0x034, 0x0008302C, + 0x034, 0x00082029, + 0x034, 0x00081026, + 0x034, 0x00080023, + 0xA0000000, 0x00000000, + 0x034, 0x0008A794, + 0x034, 0x00089791, + 0x034, 0x0008878E, + 0x034, 0x0008778B, + 0x034, 0x0008658D, + 0x034, 0x0008558A, + 0x034, 0x0008448D, + 0x034, 0x0008348A, + 0x034, 0x0008244C, + 0x034, 0x00081449, + 0x034, 0x0008042B, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0xA0000000, 0x00000000, + 0x0DF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x035, 0x000006CC, + 0x035, 0x000086CC, + 0x035, 0x000106CC, + 0x035, 0x000206CC, + 0x035, 0x000286CC, + 0x035, 0x000306CC, + 0x035, 0x000406CC, + 0x035, 0x000486CC, + 0x035, 0x000506CC, + 0x035, 0x000806CC, + 0x035, 0x000886CC, + 0x035, 0x000906CC, + 0x035, 0x000A06CC, + 0x035, 0x000A86CC, + 0x035, 0x000B06CC, + 0x035, 0x000C06CC, + 0x035, 0x000C86CC, + 0x035, 0x000D06CC, + 0xA0000000, 0x00000000, + 0x035, 0x00000484, + 0x035, 0x00008484, + 0x035, 0x00010484, + 0x035, 0x00020584, + 0x035, 0x00028584, + 0x035, 0x00030584, + 0x035, 0x00040584, + 0x035, 0x00048584, + 0x035, 0x00050584, + 0x035, 0x000805FB, + 0x035, 0x000885FB, + 0x035, 0x000905FB, + 0x035, 0x000A05FB, + 0x035, 0x000A85FB, + 0x035, 0x000B05FB, + 0x035, 0x000C05FB, + 0x035, 0x000C85FB, + 0x035, 0x000D05FB, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x0DF, 0x00000001, + 0xA0000000, 0x00000000, + 0x0DF, 0x00000000, + 0xB0000000, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00000473, + 0x036, 0x00008473, + 0x036, 0x00010473, + 0x036, 0x00020473, + 0x036, 0x00028473, + 0x036, 0x00030473, + 0x036, 0x00040473, + 0x036, 0x00048473, + 0x036, 0x00050473, + 0x036, 0x00080473, + 0x036, 0x00088473, + 0x036, 0x00090473, + 0x036, 0x000A0473, + 0x036, 0x000A8473, + 0x036, 0x000B0473, + 0x036, 0x000C0473, + 0x036, 0x000C8473, + 0x036, 0x000D0473, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x036, 0x00000475, + 0x036, 0x00008475, + 0x036, 0x00010475, + 0x036, 0x00020475, + 0x036, 0x00028475, + 0x036, 0x00030475, + 0x036, 0x00040475, + 0x036, 0x00048475, + 0x036, 0x00050475, + 0x036, 0x00080475, + 0x036, 0x00088475, + 0x036, 0x00090475, + 0x036, 0x000A0475, + 0x036, 0x000A8475, + 0x036, 0x000B0475, + 0x036, 0x000C0475, + 0x036, 0x000C8475, + 0x036, 0x000D0475, + 0xA0000000, 0x00000000, + 0x036, 0x00000474, + 0x036, 0x00008474, + 0x036, 0x00010474, + 0x036, 0x00020474, + 0x036, 0x00028474, + 0x036, 0x00030474, + 0x036, 0x00040474, + 0x036, 0x00048474, + 0x036, 0x00050474, + 0x036, 0x00080474, + 0x036, 0x00088474, + 0x036, 0x00090474, + 0x036, 0x000A0474, + 0x036, 0x000A8474, + 0x036, 0x000B0474, + 0x036, 0x000C0474, + 0x036, 0x000C8474, + 0x036, 0x000D0474, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x0EF, 0x00000004, + 0x037, 0x00000000, + 0x038, 0x0000514E, + 0x037, 0x00004000, + 0x038, 0x0000514E, + 0x037, 0x00008000, + 0x038, 0x0000514E, + 0x037, 0x00010000, + 0x038, 0x0000514E, + 0x037, 0x00014000, + 0x038, 0x0000514E, + 0x037, 0x00018000, + 0x038, 0x0000514E, + 0x037, 0x0001C000, + 0x038, 0x0000514E, + 0x037, 0x00020000, + 0x038, 0x0000514E, + 0x037, 0x00024000, + 0x038, 0x0000514E, + 0x037, 0x00028000, + 0x038, 0x0000514E, + 0x037, 0x0002C000, + 0x038, 0x0000714E, + 0x037, 0x00030000, + 0x038, 0x0000514E, + 0x037, 0x00034000, + 0x038, 0x0000514E, + 0x037, 0x00038000, + 0x038, 0x0000514E, + 0x037, 0x0003C000, + 0x038, 0x0000514E, + 0x037, 0x00040000, + 0x038, 0x0000514E, + 0x037, 0x00044000, + 0x038, 0x0000514E, + 0x037, 0x00048000, + 0x038, 0x0000514E, + 0x037, 0x00080000, + 0x038, 0x00005ECE, + 0x037, 0x00084000, + 0x038, 0x00005ECE, + 0x037, 0x00088000, + 0x038, 0x00005ECE, + 0x037, 0x00090000, + 0x038, 0x00005ECE, + 0x037, 0x00094000, + 0x038, 0x00005ECE, + 0x037, 0x00098000, + 0x038, 0x00005ECE, + 0x037, 0x0009C000, + 0x038, 0x00005ECE, + 0x037, 0x000A0000, + 0x038, 0x00005ECE, + 0x037, 0x000A4000, + 0x038, 0x00005ECE, + 0x037, 0x000A8000, + 0x038, 0x00005ECE, + 0x037, 0x000AC000, + 0x038, 0x00005ECE, + 0x037, 0x000B0000, + 0x038, 0x00005ECE, + 0x037, 0x000B4000, + 0x038, 0x00005ECE, + 0x037, 0x000B8000, + 0x038, 0x00005ECE, + 0x037, 0x000BC000, + 0x038, 0x00005ECE, + 0x037, 0x000C0000, + 0x038, 0x00005ECE, + 0x037, 0x000C4000, + 0x038, 0x00005ECE, + 0x037, 0x000C8000, + 0x038, 0x00005ECE, + 0x0EF, 0x00000000, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000008, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x03C, 0x0000007D, + 0x03C, 0x0000047D, + 0x03C, 0x0000087D, + 0x03C, 0x0000107D, + 0x03C, 0x0000147D, + 0x03C, 0x0000187D, + 0xB0000000, 0x00000000, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000275, + 0x03C, 0x00000542, + 0x03C, 0x00000821, + 0x03C, 0x00001275, + 0x03C, 0x00001542, + 0x03C, 0x00001821, + 0x03C, 0x00002275, + 0x03C, 0x00002542, + 0x03C, 0x00002821, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027F, + 0x03C, 0x00000542, + 0x03C, 0x00000821, + 0x03C, 0x0000127F, + 0x03C, 0x00001542, + 0x03C, 0x00001821, + 0x03C, 0x0000227F, + 0x03C, 0x00002542, + 0x03C, 0x00002821, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x03C, 0x0000027F, + 0x03C, 0x00000542, + 0x03C, 0x00000821, + 0x03C, 0x0000127F, + 0x03C, 0x00001542, + 0x03C, 0x00001821, + 0x03C, 0x0000227F, + 0x03C, 0x00002542, + 0x03C, 0x00002821, + 0xA0000000, 0x00000000, + 0x03C, 0x0000037E, + 0x03C, 0x00000575, + 0x03C, 0x00000971, + 0x03C, 0x0000127E, + 0x03C, 0x00001575, + 0x03C, 0x00001871, + 0x03C, 0x0000217E, + 0x03C, 0x00002575, + 0x03C, 0x00002871, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x061, 0x000C0D47, + 0x062, 0x0000133C, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x063, 0x000750E7, + 0xA0000000, 0x00000000, + 0x063, 0x0007D0E7, + 0xB0000000, 0x00000000, + 0x064, 0x00014FEC, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0x065, 0x000920D0, + 0xA0000000, 0x00000000, + 0x065, 0x000923FF, + 0xB0000000, 0x00000000, + 0x066, 0x00000040, + 0x057, 0x00050000, + 0x056, 0x00051DF0, + 0x80000008, 0x00000000, 0x40000000, 0x00000000, + 0x90000008, 0x55000000, 0x40000000, 0x00000000, + 0x90000008, 0xaa000000, 0x40000000, 0x00000000, + 0xA0000000, 0x00000000, + 0x055, 0x00082060, + 0xB0000000, 0x00000000, + +}; + +void +odm_read_and_config_mp_8814a_radiod( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u1Byte cCond; + BOOLEAN bMatched = TRUE, bSkipped = FALSE; + u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioD)/sizeof(u4Byte); + pu4Byte Array = Array_MP_8814A_RadioD; + + u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioD\n"); + + while ((i + 1) < ArrayLen) { + v1 = Array[i]; + v2 = Array[i + 1]; + + if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT31) {/* positive condition*/ + cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); + if (cCond == COND_ENDIF) {/*end*/ + bMatched = TRUE; + bSkipped = FALSE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); + } else if (cCond == COND_ELSE) { /*else*/ + bMatched = bSkipped?FALSE:TRUE; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT30) { /*negative condition*/ + if (bSkipped == FALSE) { + if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { + bMatched = TRUE; + bSkipped = TRUE; + } else { + bMatched = FALSE; + bSkipped = FALSE; + } + } else + bMatched = FALSE; + } + } else { + if (bMatched) + odm_ConfigRF_RadioD_8814A(pDM_Odm, v1, v2); + } + i = i + 2; + } +} + +u4Byte +ODM_GetVersion_MP_8814A_RadioD(void) +{ + return 85; +} + +/****************************************************************************** +* TxPowerTrack.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19}, + {0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25, 25}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 16, 17, 18}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20}, + {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 20}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 25, 25}, + {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 25}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 17}, + {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20}, + {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 20}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 23, 24}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, + {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 25}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 12, 12, 13, 13, 14}, + {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21}, + {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 25, 25, 25}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14}; + +void +odm_read_and_config_mp_8814a_txpowertrack( + struct dm_struct * pDM_Odm +) +{ + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); + + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_Type0.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; + +void +odm_read_and_config_mp_8814a_txpowertrack_type0( + struct dm_struct * pDM_Odm +) +{ + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); + + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_Type2.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22}, + {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21}, + {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 21, 21, 21, 21, 21}, + {0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21}, + {0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20}, + {0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15}, + {0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 20}, + {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 20, 20, 20, 20, 20, 20}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type2_8814A[] = {0, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13}; + +void +odm_read_and_config_mp_8814a_txpowertrack_type2( + struct dm_struct * pDM_Odm +) +{ + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); + + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TxPowerTrack_Type5.TXT +******************************************************************************/ + +u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 3, 3, 3, 4, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 4, 5, 6, 7, 7, 8, 7, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, 10, 10, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 0, 0, 1, 1, 2, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 3, 3, 4, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12}, + {0, 1, 2, 3, 3, 7, 7, 8, 8, 9, 11, 12, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 0, 1, 2, 3, 4, 5, 7, 8, 8, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13}, + {0, 0, 1, 2, 3, 3, 5, 5, 6, 8, 8, 9, 10, 11, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {0, 0, 1, 2, 3, 4, 4, 5, 7, 8, 9, 9, 10, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12}, + {0, 1, 2, 3, 3, 7, 7, 8, 8, 9, 11, 12, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 0, 1, 2, 3, 4, 5, 7, 8, 8, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 1, 2, 2, 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 0, 0, 2, 3, 4, 5, 6, 8, 8, 9, 9, 11, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {0, 0, 0, 1, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 0, 1, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12}, + {0, 2, 3, 4, 5, 7, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {0, 1, 2, 3, 3, 4, 6, 7, 8, 8, 10, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, +}; +u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 3, 3, 3, 5, 5, 6, 6, 8, 8, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, + {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {0, 0, 1, 3, 3, 4, 5, 5, 6, 7, 7, 8, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13}, +}; +u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 111, 12, 12, 12, 12, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 10, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type5_8814A[] = {0, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type5_8814A[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type5_8814A[] = {0, 2, 3, 4, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; +u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10}; + +void +odm_read_and_config_mp_8814a_txpowertrack_type5( + struct dm_struct * pDM_Odm +) +{ + struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); + + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); + + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); + odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); +} + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +const char *Array_MP_8814A_TXPWR_LMT[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "30", + "MKK", "2.4G", "20M", "HT", "2T", "01", "30", + "FCC", "2.4G", "20M", "HT", "2T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "30", + "MKK", "2.4G", "20M", "HT", "2T", "02", "30", + "FCC", "2.4G", "20M", "HT", "2T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "30", + "MKK", "2.4G", "20M", "HT", "2T", "03", "30", + "FCC", "2.4G", "20M", "HT", "2T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "30", + "MKK", "2.4G", "20M", "HT", "2T", "04", "30", + "FCC", "2.4G", "20M", "HT", "2T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "30", + "MKK", "2.4G", "20M", "HT", "2T", "05", "30", + "FCC", "2.4G", "20M", "HT", "2T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "30", + "MKK", "2.4G", "20M", "HT", "2T", "06", "30", + "FCC", "2.4G", "20M", "HT", "2T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "30", + "MKK", "2.4G", "20M", "HT", "2T", "07", "30", + "FCC", "2.4G", "20M", "HT", "2T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "30", + "MKK", "2.4G", "20M", "HT", "2T", "08", "30", + "FCC", "2.4G", "20M", "HT", "2T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "30", + "MKK", "2.4G", "20M", "HT", "2T", "09", "30", + "FCC", "2.4G", "20M", "HT", "2T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "30", + "MKK", "2.4G", "20M", "HT", "2T", "10", "30", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "30", + "MKK", "2.4G", "20M", "HT", "2T", "11", "30", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "30", + "MKK", "2.4G", "20M", "HT", "2T", "12", "30", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "30", + "MKK", "2.4G", "20M", "HT", "2T", "13", "30", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "20M", "HT", "3T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "3T", "01", "28", + "MKK", "2.4G", "20M", "HT", "3T", "01", "28", + "FCC", "2.4G", "20M", "HT", "3T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "02", "28", + "MKK", "2.4G", "20M", "HT", "3T", "02", "28", + "FCC", "2.4G", "20M", "HT", "3T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "03", "28", + "MKK", "2.4G", "20M", "HT", "3T", "03", "28", + "FCC", "2.4G", "20M", "HT", "3T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "04", "28", + "MKK", "2.4G", "20M", "HT", "3T", "04", "28", + "FCC", "2.4G", "20M", "HT", "3T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "05", "28", + "MKK", "2.4G", "20M", "HT", "3T", "05", "28", + "FCC", "2.4G", "20M", "HT", "3T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "06", "28", + "MKK", "2.4G", "20M", "HT", "3T", "06", "28", + "FCC", "2.4G", "20M", "HT", "3T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "07", "28", + "MKK", "2.4G", "20M", "HT", "3T", "07", "28", + "FCC", "2.4G", "20M", "HT", "3T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "08", "28", + "MKK", "2.4G", "20M", "HT", "3T", "08", "28", + "FCC", "2.4G", "20M", "HT", "3T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "09", "28", + "MKK", "2.4G", "20M", "HT", "3T", "09", "28", + "FCC", "2.4G", "20M", "HT", "3T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "3T", "10", "28", + "MKK", "2.4G", "20M", "HT", "3T", "10", "28", + "FCC", "2.4G", "20M", "HT", "3T", "11", "28", + "ETSI", "2.4G", "20M", "HT", "3T", "11", "28", + "MKK", "2.4G", "20M", "HT", "3T", "11", "28", + "FCC", "2.4G", "20M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "12", "28", + "MKK", "2.4G", "20M", "HT", "3T", "12", "28", + "FCC", "2.4G", "20M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "13", "28", + "MKK", "2.4G", "20M", "HT", "3T", "13", "28", + "FCC", "2.4G", "20M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", + "MKK", "2.4G", "20M", "HT", "3T", "14", "63", + "FCC", "2.4G", "20M", "HT", "4T", "01", "28", + "ETSI", "2.4G", "20M", "HT", "4T", "01", "26", + "MKK", "2.4G", "20M", "HT", "4T", "01", "26", + "FCC", "2.4G", "20M", "HT", "4T", "02", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "02", "26", + "MKK", "2.4G", "20M", "HT", "4T", "02", "26", + "FCC", "2.4G", "20M", "HT", "4T", "03", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "03", "26", + "MKK", "2.4G", "20M", "HT", "4T", "03", "26", + "FCC", "2.4G", "20M", "HT", "4T", "04", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "04", "26", + "MKK", "2.4G", "20M", "HT", "4T", "04", "26", + "FCC", "2.4G", "20M", "HT", "4T", "05", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "05", "26", + "MKK", "2.4G", "20M", "HT", "4T", "05", "26", + "FCC", "2.4G", "20M", "HT", "4T", "06", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "06", "26", + "MKK", "2.4G", "20M", "HT", "4T", "06", "26", + "FCC", "2.4G", "20M", "HT", "4T", "07", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "07", "26", + "MKK", "2.4G", "20M", "HT", "4T", "07", "26", + "FCC", "2.4G", "20M", "HT", "4T", "08", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "08", "26", + "MKK", "2.4G", "20M", "HT", "4T", "08", "26", + "FCC", "2.4G", "20M", "HT", "4T", "09", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "09", "26", + "MKK", "2.4G", "20M", "HT", "4T", "09", "26", + "FCC", "2.4G", "20M", "HT", "4T", "10", "30", + "ETSI", "2.4G", "20M", "HT", "4T", "10", "26", + "MKK", "2.4G", "20M", "HT", "4T", "10", "26", + "FCC", "2.4G", "20M", "HT", "4T", "11", "26", + "ETSI", "2.4G", "20M", "HT", "4T", "11", "26", + "MKK", "2.4G", "20M", "HT", "4T", "11", "26", + "FCC", "2.4G", "20M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "12", "26", + "MKK", "2.4G", "20M", "HT", "4T", "12", "26", + "FCC", "2.4G", "20M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "13", "26", + "MKK", "2.4G", "20M", "HT", "4T", "13", "26", + "FCC", "2.4G", "20M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", + "MKK", "2.4G", "20M", "HT", "4T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", + "MKK", "2.4G", "40M", "HT", "1T", "12", "32", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", + "MKK", "2.4G", "40M", "HT", "1T", "13", "32", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "34", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "30", + "MKK", "2.4G", "40M", "HT", "2T", "12", "30", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "30", + "MKK", "2.4G", "40M", "HT", "2T", "13", "30", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "3T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", + "MKK", "2.4G", "40M", "HT", "3T", "01", "63", + "FCC", "2.4G", "40M", "HT", "3T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", + "MKK", "2.4G", "40M", "HT", "3T", "02", "63", + "FCC", "2.4G", "40M", "HT", "3T", "03", "28", + "ETSI", "2.4G", "40M", "HT", "3T", "03", "28", + "MKK", "2.4G", "40M", "HT", "3T", "03", "28", + "FCC", "2.4G", "40M", "HT", "3T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "04", "28", + "MKK", "2.4G", "40M", "HT", "3T", "04", "28", + "FCC", "2.4G", "40M", "HT", "3T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "05", "28", + "MKK", "2.4G", "40M", "HT", "3T", "05", "28", + "FCC", "2.4G", "40M", "HT", "3T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "06", "28", + "MKK", "2.4G", "40M", "HT", "3T", "06", "28", + "FCC", "2.4G", "40M", "HT", "3T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "07", "28", + "MKK", "2.4G", "40M", "HT", "3T", "07", "28", + "FCC", "2.4G", "40M", "HT", "3T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "08", "28", + "MKK", "2.4G", "40M", "HT", "3T", "08", "28", + "FCC", "2.4G", "40M", "HT", "3T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "09", "28", + "MKK", "2.4G", "40M", "HT", "3T", "09", "28", + "FCC", "2.4G", "40M", "HT", "3T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "3T", "10", "28", + "MKK", "2.4G", "40M", "HT", "3T", "10", "28", + "FCC", "2.4G", "40M", "HT", "3T", "11", "28", + "ETSI", "2.4G", "40M", "HT", "3T", "11", "28", + "MKK", "2.4G", "40M", "HT", "3T", "11", "28", + "FCC", "2.4G", "40M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "12", "28", + "MKK", "2.4G", "40M", "HT", "3T", "12", "28", + "FCC", "2.4G", "40M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "13", "28", + "MKK", "2.4G", "40M", "HT", "3T", "13", "28", + "FCC", "2.4G", "40M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", + "MKK", "2.4G", "40M", "HT", "3T", "14", "63", + "FCC", "2.4G", "40M", "HT", "4T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", + "MKK", "2.4G", "40M", "HT", "4T", "01", "63", + "FCC", "2.4G", "40M", "HT", "4T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", + "MKK", "2.4G", "40M", "HT", "4T", "02", "63", + "FCC", "2.4G", "40M", "HT", "4T", "03", "26", + "ETSI", "2.4G", "40M", "HT", "4T", "03", "26", + "MKK", "2.4G", "40M", "HT", "4T", "03", "26", + "FCC", "2.4G", "40M", "HT", "4T", "04", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "04", "26", + "MKK", "2.4G", "40M", "HT", "4T", "04", "26", + "FCC", "2.4G", "40M", "HT", "4T", "05", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "05", "26", + "MKK", "2.4G", "40M", "HT", "4T", "05", "26", + "FCC", "2.4G", "40M", "HT", "4T", "06", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "06", "26", + "MKK", "2.4G", "40M", "HT", "4T", "06", "26", + "FCC", "2.4G", "40M", "HT", "4T", "07", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "07", "26", + "MKK", "2.4G", "40M", "HT", "4T", "07", "26", + "FCC", "2.4G", "40M", "HT", "4T", "08", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "08", "26", + "MKK", "2.4G", "40M", "HT", "4T", "08", "26", + "FCC", "2.4G", "40M", "HT", "4T", "09", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "09", "26", + "MKK", "2.4G", "40M", "HT", "4T", "09", "26", + "FCC", "2.4G", "40M", "HT", "4T", "10", "30", + "ETSI", "2.4G", "40M", "HT", "4T", "10", "26", + "MKK", "2.4G", "40M", "HT", "4T", "10", "26", + "FCC", "2.4G", "40M", "HT", "4T", "11", "26", + "ETSI", "2.4G", "40M", "HT", "4T", "11", "26", + "MKK", "2.4G", "40M", "HT", "4T", "11", "26", + "FCC", "2.4G", "40M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "12", "26", + "MKK", "2.4G", "40M", "HT", "4T", "12", "26", + "FCC", "2.4G", "40M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "13", "26", + "MKK", "2.4G", "40M", "HT", "4T", "13", "26", + "FCC", "2.4G", "40M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", + "MKK", "2.4G", "40M", "HT", "4T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", + "MKK", "5G", "20M", "OFDM", "1T", "36", "32", + "FCC", "5G", "20M", "OFDM", "1T", "40", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", + "MKK", "5G", "20M", "OFDM", "1T", "40", "32", + "FCC", "5G", "20M", "OFDM", "1T", "44", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", + "MKK", "5G", "20M", "OFDM", "1T", "44", "32", + "FCC", "5G", "20M", "OFDM", "1T", "48", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", + "MKK", "5G", "20M", "OFDM", "1T", "48", "32", + "FCC", "5G", "20M", "OFDM", "1T", "52", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", + "MKK", "5G", "20M", "OFDM", "1T", "52", "32", + "FCC", "5G", "20M", "OFDM", "1T", "56", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", + "MKK", "5G", "20M", "OFDM", "1T", "56", "32", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", + "MKK", "5G", "20M", "OFDM", "1T", "60", "32", + "FCC", "5G", "20M", "OFDM", "1T", "64", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", + "MKK", "5G", "20M", "OFDM", "1T", "64", "32", + "FCC", "5G", "20M", "OFDM", "1T", "100", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", + "MKK", "5G", "20M", "OFDM", "1T", "100", "32", + "FCC", "5G", "20M", "OFDM", "1T", "104", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "32", + "MKK", "5G", "20M", "OFDM", "1T", "104", "32", + "FCC", "5G", "20M", "OFDM", "1T", "108", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", + "MKK", "5G", "20M", "OFDM", "1T", "108", "32", + "FCC", "5G", "20M", "OFDM", "1T", "112", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", + "MKK", "5G", "20M", "OFDM", "1T", "112", "32", + "FCC", "5G", "20M", "OFDM", "1T", "116", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", + "MKK", "5G", "20M", "OFDM", "1T", "116", "32", + "FCC", "5G", "20M", "OFDM", "1T", "120", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", + "MKK", "5G", "20M", "OFDM", "1T", "120", "32", + "FCC", "5G", "20M", "OFDM", "1T", "124", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", + "MKK", "5G", "20M", "OFDM", "1T", "124", "32", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", + "MKK", "5G", "20M", "OFDM", "1T", "128", "32", + "FCC", "5G", "20M", "OFDM", "1T", "132", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", + "MKK", "5G", "20M", "OFDM", "1T", "132", "32", + "FCC", "5G", "20M", "OFDM", "1T", "136", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", + "MKK", "5G", "20M", "OFDM", "1T", "136", "32", + "FCC", "5G", "20M", "OFDM", "1T", "140", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", + "MKK", "5G", "20M", "OFDM", "1T", "140", "32", + "FCC", "5G", "20M", "OFDM", "1T", "149", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "30", + "ETSI", "5G", "20M", "HT", "1T", "36", "32", + "MKK", "5G", "20M", "HT", "1T", "36", "32", + "FCC", "5G", "20M", "HT", "1T", "40", "30", + "ETSI", "5G", "20M", "HT", "1T", "40", "32", + "MKK", "5G", "20M", "HT", "1T", "40", "32", + "FCC", "5G", "20M", "HT", "1T", "44", "30", + "ETSI", "5G", "20M", "HT", "1T", "44", "32", + "MKK", "5G", "20M", "HT", "1T", "44", "32", + "FCC", "5G", "20M", "HT", "1T", "48", "30", + "ETSI", "5G", "20M", "HT", "1T", "48", "32", + "MKK", "5G", "20M", "HT", "1T", "48", "32", + "FCC", "5G", "20M", "HT", "1T", "52", "36", + "ETSI", "5G", "20M", "HT", "1T", "52", "32", + "MKK", "5G", "20M", "HT", "1T", "52", "32", + "FCC", "5G", "20M", "HT", "1T", "56", "34", + "ETSI", "5G", "20M", "HT", "1T", "56", "32", + "MKK", "5G", "20M", "HT", "1T", "56", "32", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "32", + "MKK", "5G", "20M", "HT", "1T", "60", "32", + "FCC", "5G", "20M", "HT", "1T", "64", "28", + "ETSI", "5G", "20M", "HT", "1T", "64", "32", + "MKK", "5G", "20M", "HT", "1T", "64", "32", + "FCC", "5G", "20M", "HT", "1T", "100", "30", + "ETSI", "5G", "20M", "HT", "1T", "100", "32", + "MKK", "5G", "20M", "HT", "1T", "100", "32", + "FCC", "5G", "20M", "HT", "1T", "104", "30", + "ETSI", "5G", "20M", "HT", "1T", "104", "32", + "MKK", "5G", "20M", "HT", "1T", "104", "32", + "FCC", "5G", "20M", "HT", "1T", "108", "32", + "ETSI", "5G", "20M", "HT", "1T", "108", "32", + "MKK", "5G", "20M", "HT", "1T", "108", "32", + "FCC", "5G", "20M", "HT", "1T", "112", "34", + "ETSI", "5G", "20M", "HT", "1T", "112", "32", + "MKK", "5G", "20M", "HT", "1T", "112", "32", + "FCC", "5G", "20M", "HT", "1T", "116", "34", + "ETSI", "5G", "20M", "HT", "1T", "116", "32", + "MKK", "5G", "20M", "HT", "1T", "116", "32", + "FCC", "5G", "20M", "HT", "1T", "120", "36", + "ETSI", "5G", "20M", "HT", "1T", "120", "32", + "MKK", "5G", "20M", "HT", "1T", "120", "32", + "FCC", "5G", "20M", "HT", "1T", "124", "34", + "ETSI", "5G", "20M", "HT", "1T", "124", "32", + "MKK", "5G", "20M", "HT", "1T", "124", "32", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "32", + "MKK", "5G", "20M", "HT", "1T", "128", "32", + "FCC", "5G", "20M", "HT", "1T", "132", "30", + "ETSI", "5G", "20M", "HT", "1T", "132", "32", + "MKK", "5G", "20M", "HT", "1T", "132", "32", + "FCC", "5G", "20M", "HT", "1T", "136", "30", + "ETSI", "5G", "20M", "HT", "1T", "136", "32", + "MKK", "5G", "20M", "HT", "1T", "136", "32", + "FCC", "5G", "20M", "HT", "1T", "140", "28", + "ETSI", "5G", "20M", "HT", "1T", "140", "32", + "MKK", "5G", "20M", "HT", "1T", "140", "32", + "FCC", "5G", "20M", "HT", "1T", "149", "36", + "ETSI", "5G", "20M", "HT", "1T", "149", "32", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "36", + "ETSI", "5G", "20M", "HT", "1T", "153", "32", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "36", + "ETSI", "5G", "20M", "HT", "1T", "157", "32", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "36", + "ETSI", "5G", "20M", "HT", "1T", "161", "32", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "36", + "ETSI", "5G", "20M", "HT", "1T", "165", "32", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "20M", "HT", "3T", "36", "26", + "ETSI", "5G", "20M", "HT", "3T", "36", "28", + "MKK", "5G", "20M", "HT", "3T", "36", "28", + "FCC", "5G", "20M", "HT", "3T", "40", "26", + "ETSI", "5G", "20M", "HT", "3T", "40", "28", + "MKK", "5G", "20M", "HT", "3T", "40", "28", + "FCC", "5G", "20M", "HT", "3T", "44", "26", + "ETSI", "5G", "20M", "HT", "3T", "44", "28", + "MKK", "5G", "20M", "HT", "3T", "44", "28", + "FCC", "5G", "20M", "HT", "3T", "48", "26", + "ETSI", "5G", "20M", "HT", "3T", "48", "28", + "MKK", "5G", "20M", "HT", "3T", "48", "28", + "FCC", "5G", "20M", "HT", "3T", "52", "32", + "ETSI", "5G", "20M", "HT", "3T", "52", "28", + "MKK", "5G", "20M", "HT", "3T", "52", "28", + "FCC", "5G", "20M", "HT", "3T", "56", "30", + "ETSI", "5G", "20M", "HT", "3T", "56", "28", + "MKK", "5G", "20M", "HT", "3T", "56", "28", + "FCC", "5G", "20M", "HT", "3T", "60", "28", + "ETSI", "5G", "20M", "HT", "3T", "60", "28", + "MKK", "5G", "20M", "HT", "3T", "60", "28", + "FCC", "5G", "20M", "HT", "3T", "64", "24", + "ETSI", "5G", "20M", "HT", "3T", "64", "28", + "MKK", "5G", "20M", "HT", "3T", "64", "28", + "FCC", "5G", "20M", "HT", "3T", "100", "26", + "ETSI", "5G", "20M", "HT", "3T", "100", "28", + "MKK", "5G", "20M", "HT", "3T", "100", "28", + "FCC", "5G", "20M", "HT", "3T", "104", "26", + "ETSI", "5G", "20M", "HT", "3T", "104", "28", + "MKK", "5G", "20M", "HT", "3T", "104", "28", + "FCC", "5G", "20M", "HT", "3T", "108", "28", + "ETSI", "5G", "20M", "HT", "3T", "108", "28", + "MKK", "5G", "20M", "HT", "3T", "108", "28", + "FCC", "5G", "20M", "HT", "3T", "112", "30", + "ETSI", "5G", "20M", "HT", "3T", "112", "28", + "MKK", "5G", "20M", "HT", "3T", "112", "28", + "FCC", "5G", "20M", "HT", "3T", "116", "30", + "ETSI", "5G", "20M", "HT", "3T", "116", "28", + "MKK", "5G", "20M", "HT", "3T", "116", "28", + "FCC", "5G", "20M", "HT", "3T", "120", "32", + "ETSI", "5G", "20M", "HT", "3T", "120", "28", + "MKK", "5G", "20M", "HT", "3T", "120", "28", + "FCC", "5G", "20M", "HT", "3T", "124", "30", + "ETSI", "5G", "20M", "HT", "3T", "124", "28", + "MKK", "5G", "20M", "HT", "3T", "124", "28", + "FCC", "5G", "20M", "HT", "3T", "128", "28", + "ETSI", "5G", "20M", "HT", "3T", "128", "28", + "MKK", "5G", "20M", "HT", "3T", "128", "28", + "FCC", "5G", "20M", "HT", "3T", "132", "26", + "ETSI", "5G", "20M", "HT", "3T", "132", "28", + "MKK", "5G", "20M", "HT", "3T", "132", "28", + "FCC", "5G", "20M", "HT", "3T", "136", "26", + "ETSI", "5G", "20M", "HT", "3T", "136", "28", + "MKK", "5G", "20M", "HT", "3T", "136", "28", + "FCC", "5G", "20M", "HT", "3T", "140", "24", + "ETSI", "5G", "20M", "HT", "3T", "140", "28", + "MKK", "5G", "20M", "HT", "3T", "140", "28", + "FCC", "5G", "20M", "HT", "3T", "149", "32", + "ETSI", "5G", "20M", "HT", "3T", "149", "28", + "MKK", "5G", "20M", "HT", "3T", "149", "63", + "FCC", "5G", "20M", "HT", "3T", "153", "32", + "ETSI", "5G", "20M", "HT", "3T", "153", "28", + "MKK", "5G", "20M", "HT", "3T", "153", "63", + "FCC", "5G", "20M", "HT", "3T", "157", "32", + "ETSI", "5G", "20M", "HT", "3T", "157", "28", + "MKK", "5G", "20M", "HT", "3T", "157", "63", + "FCC", "5G", "20M", "HT", "3T", "161", "32", + "ETSI", "5G", "20M", "HT", "3T", "161", "28", + "MKK", "5G", "20M", "HT", "3T", "161", "63", + "FCC", "5G", "20M", "HT", "3T", "165", "32", + "ETSI", "5G", "20M", "HT", "3T", "165", "28", + "MKK", "5G", "20M", "HT", "3T", "165", "63", + "FCC", "5G", "20M", "HT", "4T", "36", "24", + "ETSI", "5G", "20M", "HT", "4T", "36", "26", + "MKK", "5G", "20M", "HT", "4T", "36", "26", + "FCC", "5G", "20M", "HT", "4T", "40", "24", + "ETSI", "5G", "20M", "HT", "4T", "40", "26", + "MKK", "5G", "20M", "HT", "4T", "40", "26", + "FCC", "5G", "20M", "HT", "4T", "44", "24", + "ETSI", "5G", "20M", "HT", "4T", "44", "26", + "MKK", "5G", "20M", "HT", "4T", "44", "26", + "FCC", "5G", "20M", "HT", "4T", "48", "24", + "ETSI", "5G", "20M", "HT", "4T", "48", "26", + "MKK", "5G", "20M", "HT", "4T", "48", "26", + "FCC", "5G", "20M", "HT", "4T", "52", "30", + "ETSI", "5G", "20M", "HT", "4T", "52", "26", + "MKK", "5G", "20M", "HT", "4T", "52", "26", + "FCC", "5G", "20M", "HT", "4T", "56", "28", + "ETSI", "5G", "20M", "HT", "4T", "56", "26", + "MKK", "5G", "20M", "HT", "4T", "56", "26", + "FCC", "5G", "20M", "HT", "4T", "60", "26", + "ETSI", "5G", "20M", "HT", "4T", "60", "26", + "MKK", "5G", "20M", "HT", "4T", "60", "26", + "FCC", "5G", "20M", "HT", "4T", "64", "22", + "ETSI", "5G", "20M", "HT", "4T", "64", "26", + "MKK", "5G", "20M", "HT", "4T", "64", "26", + "FCC", "5G", "20M", "HT", "4T", "100", "24", + "ETSI", "5G", "20M", "HT", "4T", "100", "26", + "MKK", "5G", "20M", "HT", "4T", "100", "26", + "FCC", "5G", "20M", "HT", "4T", "104", "24", + "ETSI", "5G", "20M", "HT", "4T", "104", "26", + "MKK", "5G", "20M", "HT", "4T", "104", "26", + "FCC", "5G", "20M", "HT", "4T", "108", "26", + "ETSI", "5G", "20M", "HT", "4T", "108", "26", + "MKK", "5G", "20M", "HT", "4T", "108", "26", + "FCC", "5G", "20M", "HT", "4T", "112", "28", + "ETSI", "5G", "20M", "HT", "4T", "112", "26", + "MKK", "5G", "20M", "HT", "4T", "112", "26", + "FCC", "5G", "20M", "HT", "4T", "116", "28", + "ETSI", "5G", "20M", "HT", "4T", "116", "26", + "MKK", "5G", "20M", "HT", "4T", "116", "26", + "FCC", "5G", "20M", "HT", "4T", "120", "30", + "ETSI", "5G", "20M", "HT", "4T", "120", "26", + "MKK", "5G", "20M", "HT", "4T", "120", "26", + "FCC", "5G", "20M", "HT", "4T", "124", "28", + "ETSI", "5G", "20M", "HT", "4T", "124", "26", + "MKK", "5G", "20M", "HT", "4T", "124", "26", + "FCC", "5G", "20M", "HT", "4T", "128", "26", + "ETSI", "5G", "20M", "HT", "4T", "128", "26", + "MKK", "5G", "20M", "HT", "4T", "128", "26", + "FCC", "5G", "20M", "HT", "4T", "132", "24", + "ETSI", "5G", "20M", "HT", "4T", "132", "26", + "MKK", "5G", "20M", "HT", "4T", "132", "26", + "FCC", "5G", "20M", "HT", "4T", "136", "24", + "ETSI", "5G", "20M", "HT", "4T", "136", "26", + "MKK", "5G", "20M", "HT", "4T", "136", "26", + "FCC", "5G", "20M", "HT", "4T", "140", "22", + "ETSI", "5G", "20M", "HT", "4T", "140", "26", + "MKK", "5G", "20M", "HT", "4T", "140", "26", + "FCC", "5G", "20M", "HT", "4T", "149", "30", + "ETSI", "5G", "20M", "HT", "4T", "149", "26", + "MKK", "5G", "20M", "HT", "4T", "149", "63", + "FCC", "5G", "20M", "HT", "4T", "153", "30", + "ETSI", "5G", "20M", "HT", "4T", "153", "26", + "MKK", "5G", "20M", "HT", "4T", "153", "63", + "FCC", "5G", "20M", "HT", "4T", "157", "30", + "ETSI", "5G", "20M", "HT", "4T", "157", "26", + "MKK", "5G", "20M", "HT", "4T", "157", "63", + "FCC", "5G", "20M", "HT", "4T", "161", "30", + "ETSI", "5G", "20M", "HT", "4T", "161", "26", + "MKK", "5G", "20M", "HT", "4T", "161", "63", + "FCC", "5G", "20M", "HT", "4T", "165", "30", + "ETSI", "5G", "20M", "HT", "4T", "165", "26", + "MKK", "5G", "20M", "HT", "4T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "30", + "ETSI", "5G", "40M", "HT", "1T", "38", "32", + "MKK", "5G", "40M", "HT", "1T", "38", "32", + "FCC", "5G", "40M", "HT", "1T", "46", "30", + "ETSI", "5G", "40M", "HT", "1T", "46", "32", + "MKK", "5G", "40M", "HT", "1T", "46", "32", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "32", + "MKK", "5G", "40M", "HT", "1T", "54", "32", + "FCC", "5G", "40M", "HT", "1T", "62", "32", + "ETSI", "5G", "40M", "HT", "1T", "62", "32", + "MKK", "5G", "40M", "HT", "1T", "62", "32", + "FCC", "5G", "40M", "HT", "1T", "102", "28", + "ETSI", "5G", "40M", "HT", "1T", "102", "32", + "MKK", "5G", "40M", "HT", "1T", "102", "32", + "FCC", "5G", "40M", "HT", "1T", "110", "32", + "ETSI", "5G", "40M", "HT", "1T", "110", "32", + "MKK", "5G", "40M", "HT", "1T", "110", "32", + "FCC", "5G", "40M", "HT", "1T", "118", "36", + "ETSI", "5G", "40M", "HT", "1T", "118", "32", + "MKK", "5G", "40M", "HT", "1T", "118", "32", + "FCC", "5G", "40M", "HT", "1T", "126", "34", + "ETSI", "5G", "40M", "HT", "1T", "126", "32", + "MKK", "5G", "40M", "HT", "1T", "126", "32", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "32", + "MKK", "5G", "40M", "HT", "1T", "134", "32", + "FCC", "5G", "40M", "HT", "1T", "151", "36", + "ETSI", "5G", "40M", "HT", "1T", "151", "32", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "36", + "ETSI", "5G", "40M", "HT", "1T", "159", "32", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "40M", "HT", "3T", "38", "26", + "ETSI", "5G", "40M", "HT", "3T", "38", "28", + "MKK", "5G", "40M", "HT", "3T", "38", "28", + "FCC", "5G", "40M", "HT", "3T", "46", "26", + "ETSI", "5G", "40M", "HT", "3T", "46", "28", + "MKK", "5G", "40M", "HT", "3T", "46", "28", + "FCC", "5G", "40M", "HT", "3T", "54", "28", + "ETSI", "5G", "40M", "HT", "3T", "54", "28", + "MKK", "5G", "40M", "HT", "3T", "54", "28", + "FCC", "5G", "40M", "HT", "3T", "62", "28", + "ETSI", "5G", "40M", "HT", "3T", "62", "28", + "MKK", "5G", "40M", "HT", "3T", "62", "28", + "FCC", "5G", "40M", "HT", "3T", "102", "24", + "ETSI", "5G", "40M", "HT", "3T", "102", "28", + "MKK", "5G", "40M", "HT", "3T", "102", "28", + "FCC", "5G", "40M", "HT", "3T", "110", "28", + "ETSI", "5G", "40M", "HT", "3T", "110", "28", + "MKK", "5G", "40M", "HT", "3T", "110", "28", + "FCC", "5G", "40M", "HT", "3T", "118", "32", + "ETSI", "5G", "40M", "HT", "3T", "118", "28", + "MKK", "5G", "40M", "HT", "3T", "118", "28", + "FCC", "5G", "40M", "HT", "3T", "126", "30", + "ETSI", "5G", "40M", "HT", "3T", "126", "28", + "MKK", "5G", "40M", "HT", "3T", "126", "28", + "FCC", "5G", "40M", "HT", "3T", "134", "28", + "ETSI", "5G", "40M", "HT", "3T", "134", "28", + "MKK", "5G", "40M", "HT", "3T", "134", "28", + "FCC", "5G", "40M", "HT", "3T", "151", "32", + "ETSI", "5G", "40M", "HT", "3T", "151", "28", + "MKK", "5G", "40M", "HT", "3T", "151", "63", + "FCC", "5G", "40M", "HT", "3T", "159", "32", + "ETSI", "5G", "40M", "HT", "3T", "159", "28", + "MKK", "5G", "40M", "HT", "3T", "159", "63", + "FCC", "5G", "40M", "HT", "4T", "38", "24", + "ETSI", "5G", "40M", "HT", "4T", "38", "26", + "MKK", "5G", "40M", "HT", "4T", "38", "26", + "FCC", "5G", "40M", "HT", "4T", "46", "24", + "ETSI", "5G", "40M", "HT", "4T", "46", "26", + "MKK", "5G", "40M", "HT", "4T", "46", "26", + "FCC", "5G", "40M", "HT", "4T", "54", "26", + "ETSI", "5G", "40M", "HT", "4T", "54", "26", + "MKK", "5G", "40M", "HT", "4T", "54", "26", + "FCC", "5G", "40M", "HT", "4T", "62", "26", + "ETSI", "5G", "40M", "HT", "4T", "62", "26", + "MKK", "5G", "40M", "HT", "4T", "62", "26", + "FCC", "5G", "40M", "HT", "4T", "102", "22", + "ETSI", "5G", "40M", "HT", "4T", "102", "26", + "MKK", "5G", "40M", "HT", "4T", "102", "26", + "FCC", "5G", "40M", "HT", "4T", "110", "26", + "ETSI", "5G", "40M", "HT", "4T", "110", "26", + "MKK", "5G", "40M", "HT", "4T", "110", "26", + "FCC", "5G", "40M", "HT", "4T", "118", "30", + "ETSI", "5G", "40M", "HT", "4T", "118", "26", + "MKK", "5G", "40M", "HT", "4T", "118", "26", + "FCC", "5G", "40M", "HT", "4T", "126", "28", + "ETSI", "5G", "40M", "HT", "4T", "126", "26", + "MKK", "5G", "40M", "HT", "4T", "126", "26", + "FCC", "5G", "40M", "HT", "4T", "134", "26", + "ETSI", "5G", "40M", "HT", "4T", "134", "26", + "MKK", "5G", "40M", "HT", "4T", "134", "26", + "FCC", "5G", "40M", "HT", "4T", "151", "30", + "ETSI", "5G", "40M", "HT", "4T", "151", "26", + "MKK", "5G", "40M", "HT", "4T", "151", "63", + "FCC", "5G", "40M", "HT", "4T", "159", "30", + "ETSI", "5G", "40M", "HT", "4T", "159", "26", + "MKK", "5G", "40M", "HT", "4T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "30", + "ETSI", "5G", "80M", "VHT", "1T", "42", "32", + "MKK", "5G", "80M", "VHT", "1T", "42", "32", + "FCC", "5G", "80M", "VHT", "1T", "58", "28", + "ETSI", "5G", "80M", "VHT", "1T", "58", "32", + "MKK", "5G", "80M", "VHT", "1T", "58", "32", + "FCC", "5G", "80M", "VHT", "1T", "106", "30", + "ETSI", "5G", "80M", "VHT", "1T", "106", "32", + "MKK", "5G", "80M", "VHT", "1T", "106", "32", + "FCC", "5G", "80M", "VHT", "1T", "122", "34", + "ETSI", "5G", "80M", "VHT", "1T", "122", "32", + "MKK", "5G", "80M", "VHT", "1T", "122", "32", + "FCC", "5G", "80M", "VHT", "1T", "155", "36", + "ETSI", "5G", "80M", "VHT", "1T", "155", "32", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63", + "FCC", "5G", "80M", "VHT", "3T", "42", "26", + "ETSI", "5G", "80M", "VHT", "3T", "42", "28", + "MKK", "5G", "80M", "VHT", "3T", "42", "28", + "FCC", "5G", "80M", "VHT", "3T", "58", "24", + "ETSI", "5G", "80M", "VHT", "3T", "58", "28", + "MKK", "5G", "80M", "VHT", "3T", "58", "28", + "FCC", "5G", "80M", "VHT", "3T", "106", "26", + "ETSI", "5G", "80M", "VHT", "3T", "106", "28", + "MKK", "5G", "80M", "VHT", "3T", "106", "28", + "FCC", "5G", "80M", "VHT", "3T", "122", "30", + "ETSI", "5G", "80M", "VHT", "3T", "122", "28", + "MKK", "5G", "80M", "VHT", "3T", "122", "28", + "FCC", "5G", "80M", "VHT", "3T", "155", "32", + "ETSI", "5G", "80M", "VHT", "3T", "155", "28", + "MKK", "5G", "80M", "VHT", "3T", "155", "63", + "FCC", "5G", "80M", "VHT", "4T", "42", "24", + "ETSI", "5G", "80M", "VHT", "4T", "42", "26", + "MKK", "5G", "80M", "VHT", "4T", "42", "26", + "FCC", "5G", "80M", "VHT", "4T", "58", "22", + "ETSI", "5G", "80M", "VHT", "4T", "58", "26", + "MKK", "5G", "80M", "VHT", "4T", "58", "26", + "FCC", "5G", "80M", "VHT", "4T", "106", "24", + "ETSI", "5G", "80M", "VHT", "4T", "106", "26", + "MKK", "5G", "80M", "VHT", "4T", "106", "26", + "FCC", "5G", "80M", "VHT", "4T", "122", "28", + "ETSI", "5G", "80M", "VHT", "4T", "122", "26", + "MKK", "5G", "80M", "VHT", "4T", "122", "26", + "FCC", "5G", "80M", "VHT", "4T", "155", "30", + "ETSI", "5G", "80M", "VHT", "4T", "155", "26", + "MKK", "5G", "80M", "VHT", "4T", "155", "63" +}; + +void +odm_read_and_config_mp_8814a_txpwr_lmt( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT)/sizeof(pu1Byte); + pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrLmt = ArrayLen/7; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT\n"); + + for (i = 0; i < ArrayLen; i += 7) { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rfPath, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_type2.TXT +******************************************************************************/ + +const char *Array_MP_8814A_TXPWR_LMT_type2[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "36", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "36", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "36", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "36", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "36", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "36", + "MKK", "2.4G", "20M", "HT", "1T", "01", "36", + "FCC", "2.4G", "20M", "HT", "1T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "36", + "MKK", "2.4G", "20M", "HT", "1T", "02", "36", + "FCC", "2.4G", "20M", "HT", "1T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "36", + "MKK", "2.4G", "20M", "HT", "1T", "03", "36", + "FCC", "2.4G", "20M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "36", + "MKK", "2.4G", "20M", "HT", "1T", "04", "36", + "FCC", "2.4G", "20M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "36", + "MKK", "2.4G", "20M", "HT", "1T", "05", "36", + "FCC", "2.4G", "20M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "36", + "MKK", "2.4G", "20M", "HT", "1T", "06", "36", + "FCC", "2.4G", "20M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "36", + "MKK", "2.4G", "20M", "HT", "1T", "07", "36", + "FCC", "2.4G", "20M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "36", + "MKK", "2.4G", "20M", "HT", "1T", "08", "36", + "FCC", "2.4G", "20M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "36", + "MKK", "2.4G", "20M", "HT", "1T", "09", "36", + "FCC", "2.4G", "20M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "36", + "MKK", "2.4G", "20M", "HT", "1T", "10", "36", + "FCC", "2.4G", "20M", "HT", "1T", "11", "36", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "36", + "MKK", "2.4G", "20M", "HT", "1T", "11", "36", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "36", + "MKK", "2.4G", "20M", "HT", "1T", "12", "36", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "36", + "MKK", "2.4G", "20M", "HT", "1T", "13", "36", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "36", + "MKK", "2.4G", "20M", "HT", "2T", "01", "36", + "FCC", "2.4G", "20M", "HT", "2T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "36", + "MKK", "2.4G", "20M", "HT", "2T", "02", "36", + "FCC", "2.4G", "20M", "HT", "2T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "36", + "MKK", "2.4G", "20M", "HT", "2T", "03", "36", + "FCC", "2.4G", "20M", "HT", "2T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "36", + "MKK", "2.4G", "20M", "HT", "2T", "04", "36", + "FCC", "2.4G", "20M", "HT", "2T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "36", + "MKK", "2.4G", "20M", "HT", "2T", "05", "36", + "FCC", "2.4G", "20M", "HT", "2T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "36", + "MKK", "2.4G", "20M", "HT", "2T", "06", "36", + "FCC", "2.4G", "20M", "HT", "2T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "36", + "MKK", "2.4G", "20M", "HT", "2T", "07", "36", + "FCC", "2.4G", "20M", "HT", "2T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "36", + "MKK", "2.4G", "20M", "HT", "2T", "08", "36", + "FCC", "2.4G", "20M", "HT", "2T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "36", + "MKK", "2.4G", "20M", "HT", "2T", "09", "36", + "FCC", "2.4G", "20M", "HT", "2T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "36", + "MKK", "2.4G", "20M", "HT", "2T", "10", "36", + "FCC", "2.4G", "20M", "HT", "2T", "11", "36", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "36", + "MKK", "2.4G", "20M", "HT", "2T", "11", "36", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "36", + "MKK", "2.4G", "20M", "HT", "2T", "12", "36", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "36", + "MKK", "2.4G", "20M", "HT", "2T", "13", "36", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "20M", "HT", "3T", "01", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "01", "36", + "MKK", "2.4G", "20M", "HT", "3T", "01", "36", + "FCC", "2.4G", "20M", "HT", "3T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "02", "36", + "MKK", "2.4G", "20M", "HT", "3T", "02", "36", + "FCC", "2.4G", "20M", "HT", "3T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "03", "36", + "MKK", "2.4G", "20M", "HT", "3T", "03", "36", + "FCC", "2.4G", "20M", "HT", "3T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "04", "36", + "MKK", "2.4G", "20M", "HT", "3T", "04", "36", + "FCC", "2.4G", "20M", "HT", "3T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "05", "36", + "MKK", "2.4G", "20M", "HT", "3T", "05", "36", + "FCC", "2.4G", "20M", "HT", "3T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "06", "36", + "MKK", "2.4G", "20M", "HT", "3T", "06", "36", + "FCC", "2.4G", "20M", "HT", "3T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "07", "36", + "MKK", "2.4G", "20M", "HT", "3T", "07", "36", + "FCC", "2.4G", "20M", "HT", "3T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "08", "36", + "MKK", "2.4G", "20M", "HT", "3T", "08", "36", + "FCC", "2.4G", "20M", "HT", "3T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "09", "36", + "MKK", "2.4G", "20M", "HT", "3T", "09", "36", + "FCC", "2.4G", "20M", "HT", "3T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "10", "36", + "MKK", "2.4G", "20M", "HT", "3T", "10", "36", + "FCC", "2.4G", "20M", "HT", "3T", "11", "36", + "ETSI", "2.4G", "20M", "HT", "3T", "11", "36", + "MKK", "2.4G", "20M", "HT", "3T", "11", "36", + "FCC", "2.4G", "20M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "12", "36", + "MKK", "2.4G", "20M", "HT", "3T", "12", "36", + "FCC", "2.4G", "20M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "13", "36", + "MKK", "2.4G", "20M", "HT", "3T", "13", "36", + "FCC", "2.4G", "20M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", + "MKK", "2.4G", "20M", "HT", "3T", "14", "63", + "FCC", "2.4G", "20M", "HT", "4T", "01", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "01", "36", + "MKK", "2.4G", "20M", "HT", "4T", "01", "36", + "FCC", "2.4G", "20M", "HT", "4T", "02", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "02", "36", + "MKK", "2.4G", "20M", "HT", "4T", "02", "36", + "FCC", "2.4G", "20M", "HT", "4T", "03", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "03", "36", + "MKK", "2.4G", "20M", "HT", "4T", "03", "36", + "FCC", "2.4G", "20M", "HT", "4T", "04", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "04", "36", + "MKK", "2.4G", "20M", "HT", "4T", "04", "36", + "FCC", "2.4G", "20M", "HT", "4T", "05", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "05", "36", + "MKK", "2.4G", "20M", "HT", "4T", "05", "36", + "FCC", "2.4G", "20M", "HT", "4T", "06", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "06", "36", + "MKK", "2.4G", "20M", "HT", "4T", "06", "36", + "FCC", "2.4G", "20M", "HT", "4T", "07", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "07", "36", + "MKK", "2.4G", "20M", "HT", "4T", "07", "36", + "FCC", "2.4G", "20M", "HT", "4T", "08", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "08", "36", + "MKK", "2.4G", "20M", "HT", "4T", "08", "36", + "FCC", "2.4G", "20M", "HT", "4T", "09", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "09", "36", + "MKK", "2.4G", "20M", "HT", "4T", "09", "36", + "FCC", "2.4G", "20M", "HT", "4T", "10", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "10", "36", + "MKK", "2.4G", "20M", "HT", "4T", "10", "36", + "FCC", "2.4G", "20M", "HT", "4T", "11", "36", + "ETSI", "2.4G", "20M", "HT", "4T", "11", "36", + "MKK", "2.4G", "20M", "HT", "4T", "11", "36", + "FCC", "2.4G", "20M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "12", "36", + "MKK", "2.4G", "20M", "HT", "4T", "12", "36", + "FCC", "2.4G", "20M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "13", "36", + "MKK", "2.4G", "20M", "HT", "4T", "13", "36", + "FCC", "2.4G", "20M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", + "MKK", "2.4G", "20M", "HT", "4T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "36", + "MKK", "2.4G", "40M", "HT", "1T", "03", "36", + "FCC", "2.4G", "40M", "HT", "1T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "36", + "MKK", "2.4G", "40M", "HT", "1T", "04", "36", + "FCC", "2.4G", "40M", "HT", "1T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "36", + "MKK", "2.4G", "40M", "HT", "1T", "05", "36", + "FCC", "2.4G", "40M", "HT", "1T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "36", + "MKK", "2.4G", "40M", "HT", "1T", "06", "36", + "FCC", "2.4G", "40M", "HT", "1T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "36", + "MKK", "2.4G", "40M", "HT", "1T", "07", "36", + "FCC", "2.4G", "40M", "HT", "1T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "36", + "MKK", "2.4G", "40M", "HT", "1T", "08", "36", + "FCC", "2.4G", "40M", "HT", "1T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "36", + "MKK", "2.4G", "40M", "HT", "1T", "09", "36", + "FCC", "2.4G", "40M", "HT", "1T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "36", + "MKK", "2.4G", "40M", "HT", "1T", "10", "36", + "FCC", "2.4G", "40M", "HT", "1T", "11", "36", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "36", + "MKK", "2.4G", "40M", "HT", "1T", "11", "36", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "36", + "MKK", "2.4G", "40M", "HT", "1T", "12", "36", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "36", + "MKK", "2.4G", "40M", "HT", "1T", "13", "36", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "36", + "MKK", "2.4G", "40M", "HT", "2T", "03", "36", + "FCC", "2.4G", "40M", "HT", "2T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "36", + "MKK", "2.4G", "40M", "HT", "2T", "04", "36", + "FCC", "2.4G", "40M", "HT", "2T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "36", + "MKK", "2.4G", "40M", "HT", "2T", "05", "36", + "FCC", "2.4G", "40M", "HT", "2T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "36", + "MKK", "2.4G", "40M", "HT", "2T", "06", "36", + "FCC", "2.4G", "40M", "HT", "2T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "36", + "MKK", "2.4G", "40M", "HT", "2T", "07", "36", + "FCC", "2.4G", "40M", "HT", "2T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "36", + "MKK", "2.4G", "40M", "HT", "2T", "08", "36", + "FCC", "2.4G", "40M", "HT", "2T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "36", + "MKK", "2.4G", "40M", "HT", "2T", "09", "36", + "FCC", "2.4G", "40M", "HT", "2T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "36", + "MKK", "2.4G", "40M", "HT", "2T", "10", "36", + "FCC", "2.4G", "40M", "HT", "2T", "11", "36", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "36", + "MKK", "2.4G", "40M", "HT", "2T", "11", "36", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "36", + "MKK", "2.4G", "40M", "HT", "2T", "12", "36", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "36", + "MKK", "2.4G", "40M", "HT", "2T", "13", "36", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "3T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", + "MKK", "2.4G", "40M", "HT", "3T", "01", "63", + "FCC", "2.4G", "40M", "HT", "3T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", + "MKK", "2.4G", "40M", "HT", "3T", "02", "63", + "FCC", "2.4G", "40M", "HT", "3T", "03", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "03", "36", + "MKK", "2.4G", "40M", "HT", "3T", "03", "36", + "FCC", "2.4G", "40M", "HT", "3T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "04", "36", + "MKK", "2.4G", "40M", "HT", "3T", "04", "36", + "FCC", "2.4G", "40M", "HT", "3T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "05", "36", + "MKK", "2.4G", "40M", "HT", "3T", "05", "36", + "FCC", "2.4G", "40M", "HT", "3T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "06", "36", + "MKK", "2.4G", "40M", "HT", "3T", "06", "36", + "FCC", "2.4G", "40M", "HT", "3T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "07", "36", + "MKK", "2.4G", "40M", "HT", "3T", "07", "36", + "FCC", "2.4G", "40M", "HT", "3T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "08", "36", + "MKK", "2.4G", "40M", "HT", "3T", "08", "36", + "FCC", "2.4G", "40M", "HT", "3T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "09", "36", + "MKK", "2.4G", "40M", "HT", "3T", "09", "36", + "FCC", "2.4G", "40M", "HT", "3T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "10", "36", + "MKK", "2.4G", "40M", "HT", "3T", "10", "36", + "FCC", "2.4G", "40M", "HT", "3T", "11", "36", + "ETSI", "2.4G", "40M", "HT", "3T", "11", "36", + "MKK", "2.4G", "40M", "HT", "3T", "11", "36", + "FCC", "2.4G", "40M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "12", "36", + "MKK", "2.4G", "40M", "HT", "3T", "12", "36", + "FCC", "2.4G", "40M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "13", "36", + "MKK", "2.4G", "40M", "HT", "3T", "13", "36", + "FCC", "2.4G", "40M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", + "MKK", "2.4G", "40M", "HT", "3T", "14", "63", + "FCC", "2.4G", "40M", "HT", "4T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", + "MKK", "2.4G", "40M", "HT", "4T", "01", "63", + "FCC", "2.4G", "40M", "HT", "4T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", + "MKK", "2.4G", "40M", "HT", "4T", "02", "63", + "FCC", "2.4G", "40M", "HT", "4T", "03", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "03", "36", + "MKK", "2.4G", "40M", "HT", "4T", "03", "36", + "FCC", "2.4G", "40M", "HT", "4T", "04", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "04", "36", + "MKK", "2.4G", "40M", "HT", "4T", "04", "36", + "FCC", "2.4G", "40M", "HT", "4T", "05", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "05", "36", + "MKK", "2.4G", "40M", "HT", "4T", "05", "36", + "FCC", "2.4G", "40M", "HT", "4T", "06", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "06", "36", + "MKK", "2.4G", "40M", "HT", "4T", "06", "36", + "FCC", "2.4G", "40M", "HT", "4T", "07", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "07", "36", + "MKK", "2.4G", "40M", "HT", "4T", "07", "36", + "FCC", "2.4G", "40M", "HT", "4T", "08", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "08", "36", + "MKK", "2.4G", "40M", "HT", "4T", "08", "36", + "FCC", "2.4G", "40M", "HT", "4T", "09", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "09", "36", + "MKK", "2.4G", "40M", "HT", "4T", "09", "36", + "FCC", "2.4G", "40M", "HT", "4T", "10", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "10", "36", + "MKK", "2.4G", "40M", "HT", "4T", "10", "36", + "FCC", "2.4G", "40M", "HT", "4T", "11", "36", + "ETSI", "2.4G", "40M", "HT", "4T", "11", "36", + "MKK", "2.4G", "40M", "HT", "4T", "11", "36", + "FCC", "2.4G", "40M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "12", "36", + "MKK", "2.4G", "40M", "HT", "4T", "12", "36", + "FCC", "2.4G", "40M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "13", "36", + "MKK", "2.4G", "40M", "HT", "4T", "13", "36", + "FCC", "2.4G", "40M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", + "MKK", "2.4G", "40M", "HT", "4T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "36", + "MKK", "5G", "20M", "OFDM", "1T", "36", "36", + "FCC", "5G", "20M", "OFDM", "1T", "40", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "36", + "MKK", "5G", "20M", "OFDM", "1T", "40", "36", + "FCC", "5G", "20M", "OFDM", "1T", "44", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "36", + "MKK", "5G", "20M", "OFDM", "1T", "44", "36", + "FCC", "5G", "20M", "OFDM", "1T", "48", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "36", + "MKK", "5G", "20M", "OFDM", "1T", "48", "36", + "FCC", "5G", "20M", "OFDM", "1T", "52", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "36", + "MKK", "5G", "20M", "OFDM", "1T", "52", "36", + "FCC", "5G", "20M", "OFDM", "1T", "56", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "36", + "MKK", "5G", "20M", "OFDM", "1T", "56", "36", + "FCC", "5G", "20M", "OFDM", "1T", "60", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "36", + "MKK", "5G", "20M", "OFDM", "1T", "60", "36", + "FCC", "5G", "20M", "OFDM", "1T", "64", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "36", + "MKK", "5G", "20M", "OFDM", "1T", "64", "36", + "FCC", "5G", "20M", "OFDM", "1T", "100", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "36", + "MKK", "5G", "20M", "OFDM", "1T", "100", "36", + "FCC", "5G", "20M", "OFDM", "1T", "104", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "36", + "MKK", "5G", "20M", "OFDM", "1T", "104", "36", + "FCC", "5G", "20M", "OFDM", "1T", "108", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "36", + "MKK", "5G", "20M", "OFDM", "1T", "108", "36", + "FCC", "5G", "20M", "OFDM", "1T", "112", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "36", + "MKK", "5G", "20M", "OFDM", "1T", "112", "36", + "FCC", "5G", "20M", "OFDM", "1T", "116", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "36", + "MKK", "5G", "20M", "OFDM", "1T", "116", "36", + "FCC", "5G", "20M", "OFDM", "1T", "120", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "36", + "MKK", "5G", "20M", "OFDM", "1T", "120", "36", + "FCC", "5G", "20M", "OFDM", "1T", "124", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "36", + "MKK", "5G", "20M", "OFDM", "1T", "124", "36", + "FCC", "5G", "20M", "OFDM", "1T", "128", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "36", + "MKK", "5G", "20M", "OFDM", "1T", "128", "36", + "FCC", "5G", "20M", "OFDM", "1T", "132", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "36", + "MKK", "5G", "20M", "OFDM", "1T", "132", "36", + "FCC", "5G", "20M", "OFDM", "1T", "136", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "36", + "MKK", "5G", "20M", "OFDM", "1T", "136", "36", + "FCC", "5G", "20M", "OFDM", "1T", "140", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "36", + "MKK", "5G", "20M", "OFDM", "1T", "140", "36", + "FCC", "5G", "20M", "OFDM", "1T", "149", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "36", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "36", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "36", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "36", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "36", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "36", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "36", + "ETSI", "5G", "20M", "HT", "1T", "36", "36", + "MKK", "5G", "20M", "HT", "1T", "36", "36", + "FCC", "5G", "20M", "HT", "1T", "40", "36", + "ETSI", "5G", "20M", "HT", "1T", "40", "36", + "MKK", "5G", "20M", "HT", "1T", "40", "36", + "FCC", "5G", "20M", "HT", "1T", "44", "36", + "ETSI", "5G", "20M", "HT", "1T", "44", "36", + "MKK", "5G", "20M", "HT", "1T", "44", "36", + "FCC", "5G", "20M", "HT", "1T", "48", "36", + "ETSI", "5G", "20M", "HT", "1T", "48", "36", + "MKK", "5G", "20M", "HT", "1T", "48", "36", + "FCC", "5G", "20M", "HT", "1T", "52", "36", + "ETSI", "5G", "20M", "HT", "1T", "52", "36", + "MKK", "5G", "20M", "HT", "1T", "52", "36", + "FCC", "5G", "20M", "HT", "1T", "56", "36", + "ETSI", "5G", "20M", "HT", "1T", "56", "36", + "MKK", "5G", "20M", "HT", "1T", "56", "36", + "FCC", "5G", "20M", "HT", "1T", "60", "36", + "ETSI", "5G", "20M", "HT", "1T", "60", "36", + "MKK", "5G", "20M", "HT", "1T", "60", "36", + "FCC", "5G", "20M", "HT", "1T", "64", "36", + "ETSI", "5G", "20M", "HT", "1T", "64", "36", + "MKK", "5G", "20M", "HT", "1T", "64", "36", + "FCC", "5G", "20M", "HT", "1T", "100", "36", + "ETSI", "5G", "20M", "HT", "1T", "100", "36", + "MKK", "5G", "20M", "HT", "1T", "100", "36", + "FCC", "5G", "20M", "HT", "1T", "104", "36", + "ETSI", "5G", "20M", "HT", "1T", "104", "36", + "MKK", "5G", "20M", "HT", "1T", "104", "36", + "FCC", "5G", "20M", "HT", "1T", "108", "36", + "ETSI", "5G", "20M", "HT", "1T", "108", "36", + "MKK", "5G", "20M", "HT", "1T", "108", "36", + "FCC", "5G", "20M", "HT", "1T", "112", "36", + "ETSI", "5G", "20M", "HT", "1T", "112", "36", + "MKK", "5G", "20M", "HT", "1T", "112", "36", + "FCC", "5G", "20M", "HT", "1T", "116", "36", + "ETSI", "5G", "20M", "HT", "1T", "116", "36", + "MKK", "5G", "20M", "HT", "1T", "116", "36", + "FCC", "5G", "20M", "HT", "1T", "120", "36", + "ETSI", "5G", "20M", "HT", "1T", "120", "36", + "MKK", "5G", "20M", "HT", "1T", "120", "36", + "FCC", "5G", "20M", "HT", "1T", "124", "36", + "ETSI", "5G", "20M", "HT", "1T", "124", "36", + "MKK", "5G", "20M", "HT", "1T", "124", "36", + "FCC", "5G", "20M", "HT", "1T", "128", "36", + "ETSI", "5G", "20M", "HT", "1T", "128", "36", + "MKK", "5G", "20M", "HT", "1T", "128", "36", + "FCC", "5G", "20M", "HT", "1T", "132", "36", + "ETSI", "5G", "20M", "HT", "1T", "132", "36", + "MKK", "5G", "20M", "HT", "1T", "132", "36", + "FCC", "5G", "20M", "HT", "1T", "136", "36", + "ETSI", "5G", "20M", "HT", "1T", "136", "36", + "MKK", "5G", "20M", "HT", "1T", "136", "36", + "FCC", "5G", "20M", "HT", "1T", "140", "36", + "ETSI", "5G", "20M", "HT", "1T", "140", "36", + "MKK", "5G", "20M", "HT", "1T", "140", "36", + "FCC", "5G", "20M", "HT", "1T", "149", "36", + "ETSI", "5G", "20M", "HT", "1T", "149", "36", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "36", + "ETSI", "5G", "20M", "HT", "1T", "153", "36", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "36", + "ETSI", "5G", "20M", "HT", "1T", "157", "36", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "36", + "ETSI", "5G", "20M", "HT", "1T", "161", "36", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "36", + "ETSI", "5G", "20M", "HT", "1T", "165", "36", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "36", + "ETSI", "5G", "20M", "HT", "2T", "36", "36", + "MKK", "5G", "20M", "HT", "2T", "36", "36", + "FCC", "5G", "20M", "HT", "2T", "40", "36", + "ETSI", "5G", "20M", "HT", "2T", "40", "36", + "MKK", "5G", "20M", "HT", "2T", "40", "36", + "FCC", "5G", "20M", "HT", "2T", "44", "36", + "ETSI", "5G", "20M", "HT", "2T", "44", "36", + "MKK", "5G", "20M", "HT", "2T", "44", "36", + "FCC", "5G", "20M", "HT", "2T", "48", "36", + "ETSI", "5G", "20M", "HT", "2T", "48", "36", + "MKK", "5G", "20M", "HT", "2T", "48", "36", + "FCC", "5G", "20M", "HT", "2T", "52", "36", + "ETSI", "5G", "20M", "HT", "2T", "52", "36", + "MKK", "5G", "20M", "HT", "2T", "52", "36", + "FCC", "5G", "20M", "HT", "2T", "56", "36", + "ETSI", "5G", "20M", "HT", "2T", "56", "36", + "MKK", "5G", "20M", "HT", "2T", "56", "36", + "FCC", "5G", "20M", "HT", "2T", "60", "36", + "ETSI", "5G", "20M", "HT", "2T", "60", "36", + "MKK", "5G", "20M", "HT", "2T", "60", "36", + "FCC", "5G", "20M", "HT", "2T", "64", "36", + "ETSI", "5G", "20M", "HT", "2T", "64", "36", + "MKK", "5G", "20M", "HT", "2T", "64", "36", + "FCC", "5G", "20M", "HT", "2T", "100", "36", + "ETSI", "5G", "20M", "HT", "2T", "100", "36", + "MKK", "5G", "20M", "HT", "2T", "100", "36", + "FCC", "5G", "20M", "HT", "2T", "104", "36", + "ETSI", "5G", "20M", "HT", "2T", "104", "36", + "MKK", "5G", "20M", "HT", "2T", "104", "36", + "FCC", "5G", "20M", "HT", "2T", "108", "36", + "ETSI", "5G", "20M", "HT", "2T", "108", "36", + "MKK", "5G", "20M", "HT", "2T", "108", "36", + "FCC", "5G", "20M", "HT", "2T", "112", "36", + "ETSI", "5G", "20M", "HT", "2T", "112", "36", + "MKK", "5G", "20M", "HT", "2T", "112", "36", + "FCC", "5G", "20M", "HT", "2T", "116", "36", + "ETSI", "5G", "20M", "HT", "2T", "116", "36", + "MKK", "5G", "20M", "HT", "2T", "116", "36", + "FCC", "5G", "20M", "HT", "2T", "120", "36", + "ETSI", "5G", "20M", "HT", "2T", "120", "36", + "MKK", "5G", "20M", "HT", "2T", "120", "36", + "FCC", "5G", "20M", "HT", "2T", "124", "36", + "ETSI", "5G", "20M", "HT", "2T", "124", "36", + "MKK", "5G", "20M", "HT", "2T", "124", "36", + "FCC", "5G", "20M", "HT", "2T", "128", "36", + "ETSI", "5G", "20M", "HT", "2T", "128", "36", + "MKK", "5G", "20M", "HT", "2T", "128", "36", + "FCC", "5G", "20M", "HT", "2T", "132", "36", + "ETSI", "5G", "20M", "HT", "2T", "132", "36", + "MKK", "5G", "20M", "HT", "2T", "132", "36", + "FCC", "5G", "20M", "HT", "2T", "136", "36", + "ETSI", "5G", "20M", "HT", "2T", "136", "36", + "MKK", "5G", "20M", "HT", "2T", "136", "36", + "FCC", "5G", "20M", "HT", "2T", "140", "36", + "ETSI", "5G", "20M", "HT", "2T", "140", "36", + "MKK", "5G", "20M", "HT", "2T", "140", "36", + "FCC", "5G", "20M", "HT", "2T", "149", "36", + "ETSI", "5G", "20M", "HT", "2T", "149", "36", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "36", + "ETSI", "5G", "20M", "HT", "2T", "153", "36", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "36", + "ETSI", "5G", "20M", "HT", "2T", "157", "36", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "36", + "ETSI", "5G", "20M", "HT", "2T", "161", "36", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "36", + "ETSI", "5G", "20M", "HT", "2T", "165", "36", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "20M", "HT", "3T", "36", "36", + "ETSI", "5G", "20M", "HT", "3T", "36", "36", + "MKK", "5G", "20M", "HT", "3T", "36", "36", + "FCC", "5G", "20M", "HT", "3T", "40", "36", + "ETSI", "5G", "20M", "HT", "3T", "40", "36", + "MKK", "5G", "20M", "HT", "3T", "40", "36", + "FCC", "5G", "20M", "HT", "3T", "44", "36", + "ETSI", "5G", "20M", "HT", "3T", "44", "36", + "MKK", "5G", "20M", "HT", "3T", "44", "36", + "FCC", "5G", "20M", "HT", "3T", "48", "36", + "ETSI", "5G", "20M", "HT", "3T", "48", "36", + "MKK", "5G", "20M", "HT", "3T", "48", "36", + "FCC", "5G", "20M", "HT", "3T", "52", "36", + "ETSI", "5G", "20M", "HT", "3T", "52", "36", + "MKK", "5G", "20M", "HT", "3T", "52", "36", + "FCC", "5G", "20M", "HT", "3T", "56", "36", + "ETSI", "5G", "20M", "HT", "3T", "56", "36", + "MKK", "5G", "20M", "HT", "3T", "56", "36", + "FCC", "5G", "20M", "HT", "3T", "60", "36", + "ETSI", "5G", "20M", "HT", "3T", "60", "36", + "MKK", "5G", "20M", "HT", "3T", "60", "36", + "FCC", "5G", "20M", "HT", "3T", "64", "36", + "ETSI", "5G", "20M", "HT", "3T", "64", "36", + "MKK", "5G", "20M", "HT", "3T", "64", "36", + "FCC", "5G", "20M", "HT", "3T", "100", "36", + "ETSI", "5G", "20M", "HT", "3T", "100", "36", + "MKK", "5G", "20M", "HT", "3T", "100", "36", + "FCC", "5G", "20M", "HT", "3T", "104", "36", + "ETSI", "5G", "20M", "HT", "3T", "104", "36", + "MKK", "5G", "20M", "HT", "3T", "104", "36", + "FCC", "5G", "20M", "HT", "3T", "108", "36", + "ETSI", "5G", "20M", "HT", "3T", "108", "36", + "MKK", "5G", "20M", "HT", "3T", "108", "36", + "FCC", "5G", "20M", "HT", "3T", "112", "36", + "ETSI", "5G", "20M", "HT", "3T", "112", "36", + "MKK", "5G", "20M", "HT", "3T", "112", "36", + "FCC", "5G", "20M", "HT", "3T", "116", "36", + "ETSI", "5G", "20M", "HT", "3T", "116", "36", + "MKK", "5G", "20M", "HT", "3T", "116", "36", + "FCC", "5G", "20M", "HT", "3T", "120", "36", + "ETSI", "5G", "20M", "HT", "3T", "120", "36", + "MKK", "5G", "20M", "HT", "3T", "120", "36", + "FCC", "5G", "20M", "HT", "3T", "124", "36", + "ETSI", "5G", "20M", "HT", "3T", "124", "36", + "MKK", "5G", "20M", "HT", "3T", "124", "36", + "FCC", "5G", "20M", "HT", "3T", "128", "36", + "ETSI", "5G", "20M", "HT", "3T", "128", "36", + "MKK", "5G", "20M", "HT", "3T", "128", "36", + "FCC", "5G", "20M", "HT", "3T", "132", "36", + "ETSI", "5G", "20M", "HT", "3T", "132", "36", + "MKK", "5G", "20M", "HT", "3T", "132", "36", + "FCC", "5G", "20M", "HT", "3T", "136", "36", + "ETSI", "5G", "20M", "HT", "3T", "136", "36", + "MKK", "5G", "20M", "HT", "3T", "136", "36", + "FCC", "5G", "20M", "HT", "3T", "140", "36", + "ETSI", "5G", "20M", "HT", "3T", "140", "36", + "MKK", "5G", "20M", "HT", "3T", "140", "36", + "FCC", "5G", "20M", "HT", "3T", "149", "36", + "ETSI", "5G", "20M", "HT", "3T", "149", "36", + "MKK", "5G", "20M", "HT", "3T", "149", "63", + "FCC", "5G", "20M", "HT", "3T", "153", "36", + "ETSI", "5G", "20M", "HT", "3T", "153", "36", + "MKK", "5G", "20M", "HT", "3T", "153", "63", + "FCC", "5G", "20M", "HT", "3T", "157", "36", + "ETSI", "5G", "20M", "HT", "3T", "157", "36", + "MKK", "5G", "20M", "HT", "3T", "157", "63", + "FCC", "5G", "20M", "HT", "3T", "161", "36", + "ETSI", "5G", "20M", "HT", "3T", "161", "36", + "MKK", "5G", "20M", "HT", "3T", "161", "63", + "FCC", "5G", "20M", "HT", "3T", "165", "36", + "ETSI", "5G", "20M", "HT", "3T", "165", "36", + "MKK", "5G", "20M", "HT", "3T", "165", "63", + "FCC", "5G", "20M", "HT", "4T", "36", "36", + "ETSI", "5G", "20M", "HT", "4T", "36", "36", + "MKK", "5G", "20M", "HT", "4T", "36", "36", + "FCC", "5G", "20M", "HT", "4T", "40", "36", + "ETSI", "5G", "20M", "HT", "4T", "40", "36", + "MKK", "5G", "20M", "HT", "4T", "40", "36", + "FCC", "5G", "20M", "HT", "4T", "44", "36", + "ETSI", "5G", "20M", "HT", "4T", "44", "36", + "MKK", "5G", "20M", "HT", "4T", "44", "36", + "FCC", "5G", "20M", "HT", "4T", "48", "36", + "ETSI", "5G", "20M", "HT", "4T", "48", "36", + "MKK", "5G", "20M", "HT", "4T", "48", "36", + "FCC", "5G", "20M", "HT", "4T", "52", "36", + "ETSI", "5G", "20M", "HT", "4T", "52", "36", + "MKK", "5G", "20M", "HT", "4T", "52", "36", + "FCC", "5G", "20M", "HT", "4T", "56", "36", + "ETSI", "5G", "20M", "HT", "4T", "56", "36", + "MKK", "5G", "20M", "HT", "4T", "56", "36", + "FCC", "5G", "20M", "HT", "4T", "60", "36", + "ETSI", "5G", "20M", "HT", "4T", "60", "36", + "MKK", "5G", "20M", "HT", "4T", "60", "36", + "FCC", "5G", "20M", "HT", "4T", "64", "36", + "ETSI", "5G", "20M", "HT", "4T", "64", "36", + "MKK", "5G", "20M", "HT", "4T", "64", "36", + "FCC", "5G", "20M", "HT", "4T", "100", "36", + "ETSI", "5G", "20M", "HT", "4T", "100", "36", + "MKK", "5G", "20M", "HT", "4T", "100", "36", + "FCC", "5G", "20M", "HT", "4T", "104", "36", + "ETSI", "5G", "20M", "HT", "4T", "104", "36", + "MKK", "5G", "20M", "HT", "4T", "104", "36", + "FCC", "5G", "20M", "HT", "4T", "108", "36", + "ETSI", "5G", "20M", "HT", "4T", "108", "36", + "MKK", "5G", "20M", "HT", "4T", "108", "36", + "FCC", "5G", "20M", "HT", "4T", "112", "36", + "ETSI", "5G", "20M", "HT", "4T", "112", "36", + "MKK", "5G", "20M", "HT", "4T", "112", "36", + "FCC", "5G", "20M", "HT", "4T", "116", "36", + "ETSI", "5G", "20M", "HT", "4T", "116", "36", + "MKK", "5G", "20M", "HT", "4T", "116", "36", + "FCC", "5G", "20M", "HT", "4T", "120", "36", + "ETSI", "5G", "20M", "HT", "4T", "120", "36", + "MKK", "5G", "20M", "HT", "4T", "120", "36", + "FCC", "5G", "20M", "HT", "4T", "124", "36", + "ETSI", "5G", "20M", "HT", "4T", "124", "36", + "MKK", "5G", "20M", "HT", "4T", "124", "36", + "FCC", "5G", "20M", "HT", "4T", "128", "36", + "ETSI", "5G", "20M", "HT", "4T", "128", "36", + "MKK", "5G", "20M", "HT", "4T", "128", "36", + "FCC", "5G", "20M", "HT", "4T", "132", "36", + "ETSI", "5G", "20M", "HT", "4T", "132", "36", + "MKK", "5G", "20M", "HT", "4T", "132", "36", + "FCC", "5G", "20M", "HT", "4T", "136", "36", + "ETSI", "5G", "20M", "HT", "4T", "136", "36", + "MKK", "5G", "20M", "HT", "4T", "136", "36", + "FCC", "5G", "20M", "HT", "4T", "140", "36", + "ETSI", "5G", "20M", "HT", "4T", "140", "36", + "MKK", "5G", "20M", "HT", "4T", "140", "36", + "FCC", "5G", "20M", "HT", "4T", "149", "36", + "ETSI", "5G", "20M", "HT", "4T", "149", "36", + "MKK", "5G", "20M", "HT", "4T", "149", "63", + "FCC", "5G", "20M", "HT", "4T", "153", "36", + "ETSI", "5G", "20M", "HT", "4T", "153", "36", + "MKK", "5G", "20M", "HT", "4T", "153", "63", + "FCC", "5G", "20M", "HT", "4T", "157", "36", + "ETSI", "5G", "20M", "HT", "4T", "157", "36", + "MKK", "5G", "20M", "HT", "4T", "157", "63", + "FCC", "5G", "20M", "HT", "4T", "161", "36", + "ETSI", "5G", "20M", "HT", "4T", "161", "36", + "MKK", "5G", "20M", "HT", "4T", "161", "63", + "FCC", "5G", "20M", "HT", "4T", "165", "36", + "ETSI", "5G", "20M", "HT", "4T", "165", "36", + "MKK", "5G", "20M", "HT", "4T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "36", + "ETSI", "5G", "40M", "HT", "1T", "38", "36", + "MKK", "5G", "40M", "HT", "1T", "38", "36", + "FCC", "5G", "40M", "HT", "1T", "46", "36", + "ETSI", "5G", "40M", "HT", "1T", "46", "36", + "MKK", "5G", "40M", "HT", "1T", "46", "36", + "FCC", "5G", "40M", "HT", "1T", "54", "36", + "ETSI", "5G", "40M", "HT", "1T", "54", "36", + "MKK", "5G", "40M", "HT", "1T", "54", "36", + "FCC", "5G", "40M", "HT", "1T", "62", "36", + "ETSI", "5G", "40M", "HT", "1T", "62", "36", + "MKK", "5G", "40M", "HT", "1T", "62", "36", + "FCC", "5G", "40M", "HT", "1T", "102", "36", + "ETSI", "5G", "40M", "HT", "1T", "102", "36", + "MKK", "5G", "40M", "HT", "1T", "102", "36", + "FCC", "5G", "40M", "HT", "1T", "110", "36", + "ETSI", "5G", "40M", "HT", "1T", "110", "36", + "MKK", "5G", "40M", "HT", "1T", "110", "36", + "FCC", "5G", "40M", "HT", "1T", "118", "36", + "ETSI", "5G", "40M", "HT", "1T", "118", "36", + "MKK", "5G", "40M", "HT", "1T", "118", "36", + "FCC", "5G", "40M", "HT", "1T", "126", "36", + "ETSI", "5G", "40M", "HT", "1T", "126", "36", + "MKK", "5G", "40M", "HT", "1T", "126", "36", + "FCC", "5G", "40M", "HT", "1T", "134", "36", + "ETSI", "5G", "40M", "HT", "1T", "134", "36", + "MKK", "5G", "40M", "HT", "1T", "134", "36", + "FCC", "5G", "40M", "HT", "1T", "151", "36", + "ETSI", "5G", "40M", "HT", "1T", "151", "36", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "36", + "ETSI", "5G", "40M", "HT", "1T", "159", "36", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "36", + "ETSI", "5G", "40M", "HT", "2T", "38", "36", + "MKK", "5G", "40M", "HT", "2T", "38", "36", + "FCC", "5G", "40M", "HT", "2T", "46", "36", + "ETSI", "5G", "40M", "HT", "2T", "46", "36", + "MKK", "5G", "40M", "HT", "2T", "46", "36", + "FCC", "5G", "40M", "HT", "2T", "54", "36", + "ETSI", "5G", "40M", "HT", "2T", "54", "36", + "MKK", "5G", "40M", "HT", "2T", "54", "36", + "FCC", "5G", "40M", "HT", "2T", "62", "36", + "ETSI", "5G", "40M", "HT", "2T", "62", "36", + "MKK", "5G", "40M", "HT", "2T", "62", "36", + "FCC", "5G", "40M", "HT", "2T", "102", "36", + "ETSI", "5G", "40M", "HT", "2T", "102", "36", + "MKK", "5G", "40M", "HT", "2T", "102", "36", + "FCC", "5G", "40M", "HT", "2T", "110", "36", + "ETSI", "5G", "40M", "HT", "2T", "110", "36", + "MKK", "5G", "40M", "HT", "2T", "110", "36", + "FCC", "5G", "40M", "HT", "2T", "118", "36", + "ETSI", "5G", "40M", "HT", "2T", "118", "36", + "MKK", "5G", "40M", "HT", "2T", "118", "36", + "FCC", "5G", "40M", "HT", "2T", "126", "36", + "ETSI", "5G", "40M", "HT", "2T", "126", "36", + "MKK", "5G", "40M", "HT", "2T", "126", "36", + "FCC", "5G", "40M", "HT", "2T", "134", "36", + "ETSI", "5G", "40M", "HT", "2T", "134", "36", + "MKK", "5G", "40M", "HT", "2T", "134", "36", + "FCC", "5G", "40M", "HT", "2T", "151", "36", + "ETSI", "5G", "40M", "HT", "2T", "151", "36", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "36", + "ETSI", "5G", "40M", "HT", "2T", "159", "36", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "40M", "HT", "3T", "38", "36", + "ETSI", "5G", "40M", "HT", "3T", "38", "36", + "MKK", "5G", "40M", "HT", "3T", "38", "36", + "FCC", "5G", "40M", "HT", "3T", "46", "36", + "ETSI", "5G", "40M", "HT", "3T", "46", "36", + "MKK", "5G", "40M", "HT", "3T", "46", "36", + "FCC", "5G", "40M", "HT", "3T", "54", "36", + "ETSI", "5G", "40M", "HT", "3T", "54", "36", + "MKK", "5G", "40M", "HT", "3T", "54", "36", + "FCC", "5G", "40M", "HT", "3T", "62", "36", + "ETSI", "5G", "40M", "HT", "3T", "62", "36", + "MKK", "5G", "40M", "HT", "3T", "62", "36", + "FCC", "5G", "40M", "HT", "3T", "102", "36", + "ETSI", "5G", "40M", "HT", "3T", "102", "36", + "MKK", "5G", "40M", "HT", "3T", "102", "36", + "FCC", "5G", "40M", "HT", "3T", "110", "36", + "ETSI", "5G", "40M", "HT", "3T", "110", "36", + "MKK", "5G", "40M", "HT", "3T", "110", "36", + "FCC", "5G", "40M", "HT", "3T", "118", "36", + "ETSI", "5G", "40M", "HT", "3T", "118", "36", + "MKK", "5G", "40M", "HT", "3T", "118", "36", + "FCC", "5G", "40M", "HT", "3T", "126", "36", + "ETSI", "5G", "40M", "HT", "3T", "126", "36", + "MKK", "5G", "40M", "HT", "3T", "126", "36", + "FCC", "5G", "40M", "HT", "3T", "134", "36", + "ETSI", "5G", "40M", "HT", "3T", "134", "36", + "MKK", "5G", "40M", "HT", "3T", "134", "36", + "FCC", "5G", "40M", "HT", "3T", "151", "36", + "ETSI", "5G", "40M", "HT", "3T", "151", "36", + "MKK", "5G", "40M", "HT", "3T", "151", "63", + "FCC", "5G", "40M", "HT", "3T", "159", "36", + "ETSI", "5G", "40M", "HT", "3T", "159", "36", + "MKK", "5G", "40M", "HT", "3T", "159", "63", + "FCC", "5G", "40M", "HT", "4T", "38", "36", + "ETSI", "5G", "40M", "HT", "4T", "38", "36", + "MKK", "5G", "40M", "HT", "4T", "38", "36", + "FCC", "5G", "40M", "HT", "4T", "46", "36", + "ETSI", "5G", "40M", "HT", "4T", "46", "36", + "MKK", "5G", "40M", "HT", "4T", "46", "36", + "FCC", "5G", "40M", "HT", "4T", "54", "36", + "ETSI", "5G", "40M", "HT", "4T", "54", "36", + "MKK", "5G", "40M", "HT", "4T", "54", "36", + "FCC", "5G", "40M", "HT", "4T", "62", "36", + "ETSI", "5G", "40M", "HT", "4T", "62", "36", + "MKK", "5G", "40M", "HT", "4T", "62", "36", + "FCC", "5G", "40M", "HT", "4T", "102", "36", + "ETSI", "5G", "40M", "HT", "4T", "102", "36", + "MKK", "5G", "40M", "HT", "4T", "102", "36", + "FCC", "5G", "40M", "HT", "4T", "110", "36", + "ETSI", "5G", "40M", "HT", "4T", "110", "36", + "MKK", "5G", "40M", "HT", "4T", "110", "36", + "FCC", "5G", "40M", "HT", "4T", "118", "36", + "ETSI", "5G", "40M", "HT", "4T", "118", "36", + "MKK", "5G", "40M", "HT", "4T", "118", "36", + "FCC", "5G", "40M", "HT", "4T", "126", "36", + "ETSI", "5G", "40M", "HT", "4T", "126", "36", + "MKK", "5G", "40M", "HT", "4T", "126", "36", + "FCC", "5G", "40M", "HT", "4T", "134", "36", + "ETSI", "5G", "40M", "HT", "4T", "134", "36", + "MKK", "5G", "40M", "HT", "4T", "134", "36", + "FCC", "5G", "40M", "HT", "4T", "151", "36", + "ETSI", "5G", "40M", "HT", "4T", "151", "36", + "MKK", "5G", "40M", "HT", "4T", "151", "63", + "FCC", "5G", "40M", "HT", "4T", "159", "36", + "ETSI", "5G", "40M", "HT", "4T", "159", "36", + "MKK", "5G", "40M", "HT", "4T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "36", + "ETSI", "5G", "80M", "VHT", "1T", "42", "36", + "MKK", "5G", "80M", "VHT", "1T", "42", "36", + "FCC", "5G", "80M", "VHT", "1T", "58", "36", + "ETSI", "5G", "80M", "VHT", "1T", "58", "36", + "MKK", "5G", "80M", "VHT", "1T", "58", "36", + "FCC", "5G", "80M", "VHT", "1T", "106", "36", + "ETSI", "5G", "80M", "VHT", "1T", "106", "36", + "MKK", "5G", "80M", "VHT", "1T", "106", "36", + "FCC", "5G", "80M", "VHT", "1T", "122", "36", + "ETSI", "5G", "80M", "VHT", "1T", "122", "36", + "MKK", "5G", "80M", "VHT", "1T", "122", "36", + "FCC", "5G", "80M", "VHT", "1T", "155", "36", + "ETSI", "5G", "80M", "VHT", "1T", "155", "36", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "36", + "ETSI", "5G", "80M", "VHT", "2T", "42", "36", + "MKK", "5G", "80M", "VHT", "2T", "42", "36", + "FCC", "5G", "80M", "VHT", "2T", "58", "36", + "ETSI", "5G", "80M", "VHT", "2T", "58", "36", + "MKK", "5G", "80M", "VHT", "2T", "58", "36", + "FCC", "5G", "80M", "VHT", "2T", "106", "36", + "ETSI", "5G", "80M", "VHT", "2T", "106", "36", + "MKK", "5G", "80M", "VHT", "2T", "106", "36", + "FCC", "5G", "80M", "VHT", "2T", "122", "36", + "ETSI", "5G", "80M", "VHT", "2T", "122", "36", + "MKK", "5G", "80M", "VHT", "2T", "122", "36", + "FCC", "5G", "80M", "VHT", "2T", "155", "36", + "ETSI", "5G", "80M", "VHT", "2T", "155", "36", + "MKK", "5G", "80M", "VHT", "2T", "155", "63", + "FCC", "5G", "80M", "VHT", "3T", "42", "36", + "ETSI", "5G", "80M", "VHT", "3T", "42", "36", + "MKK", "5G", "80M", "VHT", "3T", "42", "36", + "FCC", "5G", "80M", "VHT", "3T", "58", "36", + "ETSI", "5G", "80M", "VHT", "3T", "58", "36", + "MKK", "5G", "80M", "VHT", "3T", "58", "36", + "FCC", "5G", "80M", "VHT", "3T", "106", "36", + "ETSI", "5G", "80M", "VHT", "3T", "106", "36", + "MKK", "5G", "80M", "VHT", "3T", "106", "36", + "FCC", "5G", "80M", "VHT", "3T", "122", "36", + "ETSI", "5G", "80M", "VHT", "3T", "122", "36", + "MKK", "5G", "80M", "VHT", "3T", "122", "36", + "FCC", "5G", "80M", "VHT", "3T", "155", "36", + "ETSI", "5G", "80M", "VHT", "3T", "155", "36", + "MKK", "5G", "80M", "VHT", "3T", "155", "63", + "FCC", "5G", "80M", "VHT", "4T", "42", "36", + "ETSI", "5G", "80M", "VHT", "4T", "42", "36", + "MKK", "5G", "80M", "VHT", "4T", "42", "36", + "FCC", "5G", "80M", "VHT", "4T", "58", "36", + "ETSI", "5G", "80M", "VHT", "4T", "58", "36", + "MKK", "5G", "80M", "VHT", "4T", "58", "36", + "FCC", "5G", "80M", "VHT", "4T", "106", "36", + "ETSI", "5G", "80M", "VHT", "4T", "106", "36", + "MKK", "5G", "80M", "VHT", "4T", "106", "36", + "FCC", "5G", "80M", "VHT", "4T", "122", "36", + "ETSI", "5G", "80M", "VHT", "4T", "122", "36", + "MKK", "5G", "80M", "VHT", "4T", "122", "36", + "FCC", "5G", "80M", "VHT", "4T", "155", "36", + "ETSI", "5G", "80M", "VHT", "4T", "155", "36", + "MKK", "5G", "80M", "VHT", "4T", "155", "63" +}; + +void +odm_read_and_config_mp_8814a_txpwr_lmt_type2( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT_type2)/sizeof(pu1Byte); + pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_type2; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrLmt = ArrayLen/7; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_type2\n"); + + for (i = 0; i < ArrayLen; i += 7) { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rfPath, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_Type3.TXT +******************************************************************************/ + +const char *Array_MP_8814A_TXPWR_LMT_Type3[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "40", + "MKK", "2.4G", "20M", "HT", "1T", "01", "40", + "FCC", "2.4G", "20M", "HT", "1T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "40", + "MKK", "2.4G", "20M", "HT", "1T", "02", "40", + "FCC", "2.4G", "20M", "HT", "1T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "40", + "MKK", "2.4G", "20M", "HT", "1T", "03", "40", + "FCC", "2.4G", "20M", "HT", "1T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "40", + "MKK", "2.4G", "20M", "HT", "1T", "04", "40", + "FCC", "2.4G", "20M", "HT", "1T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "40", + "MKK", "2.4G", "20M", "HT", "1T", "05", "40", + "FCC", "2.4G", "20M", "HT", "1T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "40", + "MKK", "2.4G", "20M", "HT", "1T", "06", "40", + "FCC", "2.4G", "20M", "HT", "1T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "40", + "MKK", "2.4G", "20M", "HT", "1T", "07", "40", + "FCC", "2.4G", "20M", "HT", "1T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "40", + "MKK", "2.4G", "20M", "HT", "1T", "08", "40", + "FCC", "2.4G", "20M", "HT", "1T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "40", + "MKK", "2.4G", "20M", "HT", "1T", "09", "40", + "FCC", "2.4G", "20M", "HT", "1T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "40", + "MKK", "2.4G", "20M", "HT", "1T", "10", "40", + "FCC", "2.4G", "20M", "HT", "1T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "40", + "MKK", "2.4G", "20M", "HT", "1T", "11", "40", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "40", + "MKK", "2.4G", "20M", "HT", "1T", "12", "40", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "40", + "MKK", "2.4G", "20M", "HT", "1T", "13", "40", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "40", + "MKK", "2.4G", "20M", "HT", "2T", "01", "40", + "FCC", "2.4G", "20M", "HT", "2T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "40", + "MKK", "2.4G", "20M", "HT", "2T", "02", "40", + "FCC", "2.4G", "20M", "HT", "2T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "40", + "MKK", "2.4G", "20M", "HT", "2T", "03", "40", + "FCC", "2.4G", "20M", "HT", "2T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "40", + "MKK", "2.4G", "20M", "HT", "2T", "04", "40", + "FCC", "2.4G", "20M", "HT", "2T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "40", + "MKK", "2.4G", "20M", "HT", "2T", "05", "40", + "FCC", "2.4G", "20M", "HT", "2T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "40", + "MKK", "2.4G", "20M", "HT", "2T", "06", "40", + "FCC", "2.4G", "20M", "HT", "2T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "40", + "MKK", "2.4G", "20M", "HT", "2T", "07", "40", + "FCC", "2.4G", "20M", "HT", "2T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "40", + "MKK", "2.4G", "20M", "HT", "2T", "08", "40", + "FCC", "2.4G", "20M", "HT", "2T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "40", + "MKK", "2.4G", "20M", "HT", "2T", "09", "40", + "FCC", "2.4G", "20M", "HT", "2T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "40", + "MKK", "2.4G", "20M", "HT", "2T", "10", "40", + "FCC", "2.4G", "20M", "HT", "2T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "40", + "MKK", "2.4G", "20M", "HT", "2T", "11", "40", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "40", + "MKK", "2.4G", "20M", "HT", "2T", "12", "40", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "40", + "MKK", "2.4G", "20M", "HT", "2T", "13", "40", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "20M", "HT", "3T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "01", "40", + "MKK", "2.4G", "20M", "HT", "3T", "01", "40", + "FCC", "2.4G", "20M", "HT", "3T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "02", "40", + "MKK", "2.4G", "20M", "HT", "3T", "02", "40", + "FCC", "2.4G", "20M", "HT", "3T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "03", "40", + "MKK", "2.4G", "20M", "HT", "3T", "03", "40", + "FCC", "2.4G", "20M", "HT", "3T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "04", "40", + "MKK", "2.4G", "20M", "HT", "3T", "04", "40", + "FCC", "2.4G", "20M", "HT", "3T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "05", "40", + "MKK", "2.4G", "20M", "HT", "3T", "05", "40", + "FCC", "2.4G", "20M", "HT", "3T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "06", "40", + "MKK", "2.4G", "20M", "HT", "3T", "06", "40", + "FCC", "2.4G", "20M", "HT", "3T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "07", "40", + "MKK", "2.4G", "20M", "HT", "3T", "07", "40", + "FCC", "2.4G", "20M", "HT", "3T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "08", "40", + "MKK", "2.4G", "20M", "HT", "3T", "08", "40", + "FCC", "2.4G", "20M", "HT", "3T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "09", "40", + "MKK", "2.4G", "20M", "HT", "3T", "09", "40", + "FCC", "2.4G", "20M", "HT", "3T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "10", "40", + "MKK", "2.4G", "20M", "HT", "3T", "10", "40", + "FCC", "2.4G", "20M", "HT", "3T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "11", "40", + "MKK", "2.4G", "20M", "HT", "3T", "11", "40", + "FCC", "2.4G", "20M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "12", "40", + "MKK", "2.4G", "20M", "HT", "3T", "12", "40", + "FCC", "2.4G", "20M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "13", "40", + "MKK", "2.4G", "20M", "HT", "3T", "13", "40", + "FCC", "2.4G", "20M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", + "MKK", "2.4G", "20M", "HT", "3T", "14", "63", + "FCC", "2.4G", "20M", "HT", "4T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "01", "40", + "MKK", "2.4G", "20M", "HT", "4T", "01", "40", + "FCC", "2.4G", "20M", "HT", "4T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "02", "40", + "MKK", "2.4G", "20M", "HT", "4T", "02", "40", + "FCC", "2.4G", "20M", "HT", "4T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "03", "40", + "MKK", "2.4G", "20M", "HT", "4T", "03", "40", + "FCC", "2.4G", "20M", "HT", "4T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "04", "40", + "MKK", "2.4G", "20M", "HT", "4T", "04", "40", + "FCC", "2.4G", "20M", "HT", "4T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "05", "40", + "MKK", "2.4G", "20M", "HT", "4T", "05", "40", + "FCC", "2.4G", "20M", "HT", "4T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "06", "40", + "MKK", "2.4G", "20M", "HT", "4T", "06", "40", + "FCC", "2.4G", "20M", "HT", "4T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "07", "40", + "MKK", "2.4G", "20M", "HT", "4T", "07", "40", + "FCC", "2.4G", "20M", "HT", "4T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "08", "40", + "MKK", "2.4G", "20M", "HT", "4T", "08", "40", + "FCC", "2.4G", "20M", "HT", "4T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "09", "40", + "MKK", "2.4G", "20M", "HT", "4T", "09", "40", + "FCC", "2.4G", "20M", "HT", "4T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "10", "40", + "MKK", "2.4G", "20M", "HT", "4T", "10", "40", + "FCC", "2.4G", "20M", "HT", "4T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "11", "40", + "MKK", "2.4G", "20M", "HT", "4T", "11", "40", + "FCC", "2.4G", "20M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "12", "40", + "MKK", "2.4G", "20M", "HT", "4T", "12", "40", + "FCC", "2.4G", "20M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "13", "40", + "MKK", "2.4G", "20M", "HT", "4T", "13", "40", + "FCC", "2.4G", "20M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", + "MKK", "2.4G", "20M", "HT", "4T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "40", + "MKK", "2.4G", "40M", "HT", "1T", "03", "40", + "FCC", "2.4G", "40M", "HT", "1T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "40", + "MKK", "2.4G", "40M", "HT", "1T", "04", "40", + "FCC", "2.4G", "40M", "HT", "1T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "40", + "MKK", "2.4G", "40M", "HT", "1T", "05", "40", + "FCC", "2.4G", "40M", "HT", "1T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "40", + "MKK", "2.4G", "40M", "HT", "1T", "06", "40", + "FCC", "2.4G", "40M", "HT", "1T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "40", + "MKK", "2.4G", "40M", "HT", "1T", "07", "40", + "FCC", "2.4G", "40M", "HT", "1T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "40", + "MKK", "2.4G", "40M", "HT", "1T", "08", "40", + "FCC", "2.4G", "40M", "HT", "1T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "40", + "MKK", "2.4G", "40M", "HT", "1T", "09", "40", + "FCC", "2.4G", "40M", "HT", "1T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "40", + "MKK", "2.4G", "40M", "HT", "1T", "10", "40", + "FCC", "2.4G", "40M", "HT", "1T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "40", + "MKK", "2.4G", "40M", "HT", "1T", "11", "40", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "40", + "MKK", "2.4G", "40M", "HT", "1T", "12", "40", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "40", + "MKK", "2.4G", "40M", "HT", "1T", "13", "40", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "40", + "MKK", "2.4G", "40M", "HT", "2T", "03", "40", + "FCC", "2.4G", "40M", "HT", "2T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "40", + "MKK", "2.4G", "40M", "HT", "2T", "04", "40", + "FCC", "2.4G", "40M", "HT", "2T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "40", + "MKK", "2.4G", "40M", "HT", "2T", "05", "40", + "FCC", "2.4G", "40M", "HT", "2T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "40", + "MKK", "2.4G", "40M", "HT", "2T", "06", "40", + "FCC", "2.4G", "40M", "HT", "2T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "40", + "MKK", "2.4G", "40M", "HT", "2T", "07", "40", + "FCC", "2.4G", "40M", "HT", "2T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "40", + "MKK", "2.4G", "40M", "HT", "2T", "08", "40", + "FCC", "2.4G", "40M", "HT", "2T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "40", + "MKK", "2.4G", "40M", "HT", "2T", "09", "40", + "FCC", "2.4G", "40M", "HT", "2T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "40", + "MKK", "2.4G", "40M", "HT", "2T", "10", "40", + "FCC", "2.4G", "40M", "HT", "2T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "40", + "MKK", "2.4G", "40M", "HT", "2T", "11", "40", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "40", + "MKK", "2.4G", "40M", "HT", "2T", "12", "40", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "40", + "MKK", "2.4G", "40M", "HT", "2T", "13", "40", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "3T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", + "MKK", "2.4G", "40M", "HT", "3T", "01", "63", + "FCC", "2.4G", "40M", "HT", "3T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", + "MKK", "2.4G", "40M", "HT", "3T", "02", "63", + "FCC", "2.4G", "40M", "HT", "3T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "03", "40", + "MKK", "2.4G", "40M", "HT", "3T", "03", "40", + "FCC", "2.4G", "40M", "HT", "3T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "04", "40", + "MKK", "2.4G", "40M", "HT", "3T", "04", "40", + "FCC", "2.4G", "40M", "HT", "3T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "05", "40", + "MKK", "2.4G", "40M", "HT", "3T", "05", "40", + "FCC", "2.4G", "40M", "HT", "3T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "06", "40", + "MKK", "2.4G", "40M", "HT", "3T", "06", "40", + "FCC", "2.4G", "40M", "HT", "3T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "07", "40", + "MKK", "2.4G", "40M", "HT", "3T", "07", "40", + "FCC", "2.4G", "40M", "HT", "3T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "08", "40", + "MKK", "2.4G", "40M", "HT", "3T", "08", "40", + "FCC", "2.4G", "40M", "HT", "3T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "09", "40", + "MKK", "2.4G", "40M", "HT", "3T", "09", "40", + "FCC", "2.4G", "40M", "HT", "3T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "10", "40", + "MKK", "2.4G", "40M", "HT", "3T", "10", "40", + "FCC", "2.4G", "40M", "HT", "3T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "11", "40", + "MKK", "2.4G", "40M", "HT", "3T", "11", "40", + "FCC", "2.4G", "40M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "12", "40", + "MKK", "2.4G", "40M", "HT", "3T", "12", "40", + "FCC", "2.4G", "40M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "13", "40", + "MKK", "2.4G", "40M", "HT", "3T", "13", "40", + "FCC", "2.4G", "40M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", + "MKK", "2.4G", "40M", "HT", "3T", "14", "63", + "FCC", "2.4G", "40M", "HT", "4T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", + "MKK", "2.4G", "40M", "HT", "4T", "01", "63", + "FCC", "2.4G", "40M", "HT", "4T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", + "MKK", "2.4G", "40M", "HT", "4T", "02", "63", + "FCC", "2.4G", "40M", "HT", "4T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "03", "40", + "MKK", "2.4G", "40M", "HT", "4T", "03", "40", + "FCC", "2.4G", "40M", "HT", "4T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "04", "40", + "MKK", "2.4G", "40M", "HT", "4T", "04", "40", + "FCC", "2.4G", "40M", "HT", "4T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "05", "40", + "MKK", "2.4G", "40M", "HT", "4T", "05", "40", + "FCC", "2.4G", "40M", "HT", "4T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "06", "40", + "MKK", "2.4G", "40M", "HT", "4T", "06", "40", + "FCC", "2.4G", "40M", "HT", "4T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "07", "40", + "MKK", "2.4G", "40M", "HT", "4T", "07", "40", + "FCC", "2.4G", "40M", "HT", "4T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "08", "40", + "MKK", "2.4G", "40M", "HT", "4T", "08", "40", + "FCC", "2.4G", "40M", "HT", "4T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "09", "40", + "MKK", "2.4G", "40M", "HT", "4T", "09", "40", + "FCC", "2.4G", "40M", "HT", "4T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "10", "40", + "MKK", "2.4G", "40M", "HT", "4T", "10", "40", + "FCC", "2.4G", "40M", "HT", "4T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "11", "40", + "MKK", "2.4G", "40M", "HT", "4T", "11", "40", + "FCC", "2.4G", "40M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "12", "40", + "MKK", "2.4G", "40M", "HT", "4T", "12", "40", + "FCC", "2.4G", "40M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "13", "40", + "MKK", "2.4G", "40M", "HT", "4T", "13", "40", + "FCC", "2.4G", "40M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", + "MKK", "2.4G", "40M", "HT", "4T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "40", + "MKK", "5G", "20M", "OFDM", "1T", "36", "40", + "FCC", "5G", "20M", "OFDM", "1T", "40", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "40", + "MKK", "5G", "20M", "OFDM", "1T", "40", "40", + "FCC", "5G", "20M", "OFDM", "1T", "44", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "40", + "MKK", "5G", "20M", "OFDM", "1T", "44", "40", + "FCC", "5G", "20M", "OFDM", "1T", "48", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "40", + "MKK", "5G", "20M", "OFDM", "1T", "48", "40", + "FCC", "5G", "20M", "OFDM", "1T", "52", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "40", + "MKK", "5G", "20M", "OFDM", "1T", "52", "40", + "FCC", "5G", "20M", "OFDM", "1T", "56", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "40", + "MKK", "5G", "20M", "OFDM", "1T", "56", "40", + "FCC", "5G", "20M", "OFDM", "1T", "60", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "40", + "MKK", "5G", "20M", "OFDM", "1T", "60", "40", + "FCC", "5G", "20M", "OFDM", "1T", "64", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "40", + "MKK", "5G", "20M", "OFDM", "1T", "64", "40", + "FCC", "5G", "20M", "OFDM", "1T", "100", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "40", + "MKK", "5G", "20M", "OFDM", "1T", "100", "40", + "FCC", "5G", "20M", "OFDM", "1T", "104", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "40", + "MKK", "5G", "20M", "OFDM", "1T", "104", "40", + "FCC", "5G", "20M", "OFDM", "1T", "108", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "40", + "MKK", "5G", "20M", "OFDM", "1T", "108", "40", + "FCC", "5G", "20M", "OFDM", "1T", "112", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "40", + "MKK", "5G", "20M", "OFDM", "1T", "112", "40", + "FCC", "5G", "20M", "OFDM", "1T", "116", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "40", + "MKK", "5G", "20M", "OFDM", "1T", "116", "40", + "FCC", "5G", "20M", "OFDM", "1T", "120", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "40", + "MKK", "5G", "20M", "OFDM", "1T", "120", "40", + "FCC", "5G", "20M", "OFDM", "1T", "124", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "40", + "MKK", "5G", "20M", "OFDM", "1T", "124", "40", + "FCC", "5G", "20M", "OFDM", "1T", "128", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "40", + "MKK", "5G", "20M", "OFDM", "1T", "128", "40", + "FCC", "5G", "20M", "OFDM", "1T", "132", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "40", + "MKK", "5G", "20M", "OFDM", "1T", "132", "40", + "FCC", "5G", "20M", "OFDM", "1T", "136", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "40", + "MKK", "5G", "20M", "OFDM", "1T", "136", "40", + "FCC", "5G", "20M", "OFDM", "1T", "140", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "40", + "MKK", "5G", "20M", "OFDM", "1T", "140", "40", + "FCC", "5G", "20M", "OFDM", "1T", "149", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "40", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "40", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "40", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "40", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "40", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "46", + "ETSI", "5G", "20M", "HT", "1T", "36", "40", + "MKK", "5G", "20M", "HT", "1T", "36", "40", + "FCC", "5G", "20M", "HT", "1T", "40", "46", + "ETSI", "5G", "20M", "HT", "1T", "40", "40", + "MKK", "5G", "20M", "HT", "1T", "40", "40", + "FCC", "5G", "20M", "HT", "1T", "44", "46", + "ETSI", "5G", "20M", "HT", "1T", "44", "40", + "MKK", "5G", "20M", "HT", "1T", "44", "40", + "FCC", "5G", "20M", "HT", "1T", "48", "46", + "ETSI", "5G", "20M", "HT", "1T", "48", "40", + "MKK", "5G", "20M", "HT", "1T", "48", "40", + "FCC", "5G", "20M", "HT", "1T", "52", "46", + "ETSI", "5G", "20M", "HT", "1T", "52", "40", + "MKK", "5G", "20M", "HT", "1T", "52", "40", + "FCC", "5G", "20M", "HT", "1T", "56", "46", + "ETSI", "5G", "20M", "HT", "1T", "56", "40", + "MKK", "5G", "20M", "HT", "1T", "56", "40", + "FCC", "5G", "20M", "HT", "1T", "60", "46", + "ETSI", "5G", "20M", "HT", "1T", "60", "40", + "MKK", "5G", "20M", "HT", "1T", "60", "40", + "FCC", "5G", "20M", "HT", "1T", "64", "46", + "ETSI", "5G", "20M", "HT", "1T", "64", "40", + "MKK", "5G", "20M", "HT", "1T", "64", "40", + "FCC", "5G", "20M", "HT", "1T", "100", "46", + "ETSI", "5G", "20M", "HT", "1T", "100", "40", + "MKK", "5G", "20M", "HT", "1T", "100", "40", + "FCC", "5G", "20M", "HT", "1T", "104", "46", + "ETSI", "5G", "20M", "HT", "1T", "104", "40", + "MKK", "5G", "20M", "HT", "1T", "104", "40", + "FCC", "5G", "20M", "HT", "1T", "108", "46", + "ETSI", "5G", "20M", "HT", "1T", "108", "40", + "MKK", "5G", "20M", "HT", "1T", "108", "40", + "FCC", "5G", "20M", "HT", "1T", "112", "46", + "ETSI", "5G", "20M", "HT", "1T", "112", "40", + "MKK", "5G", "20M", "HT", "1T", "112", "40", + "FCC", "5G", "20M", "HT", "1T", "116", "46", + "ETSI", "5G", "20M", "HT", "1T", "116", "40", + "MKK", "5G", "20M", "HT", "1T", "116", "40", + "FCC", "5G", "20M", "HT", "1T", "120", "46", + "ETSI", "5G", "20M", "HT", "1T", "120", "40", + "MKK", "5G", "20M", "HT", "1T", "120", "40", + "FCC", "5G", "20M", "HT", "1T", "124", "46", + "ETSI", "5G", "20M", "HT", "1T", "124", "40", + "MKK", "5G", "20M", "HT", "1T", "124", "40", + "FCC", "5G", "20M", "HT", "1T", "128", "46", + "ETSI", "5G", "20M", "HT", "1T", "128", "40", + "MKK", "5G", "20M", "HT", "1T", "128", "40", + "FCC", "5G", "20M", "HT", "1T", "132", "46", + "ETSI", "5G", "20M", "HT", "1T", "132", "40", + "MKK", "5G", "20M", "HT", "1T", "132", "40", + "FCC", "5G", "20M", "HT", "1T", "136", "46", + "ETSI", "5G", "20M", "HT", "1T", "136", "40", + "MKK", "5G", "20M", "HT", "1T", "136", "40", + "FCC", "5G", "20M", "HT", "1T", "140", "46", + "ETSI", "5G", "20M", "HT", "1T", "140", "40", + "MKK", "5G", "20M", "HT", "1T", "140", "40", + "FCC", "5G", "20M", "HT", "1T", "149", "46", + "ETSI", "5G", "20M", "HT", "1T", "149", "40", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "46", + "ETSI", "5G", "20M", "HT", "1T", "153", "40", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "46", + "ETSI", "5G", "20M", "HT", "1T", "157", "40", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "46", + "ETSI", "5G", "20M", "HT", "1T", "161", "40", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "46", + "ETSI", "5G", "20M", "HT", "1T", "165", "40", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "46", + "ETSI", "5G", "20M", "HT", "2T", "36", "40", + "MKK", "5G", "20M", "HT", "2T", "36", "40", + "FCC", "5G", "20M", "HT", "2T", "40", "46", + "ETSI", "5G", "20M", "HT", "2T", "40", "40", + "MKK", "5G", "20M", "HT", "2T", "40", "40", + "FCC", "5G", "20M", "HT", "2T", "44", "46", + "ETSI", "5G", "20M", "HT", "2T", "44", "40", + "MKK", "5G", "20M", "HT", "2T", "44", "40", + "FCC", "5G", "20M", "HT", "2T", "48", "46", + "ETSI", "5G", "20M", "HT", "2T", "48", "40", + "MKK", "5G", "20M", "HT", "2T", "48", "40", + "FCC", "5G", "20M", "HT", "2T", "52", "46", + "ETSI", "5G", "20M", "HT", "2T", "52", "40", + "MKK", "5G", "20M", "HT", "2T", "52", "40", + "FCC", "5G", "20M", "HT", "2T", "56", "46", + "ETSI", "5G", "20M", "HT", "2T", "56", "40", + "MKK", "5G", "20M", "HT", "2T", "56", "40", + "FCC", "5G", "20M", "HT", "2T", "60", "46", + "ETSI", "5G", "20M", "HT", "2T", "60", "40", + "MKK", "5G", "20M", "HT", "2T", "60", "40", + "FCC", "5G", "20M", "HT", "2T", "64", "46", + "ETSI", "5G", "20M", "HT", "2T", "64", "40", + "MKK", "5G", "20M", "HT", "2T", "64", "40", + "FCC", "5G", "20M", "HT", "2T", "100", "46", + "ETSI", "5G", "20M", "HT", "2T", "100", "40", + "MKK", "5G", "20M", "HT", "2T", "100", "40", + "FCC", "5G", "20M", "HT", "2T", "104", "46", + "ETSI", "5G", "20M", "HT", "2T", "104", "40", + "MKK", "5G", "20M", "HT", "2T", "104", "40", + "FCC", "5G", "20M", "HT", "2T", "108", "46", + "ETSI", "5G", "20M", "HT", "2T", "108", "40", + "MKK", "5G", "20M", "HT", "2T", "108", "40", + "FCC", "5G", "20M", "HT", "2T", "112", "46", + "ETSI", "5G", "20M", "HT", "2T", "112", "40", + "MKK", "5G", "20M", "HT", "2T", "112", "40", + "FCC", "5G", "20M", "HT", "2T", "116", "46", + "ETSI", "5G", "20M", "HT", "2T", "116", "40", + "MKK", "5G", "20M", "HT", "2T", "116", "40", + "FCC", "5G", "20M", "HT", "2T", "120", "46", + "ETSI", "5G", "20M", "HT", "2T", "120", "40", + "MKK", "5G", "20M", "HT", "2T", "120", "40", + "FCC", "5G", "20M", "HT", "2T", "124", "46", + "ETSI", "5G", "20M", "HT", "2T", "124", "40", + "MKK", "5G", "20M", "HT", "2T", "124", "40", + "FCC", "5G", "20M", "HT", "2T", "128", "46", + "ETSI", "5G", "20M", "HT", "2T", "128", "40", + "MKK", "5G", "20M", "HT", "2T", "128", "40", + "FCC", "5G", "20M", "HT", "2T", "132", "46", + "ETSI", "5G", "20M", "HT", "2T", "132", "40", + "MKK", "5G", "20M", "HT", "2T", "132", "40", + "FCC", "5G", "20M", "HT", "2T", "136", "46", + "ETSI", "5G", "20M", "HT", "2T", "136", "40", + "MKK", "5G", "20M", "HT", "2T", "136", "40", + "FCC", "5G", "20M", "HT", "2T", "140", "46", + "ETSI", "5G", "20M", "HT", "2T", "140", "40", + "MKK", "5G", "20M", "HT", "2T", "140", "40", + "FCC", "5G", "20M", "HT", "2T", "149", "46", + "ETSI", "5G", "20M", "HT", "2T", "149", "40", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "46", + "ETSI", "5G", "20M", "HT", "2T", "153", "40", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "46", + "ETSI", "5G", "20M", "HT", "2T", "157", "40", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "46", + "ETSI", "5G", "20M", "HT", "2T", "161", "40", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "46", + "ETSI", "5G", "20M", "HT", "2T", "165", "40", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "20M", "HT", "3T", "36", "46", + "ETSI", "5G", "20M", "HT", "3T", "36", "40", + "MKK", "5G", "20M", "HT", "3T", "36", "40", + "FCC", "5G", "20M", "HT", "3T", "40", "46", + "ETSI", "5G", "20M", "HT", "3T", "40", "40", + "MKK", "5G", "20M", "HT", "3T", "40", "40", + "FCC", "5G", "20M", "HT", "3T", "44", "46", + "ETSI", "5G", "20M", "HT", "3T", "44", "40", + "MKK", "5G", "20M", "HT", "3T", "44", "40", + "FCC", "5G", "20M", "HT", "3T", "48", "46", + "ETSI", "5G", "20M", "HT", "3T", "48", "40", + "MKK", "5G", "20M", "HT", "3T", "48", "40", + "FCC", "5G", "20M", "HT", "3T", "52", "46", + "ETSI", "5G", "20M", "HT", "3T", "52", "40", + "MKK", "5G", "20M", "HT", "3T", "52", "40", + "FCC", "5G", "20M", "HT", "3T", "56", "46", + "ETSI", "5G", "20M", "HT", "3T", "56", "40", + "MKK", "5G", "20M", "HT", "3T", "56", "40", + "FCC", "5G", "20M", "HT", "3T", "60", "46", + "ETSI", "5G", "20M", "HT", "3T", "60", "40", + "MKK", "5G", "20M", "HT", "3T", "60", "40", + "FCC", "5G", "20M", "HT", "3T", "64", "46", + "ETSI", "5G", "20M", "HT", "3T", "64", "40", + "MKK", "5G", "20M", "HT", "3T", "64", "40", + "FCC", "5G", "20M", "HT", "3T", "100", "46", + "ETSI", "5G", "20M", "HT", "3T", "100", "40", + "MKK", "5G", "20M", "HT", "3T", "100", "40", + "FCC", "5G", "20M", "HT", "3T", "104", "46", + "ETSI", "5G", "20M", "HT", "3T", "104", "40", + "MKK", "5G", "20M", "HT", "3T", "104", "40", + "FCC", "5G", "20M", "HT", "3T", "108", "46", + "ETSI", "5G", "20M", "HT", "3T", "108", "40", + "MKK", "5G", "20M", "HT", "3T", "108", "40", + "FCC", "5G", "20M", "HT", "3T", "112", "46", + "ETSI", "5G", "20M", "HT", "3T", "112", "40", + "MKK", "5G", "20M", "HT", "3T", "112", "40", + "FCC", "5G", "20M", "HT", "3T", "116", "46", + "ETSI", "5G", "20M", "HT", "3T", "116", "40", + "MKK", "5G", "20M", "HT", "3T", "116", "40", + "FCC", "5G", "20M", "HT", "3T", "120", "46", + "ETSI", "5G", "20M", "HT", "3T", "120", "40", + "MKK", "5G", "20M", "HT", "3T", "120", "40", + "FCC", "5G", "20M", "HT", "3T", "124", "46", + "ETSI", "5G", "20M", "HT", "3T", "124", "40", + "MKK", "5G", "20M", "HT", "3T", "124", "40", + "FCC", "5G", "20M", "HT", "3T", "128", "46", + "ETSI", "5G", "20M", "HT", "3T", "128", "40", + "MKK", "5G", "20M", "HT", "3T", "128", "40", + "FCC", "5G", "20M", "HT", "3T", "132", "46", + "ETSI", "5G", "20M", "HT", "3T", "132", "40", + "MKK", "5G", "20M", "HT", "3T", "132", "40", + "FCC", "5G", "20M", "HT", "3T", "136", "46", + "ETSI", "5G", "20M", "HT", "3T", "136", "40", + "MKK", "5G", "20M", "HT", "3T", "136", "40", + "FCC", "5G", "20M", "HT", "3T", "140", "46", + "ETSI", "5G", "20M", "HT", "3T", "140", "40", + "MKK", "5G", "20M", "HT", "3T", "140", "40", + "FCC", "5G", "20M", "HT", "3T", "149", "46", + "ETSI", "5G", "20M", "HT", "3T", "149", "40", + "MKK", "5G", "20M", "HT", "3T", "149", "63", + "FCC", "5G", "20M", "HT", "3T", "153", "46", + "ETSI", "5G", "20M", "HT", "3T", "153", "40", + "MKK", "5G", "20M", "HT", "3T", "153", "63", + "FCC", "5G", "20M", "HT", "3T", "157", "46", + "ETSI", "5G", "20M", "HT", "3T", "157", "40", + "MKK", "5G", "20M", "HT", "3T", "157", "63", + "FCC", "5G", "20M", "HT", "3T", "161", "46", + "ETSI", "5G", "20M", "HT", "3T", "161", "40", + "MKK", "5G", "20M", "HT", "3T", "161", "63", + "FCC", "5G", "20M", "HT", "3T", "165", "46", + "ETSI", "5G", "20M", "HT", "3T", "165", "40", + "MKK", "5G", "20M", "HT", "3T", "165", "63", + "FCC", "5G", "20M", "HT", "4T", "36", "46", + "ETSI", "5G", "20M", "HT", "4T", "36", "40", + "MKK", "5G", "20M", "HT", "4T", "36", "40", + "FCC", "5G", "20M", "HT", "4T", "40", "46", + "ETSI", "5G", "20M", "HT", "4T", "40", "40", + "MKK", "5G", "20M", "HT", "4T", "40", "40", + "FCC", "5G", "20M", "HT", "4T", "44", "46", + "ETSI", "5G", "20M", "HT", "4T", "44", "40", + "MKK", "5G", "20M", "HT", "4T", "44", "40", + "FCC", "5G", "20M", "HT", "4T", "48", "46", + "ETSI", "5G", "20M", "HT", "4T", "48", "40", + "MKK", "5G", "20M", "HT", "4T", "48", "40", + "FCC", "5G", "20M", "HT", "4T", "52", "46", + "ETSI", "5G", "20M", "HT", "4T", "52", "40", + "MKK", "5G", "20M", "HT", "4T", "52", "40", + "FCC", "5G", "20M", "HT", "4T", "56", "46", + "ETSI", "5G", "20M", "HT", "4T", "56", "40", + "MKK", "5G", "20M", "HT", "4T", "56", "40", + "FCC", "5G", "20M", "HT", "4T", "60", "46", + "ETSI", "5G", "20M", "HT", "4T", "60", "40", + "MKK", "5G", "20M", "HT", "4T", "60", "40", + "FCC", "5G", "20M", "HT", "4T", "64", "46", + "ETSI", "5G", "20M", "HT", "4T", "64", "40", + "MKK", "5G", "20M", "HT", "4T", "64", "40", + "FCC", "5G", "20M", "HT", "4T", "100", "46", + "ETSI", "5G", "20M", "HT", "4T", "100", "40", + "MKK", "5G", "20M", "HT", "4T", "100", "40", + "FCC", "5G", "20M", "HT", "4T", "104", "46", + "ETSI", "5G", "20M", "HT", "4T", "104", "40", + "MKK", "5G", "20M", "HT", "4T", "104", "40", + "FCC", "5G", "20M", "HT", "4T", "108", "46", + "ETSI", "5G", "20M", "HT", "4T", "108", "40", + "MKK", "5G", "20M", "HT", "4T", "108", "40", + "FCC", "5G", "20M", "HT", "4T", "112", "46", + "ETSI", "5G", "20M", "HT", "4T", "112", "40", + "MKK", "5G", "20M", "HT", "4T", "112", "40", + "FCC", "5G", "20M", "HT", "4T", "116", "46", + "ETSI", "5G", "20M", "HT", "4T", "116", "40", + "MKK", "5G", "20M", "HT", "4T", "116", "40", + "FCC", "5G", "20M", "HT", "4T", "120", "46", + "ETSI", "5G", "20M", "HT", "4T", "120", "40", + "MKK", "5G", "20M", "HT", "4T", "120", "40", + "FCC", "5G", "20M", "HT", "4T", "124", "46", + "ETSI", "5G", "20M", "HT", "4T", "124", "40", + "MKK", "5G", "20M", "HT", "4T", "124", "40", + "FCC", "5G", "20M", "HT", "4T", "128", "46", + "ETSI", "5G", "20M", "HT", "4T", "128", "40", + "MKK", "5G", "20M", "HT", "4T", "128", "40", + "FCC", "5G", "20M", "HT", "4T", "132", "46", + "ETSI", "5G", "20M", "HT", "4T", "132", "40", + "MKK", "5G", "20M", "HT", "4T", "132", "40", + "FCC", "5G", "20M", "HT", "4T", "136", "46", + "ETSI", "5G", "20M", "HT", "4T", "136", "40", + "MKK", "5G", "20M", "HT", "4T", "136", "40", + "FCC", "5G", "20M", "HT", "4T", "140", "46", + "ETSI", "5G", "20M", "HT", "4T", "140", "40", + "MKK", "5G", "20M", "HT", "4T", "140", "40", + "FCC", "5G", "20M", "HT", "4T", "149", "46", + "ETSI", "5G", "20M", "HT", "4T", "149", "40", + "MKK", "5G", "20M", "HT", "4T", "149", "63", + "FCC", "5G", "20M", "HT", "4T", "153", "46", + "ETSI", "5G", "20M", "HT", "4T", "153", "40", + "MKK", "5G", "20M", "HT", "4T", "153", "63", + "FCC", "5G", "20M", "HT", "4T", "157", "46", + "ETSI", "5G", "20M", "HT", "4T", "157", "40", + "MKK", "5G", "20M", "HT", "4T", "157", "63", + "FCC", "5G", "20M", "HT", "4T", "161", "46", + "ETSI", "5G", "20M", "HT", "4T", "161", "40", + "MKK", "5G", "20M", "HT", "4T", "161", "63", + "FCC", "5G", "20M", "HT", "4T", "165", "46", + "ETSI", "5G", "20M", "HT", "4T", "165", "40", + "MKK", "5G", "20M", "HT", "4T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "46", + "ETSI", "5G", "40M", "HT", "1T", "38", "40", + "MKK", "5G", "40M", "HT", "1T", "38", "40", + "FCC", "5G", "40M", "HT", "1T", "46", "46", + "ETSI", "5G", "40M", "HT", "1T", "46", "40", + "MKK", "5G", "40M", "HT", "1T", "46", "40", + "FCC", "5G", "40M", "HT", "1T", "54", "46", + "ETSI", "5G", "40M", "HT", "1T", "54", "40", + "MKK", "5G", "40M", "HT", "1T", "54", "40", + "FCC", "5G", "40M", "HT", "1T", "62", "46", + "ETSI", "5G", "40M", "HT", "1T", "62", "40", + "MKK", "5G", "40M", "HT", "1T", "62", "40", + "FCC", "5G", "40M", "HT", "1T", "102", "46", + "ETSI", "5G", "40M", "HT", "1T", "102", "40", + "MKK", "5G", "40M", "HT", "1T", "102", "40", + "FCC", "5G", "40M", "HT", "1T", "110", "46", + "ETSI", "5G", "40M", "HT", "1T", "110", "40", + "MKK", "5G", "40M", "HT", "1T", "110", "40", + "FCC", "5G", "40M", "HT", "1T", "118", "46", + "ETSI", "5G", "40M", "HT", "1T", "118", "40", + "MKK", "5G", "40M", "HT", "1T", "118", "40", + "FCC", "5G", "40M", "HT", "1T", "126", "46", + "ETSI", "5G", "40M", "HT", "1T", "126", "40", + "MKK", "5G", "40M", "HT", "1T", "126", "40", + "FCC", "5G", "40M", "HT", "1T", "134", "46", + "ETSI", "5G", "40M", "HT", "1T", "134", "40", + "MKK", "5G", "40M", "HT", "1T", "134", "40", + "FCC", "5G", "40M", "HT", "1T", "151", "46", + "ETSI", "5G", "40M", "HT", "1T", "151", "40", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "46", + "ETSI", "5G", "40M", "HT", "1T", "159", "40", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "46", + "ETSI", "5G", "40M", "HT", "2T", "38", "40", + "MKK", "5G", "40M", "HT", "2T", "38", "40", + "FCC", "5G", "40M", "HT", "2T", "46", "46", + "ETSI", "5G", "40M", "HT", "2T", "46", "40", + "MKK", "5G", "40M", "HT", "2T", "46", "40", + "FCC", "5G", "40M", "HT", "2T", "54", "46", + "ETSI", "5G", "40M", "HT", "2T", "54", "40", + "MKK", "5G", "40M", "HT", "2T", "54", "40", + "FCC", "5G", "40M", "HT", "2T", "62", "46", + "ETSI", "5G", "40M", "HT", "2T", "62", "40", + "MKK", "5G", "40M", "HT", "2T", "62", "40", + "FCC", "5G", "40M", "HT", "2T", "102", "46", + "ETSI", "5G", "40M", "HT", "2T", "102", "40", + "MKK", "5G", "40M", "HT", "2T", "102", "40", + "FCC", "5G", "40M", "HT", "2T", "110", "46", + "ETSI", "5G", "40M", "HT", "2T", "110", "40", + "MKK", "5G", "40M", "HT", "2T", "110", "40", + "FCC", "5G", "40M", "HT", "2T", "118", "46", + "ETSI", "5G", "40M", "HT", "2T", "118", "40", + "MKK", "5G", "40M", "HT", "2T", "118", "40", + "FCC", "5G", "40M", "HT", "2T", "126", "46", + "ETSI", "5G", "40M", "HT", "2T", "126", "40", + "MKK", "5G", "40M", "HT", "2T", "126", "40", + "FCC", "5G", "40M", "HT", "2T", "134", "46", + "ETSI", "5G", "40M", "HT", "2T", "134", "40", + "MKK", "5G", "40M", "HT", "2T", "134", "40", + "FCC", "5G", "40M", "HT", "2T", "151", "46", + "ETSI", "5G", "40M", "HT", "2T", "151", "40", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "46", + "ETSI", "5G", "40M", "HT", "2T", "159", "40", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "40M", "HT", "3T", "38", "46", + "ETSI", "5G", "40M", "HT", "3T", "38", "40", + "MKK", "5G", "40M", "HT", "3T", "38", "40", + "FCC", "5G", "40M", "HT", "3T", "46", "46", + "ETSI", "5G", "40M", "HT", "3T", "46", "40", + "MKK", "5G", "40M", "HT", "3T", "46", "40", + "FCC", "5G", "40M", "HT", "3T", "54", "46", + "ETSI", "5G", "40M", "HT", "3T", "54", "40", + "MKK", "5G", "40M", "HT", "3T", "54", "40", + "FCC", "5G", "40M", "HT", "3T", "62", "46", + "ETSI", "5G", "40M", "HT", "3T", "62", "40", + "MKK", "5G", "40M", "HT", "3T", "62", "40", + "FCC", "5G", "40M", "HT", "3T", "102", "46", + "ETSI", "5G", "40M", "HT", "3T", "102", "40", + "MKK", "5G", "40M", "HT", "3T", "102", "40", + "FCC", "5G", "40M", "HT", "3T", "110", "46", + "ETSI", "5G", "40M", "HT", "3T", "110", "40", + "MKK", "5G", "40M", "HT", "3T", "110", "40", + "FCC", "5G", "40M", "HT", "3T", "118", "46", + "ETSI", "5G", "40M", "HT", "3T", "118", "40", + "MKK", "5G", "40M", "HT", "3T", "118", "40", + "FCC", "5G", "40M", "HT", "3T", "126", "46", + "ETSI", "5G", "40M", "HT", "3T", "126", "40", + "MKK", "5G", "40M", "HT", "3T", "126", "40", + "FCC", "5G", "40M", "HT", "3T", "134", "46", + "ETSI", "5G", "40M", "HT", "3T", "134", "40", + "MKK", "5G", "40M", "HT", "3T", "134", "40", + "FCC", "5G", "40M", "HT", "3T", "151", "46", + "ETSI", "5G", "40M", "HT", "3T", "151", "40", + "MKK", "5G", "40M", "HT", "3T", "151", "63", + "FCC", "5G", "40M", "HT", "3T", "159", "46", + "ETSI", "5G", "40M", "HT", "3T", "159", "40", + "MKK", "5G", "40M", "HT", "3T", "159", "63", + "FCC", "5G", "40M", "HT", "4T", "38", "46", + "ETSI", "5G", "40M", "HT", "4T", "38", "40", + "MKK", "5G", "40M", "HT", "4T", "38", "40", + "FCC", "5G", "40M", "HT", "4T", "46", "46", + "ETSI", "5G", "40M", "HT", "4T", "46", "40", + "MKK", "5G", "40M", "HT", "4T", "46", "40", + "FCC", "5G", "40M", "HT", "4T", "54", "46", + "ETSI", "5G", "40M", "HT", "4T", "54", "40", + "MKK", "5G", "40M", "HT", "4T", "54", "40", + "FCC", "5G", "40M", "HT", "4T", "62", "46", + "ETSI", "5G", "40M", "HT", "4T", "62", "40", + "MKK", "5G", "40M", "HT", "4T", "62", "40", + "FCC", "5G", "40M", "HT", "4T", "102", "46", + "ETSI", "5G", "40M", "HT", "4T", "102", "40", + "MKK", "5G", "40M", "HT", "4T", "102", "40", + "FCC", "5G", "40M", "HT", "4T", "110", "46", + "ETSI", "5G", "40M", "HT", "4T", "110", "40", + "MKK", "5G", "40M", "HT", "4T", "110", "40", + "FCC", "5G", "40M", "HT", "4T", "118", "46", + "ETSI", "5G", "40M", "HT", "4T", "118", "40", + "MKK", "5G", "40M", "HT", "4T", "118", "40", + "FCC", "5G", "40M", "HT", "4T", "126", "46", + "ETSI", "5G", "40M", "HT", "4T", "126", "40", + "MKK", "5G", "40M", "HT", "4T", "126", "40", + "FCC", "5G", "40M", "HT", "4T", "134", "46", + "ETSI", "5G", "40M", "HT", "4T", "134", "40", + "MKK", "5G", "40M", "HT", "4T", "134", "40", + "FCC", "5G", "40M", "HT", "4T", "151", "46", + "ETSI", "5G", "40M", "HT", "4T", "151", "40", + "MKK", "5G", "40M", "HT", "4T", "151", "63", + "FCC", "5G", "40M", "HT", "4T", "159", "46", + "ETSI", "5G", "40M", "HT", "4T", "159", "40", + "MKK", "5G", "40M", "HT", "4T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "46", + "ETSI", "5G", "80M", "VHT", "1T", "42", "40", + "MKK", "5G", "80M", "VHT", "1T", "42", "40", + "FCC", "5G", "80M", "VHT", "1T", "58", "46", + "ETSI", "5G", "80M", "VHT", "1T", "58", "40", + "MKK", "5G", "80M", "VHT", "1T", "58", "40", + "FCC", "5G", "80M", "VHT", "1T", "106", "46", + "ETSI", "5G", "80M", "VHT", "1T", "106", "40", + "MKK", "5G", "80M", "VHT", "1T", "106", "40", + "FCC", "5G", "80M", "VHT", "1T", "122", "46", + "ETSI", "5G", "80M", "VHT", "1T", "122", "40", + "MKK", "5G", "80M", "VHT", "1T", "122", "40", + "FCC", "5G", "80M", "VHT", "1T", "155", "46", + "ETSI", "5G", "80M", "VHT", "1T", "155", "40", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "46", + "ETSI", "5G", "80M", "VHT", "2T", "42", "40", + "MKK", "5G", "80M", "VHT", "2T", "42", "40", + "FCC", "5G", "80M", "VHT", "2T", "58", "46", + "ETSI", "5G", "80M", "VHT", "2T", "58", "40", + "MKK", "5G", "80M", "VHT", "2T", "58", "40", + "FCC", "5G", "80M", "VHT", "2T", "106", "46", + "ETSI", "5G", "80M", "VHT", "2T", "106", "40", + "MKK", "5G", "80M", "VHT", "2T", "106", "40", + "FCC", "5G", "80M", "VHT", "2T", "122", "46", + "ETSI", "5G", "80M", "VHT", "2T", "122", "40", + "MKK", "5G", "80M", "VHT", "2T", "122", "40", + "FCC", "5G", "80M", "VHT", "2T", "155", "46", + "ETSI", "5G", "80M", "VHT", "2T", "155", "40", + "MKK", "5G", "80M", "VHT", "2T", "155", "63", + "FCC", "5G", "80M", "VHT", "3T", "42", "46", + "ETSI", "5G", "80M", "VHT", "3T", "42", "40", + "MKK", "5G", "80M", "VHT", "3T", "42", "40", + "FCC", "5G", "80M", "VHT", "3T", "58", "46", + "ETSI", "5G", "80M", "VHT", "3T", "58", "40", + "MKK", "5G", "80M", "VHT", "3T", "58", "40", + "FCC", "5G", "80M", "VHT", "3T", "106", "46", + "ETSI", "5G", "80M", "VHT", "3T", "106", "40", + "MKK", "5G", "80M", "VHT", "3T", "106", "40", + "FCC", "5G", "80M", "VHT", "3T", "122", "46", + "ETSI", "5G", "80M", "VHT", "3T", "122", "40", + "MKK", "5G", "80M", "VHT", "3T", "122", "40", + "FCC", "5G", "80M", "VHT", "3T", "155", "46", + "ETSI", "5G", "80M", "VHT", "3T", "155", "40", + "MKK", "5G", "80M", "VHT", "3T", "155", "63", + "FCC", "5G", "80M", "VHT", "4T", "42", "46", + "ETSI", "5G", "80M", "VHT", "4T", "42", "40", + "MKK", "5G", "80M", "VHT", "4T", "42", "40", + "FCC", "5G", "80M", "VHT", "4T", "58", "46", + "ETSI", "5G", "80M", "VHT", "4T", "58", "40", + "MKK", "5G", "80M", "VHT", "4T", "58", "40", + "FCC", "5G", "80M", "VHT", "4T", "106", "46", + "ETSI", "5G", "80M", "VHT", "4T", "106", "40", + "MKK", "5G", "80M", "VHT", "4T", "106", "40", + "FCC", "5G", "80M", "VHT", "4T", "122", "46", + "ETSI", "5G", "80M", "VHT", "4T", "122", "40", + "MKK", "5G", "80M", "VHT", "4T", "122", "40", + "FCC", "5G", "80M", "VHT", "4T", "155", "46", + "ETSI", "5G", "80M", "VHT", "4T", "155", "40", + "MKK", "5G", "80M", "VHT", "4T", "155", "63" +}; + +void +odm_read_and_config_mp_8814a_txpwr_lmt_type3( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT_Type3)/sizeof(pu1Byte); + pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_Type3; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrLmt = ArrayLen/7; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type3\n"); + + for (i = 0; i < ArrayLen; i += 7) { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rfPath, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_Type5.TXT +******************************************************************************/ + +const char *Array_MP_8814A_TXPWR_LMT_Type5[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "46", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "40", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "40", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "46", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "40", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "40", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "40", + "MKK", "2.4G", "20M", "HT", "1T", "01", "40", + "FCC", "2.4G", "20M", "HT", "1T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "40", + "MKK", "2.4G", "20M", "HT", "1T", "02", "40", + "FCC", "2.4G", "20M", "HT", "1T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "40", + "MKK", "2.4G", "20M", "HT", "1T", "03", "40", + "FCC", "2.4G", "20M", "HT", "1T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "40", + "MKK", "2.4G", "20M", "HT", "1T", "04", "40", + "FCC", "2.4G", "20M", "HT", "1T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "40", + "MKK", "2.4G", "20M", "HT", "1T", "05", "40", + "FCC", "2.4G", "20M", "HT", "1T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "40", + "MKK", "2.4G", "20M", "HT", "1T", "06", "40", + "FCC", "2.4G", "20M", "HT", "1T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "40", + "MKK", "2.4G", "20M", "HT", "1T", "07", "40", + "FCC", "2.4G", "20M", "HT", "1T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "40", + "MKK", "2.4G", "20M", "HT", "1T", "08", "40", + "FCC", "2.4G", "20M", "HT", "1T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "40", + "MKK", "2.4G", "20M", "HT", "1T", "09", "40", + "FCC", "2.4G", "20M", "HT", "1T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "40", + "MKK", "2.4G", "20M", "HT", "1T", "10", "40", + "FCC", "2.4G", "20M", "HT", "1T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "40", + "MKK", "2.4G", "20M", "HT", "1T", "11", "40", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "40", + "MKK", "2.4G", "20M", "HT", "1T", "12", "40", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "40", + "MKK", "2.4G", "20M", "HT", "1T", "13", "40", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "40", + "MKK", "2.4G", "20M", "HT", "2T", "01", "40", + "FCC", "2.4G", "20M", "HT", "2T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "40", + "MKK", "2.4G", "20M", "HT", "2T", "02", "40", + "FCC", "2.4G", "20M", "HT", "2T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "40", + "MKK", "2.4G", "20M", "HT", "2T", "03", "40", + "FCC", "2.4G", "20M", "HT", "2T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "40", + "MKK", "2.4G", "20M", "HT", "2T", "04", "40", + "FCC", "2.4G", "20M", "HT", "2T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "40", + "MKK", "2.4G", "20M", "HT", "2T", "05", "40", + "FCC", "2.4G", "20M", "HT", "2T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "40", + "MKK", "2.4G", "20M", "HT", "2T", "06", "40", + "FCC", "2.4G", "20M", "HT", "2T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "40", + "MKK", "2.4G", "20M", "HT", "2T", "07", "40", + "FCC", "2.4G", "20M", "HT", "2T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "40", + "MKK", "2.4G", "20M", "HT", "2T", "08", "40", + "FCC", "2.4G", "20M", "HT", "2T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "40", + "MKK", "2.4G", "20M", "HT", "2T", "09", "40", + "FCC", "2.4G", "20M", "HT", "2T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "40", + "MKK", "2.4G", "20M", "HT", "2T", "10", "40", + "FCC", "2.4G", "20M", "HT", "2T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "40", + "MKK", "2.4G", "20M", "HT", "2T", "11", "40", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "40", + "MKK", "2.4G", "20M", "HT", "2T", "12", "40", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "40", + "MKK", "2.4G", "20M", "HT", "2T", "13", "40", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "20M", "HT", "3T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "01", "40", + "MKK", "2.4G", "20M", "HT", "3T", "01", "40", + "FCC", "2.4G", "20M", "HT", "3T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "02", "40", + "MKK", "2.4G", "20M", "HT", "3T", "02", "40", + "FCC", "2.4G", "20M", "HT", "3T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "03", "40", + "MKK", "2.4G", "20M", "HT", "3T", "03", "40", + "FCC", "2.4G", "20M", "HT", "3T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "04", "40", + "MKK", "2.4G", "20M", "HT", "3T", "04", "40", + "FCC", "2.4G", "20M", "HT", "3T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "05", "40", + "MKK", "2.4G", "20M", "HT", "3T", "05", "40", + "FCC", "2.4G", "20M", "HT", "3T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "06", "40", + "MKK", "2.4G", "20M", "HT", "3T", "06", "40", + "FCC", "2.4G", "20M", "HT", "3T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "07", "40", + "MKK", "2.4G", "20M", "HT", "3T", "07", "40", + "FCC", "2.4G", "20M", "HT", "3T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "08", "40", + "MKK", "2.4G", "20M", "HT", "3T", "08", "40", + "FCC", "2.4G", "20M", "HT", "3T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "09", "40", + "MKK", "2.4G", "20M", "HT", "3T", "09", "40", + "FCC", "2.4G", "20M", "HT", "3T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "10", "40", + "MKK", "2.4G", "20M", "HT", "3T", "10", "40", + "FCC", "2.4G", "20M", "HT", "3T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "3T", "11", "40", + "MKK", "2.4G", "20M", "HT", "3T", "11", "40", + "FCC", "2.4G", "20M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "12", "40", + "MKK", "2.4G", "20M", "HT", "3T", "12", "40", + "FCC", "2.4G", "20M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "13", "40", + "MKK", "2.4G", "20M", "HT", "3T", "13", "40", + "FCC", "2.4G", "20M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", + "MKK", "2.4G", "20M", "HT", "3T", "14", "63", + "FCC", "2.4G", "20M", "HT", "4T", "01", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "01", "40", + "MKK", "2.4G", "20M", "HT", "4T", "01", "40", + "FCC", "2.4G", "20M", "HT", "4T", "02", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "02", "40", + "MKK", "2.4G", "20M", "HT", "4T", "02", "40", + "FCC", "2.4G", "20M", "HT", "4T", "03", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "03", "40", + "MKK", "2.4G", "20M", "HT", "4T", "03", "40", + "FCC", "2.4G", "20M", "HT", "4T", "04", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "04", "40", + "MKK", "2.4G", "20M", "HT", "4T", "04", "40", + "FCC", "2.4G", "20M", "HT", "4T", "05", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "05", "40", + "MKK", "2.4G", "20M", "HT", "4T", "05", "40", + "FCC", "2.4G", "20M", "HT", "4T", "06", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "06", "40", + "MKK", "2.4G", "20M", "HT", "4T", "06", "40", + "FCC", "2.4G", "20M", "HT", "4T", "07", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "07", "40", + "MKK", "2.4G", "20M", "HT", "4T", "07", "40", + "FCC", "2.4G", "20M", "HT", "4T", "08", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "08", "40", + "MKK", "2.4G", "20M", "HT", "4T", "08", "40", + "FCC", "2.4G", "20M", "HT", "4T", "09", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "09", "40", + "MKK", "2.4G", "20M", "HT", "4T", "09", "40", + "FCC", "2.4G", "20M", "HT", "4T", "10", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "10", "40", + "MKK", "2.4G", "20M", "HT", "4T", "10", "40", + "FCC", "2.4G", "20M", "HT", "4T", "11", "46", + "ETSI", "2.4G", "20M", "HT", "4T", "11", "40", + "MKK", "2.4G", "20M", "HT", "4T", "11", "40", + "FCC", "2.4G", "20M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "12", "40", + "MKK", "2.4G", "20M", "HT", "4T", "12", "40", + "FCC", "2.4G", "20M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "13", "40", + "MKK", "2.4G", "20M", "HT", "4T", "13", "40", + "FCC", "2.4G", "20M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", + "MKK", "2.4G", "20M", "HT", "4T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "40", + "MKK", "2.4G", "40M", "HT", "1T", "03", "40", + "FCC", "2.4G", "40M", "HT", "1T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "40", + "MKK", "2.4G", "40M", "HT", "1T", "04", "40", + "FCC", "2.4G", "40M", "HT", "1T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "40", + "MKK", "2.4G", "40M", "HT", "1T", "05", "40", + "FCC", "2.4G", "40M", "HT", "1T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "40", + "MKK", "2.4G", "40M", "HT", "1T", "06", "40", + "FCC", "2.4G", "40M", "HT", "1T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "40", + "MKK", "2.4G", "40M", "HT", "1T", "07", "40", + "FCC", "2.4G", "40M", "HT", "1T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "40", + "MKK", "2.4G", "40M", "HT", "1T", "08", "40", + "FCC", "2.4G", "40M", "HT", "1T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "40", + "MKK", "2.4G", "40M", "HT", "1T", "09", "40", + "FCC", "2.4G", "40M", "HT", "1T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "40", + "MKK", "2.4G", "40M", "HT", "1T", "10", "40", + "FCC", "2.4G", "40M", "HT", "1T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "40", + "MKK", "2.4G", "40M", "HT", "1T", "11", "40", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "40", + "MKK", "2.4G", "40M", "HT", "1T", "12", "40", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "40", + "MKK", "2.4G", "40M", "HT", "1T", "13", "40", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "40", + "MKK", "2.4G", "40M", "HT", "2T", "03", "40", + "FCC", "2.4G", "40M", "HT", "2T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "40", + "MKK", "2.4G", "40M", "HT", "2T", "04", "40", + "FCC", "2.4G", "40M", "HT", "2T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "40", + "MKK", "2.4G", "40M", "HT", "2T", "05", "40", + "FCC", "2.4G", "40M", "HT", "2T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "40", + "MKK", "2.4G", "40M", "HT", "2T", "06", "40", + "FCC", "2.4G", "40M", "HT", "2T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "40", + "MKK", "2.4G", "40M", "HT", "2T", "07", "40", + "FCC", "2.4G", "40M", "HT", "2T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "40", + "MKK", "2.4G", "40M", "HT", "2T", "08", "40", + "FCC", "2.4G", "40M", "HT", "2T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "40", + "MKK", "2.4G", "40M", "HT", "2T", "09", "40", + "FCC", "2.4G", "40M", "HT", "2T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "40", + "MKK", "2.4G", "40M", "HT", "2T", "10", "40", + "FCC", "2.4G", "40M", "HT", "2T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "40", + "MKK", "2.4G", "40M", "HT", "2T", "11", "40", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "40", + "MKK", "2.4G", "40M", "HT", "2T", "12", "40", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "40", + "MKK", "2.4G", "40M", "HT", "2T", "13", "40", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "3T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", + "MKK", "2.4G", "40M", "HT", "3T", "01", "63", + "FCC", "2.4G", "40M", "HT", "3T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", + "MKK", "2.4G", "40M", "HT", "3T", "02", "63", + "FCC", "2.4G", "40M", "HT", "3T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "03", "40", + "MKK", "2.4G", "40M", "HT", "3T", "03", "40", + "FCC", "2.4G", "40M", "HT", "3T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "04", "40", + "MKK", "2.4G", "40M", "HT", "3T", "04", "40", + "FCC", "2.4G", "40M", "HT", "3T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "05", "40", + "MKK", "2.4G", "40M", "HT", "3T", "05", "40", + "FCC", "2.4G", "40M", "HT", "3T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "06", "40", + "MKK", "2.4G", "40M", "HT", "3T", "06", "40", + "FCC", "2.4G", "40M", "HT", "3T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "07", "40", + "MKK", "2.4G", "40M", "HT", "3T", "07", "40", + "FCC", "2.4G", "40M", "HT", "3T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "08", "40", + "MKK", "2.4G", "40M", "HT", "3T", "08", "40", + "FCC", "2.4G", "40M", "HT", "3T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "09", "40", + "MKK", "2.4G", "40M", "HT", "3T", "09", "40", + "FCC", "2.4G", "40M", "HT", "3T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "10", "40", + "MKK", "2.4G", "40M", "HT", "3T", "10", "40", + "FCC", "2.4G", "40M", "HT", "3T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "3T", "11", "40", + "MKK", "2.4G", "40M", "HT", "3T", "11", "40", + "FCC", "2.4G", "40M", "HT", "3T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "12", "40", + "MKK", "2.4G", "40M", "HT", "3T", "12", "40", + "FCC", "2.4G", "40M", "HT", "3T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "13", "40", + "MKK", "2.4G", "40M", "HT", "3T", "13", "40", + "FCC", "2.4G", "40M", "HT", "3T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", + "MKK", "2.4G", "40M", "HT", "3T", "14", "63", + "FCC", "2.4G", "40M", "HT", "4T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", + "MKK", "2.4G", "40M", "HT", "4T", "01", "63", + "FCC", "2.4G", "40M", "HT", "4T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", + "MKK", "2.4G", "40M", "HT", "4T", "02", "63", + "FCC", "2.4G", "40M", "HT", "4T", "03", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "03", "40", + "MKK", "2.4G", "40M", "HT", "4T", "03", "40", + "FCC", "2.4G", "40M", "HT", "4T", "04", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "04", "40", + "MKK", "2.4G", "40M", "HT", "4T", "04", "40", + "FCC", "2.4G", "40M", "HT", "4T", "05", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "05", "40", + "MKK", "2.4G", "40M", "HT", "4T", "05", "40", + "FCC", "2.4G", "40M", "HT", "4T", "06", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "06", "40", + "MKK", "2.4G", "40M", "HT", "4T", "06", "40", + "FCC", "2.4G", "40M", "HT", "4T", "07", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "07", "40", + "MKK", "2.4G", "40M", "HT", "4T", "07", "40", + "FCC", "2.4G", "40M", "HT", "4T", "08", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "08", "40", + "MKK", "2.4G", "40M", "HT", "4T", "08", "40", + "FCC", "2.4G", "40M", "HT", "4T", "09", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "09", "40", + "MKK", "2.4G", "40M", "HT", "4T", "09", "40", + "FCC", "2.4G", "40M", "HT", "4T", "10", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "10", "40", + "MKK", "2.4G", "40M", "HT", "4T", "10", "40", + "FCC", "2.4G", "40M", "HT", "4T", "11", "46", + "ETSI", "2.4G", "40M", "HT", "4T", "11", "40", + "MKK", "2.4G", "40M", "HT", "4T", "11", "40", + "FCC", "2.4G", "40M", "HT", "4T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "12", "40", + "MKK", "2.4G", "40M", "HT", "4T", "12", "40", + "FCC", "2.4G", "40M", "HT", "4T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "13", "40", + "MKK", "2.4G", "40M", "HT", "4T", "13", "40", + "FCC", "2.4G", "40M", "HT", "4T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", + "MKK", "2.4G", "40M", "HT", "4T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "40", + "MKK", "5G", "20M", "OFDM", "1T", "36", "40", + "FCC", "5G", "20M", "OFDM", "1T", "40", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "40", + "MKK", "5G", "20M", "OFDM", "1T", "40", "40", + "FCC", "5G", "20M", "OFDM", "1T", "44", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "40", + "MKK", "5G", "20M", "OFDM", "1T", "44", "40", + "FCC", "5G", "20M", "OFDM", "1T", "48", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "40", + "MKK", "5G", "20M", "OFDM", "1T", "48", "40", + "FCC", "5G", "20M", "OFDM", "1T", "52", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "40", + "MKK", "5G", "20M", "OFDM", "1T", "52", "40", + "FCC", "5G", "20M", "OFDM", "1T", "56", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "40", + "MKK", "5G", "20M", "OFDM", "1T", "56", "40", + "FCC", "5G", "20M", "OFDM", "1T", "60", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "40", + "MKK", "5G", "20M", "OFDM", "1T", "60", "40", + "FCC", "5G", "20M", "OFDM", "1T", "64", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "40", + "MKK", "5G", "20M", "OFDM", "1T", "64", "40", + "FCC", "5G", "20M", "OFDM", "1T", "100", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "40", + "MKK", "5G", "20M", "OFDM", "1T", "100", "40", + "FCC", "5G", "20M", "OFDM", "1T", "104", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "40", + "MKK", "5G", "20M", "OFDM", "1T", "104", "40", + "FCC", "5G", "20M", "OFDM", "1T", "108", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "40", + "MKK", "5G", "20M", "OFDM", "1T", "108", "40", + "FCC", "5G", "20M", "OFDM", "1T", "112", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "40", + "MKK", "5G", "20M", "OFDM", "1T", "112", "40", + "FCC", "5G", "20M", "OFDM", "1T", "116", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "40", + "MKK", "5G", "20M", "OFDM", "1T", "116", "40", + "FCC", "5G", "20M", "OFDM", "1T", "120", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "40", + "MKK", "5G", "20M", "OFDM", "1T", "120", "40", + "FCC", "5G", "20M", "OFDM", "1T", "124", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "40", + "MKK", "5G", "20M", "OFDM", "1T", "124", "40", + "FCC", "5G", "20M", "OFDM", "1T", "128", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "40", + "MKK", "5G", "20M", "OFDM", "1T", "128", "40", + "FCC", "5G", "20M", "OFDM", "1T", "132", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "40", + "MKK", "5G", "20M", "OFDM", "1T", "132", "40", + "FCC", "5G", "20M", "OFDM", "1T", "136", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "40", + "MKK", "5G", "20M", "OFDM", "1T", "136", "40", + "FCC", "5G", "20M", "OFDM", "1T", "140", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "40", + "MKK", "5G", "20M", "OFDM", "1T", "140", "40", + "FCC", "5G", "20M", "OFDM", "1T", "149", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "40", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "40", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "40", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "40", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "46", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "40", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "46", + "ETSI", "5G", "20M", "HT", "1T", "36", "40", + "MKK", "5G", "20M", "HT", "1T", "36", "40", + "FCC", "5G", "20M", "HT", "1T", "40", "46", + "ETSI", "5G", "20M", "HT", "1T", "40", "40", + "MKK", "5G", "20M", "HT", "1T", "40", "40", + "FCC", "5G", "20M", "HT", "1T", "44", "46", + "ETSI", "5G", "20M", "HT", "1T", "44", "40", + "MKK", "5G", "20M", "HT", "1T", "44", "40", + "FCC", "5G", "20M", "HT", "1T", "48", "46", + "ETSI", "5G", "20M", "HT", "1T", "48", "40", + "MKK", "5G", "20M", "HT", "1T", "48", "40", + "FCC", "5G", "20M", "HT", "1T", "52", "46", + "ETSI", "5G", "20M", "HT", "1T", "52", "40", + "MKK", "5G", "20M", "HT", "1T", "52", "40", + "FCC", "5G", "20M", "HT", "1T", "56", "46", + "ETSI", "5G", "20M", "HT", "1T", "56", "40", + "MKK", "5G", "20M", "HT", "1T", "56", "40", + "FCC", "5G", "20M", "HT", "1T", "60", "46", + "ETSI", "5G", "20M", "HT", "1T", "60", "40", + "MKK", "5G", "20M", "HT", "1T", "60", "40", + "FCC", "5G", "20M", "HT", "1T", "64", "46", + "ETSI", "5G", "20M", "HT", "1T", "64", "40", + "MKK", "5G", "20M", "HT", "1T", "64", "40", + "FCC", "5G", "20M", "HT", "1T", "100", "46", + "ETSI", "5G", "20M", "HT", "1T", "100", "40", + "MKK", "5G", "20M", "HT", "1T", "100", "40", + "FCC", "5G", "20M", "HT", "1T", "104", "46", + "ETSI", "5G", "20M", "HT", "1T", "104", "40", + "MKK", "5G", "20M", "HT", "1T", "104", "40", + "FCC", "5G", "20M", "HT", "1T", "108", "46", + "ETSI", "5G", "20M", "HT", "1T", "108", "40", + "MKK", "5G", "20M", "HT", "1T", "108", "40", + "FCC", "5G", "20M", "HT", "1T", "112", "46", + "ETSI", "5G", "20M", "HT", "1T", "112", "40", + "MKK", "5G", "20M", "HT", "1T", "112", "40", + "FCC", "5G", "20M", "HT", "1T", "116", "46", + "ETSI", "5G", "20M", "HT", "1T", "116", "40", + "MKK", "5G", "20M", "HT", "1T", "116", "40", + "FCC", "5G", "20M", "HT", "1T", "120", "46", + "ETSI", "5G", "20M", "HT", "1T", "120", "40", + "MKK", "5G", "20M", "HT", "1T", "120", "40", + "FCC", "5G", "20M", "HT", "1T", "124", "46", + "ETSI", "5G", "20M", "HT", "1T", "124", "40", + "MKK", "5G", "20M", "HT", "1T", "124", "40", + "FCC", "5G", "20M", "HT", "1T", "128", "46", + "ETSI", "5G", "20M", "HT", "1T", "128", "40", + "MKK", "5G", "20M", "HT", "1T", "128", "40", + "FCC", "5G", "20M", "HT", "1T", "132", "46", + "ETSI", "5G", "20M", "HT", "1T", "132", "40", + "MKK", "5G", "20M", "HT", "1T", "132", "40", + "FCC", "5G", "20M", "HT", "1T", "136", "46", + "ETSI", "5G", "20M", "HT", "1T", "136", "40", + "MKK", "5G", "20M", "HT", "1T", "136", "40", + "FCC", "5G", "20M", "HT", "1T", "140", "46", + "ETSI", "5G", "20M", "HT", "1T", "140", "40", + "MKK", "5G", "20M", "HT", "1T", "140", "40", + "FCC", "5G", "20M", "HT", "1T", "149", "46", + "ETSI", "5G", "20M", "HT", "1T", "149", "40", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "46", + "ETSI", "5G", "20M", "HT", "1T", "153", "40", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "46", + "ETSI", "5G", "20M", "HT", "1T", "157", "40", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "46", + "ETSI", "5G", "20M", "HT", "1T", "161", "40", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "46", + "ETSI", "5G", "20M", "HT", "1T", "165", "40", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "46", + "ETSI", "5G", "20M", "HT", "2T", "36", "40", + "MKK", "5G", "20M", "HT", "2T", "36", "40", + "FCC", "5G", "20M", "HT", "2T", "40", "46", + "ETSI", "5G", "20M", "HT", "2T", "40", "40", + "MKK", "5G", "20M", "HT", "2T", "40", "40", + "FCC", "5G", "20M", "HT", "2T", "44", "46", + "ETSI", "5G", "20M", "HT", "2T", "44", "40", + "MKK", "5G", "20M", "HT", "2T", "44", "40", + "FCC", "5G", "20M", "HT", "2T", "48", "46", + "ETSI", "5G", "20M", "HT", "2T", "48", "40", + "MKK", "5G", "20M", "HT", "2T", "48", "40", + "FCC", "5G", "20M", "HT", "2T", "52", "46", + "ETSI", "5G", "20M", "HT", "2T", "52", "40", + "MKK", "5G", "20M", "HT", "2T", "52", "40", + "FCC", "5G", "20M", "HT", "2T", "56", "46", + "ETSI", "5G", "20M", "HT", "2T", "56", "40", + "MKK", "5G", "20M", "HT", "2T", "56", "40", + "FCC", "5G", "20M", "HT", "2T", "60", "46", + "ETSI", "5G", "20M", "HT", "2T", "60", "40", + "MKK", "5G", "20M", "HT", "2T", "60", "40", + "FCC", "5G", "20M", "HT", "2T", "64", "46", + "ETSI", "5G", "20M", "HT", "2T", "64", "40", + "MKK", "5G", "20M", "HT", "2T", "64", "40", + "FCC", "5G", "20M", "HT", "2T", "100", "46", + "ETSI", "5G", "20M", "HT", "2T", "100", "40", + "MKK", "5G", "20M", "HT", "2T", "100", "40", + "FCC", "5G", "20M", "HT", "2T", "104", "46", + "ETSI", "5G", "20M", "HT", "2T", "104", "40", + "MKK", "5G", "20M", "HT", "2T", "104", "40", + "FCC", "5G", "20M", "HT", "2T", "108", "46", + "ETSI", "5G", "20M", "HT", "2T", "108", "40", + "MKK", "5G", "20M", "HT", "2T", "108", "40", + "FCC", "5G", "20M", "HT", "2T", "112", "46", + "ETSI", "5G", "20M", "HT", "2T", "112", "40", + "MKK", "5G", "20M", "HT", "2T", "112", "40", + "FCC", "5G", "20M", "HT", "2T", "116", "46", + "ETSI", "5G", "20M", "HT", "2T", "116", "40", + "MKK", "5G", "20M", "HT", "2T", "116", "40", + "FCC", "5G", "20M", "HT", "2T", "120", "46", + "ETSI", "5G", "20M", "HT", "2T", "120", "40", + "MKK", "5G", "20M", "HT", "2T", "120", "40", + "FCC", "5G", "20M", "HT", "2T", "124", "46", + "ETSI", "5G", "20M", "HT", "2T", "124", "40", + "MKK", "5G", "20M", "HT", "2T", "124", "40", + "FCC", "5G", "20M", "HT", "2T", "128", "46", + "ETSI", "5G", "20M", "HT", "2T", "128", "40", + "MKK", "5G", "20M", "HT", "2T", "128", "40", + "FCC", "5G", "20M", "HT", "2T", "132", "46", + "ETSI", "5G", "20M", "HT", "2T", "132", "40", + "MKK", "5G", "20M", "HT", "2T", "132", "40", + "FCC", "5G", "20M", "HT", "2T", "136", "46", + "ETSI", "5G", "20M", "HT", "2T", "136", "40", + "MKK", "5G", "20M", "HT", "2T", "136", "40", + "FCC", "5G", "20M", "HT", "2T", "140", "46", + "ETSI", "5G", "20M", "HT", "2T", "140", "40", + "MKK", "5G", "20M", "HT", "2T", "140", "40", + "FCC", "5G", "20M", "HT", "2T", "149", "46", + "ETSI", "5G", "20M", "HT", "2T", "149", "40", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "46", + "ETSI", "5G", "20M", "HT", "2T", "153", "40", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "46", + "ETSI", "5G", "20M", "HT", "2T", "157", "40", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "46", + "ETSI", "5G", "20M", "HT", "2T", "161", "40", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "46", + "ETSI", "5G", "20M", "HT", "2T", "165", "40", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "20M", "HT", "3T", "36", "46", + "ETSI", "5G", "20M", "HT", "3T", "36", "40", + "MKK", "5G", "20M", "HT", "3T", "36", "40", + "FCC", "5G", "20M", "HT", "3T", "40", "46", + "ETSI", "5G", "20M", "HT", "3T", "40", "40", + "MKK", "5G", "20M", "HT", "3T", "40", "40", + "FCC", "5G", "20M", "HT", "3T", "44", "46", + "ETSI", "5G", "20M", "HT", "3T", "44", "40", + "MKK", "5G", "20M", "HT", "3T", "44", "40", + "FCC", "5G", "20M", "HT", "3T", "48", "46", + "ETSI", "5G", "20M", "HT", "3T", "48", "40", + "MKK", "5G", "20M", "HT", "3T", "48", "40", + "FCC", "5G", "20M", "HT", "3T", "52", "46", + "ETSI", "5G", "20M", "HT", "3T", "52", "40", + "MKK", "5G", "20M", "HT", "3T", "52", "40", + "FCC", "5G", "20M", "HT", "3T", "56", "46", + "ETSI", "5G", "20M", "HT", "3T", "56", "40", + "MKK", "5G", "20M", "HT", "3T", "56", "40", + "FCC", "5G", "20M", "HT", "3T", "60", "46", + "ETSI", "5G", "20M", "HT", "3T", "60", "40", + "MKK", "5G", "20M", "HT", "3T", "60", "40", + "FCC", "5G", "20M", "HT", "3T", "64", "46", + "ETSI", "5G", "20M", "HT", "3T", "64", "40", + "MKK", "5G", "20M", "HT", "3T", "64", "40", + "FCC", "5G", "20M", "HT", "3T", "100", "46", + "ETSI", "5G", "20M", "HT", "3T", "100", "40", + "MKK", "5G", "20M", "HT", "3T", "100", "40", + "FCC", "5G", "20M", "HT", "3T", "104", "46", + "ETSI", "5G", "20M", "HT", "3T", "104", "40", + "MKK", "5G", "20M", "HT", "3T", "104", "40", + "FCC", "5G", "20M", "HT", "3T", "108", "46", + "ETSI", "5G", "20M", "HT", "3T", "108", "40", + "MKK", "5G", "20M", "HT", "3T", "108", "40", + "FCC", "5G", "20M", "HT", "3T", "112", "46", + "ETSI", "5G", "20M", "HT", "3T", "112", "40", + "MKK", "5G", "20M", "HT", "3T", "112", "40", + "FCC", "5G", "20M", "HT", "3T", "116", "46", + "ETSI", "5G", "20M", "HT", "3T", "116", "40", + "MKK", "5G", "20M", "HT", "3T", "116", "40", + "FCC", "5G", "20M", "HT", "3T", "120", "46", + "ETSI", "5G", "20M", "HT", "3T", "120", "40", + "MKK", "5G", "20M", "HT", "3T", "120", "40", + "FCC", "5G", "20M", "HT", "3T", "124", "46", + "ETSI", "5G", "20M", "HT", "3T", "124", "40", + "MKK", "5G", "20M", "HT", "3T", "124", "40", + "FCC", "5G", "20M", "HT", "3T", "128", "46", + "ETSI", "5G", "20M", "HT", "3T", "128", "40", + "MKK", "5G", "20M", "HT", "3T", "128", "40", + "FCC", "5G", "20M", "HT", "3T", "132", "46", + "ETSI", "5G", "20M", "HT", "3T", "132", "40", + "MKK", "5G", "20M", "HT", "3T", "132", "40", + "FCC", "5G", "20M", "HT", "3T", "136", "46", + "ETSI", "5G", "20M", "HT", "3T", "136", "40", + "MKK", "5G", "20M", "HT", "3T", "136", "40", + "FCC", "5G", "20M", "HT", "3T", "140", "46", + "ETSI", "5G", "20M", "HT", "3T", "140", "40", + "MKK", "5G", "20M", "HT", "3T", "140", "40", + "FCC", "5G", "20M", "HT", "3T", "149", "46", + "ETSI", "5G", "20M", "HT", "3T", "149", "40", + "MKK", "5G", "20M", "HT", "3T", "149", "63", + "FCC", "5G", "20M", "HT", "3T", "153", "46", + "ETSI", "5G", "20M", "HT", "3T", "153", "40", + "MKK", "5G", "20M", "HT", "3T", "153", "63", + "FCC", "5G", "20M", "HT", "3T", "157", "46", + "ETSI", "5G", "20M", "HT", "3T", "157", "40", + "MKK", "5G", "20M", "HT", "3T", "157", "63", + "FCC", "5G", "20M", "HT", "3T", "161", "46", + "ETSI", "5G", "20M", "HT", "3T", "161", "40", + "MKK", "5G", "20M", "HT", "3T", "161", "63", + "FCC", "5G", "20M", "HT", "3T", "165", "46", + "ETSI", "5G", "20M", "HT", "3T", "165", "40", + "MKK", "5G", "20M", "HT", "3T", "165", "63", + "FCC", "5G", "20M", "HT", "4T", "36", "46", + "ETSI", "5G", "20M", "HT", "4T", "36", "40", + "MKK", "5G", "20M", "HT", "4T", "36", "40", + "FCC", "5G", "20M", "HT", "4T", "40", "46", + "ETSI", "5G", "20M", "HT", "4T", "40", "40", + "MKK", "5G", "20M", "HT", "4T", "40", "40", + "FCC", "5G", "20M", "HT", "4T", "44", "46", + "ETSI", "5G", "20M", "HT", "4T", "44", "40", + "MKK", "5G", "20M", "HT", "4T", "44", "40", + "FCC", "5G", "20M", "HT", "4T", "48", "46", + "ETSI", "5G", "20M", "HT", "4T", "48", "40", + "MKK", "5G", "20M", "HT", "4T", "48", "40", + "FCC", "5G", "20M", "HT", "4T", "52", "46", + "ETSI", "5G", "20M", "HT", "4T", "52", "40", + "MKK", "5G", "20M", "HT", "4T", "52", "40", + "FCC", "5G", "20M", "HT", "4T", "56", "46", + "ETSI", "5G", "20M", "HT", "4T", "56", "40", + "MKK", "5G", "20M", "HT", "4T", "56", "40", + "FCC", "5G", "20M", "HT", "4T", "60", "46", + "ETSI", "5G", "20M", "HT", "4T", "60", "40", + "MKK", "5G", "20M", "HT", "4T", "60", "40", + "FCC", "5G", "20M", "HT", "4T", "64", "46", + "ETSI", "5G", "20M", "HT", "4T", "64", "40", + "MKK", "5G", "20M", "HT", "4T", "64", "40", + "FCC", "5G", "20M", "HT", "4T", "100", "46", + "ETSI", "5G", "20M", "HT", "4T", "100", "40", + "MKK", "5G", "20M", "HT", "4T", "100", "40", + "FCC", "5G", "20M", "HT", "4T", "104", "46", + "ETSI", "5G", "20M", "HT", "4T", "104", "40", + "MKK", "5G", "20M", "HT", "4T", "104", "40", + "FCC", "5G", "20M", "HT", "4T", "108", "46", + "ETSI", "5G", "20M", "HT", "4T", "108", "40", + "MKK", "5G", "20M", "HT", "4T", "108", "40", + "FCC", "5G", "20M", "HT", "4T", "112", "46", + "ETSI", "5G", "20M", "HT", "4T", "112", "40", + "MKK", "5G", "20M", "HT", "4T", "112", "40", + "FCC", "5G", "20M", "HT", "4T", "116", "46", + "ETSI", "5G", "20M", "HT", "4T", "116", "40", + "MKK", "5G", "20M", "HT", "4T", "116", "40", + "FCC", "5G", "20M", "HT", "4T", "120", "46", + "ETSI", "5G", "20M", "HT", "4T", "120", "40", + "MKK", "5G", "20M", "HT", "4T", "120", "40", + "FCC", "5G", "20M", "HT", "4T", "124", "46", + "ETSI", "5G", "20M", "HT", "4T", "124", "40", + "MKK", "5G", "20M", "HT", "4T", "124", "40", + "FCC", "5G", "20M", "HT", "4T", "128", "46", + "ETSI", "5G", "20M", "HT", "4T", "128", "40", + "MKK", "5G", "20M", "HT", "4T", "128", "40", + "FCC", "5G", "20M", "HT", "4T", "132", "46", + "ETSI", "5G", "20M", "HT", "4T", "132", "40", + "MKK", "5G", "20M", "HT", "4T", "132", "40", + "FCC", "5G", "20M", "HT", "4T", "136", "46", + "ETSI", "5G", "20M", "HT", "4T", "136", "40", + "MKK", "5G", "20M", "HT", "4T", "136", "40", + "FCC", "5G", "20M", "HT", "4T", "140", "46", + "ETSI", "5G", "20M", "HT", "4T", "140", "40", + "MKK", "5G", "20M", "HT", "4T", "140", "40", + "FCC", "5G", "20M", "HT", "4T", "149", "46", + "ETSI", "5G", "20M", "HT", "4T", "149", "40", + "MKK", "5G", "20M", "HT", "4T", "149", "63", + "FCC", "5G", "20M", "HT", "4T", "153", "46", + "ETSI", "5G", "20M", "HT", "4T", "153", "40", + "MKK", "5G", "20M", "HT", "4T", "153", "63", + "FCC", "5G", "20M", "HT", "4T", "157", "46", + "ETSI", "5G", "20M", "HT", "4T", "157", "40", + "MKK", "5G", "20M", "HT", "4T", "157", "63", + "FCC", "5G", "20M", "HT", "4T", "161", "46", + "ETSI", "5G", "20M", "HT", "4T", "161", "40", + "MKK", "5G", "20M", "HT", "4T", "161", "63", + "FCC", "5G", "20M", "HT", "4T", "165", "46", + "ETSI", "5G", "20M", "HT", "4T", "165", "40", + "MKK", "5G", "20M", "HT", "4T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "46", + "ETSI", "5G", "40M", "HT", "1T", "38", "40", + "MKK", "5G", "40M", "HT", "1T", "38", "40", + "FCC", "5G", "40M", "HT", "1T", "46", "46", + "ETSI", "5G", "40M", "HT", "1T", "46", "40", + "MKK", "5G", "40M", "HT", "1T", "46", "40", + "FCC", "5G", "40M", "HT", "1T", "54", "46", + "ETSI", "5G", "40M", "HT", "1T", "54", "40", + "MKK", "5G", "40M", "HT", "1T", "54", "40", + "FCC", "5G", "40M", "HT", "1T", "62", "46", + "ETSI", "5G", "40M", "HT", "1T", "62", "40", + "MKK", "5G", "40M", "HT", "1T", "62", "40", + "FCC", "5G", "40M", "HT", "1T", "102", "46", + "ETSI", "5G", "40M", "HT", "1T", "102", "40", + "MKK", "5G", "40M", "HT", "1T", "102", "40", + "FCC", "5G", "40M", "HT", "1T", "110", "46", + "ETSI", "5G", "40M", "HT", "1T", "110", "40", + "MKK", "5G", "40M", "HT", "1T", "110", "40", + "FCC", "5G", "40M", "HT", "1T", "118", "46", + "ETSI", "5G", "40M", "HT", "1T", "118", "40", + "MKK", "5G", "40M", "HT", "1T", "118", "40", + "FCC", "5G", "40M", "HT", "1T", "126", "46", + "ETSI", "5G", "40M", "HT", "1T", "126", "40", + "MKK", "5G", "40M", "HT", "1T", "126", "40", + "FCC", "5G", "40M", "HT", "1T", "134", "46", + "ETSI", "5G", "40M", "HT", "1T", "134", "40", + "MKK", "5G", "40M", "HT", "1T", "134", "40", + "FCC", "5G", "40M", "HT", "1T", "151", "46", + "ETSI", "5G", "40M", "HT", "1T", "151", "40", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "46", + "ETSI", "5G", "40M", "HT", "1T", "159", "40", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "46", + "ETSI", "5G", "40M", "HT", "2T", "38", "40", + "MKK", "5G", "40M", "HT", "2T", "38", "40", + "FCC", "5G", "40M", "HT", "2T", "46", "46", + "ETSI", "5G", "40M", "HT", "2T", "46", "40", + "MKK", "5G", "40M", "HT", "2T", "46", "40", + "FCC", "5G", "40M", "HT", "2T", "54", "46", + "ETSI", "5G", "40M", "HT", "2T", "54", "40", + "MKK", "5G", "40M", "HT", "2T", "54", "40", + "FCC", "5G", "40M", "HT", "2T", "62", "46", + "ETSI", "5G", "40M", "HT", "2T", "62", "40", + "MKK", "5G", "40M", "HT", "2T", "62", "40", + "FCC", "5G", "40M", "HT", "2T", "102", "46", + "ETSI", "5G", "40M", "HT", "2T", "102", "40", + "MKK", "5G", "40M", "HT", "2T", "102", "40", + "FCC", "5G", "40M", "HT", "2T", "110", "46", + "ETSI", "5G", "40M", "HT", "2T", "110", "40", + "MKK", "5G", "40M", "HT", "2T", "110", "40", + "FCC", "5G", "40M", "HT", "2T", "118", "46", + "ETSI", "5G", "40M", "HT", "2T", "118", "40", + "MKK", "5G", "40M", "HT", "2T", "118", "40", + "FCC", "5G", "40M", "HT", "2T", "126", "46", + "ETSI", "5G", "40M", "HT", "2T", "126", "40", + "MKK", "5G", "40M", "HT", "2T", "126", "40", + "FCC", "5G", "40M", "HT", "2T", "134", "46", + "ETSI", "5G", "40M", "HT", "2T", "134", "40", + "MKK", "5G", "40M", "HT", "2T", "134", "40", + "FCC", "5G", "40M", "HT", "2T", "151", "46", + "ETSI", "5G", "40M", "HT", "2T", "151", "40", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "46", + "ETSI", "5G", "40M", "HT", "2T", "159", "40", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "40M", "HT", "3T", "38", "46", + "ETSI", "5G", "40M", "HT", "3T", "38", "40", + "MKK", "5G", "40M", "HT", "3T", "38", "40", + "FCC", "5G", "40M", "HT", "3T", "46", "46", + "ETSI", "5G", "40M", "HT", "3T", "46", "40", + "MKK", "5G", "40M", "HT", "3T", "46", "40", + "FCC", "5G", "40M", "HT", "3T", "54", "46", + "ETSI", "5G", "40M", "HT", "3T", "54", "40", + "MKK", "5G", "40M", "HT", "3T", "54", "40", + "FCC", "5G", "40M", "HT", "3T", "62", "46", + "ETSI", "5G", "40M", "HT", "3T", "62", "40", + "MKK", "5G", "40M", "HT", "3T", "62", "40", + "FCC", "5G", "40M", "HT", "3T", "102", "46", + "ETSI", "5G", "40M", "HT", "3T", "102", "40", + "MKK", "5G", "40M", "HT", "3T", "102", "40", + "FCC", "5G", "40M", "HT", "3T", "110", "46", + "ETSI", "5G", "40M", "HT", "3T", "110", "40", + "MKK", "5G", "40M", "HT", "3T", "110", "40", + "FCC", "5G", "40M", "HT", "3T", "118", "46", + "ETSI", "5G", "40M", "HT", "3T", "118", "40", + "MKK", "5G", "40M", "HT", "3T", "118", "40", + "FCC", "5G", "40M", "HT", "3T", "126", "46", + "ETSI", "5G", "40M", "HT", "3T", "126", "40", + "MKK", "5G", "40M", "HT", "3T", "126", "40", + "FCC", "5G", "40M", "HT", "3T", "134", "46", + "ETSI", "5G", "40M", "HT", "3T", "134", "40", + "MKK", "5G", "40M", "HT", "3T", "134", "40", + "FCC", "5G", "40M", "HT", "3T", "151", "46", + "ETSI", "5G", "40M", "HT", "3T", "151", "40", + "MKK", "5G", "40M", "HT", "3T", "151", "63", + "FCC", "5G", "40M", "HT", "3T", "159", "46", + "ETSI", "5G", "40M", "HT", "3T", "159", "40", + "MKK", "5G", "40M", "HT", "3T", "159", "63", + "FCC", "5G", "40M", "HT", "4T", "38", "46", + "ETSI", "5G", "40M", "HT", "4T", "38", "40", + "MKK", "5G", "40M", "HT", "4T", "38", "40", + "FCC", "5G", "40M", "HT", "4T", "46", "46", + "ETSI", "5G", "40M", "HT", "4T", "46", "40", + "MKK", "5G", "40M", "HT", "4T", "46", "40", + "FCC", "5G", "40M", "HT", "4T", "54", "46", + "ETSI", "5G", "40M", "HT", "4T", "54", "40", + "MKK", "5G", "40M", "HT", "4T", "54", "40", + "FCC", "5G", "40M", "HT", "4T", "62", "46", + "ETSI", "5G", "40M", "HT", "4T", "62", "40", + "MKK", "5G", "40M", "HT", "4T", "62", "40", + "FCC", "5G", "40M", "HT", "4T", "102", "46", + "ETSI", "5G", "40M", "HT", "4T", "102", "40", + "MKK", "5G", "40M", "HT", "4T", "102", "40", + "FCC", "5G", "40M", "HT", "4T", "110", "46", + "ETSI", "5G", "40M", "HT", "4T", "110", "40", + "MKK", "5G", "40M", "HT", "4T", "110", "40", + "FCC", "5G", "40M", "HT", "4T", "118", "46", + "ETSI", "5G", "40M", "HT", "4T", "118", "40", + "MKK", "5G", "40M", "HT", "4T", "118", "40", + "FCC", "5G", "40M", "HT", "4T", "126", "46", + "ETSI", "5G", "40M", "HT", "4T", "126", "40", + "MKK", "5G", "40M", "HT", "4T", "126", "40", + "FCC", "5G", "40M", "HT", "4T", "134", "46", + "ETSI", "5G", "40M", "HT", "4T", "134", "40", + "MKK", "5G", "40M", "HT", "4T", "134", "40", + "FCC", "5G", "40M", "HT", "4T", "151", "46", + "ETSI", "5G", "40M", "HT", "4T", "151", "40", + "MKK", "5G", "40M", "HT", "4T", "151", "63", + "FCC", "5G", "40M", "HT", "4T", "159", "46", + "ETSI", "5G", "40M", "HT", "4T", "159", "40", + "MKK", "5G", "40M", "HT", "4T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "46", + "ETSI", "5G", "80M", "VHT", "1T", "42", "40", + "MKK", "5G", "80M", "VHT", "1T", "42", "40", + "FCC", "5G", "80M", "VHT", "1T", "58", "46", + "ETSI", "5G", "80M", "VHT", "1T", "58", "40", + "MKK", "5G", "80M", "VHT", "1T", "58", "40", + "FCC", "5G", "80M", "VHT", "1T", "106", "46", + "ETSI", "5G", "80M", "VHT", "1T", "106", "40", + "MKK", "5G", "80M", "VHT", "1T", "106", "40", + "FCC", "5G", "80M", "VHT", "1T", "122", "46", + "ETSI", "5G", "80M", "VHT", "1T", "122", "40", + "MKK", "5G", "80M", "VHT", "1T", "122", "40", + "FCC", "5G", "80M", "VHT", "1T", "155", "46", + "ETSI", "5G", "80M", "VHT", "1T", "155", "40", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "46", + "ETSI", "5G", "80M", "VHT", "2T", "42", "40", + "MKK", "5G", "80M", "VHT", "2T", "42", "40", + "FCC", "5G", "80M", "VHT", "2T", "58", "46", + "ETSI", "5G", "80M", "VHT", "2T", "58", "40", + "MKK", "5G", "80M", "VHT", "2T", "58", "40", + "FCC", "5G", "80M", "VHT", "2T", "106", "46", + "ETSI", "5G", "80M", "VHT", "2T", "106", "40", + "MKK", "5G", "80M", "VHT", "2T", "106", "40", + "FCC", "5G", "80M", "VHT", "2T", "122", "46", + "ETSI", "5G", "80M", "VHT", "2T", "122", "40", + "MKK", "5G", "80M", "VHT", "2T", "122", "40", + "FCC", "5G", "80M", "VHT", "2T", "155", "46", + "ETSI", "5G", "80M", "VHT", "2T", "155", "40", + "MKK", "5G", "80M", "VHT", "2T", "155", "63", + "FCC", "5G", "80M", "VHT", "3T", "42", "46", + "ETSI", "5G", "80M", "VHT", "3T", "42", "40", + "MKK", "5G", "80M", "VHT", "3T", "42", "40", + "FCC", "5G", "80M", "VHT", "3T", "58", "46", + "ETSI", "5G", "80M", "VHT", "3T", "58", "40", + "MKK", "5G", "80M", "VHT", "3T", "58", "40", + "FCC", "5G", "80M", "VHT", "3T", "106", "46", + "ETSI", "5G", "80M", "VHT", "3T", "106", "40", + "MKK", "5G", "80M", "VHT", "3T", "106", "40", + "FCC", "5G", "80M", "VHT", "3T", "122", "46", + "ETSI", "5G", "80M", "VHT", "3T", "122", "40", + "MKK", "5G", "80M", "VHT", "3T", "122", "40", + "FCC", "5G", "80M", "VHT", "3T", "155", "46", + "ETSI", "5G", "80M", "VHT", "3T", "155", "40", + "MKK", "5G", "80M", "VHT", "3T", "155", "63", + "FCC", "5G", "80M", "VHT", "4T", "42", "46", + "ETSI", "5G", "80M", "VHT", "4T", "42", "40", + "MKK", "5G", "80M", "VHT", "4T", "42", "40", + "FCC", "5G", "80M", "VHT", "4T", "58", "46", + "ETSI", "5G", "80M", "VHT", "4T", "58", "40", + "MKK", "5G", "80M", "VHT", "4T", "58", "40", + "FCC", "5G", "80M", "VHT", "4T", "106", "46", + "ETSI", "5G", "80M", "VHT", "4T", "106", "40", + "MKK", "5G", "80M", "VHT", "4T", "106", "40", + "FCC", "5G", "80M", "VHT", "4T", "122", "46", + "ETSI", "5G", "80M", "VHT", "4T", "122", "40", + "MKK", "5G", "80M", "VHT", "4T", "122", "40", + "FCC", "5G", "80M", "VHT", "4T", "155", "46", + "ETSI", "5G", "80M", "VHT", "4T", "155", "40", + "MKK", "5G", "80M", "VHT", "4T", "155", "63" +}; + +void +odm_read_and_config_mp_8814a_txpwr_lmt_type5( + struct dm_struct * pDM_Odm +) +{ + u4Byte i = 0; + u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT_Type5)/sizeof(pu1Byte); + pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_Type5; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PADAPTER Adapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesReadPwrLmt = ArrayLen/7; +#endif + + PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type5\n"); + + for (i = 0; i < ArrayLen; i += 7) { + pu1Byte regulation = Array[i]; + pu1Byte band = Array[i+1]; + pu1Byte bandwidth = Array[i+2]; + pu1Byte rate = Array[i+3]; + pu1Byte rfPath = Array[i+4]; + pu1Byte chnl = Array[i+5]; + pu1Byte val = Array[i+6]; + + odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rfPath, chnl, val); +#endif + } + +} + +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/hal/phydm/rtl8814a/halhwimg8814a_rf.h b/hal/phydm/rtl8814a/halhwimg8814a_rf.h new file mode 100644 index 0000000..2770751 --- /dev/null +++ b/hal/phydm/rtl8814a/halhwimg8814a_rf.h @@ -0,0 +1,149 @@ +/****************************************************************************** +* +* 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 +* +* +******************************************************************************/ + +/*Image2HeaderVersion: 2.19*/ +#if (RTL8814A_SUPPORT == 1) +#ifndef __INC_MP_RF_HW_IMG_8814A_H +#define __INC_MP_RF_HW_IMG_8814A_H + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_radioa(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_RadioA(void); + +/****************************************************************************** +* RadioB.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_radiob(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_RadioB(void); + +/****************************************************************************** +* RadioC.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_radioc(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_RadioC(void); + +/****************************************************************************** +* RadioD.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_radiod(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_RadioD(void); + +/****************************************************************************** +* TxPowerTrack.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpowertrack(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack(void); + +/****************************************************************************** +* TxPowerTrack_Type0.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpowertrack_type0(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type0(void); + +/****************************************************************************** +* TxPowerTrack_Type2.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpowertrack_type2(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type2(void); + +/****************************************************************************** +* TxPowerTrack_Type5.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpowertrack_type5(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type5(void); + +/****************************************************************************** +* TXPWR_LMT.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpwr_lmt(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT(void); + +/****************************************************************************** +* TXPWR_LMT_type2.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpwr_lmt_type2(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_type2(void); + +/****************************************************************************** +* TXPWR_LMT_Type3.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpwr_lmt_type3(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_Type3(void); + +/****************************************************************************** +* TXPWR_LMT_Type5.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8814a_txpwr_lmt_type5(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *pDM_Odm +); +u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_Type5(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ + diff --git a/hal/phydm/rtl8814a/halphyrf_8814a_ap.c b/hal/phydm/rtl8814a/halphyrf_8814a_ap.c new file mode 100644 index 0000000..948f919 --- /dev/null +++ b/hal/phydm/rtl8814a/halphyrf_8814a_ap.c @@ -0,0 +1,1754 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#if !defined(__ECOS) && !defined(CONFIG_COMPAT_WIRELESS) +#include "mp_precomp.h" +#else +#include "../mp_precomp.h" +#endif +#include "../phydm_precomp.h" + + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX8814A 6 + +/*---------------------------Define Local Constant---------------------------*/ + + +//3============================================================ +//3 Tx Power Tracking +//3============================================================ + +u8 +CheckRFGainOffset( + struct dm_struct *pDM_Odm, + PWRTRACK_METHOD Method, + u8 RFPath + ) +{ + s1Byte UpperBound = 10, LowerBound = -5; // 4'b1010 = 10 + s1Byte Final_RF_Index = 0; + BOOLEAN bPositive = FALSE; + u32 bitMask = 0; + u8 Final_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -9dB + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + if(Method == MIX_MODE) //normal Tx power tracking + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("is 8814 MP chip\n")); + bitMask = BIT19; + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; + + if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not + bPositive = TRUE; + else + bPositive = FALSE; + + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive); + + bitMask = BIT18|BIT17|BIT16|BIT15; + Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/ + + } + + if(Final_RF_Index > UpperBound) //Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB + { + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); + + if(Final_OFDM_Swing_Index > TxScalingUpperBound) // bb swing upper bound = +2dB + Final_OFDM_Swing_Index = TxScalingUpperBound; + + return Final_OFDM_Swing_Index; + } + else if(Final_RF_Index < LowerBound) // lower bound = -5dB + { + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound)); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex - ((LowerBound<<1) - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); + + if(Final_OFDM_Swing_Index < TxScalingLowerBound) // bb swing lower bound = -10dB + Final_OFDM_Swing_Index = TxScalingLowerBound; + return Final_OFDM_Swing_Index; + } + else // normal case + { + + if(bPositive == TRUE) + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index); //set RF Reg0x55 per path + else + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index); //set RF Reg0x55 per path + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; + return Final_OFDM_Swing_Index; + } + + return FALSE; +} + + +VOID +ODM_TxPwrTrackSetPwr8814A( + struct dm_struct *pDM_Odm, + PWRTRACK_METHOD Method, + u8 RFPath, + u8 ChannelMappedIndex + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER Adapter = pDM_Odm->Adapter; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); +#endif + u8 Final_OFDM_Swing_Index = 0; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); + + Final_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath); + } + else if(Method == TSSI_MODE) + { + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); + } + else if(Method == BBSWING) // use for mp driver clean power tracking status + { + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; + + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); + + ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); + } + + if((Method == MIX_MODE) || (Method == BBSWING)) + { + switch(RFPath) + { + case ODM_RF_PATH_A: + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case ODM_RF_PATH_B: + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case ODM_RF_PATH_C: + + ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + case ODM_RF_PATH_D: + + ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); + break; + + default: + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Wrong Path name!!!! \n")); + + break; + } + } + return; +} // ODM_TxPwrTrackSetPwr8814A + +VOID +GetDeltaSwingTable_8814A( + IN struct dm_struct *pDM_Odm, + OUT pu8 *TemperatureUP_A, + OUT pu8 *TemperatureDOWN_A, + OUT pu8 *TemperatureUP_B, + OUT pu8 *TemperatureDOWN_B + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + u2Byte rate = *(pDM_Odm->pForcedDataRate); + u8 channel = *(pDM_Odm->pChannel); + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(rate)) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; + } else { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; + } + } else if ( 36 <= channel && channel <= 64) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; + } else if ( 100 <= channel && channel <= 140) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; + } else if ( 149 <= channel && channel <= 173) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; + } else { + *TemperatureUP_A = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_A = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; + *TemperatureUP_B = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_B = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; + } + + return; +} + + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN struct dm_struct *pDM_Odm, + OUT pu8 *TemperatureUP_C, + OUT pu8 *TemperatureDOWN_C, + OUT pu8 *TemperatureUP_D, + OUT pu8 *TemperatureDOWN_D + ) +{ + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + u2Byte rate = *(pDM_Odm->pForcedDataRate); + u8 channel = *(pDM_Odm->pChannel); + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(rate)) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; + } else { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; + } + } else if ( 36 <= channel && channel <= 64) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; + } else if ( 100 <= channel && channel <= 140) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; + } else if ( 149 <= channel && channel <= 173) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; + } else { + *TemperatureUP_C = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_C = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; + *TemperatureUP_D = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; + *TemperatureDOWN_D = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; + } + + return; +} + + +void ConfigureTxpowerTrack_8814A( + IN PTXPWRTRACK_CFG pConfig + ) +{ + pConfig->SwingTableSize_CCK = ODM_CCK_TABLE_SIZE; + pConfig->SwingTableSize_OFDM = ODM_OFDM_TABLE_SIZE; + pConfig->Threshold_IQK = 8; + pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; + pConfig->RfPathCount = MAX_PATH_NUM_8814A; + pConfig->ThermalRegAddr = RF_T_METER_8814A; + + pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; + pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; + pConfig->DoIQK = DoIQK_8814A; + pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; + pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; +} + + + +//1 7. IQK + + + +// +// 2011/07/26 MH Add an API for testing IQK fail case. +// +// MP Already declare in odm.c +#if 0 //!(DM_ODM_SUPPORT_TYPE & ODM_WIN) +BOOLEAN +ODM_CheckPowerStatus( + IN PADAPTER Adapter) +{ + /* + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_struct *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,COMP_INIT, 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, (pu8)(&rtState)); + if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) + { + ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", + Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState)); + return FALSE; + } + */ + return TRUE; +} +#endif + +VOID + _PHY_SaveADDARegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu32 ADDAReg, + IN pu32 ADDABackup, + IN u32 RegisterNum + ) +{ + u32 i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif + + if (ODM_CheckPowerStatus(pAdapter) == FALSE) + return; +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save ADDA parameters.\n")); + for( i = 0 ; i < RegisterNum ; i++){ + ADDABackup[i] = ODM_GetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord); + } +} + + +VOID + _PHY_SaveMACRegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu32 MACReg, + IN pu32 MACBackup + ) +{ + u32 i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save MAC parameters.\n")); + for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + MACBackup[i] = ODM_Read1Byte(pDM_Odm, MACReg[i]); + } + MACBackup[i] = ODM_Read4Byte(pDM_Odm, MACReg[i]); + +} + + +VOID + _PHY_ReloadADDARegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu32 ADDAReg, + IN pu32 ADDABackup, + IN u32 RegiesterNum + ) +{ + u32 i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload ADDA power saving parameters !\n")); + for(i = 0 ; i < RegiesterNum; i++) + { + ODM_SetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord, ADDABackup[i]); + } +} + +VOID + _PHY_ReloadMACRegisters_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu32 MACReg, + IN pu32 MACBackup + ) +{ + u32 i; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload MAC parameters !\n")); + for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + ODM_Write1Byte(pDM_Odm, MACReg[i], (u8)MACBackup[i]); + } + ODM_Write4Byte(pDM_Odm, MACReg[i], MACBackup[i]); +} + + + +VOID + _PHY_MACSettingCalibration_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu32 MACReg, + IN pu32 MACBackup + ) +{ + u32 i = 0; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n")); + + ODM_Write1Byte(pDM_Odm, MACReg[i], 0x3F); + + for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ + ODM_Write1Byte(pDM_Odm, MACReg[i], (u8)(MACBackup[i]&(~BIT3))); + } + ODM_Write1Byte(pDM_Odm, MACReg[i], (u8)(MACBackup[i]&(~BIT5))); + +} + +#if 0 +#define BW_20M 0 +#define BW_40M 1 +#define BW_80M 2 +#endif + +VOID + phy_LCCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN is2T + ) +{ + u32 /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0; + u32 cnt; + + //Check continuous TX and Packet TX + u32 reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; + + // Backup RF reg18. + + if((reg0x914 & 0x70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0xFF); + + //3 3. Read RF reg18 + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + //3 4. Set LC calibration begin bit15 + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000, 0x1); + + ODM_delay_ms(100); + + for (cnt = 0; cnt < 100; cnt++) { + if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) + break; + ODM_delay_ms(10); + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); + + + //3 Restore original situation + if((reg0x914 & 70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0x00); + + // Recover channel number + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); +} + +//Analog Pre-distortion calibration +#define APK_BB_REG_NUM 8 +#define APK_CURVE_REG_NUM 4 +#define PATH_NUM 2 + +VOID + phy_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta, + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + u32 regD[PATH_NUM]; + u32 tmpReg, index, offset, apkbound; + u8 path, i, pathbound = PATH_NUM; + u32 BB_backup[APK_BB_REG_NUM]; + u32 BB_REG[APK_BB_REG_NUM] = { + rFPGA1_TxBlock, rOFDM0_TRxPathEnable, + rFPGA0_RFMOD, rOFDM0_TRMuxPar, + rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW, + rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE }; + u32 BB_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x00204000 }; + u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x22204000 }; + + u32 AFE_backup[IQK_ADDA_REG_NUM]; + u32 AFE_REG[IQK_ADDA_REG_NUM] = { + rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, + rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, + rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, + rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + + u32 MAC_backup[IQK_MAC_REG_NUM]; + u32 MAC_REG[IQK_MAC_REG_NUM] = { + REG_TXPAUSE, REG_BCN_CTRL, + REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; + + u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, + {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} + }; + + u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings + {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} + }; + + u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, + {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} + }; + + u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} + }; + + u32 AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u32 APK_offset[PATH_NUM] = { + rConfig_AntA, rConfig_AntB}; + + u32 APK_normal_offset[PATH_NUM] = { + rConfig_Pmpd_AntA, rConfig_Pmpd_AntB}; + + u32 APK_value[PATH_NUM] = { + 0x92fc0000, 0x12fc0000}; + + u32 APK_normal_value[PATH_NUM] = { + 0x92680000, 0x12680000}; + + s1Byte APK_delta_mapping[APK_BB_REG_NUM][13] = { + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} + }; + + u32 APK_normal_setting_value_1[13] = { + 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, + 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, + 0x12680000, 0x00880000, 0x00880000 + }; + + u32 APK_normal_setting_value_2[16] = { + 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, + 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, + 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, + 0x00050006 + }; + + u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a + // u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; + + s4Byte BB_offset, delta_V, delta_offset; + +#if defined(MP_DRIVER) && (MP_DRIVER == 1) +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); +#else + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); +#endif + pMptCtx->APK_bound[0] = 45; + pMptCtx->APK_bound[1] = 52; + +#endif + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_APCalibrate_8814A() delta %d\n", delta)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AP Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); + if(!is2T) + pathbound = 1; + + //2 FOR NORMAL CHIP SETTINGS + + // Temporarily do not allow normal driver to do the following settings because these offset + // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal + // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the + // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. +#if !defined(MP_DRIVER) || (MP_DRIVER != 1) + return; +#endif + //settings adjust for normal chip + for(index = 0; index < PATH_NUM; index ++) + { + APK_offset[index] = APK_normal_offset[index]; + APK_value[index] = APK_normal_value[index]; + AFE_on_off[index] = 0x6fdb25a4; + } + + for(index = 0; index < APK_BB_REG_NUM; index ++) + { + for(path = 0; path < pathbound; path++) + { + APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; + APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; + } + BB_AP_MODE[index] = BB_normal_AP_MODE[index]; + } + + apkbound = 6; + + //save BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0) //skip + continue; + BB_backup[index] = ODM_GetBBReg(pDM_Odm, BB_REG[index], bMaskDWord); + } + + //save MAC default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_SaveMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); + + //save AFE default value + _PHY_SaveADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#else + _PHY_SaveMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); + + //save AFE default value + _PHY_SaveADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#endif + + for(path = 0; path < pathbound; path++) + { + + + if(path == RF_PATH_A) + { + //path A APK + //load APK setting + //path-A + offset = rPdp_AntA; + for(index = 0; index < 11; index ++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); + + offset = rConfig_AntA; + for(; index < 13; index ++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + + //path A + offset = rPdp_AntA; + for(index = 0; index < 16; index++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + } + else if(path == RF_PATH_B) + { + //path B APK + //load APK setting + //path-B + offset = rPdp_AntB; + for(index = 0; index < 10; index ++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); + + offset = rConfig_AntA; + index = 11; + for(; index < 13; index ++) //offset 0xb68, 0xb6c + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + + //path B + offset = 0xb60; + for(index = 0; index < 16; index++) + { + ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); + + offset += 0x04; + } + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0); + } + + //save RF default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + regD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord); +#else + regD[path] = ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord); +#endif + + //Path A AFE all on, path B AFE All off or vise versa + for(index = 0; index < IQK_ADDA_REG_NUM ; index++) + ODM_SetBBReg(pDM_Odm, AFE_REG[index], bMaskDWord, AFE_on_off[path]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xe70 %x\n", ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord))); + + //BB to AP mode + if(path == 0) + { + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + + if(index == 0) //skip + continue; + else if (index < 5) + ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); + else if (BB_REG[index] == 0x870) + ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); + else + ODM_SetBBReg(pDM_Odm, BB_REG[index], BIT10, 0x0); + } + + ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00); + ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00); + } + else //path B + { + ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00); + ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00); + + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x800 %x\n", ODM_GetBBReg(pDM_Odm, 0x800, bMaskDWord))); + + //MAC settings +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_MACSettingCalibration_8814A(pAdapter, MAC_REG, MAC_backup); +#else + _PHY_MACSettingCalibration_8814A(pDM_Odm, MAC_REG, MAC_backup); +#endif + + if(path == RF_PATH_A) //Path B to standby mode + { + ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000); + } + else //Path A to standby mode + { + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20103); + } + + delta_offset = ((delta+14)/2); + if(delta_offset < 0) + delta_offset = 0; + else if (delta_offset > 12) + delta_offset = 12; + + //AP calibration + for(index = 0; index < APK_BB_REG_NUM; index++) + { + if(index != 1) //only DO PA11+PAD01001, AP RF setting + continue; + + tmpReg = APK_RF_init_value[path][index]; +#if 1 + if(!pDM_Odm->RFCalibrateInfo.bAPKThermalMeterIgnore) + { + BB_offset = (tmpReg & 0xF0000) >> 16; + + if(!(tmpReg & BIT15)) //sign bit 0 + { + BB_offset = -BB_offset; + } + + delta_V = APK_delta_mapping[index][delta_offset]; + + BB_offset += delta_V; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() APK index %d tmpReg 0x%x delta_V %d delta_offset %d\n", index, tmpReg, (int)delta_V, (int)delta_offset)); + + if(BB_offset < 0) + { + tmpReg = tmpReg & (~BIT15); + BB_offset = -BB_offset; + } + else + { + tmpReg = tmpReg | BIT15; + } + tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); + } +#endif + + ODM_SetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord, 0x8992e); +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, path, RF_IPA_A, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, path, RF_AC, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord))); +#else + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", ODM_GetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", ODM_GetRFReg(pDM_Odm, path, RF_AC, bMaskDWord))); + ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord))); +#endif + + // PA11+PAD01111, one shot + i = 0; + do + { + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); + { + ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); + ODM_delay_ms(3); + ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[1]); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); + + ODM_delay_ms(20); + } + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + if(path == RF_PATH_A) + tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000); + else + tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0xF8000000); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xbd8[25:21] %x\n", tmpReg)); + + + i++; + } + while(tmpReg > apkbound && i < 4); + + APK_result[path][index] = tmpReg; + } + } + + //reload MAC default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_ReloadMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); +#else + _PHY_ReloadMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); +#endif + + //reload BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + + if(index == 0) //skip + continue; + ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]); + } + + //reload AFE default value +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + _PHY_ReloadADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#else + _PHY_ReloadADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); +#endif + + //reload RF path default value + for(path = 0; path < pathbound; path++) + { + ODM_SetRFReg(pDM_Odm, path, 0xd, bMaskDWord, regD[path]); + if(path == RF_PATH_B) + { + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101); + } + + //note no index == 0 + if (APK_result[path][1] > 6) + APK_result[path][1] = 6; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); + } + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("\n")); + + + for(path = 0; path < pathbound; path++) + { + ODM_SetRFReg(pDM_Odm, path, 0x3, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); + if(path == RF_PATH_A) + ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); + else + ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + ODM_SetRFReg(pDM_Odm, path, RF_BS_PA_APSET_G9_G11, bMaskDWord, + ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); +#endif + } + + pDM_Odm->RFCalibrateInfo.bAPKdone = TRUE; + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_APCalibrate_8814A()\n")); +} + + + + + + +VOID +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ) +{ + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); + phy_LCCalibrate_8814A(pDM_Odm, TRUE); + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); +} + +VOID + PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif +#ifdef DISABLE_BB_RF + return; +#endif + + return; +#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) + if(!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)) + { + return; + } +#endif + +#if defined(FOR_BRAZIL_PRETEST) && (FOR_BRAZIL_PRETEST != 1) + if(pDM_Odm->RFCalibrateInfo.bAPKdone) +#endif + return; + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + if(IS_92C_SERIAL( pHalData->VersionID)){ + phy_APCalibrate_8814A(pAdapter, delta, TRUE); + } + else +#endif + { + // For 88C 1T1R +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + phy_APCalibrate_8814A(pAdapter, delta, FALSE); +#else + phy_APCalibrate_8814A(pDM_Odm, delta, FALSE); +#endif + } +} + VOID phy_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + if(!pAdapter->bHWInitReady) +#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) + if(pAdapter->hw_init_completed == _FALSE) +#endif + { + u8 u1bTmp; + u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; + ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); + //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); + ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + +#endif + + if(is2T) //92C + { + if(bMain) + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A + else + ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT + } + else //88C + { + + if(bMain) + ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x2); //Main + else + ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x1); //Aux + } +} + VOID PHY_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#ifdef DISABLE_BB_RF + return; +#endif + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + if (IS_92C_SERIAL(pHalData->VersionID)) + { + phy_SetRFPathSwitch_8814A(pAdapter, bMain, TRUE); + } + else +#endif + { + // For 88C 1T1R +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + phy_SetRFPathSwitch_8814A(pAdapter, bMain, FALSE); +#else + phy_SetRFPathSwitch_8814A(pDM_Odm, bMain, FALSE); +#endif + } +} + + +#define DP_BB_REG_NUM 7 +#define DP_RF_REG_NUM 1 +#define DP_RETRY_LIMIT 10 +#define DP_PATH_NUM 2 +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + + + + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) +//digital predistortion +VOID + phy_DigitalPredistortion_8814A( +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PADAPTER pAdapter, +#else + IN PDM_ODM_T pDM_Odm, +#endif + IN BOOLEAN is2T + ) +{ +#if (RT_PLATFORM == PLATFORM_WINDOWS) +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + + u32 tmpReg, tmpReg2, index, i; + u8 path, pathbound = PATH_NUM; + u32 AFE_backup[IQK_ADDA_REG_NUM]; + u32 AFE_REG[IQK_ADDA_REG_NUM] = { + rFPGA0_XCD_SwitchControl, rBlue_Tooth, + rRx_Wait_CCA, rTx_CCK_RFON, + rTx_CCK_BBON, rTx_OFDM_RFON, + rTx_OFDM_BBON, rTx_To_Rx, + rTx_To_Tx, rRx_CCK, + rRx_OFDM, rRx_Wait_RIFS, + rRx_TO_Rx, rStandby, + rSleep, rPMPD_ANAEN }; + + u32 BB_backup[DP_BB_REG_NUM]; + u32 BB_REG[DP_BB_REG_NUM] = { + rOFDM0_TRxPathEnable, rFPGA0_RFMOD, + rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, + rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, + rFPGA0_XB_RFInterfaceOE}; + u32 BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, + 0x0, 0x0, 0x0}; + + u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; + u32 RF_REG[DP_RF_REG_NUM] = { + RF_TXBIAS_A}; + + u32 MAC_backup[IQK_MAC_REG_NUM]; + u32 MAC_REG[IQK_MAC_REG_NUM] = { + REG_TXPAUSE, REG_BCN_CTRL, + REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; + + u32 Tx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = { + {0x1e1e1e1e, 0x03901e1e}, + {0x18181818, 0x03901818}, + {0x0e0e0e0e, 0x03900e0e} + }; + + u32 AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u8 RetryCount = 0; + + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_DigitalPredistortion_8814A()\n")); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_DigitalPredistortion_8814A for %s %s\n", (is2T ? "2T2R" : "1T1R"))); + + //save BB default value + for(index=0; index tx_agc 1f ~11 + // PA gain = 11 & PAD2 => tx_agc 10~0e + // PA gain = 01 => tx_agc 0b~0d + // PA gain = 00 => tx_agc 0a~00 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 3; index++) + ODM_SetBBReg(pDM_Odm, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]); + ODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, Tx_AGC[i][1]); + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + ODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02097098); + ODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path A + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x80047788); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x00047788); + ODM_delay_ms(50); + } + + //PA gain = 11 => tx_agc = 1a + for(index = 0; index < 3; index++) + ODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, 0x34343434); + ODM_SetBBReg(pDM_Odm,0xe08+index*4, bMaskDWord, 0x03903434); + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, 0x34343434); + + //==================================== + // PAGE_B for Path-A DPK setting + //==================================== + // open inner loopback @ b00[19]:10 od 0xb00 0x01097018 + ODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02017098); + ODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000); + + //rf_lpbk_setup + //1.rf 00:5205a, rf 0d:0e52c + ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0c, bMaskDWord, 0x8992b); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0d, bMaskDWord, 0x0e52c); + ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bMaskDWord, 0x5205a ); + + //----send one shot signal----// + // Path A + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + + while(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathAOK) + { + //----read back measurement results----// + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c297018); + tmpReg = ODM_GetBBReg(pDM_Odm, 0xbe0, bMaskDWord); + ODM_delay_ms(10); + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c29701f); + tmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbe8, bMaskDWord); + ODM_delay_ms(10); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff ) + { + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098); + + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + RetryCount++; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A DPK RetryCount %d 0xbe0[31:16] %x 0xbe8[31:16] %x\n", RetryCount, tmpReg, tmpReg2)); + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A DPK Sucess\n")); + pDM_Odm->RFCalibrateInfo.bDPPathAOK = TRUE; + break; + } + } + RetryCount = 0; + + //DPP path A + if(pDM_Odm->RFCalibrateInfo.bDPPathAOK) + { + // DP settings + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x01017098); + ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + + for(i=rPdp_AntA; i<=0xb3c; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A ofsset = 0x%x\n", i)); + } + + //pwsf + ODM_SetBBReg(pDM_Odm, 0xb40, bMaskDWord, 0x40404040); + ODM_SetBBReg(pDM_Odm, 0xb44, bMaskDWord, 0x28324040); + ODM_SetBBReg(pDM_Odm, 0xb48, bMaskDWord, 0x10141920); + + for(i=0xb4c; i<=0xb5c; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c); + } + + //TX_AGC boundary + ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + } + else + { + ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x00000000); + } + + //DPK path B + if(is2T) + { + //Path A to standby mode + ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); + + // LUTs => tx_agc + // PA gain = 11 & PAD1, => tx_agc 1f ~11 + // PA gain = 11 & PAD2, => tx_agc 10 ~0e + // PA gain = 01 => tx_agc 0b ~0d + // PA gain = 00 => tx_agc 0a ~00 + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02097098); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path B + ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntB, bMaskDWord, 0x80047788); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x00047788); + ODM_delay_ms(50); + } + + // PA gain = 11 => tx_agc = 1a + for(index = 0; index < 4; index++) + ODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + ODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, 0x34343434); + + // PAGE_B for Path-B DPK setting + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); + + // RF lpbk switches on + ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x0101000f); + ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x01120103); + + //Path-B RF lpbk + ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0c, bMaskDWord, 0x8992b); + ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0d, bMaskDWord, 0x0e52c); + ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x5205a); + + //----send one shot signal----// + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + + while(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathBOK) + { + //----read back measurement results----// + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c297018); + tmpReg = ODM_GetBBReg(pDM_Odm, 0xbf0, bMaskDWord); + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c29701f); + tmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbf8, bMaskDWord); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff) + { + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098); + + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0); + ODM_delay_ms(1); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0); + ODM_delay_ms(50); + RetryCount++; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B DPK RetryCount %d 0xbf0[31:16] %x, 0xbf8[31:16] %x\n", RetryCount , tmpReg, tmpReg2)); + } + else + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B DPK Success\n")); + pDM_Odm->RFCalibrateInfo.bDPPathBOK = TRUE; + break; + } + } + + //DPP path B + if(pDM_Odm->RFCalibrateInfo.bDPPathBOK) + { + // DP setting + // LUT by SRAM + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x01017098); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x776d9f84); + ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); + ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); + + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); + for(i=0xb60; i<=0xb9c; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B ofsset = 0x%x\n", i)); + } + + // PWSF + ODM_SetBBReg(pDM_Odm, 0xba0, bMaskDWord, 0x40404040); + ODM_SetBBReg(pDM_Odm, 0xba4, bMaskDWord, 0x28324050); + ODM_SetBBReg(pDM_Odm, 0xba8, bMaskDWord, 0x0c141920); + + for(i=0xbac; i<=0xbbc; i+=4) + { + ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c); + } + + // tx_agc boundary + ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f); + ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); + + } + else + { + ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x00000000); + } + } + + //reload BB default value + for(index=0; indexRFCalibrateInfo.bDPdone = TRUE; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_DigitalPredistortion_8814A()\n")); +#endif +} + +VOID + phy_DigitalPredistortion_8814A_8814A( +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PADAPTER pAdapter +#else + IN PDM_ODM_T pDM_Odm +#endif + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif +#if DISABLE_BB_RF + return; +#endif + + return; + + if(pDM_Odm->RFCalibrateInfo.bDPdone) + return; +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + + if(IS_92C_SERIAL( pHalData->VersionID)){ + phy_DigitalPredistortion_8814A(pAdapter, TRUE); + } + else +#endif + { + // For 88C 1T1R + phy_DigitalPredistortion_8814A(pAdapter, FALSE); + } +} + + + +//return value TRUE => Main; FALSE => Aux + + BOOLEAN phy_QueryRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN is2T + ) +{ +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#if (DM_ODM_SUPPORT_TYPE == ODM_CE) + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; +#endif +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; +#endif +#endif + if(!pAdapter->bHWInitReady) + { + u8 u1bTmp; + u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; + ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); + //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); + ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) // + { + if(ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) + return TRUE; + else + return FALSE; + } + else + { + if((ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT4|BIT3) == 0x0) || + (ODM_GetBBReg(pDM_Odm, rConfig_ram64x16, BIT31) == 0x0)) + return TRUE; + else + return FALSE; + } +} + + + +//return value TRUE => Main; FALSE => Aux + BOOLEAN PHY_QueryRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm +#else + IN PADAPTER pAdapter +#endif + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DISABLE_BB_RF + return TRUE; +#endif +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + + //if(IS_92C_SERIAL( pHalData->VersionID)){ + if(IS_2T2R( pHalData->VersionID)){ + return phy_QueryRFPathSwitch_8814A(pAdapter, TRUE); + } + else +#endif + { + // For 88C 1T1R +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + return phy_QueryRFPathSwitch_8814A(pAdapter, FALSE); +#else + return phy_QueryRFPathSwitch_8814A(pDM_Odm, FALSE); +#endif + } +} +#endif + + diff --git a/hal/phydm/rtl8814a/halphyrf_8814a_ap.h b/hal/phydm/rtl8814a/halphyrf_8814a_ap.h new file mode 100644 index 0000000..cbb1ced --- /dev/null +++ b/hal/phydm/rtl8814a/halphyrf_8814a_ap.h @@ -0,0 +1,164 @@ +/****************************************************************************** + * + * 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_PHY_RF_8814A_H__ +#define __HAL_PHY_RF_8814A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define IQK_DELAY_TIME_8814A 10 //ms +#define index_mapping_NUM_8814A 15 +#define AVG_THERMAL_NUM_8814A 4 +#define RF_T_METER_8814A 0x42 +#define MAX_PATH_NUM_8814A 4 + +#include "../halphyrf_ap.h" + + +void ConfigureTxpowerTrack_8814A( + PTXPWRTRACK_CFG pConfig + ); + +VOID +GetDeltaSwingTable_8814A( + struct dm_struct *pDM_Odm, + u8* *TemperatureUP_A, + u8* *TemperatureDOWN_A, + u8* *TemperatureUP_B, + u8* *TemperatureDOWN_B + ); + +VOID +GetDeltaSwingTable_8814A_PathCD( + struct dm_struct *pDM_Odm, + u8* *TemperatureUP_C, + u8* *TemperatureDOWN_C, + u8* *TemperatureUP_D, + u8* *TemperatureDOWN_D + ); + +VOID +ConfigureTxpowerTrack_8814A( + IN PTXPWRTRACK_CFG pConfig + ); + + +VOID +ODM_TxPwrTrackSetPwr8814A( + IN PDM_ODM_T pDM_Odm, + IN PWRTRACK_METHOD Method, + IN u1Byte RFPath, + IN u1Byte ChannelMappedIndex + ); + + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath + ); + + +// +// LC calibrate +// +void +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm +); + +void +phy_LCCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN is2T +); + + +// +// AP calibrate +// +void +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta); +void +PHY_DigitalPredistortion_8814A( IN PADAPTER pAdapter); + + +#if 0 //FOR_8814_IQK +VOID +_PHY_SaveADDARegisters( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN pu4Byte ADDABackup, + IN u4Byte RegisterNum + ); + +VOID +_PHY_PathADDAOn( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte ADDAReg, + IN BOOLEAN isPathAOn, + IN BOOLEAN is2T + ); + +VOID +_PHY_MACSettingCalibration( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN pu4Byte MACReg, + IN pu4Byte MACBackup + ); + + + +VOID +_PHY_PathAStandBy( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm +#else + IN PADAPTER pAdapter +#endif + ); + +#endif + + +#endif // #ifndef __HAL_PHY_RF_8814A_H__ + diff --git a/hal/phydm/rtl8814a/halphyrf_8814a_win.c b/hal/phydm/rtl8814a/halphyrf_8814a_win.c new file mode 100644 index 0000000..eb91c4d --- /dev/null +++ b/hal/phydm/rtl8814a/halphyrf_8814a_win.c @@ -0,0 +1,528 @@ +/****************************************************************************** + * + * 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 "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) + + +/*---------------------------Define Local Constant---------------------------*/ +// 2010/04/25 MH Define the max tx power tracking tx agc power. +#define ODM_TXPWRTRACK_MAX_IDX_8814A 6 + +/*---------------------------Define Local Constant---------------------------*/ + +//3============================================================ +//3 Tx Power Tracking +//3============================================================ + +// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010 + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + u1Byte RFPath + ) +{ + u1Byte UpperBound = 10; // 4'b1010 = 10 + u1Byte Final_RF_Index = 0; + BOOLEAN bPositive = FALSE; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not + { + Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; + bPositive = TRUE; + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); + } + else + { + Final_RF_Index = (-1)*pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; + bPositive = FALSE; + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); + } + + if(bPositive == TRUE) + { + if(Final_RF_Index >= UpperBound) + { + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, UpperBound); //set RF Reg0x55 per path + return UpperBound; + } + else + { + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path + return Final_RF_Index; + } + } + else + { + ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path + return Final_RF_Index; + + } + + return FALSE; + +} + + + + +VOID +ODM_TxPwrTrackSetPwr8814A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ) +{ + u1Byte Final_OFDM_Swing_Index = 0; + u1Byte Final_CCK_Swing_Index = 0; + u1Byte Final_RF_Index = 0; + u1Byte UpperBound = 10, TxScalingUpperBound = 28; // Upperbound = 4'b1010, TxScalingUpperBound = +2 dB + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + + + if (Method == MIX_MODE) + { + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pRFCalibrateInfo->DefaultOfdmIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", + pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); + + Final_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; + + Final_RF_Index = CheckRFGainOffset(pDM_Odm, RFPath); // check if Final_RF_Index >= 10 + + if((Final_RF_Index == UpperBound) && (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)) // check BBSW is not over +2dB + { + Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); + if(Final_OFDM_Swing_Index > TxScalingUpperBound) + Final_OFDM_Swing_Index = TxScalingUpperBound; + } + + switch(RFPath) + { + case ODM_RF_PATH_A: + + ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + case ODM_RF_PATH_B: + + ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + case ODM_RF_PATH_C: + + ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + case ODM_RF_PATH_D: + + ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); + break; + + default: + ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, + ("Wrong Path name!!!! \n")); + + break; + } + + + } + + return; +} // ODM_TxPwrTrackSetPwr8814A + + +VOID +GetDeltaSwingTable_8814A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte TxRate = 0xFF; + u1Byte channel = pHalData->CurrentChannel; + + + if (pDM_Odm->mp_mode == TRUE) { + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #endif + } else { + u2Byte rate = *(pDM_Odm->pForcedDataRate); + + if (!rate) { /*auto rate*/ + if (rate != 0xFF) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + TxRate = HwRateToMRate(pDM_Odm->TxRate); + #endif + } + } else { /*force rate*/ + TxRate = (u1Byte)rate; + } + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); + + if (1 <= channel && channel <= 14) { + if (IS_CCK_RATE(TxRate)) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; + } else { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; + } + } else if (36 <= channel && channel <= 64) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; + } else if (100 <= channel && channel <= 144) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; + } else if (149 <= channel && channel <= 173) { + *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; + *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; + *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; + *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; + } else { + *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + } + + + return; +} + + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_C, + OUT pu1Byte *TemperatureDOWN_C, + OUT pu1Byte *TemperatureUP_D, + OUT pu1Byte *TemperatureDOWN_D + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte TxRate = 0xFF; + u1Byte channel = pHalData->CurrentChannel; + + if (pDM_Odm->mp_mode == TRUE) { + #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + #if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); + + TxRate = MptToMgntRate(pMptCtx->MptRateIndex); + #endif + #endif + } else { + u2Byte rate = *(pDM_Odm->pForcedDataRate); + + if (!rate) { /*auto rate*/ + if (rate != 0xFF) { + #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) + TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); + #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) + TxRate = HwRateToMRate(pDM_Odm->TxRate); + #endif + } + } else { /*force rate*/ + TxRate = (u1Byte)rate; + } + } + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); + + + if ( 1 <= channel && channel <= 14) { + if (IS_CCK_RATE(TxRate)) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; + } else { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; + } + } else if (36 <= channel && channel <= 64) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; + } else if (100 <= channel && channel <= 144) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; + } else if (149 <= channel && channel <= 173) { + *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; + *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; + *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; + *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; + } else { + *TemperatureUP_C = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + *TemperatureUP_D = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; + *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; + } + + + return; +} + +void ConfigureTxpowerTrack_8814A( + PTXPWRTRACK_CFG pConfig + ) +{ + pConfig->SwingTableSize_CCK = CCK_TABLE_SIZE; + pConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE; + pConfig->Threshold_IQK = 8; + pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; + pConfig->RfPathCount = MAX_PATH_NUM_8814A; + pConfig->ThermalRegAddr = RF_T_METER_88E; + + pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; + pConfig->DoIQK = DoIQK_8814A; + pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; + pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; + pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; +} + +VOID +phy_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm, + IN BOOLEAN is2T + ) +{ + u4Byte LC_Cal = 0, cnt; + + //Check continuous TX and Packet TX + u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; + + // Backup RF reg18. + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + if((reg0x914 & 0x70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0xFF); + + //3 3. Read RF reg18 + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); + + //3 4. Set LC calibration begin bit15 + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); + + ODM_delay_ms(100); + + for (cnt = 0; cnt < 100; cnt++) { + if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) + break; + ODM_delay_ms(10); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); + + + + //3 Restore original situation + if((reg0x914 & 70000) == 0) + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0x00); + + // Recover channel number + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); + + DbgPrint("Call %s\n", __FUNCTION__); +} + + +VOID +phy_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta, + IN BOOLEAN is2T + ) +{ +} + + +VOID +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ) +{ + +#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) + PADAPTER pAdapter = pDM_Odm->Adapter; + +#if (MP_DRIVER == 1) +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); +#else + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); +#endif +#endif +#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); + +//#if (MP_DRIVER == 1) + phy_LCCalibrate_8814A(pDM_Odm, TRUE); +//#endif + + ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); + +} + +VOID +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ) +{ + +} + + +VOID +PHY_DPCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ) +{ +} + + +BOOLEAN +phy_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter + ) +{ + return TRUE; +} + + +BOOLEAN PHY_QueryRFPathSwitch_8814A( + IN PADAPTER pAdapter + ) +{ + +#if DISABLE_BB_RF + return TRUE; +#endif + + return phy_QueryRFPathSwitch_8814A(pAdapter); +} + + +VOID phy_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ +} +VOID PHY_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ) +{ +} + + + + +#else /* (RTL8814A_SUPPORT == 0)*/ +VOID +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ){} + +VOID +PHY_IQCalibrate_8814A( + IN PDM_ODM_T pDM_Odm, + IN BOOLEAN bReCovery + ){} +#endif /* (RTL8814A_SUPPORT == 0)*/ diff --git a/hal/phydm/rtl8814a/halphyrf_8814a_win.h b/hal/phydm/rtl8814a/halphyrf_8814a_win.h new file mode 100644 index 0000000..658d6f0 --- /dev/null +++ b/hal/phydm/rtl8814a/halphyrf_8814a_win.h @@ -0,0 +1,106 @@ +/****************************************************************************** + * + * 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_PHY_RF_8814A_H__ +#define __HAL_PHY_RF_8814A_H__ + +/*--------------------------Define Parameters-------------------------------*/ +#define AVG_THERMAL_NUM_8814A 4 + +#include "halphyrf_win.h" + +void ConfigureTxpowerTrack_8814A( + PTXPWRTRACK_CFG pConfig + ); + +VOID +GetDeltaSwingTable_8814A( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_A, + OUT pu1Byte *TemperatureDOWN_A, + OUT pu1Byte *TemperatureUP_B, + OUT pu1Byte *TemperatureDOWN_B + ); + +VOID +GetDeltaSwingTable_8814A_PathCD( + IN PDM_ODM_T pDM_Odm, + OUT pu1Byte *TemperatureUP_C, + OUT pu1Byte *TemperatureDOWN_C, + OUT pu1Byte *TemperatureUP_D, + OUT pu1Byte *TemperatureDOWN_D + ); + + +VOID +ODM_TxPwrTrackSetPwr8814A( + PDM_ODM_T pDM_Odm, + PWRTRACK_METHOD Method, + u1Byte RFPath, + u1Byte ChannelMappedIndex + ); + +u1Byte +CheckRFGainOffset( + PDM_ODM_T pDM_Odm, + u1Byte RFPath + ); + + +// +// LC calibrate +// +void +PHY_LCCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ); + +// +// AP calibrate +// +void +PHY_APCalibrate_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN s1Byte delta + ); + + +VOID +PHY_DPCalibrate_8814A( + IN PDM_ODM_T pDM_Odm + ); + + +VOID PHY_SetRFPathSwitch_8814A( +#if (DM_ODM_SUPPORT_TYPE & ODM_AP) + IN PDM_ODM_T pDM_Odm, +#else + IN PADAPTER pAdapter, +#endif + IN BOOLEAN bMain + ); + + +#endif // #ifndef __HAL_PHY_RF_8188E_H__ + diff --git a/hal/phydm/rtl8814a/phydm_regconfig8814a.c b/hal/phydm/rtl8814a/phydm_regconfig8814a.c new file mode 100644 index 0000000..2e3f206 --- /dev/null +++ b/hal/phydm/rtl8814a/phydm_regconfig8814a.c @@ -0,0 +1,219 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) + +void +odm_ConfigRFReg_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data, + enum rf_path RF_PATH, + u32 RegAddr + ) +{ + if(Addr == 0xfe || Addr == 0xffe) + { + #ifdef CONFIG_LONG_DELAY_ISSUE + ODM_sleep_ms(50); + #else + ODM_delay_ms(50); + #endif + } + else + { + odm_set_rf_reg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data); + // Add 1us delay between BB/RF register setting. + ODM_delay_us(1); + } +} + + +void +odm_ConfigRF_RadioA_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ) +{ + u4Byte content = 0x1000; // RF_Content: radioa_txt + u4Byte maskforPhySet= (u4Byte)(content&0xE000); + + odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_A, Addr|maskforPhySet); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioA] %08X %08X\n", Addr, Data)); +} + +void +odm_ConfigRF_RadioB_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ) +{ + u4Byte content = 0x1001; // RF_Content: radiob_txt + u4Byte maskforPhySet= (u4Byte)(content&0xE000); + + odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_B, Addr|maskforPhySet); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioB] %08X %08X\n", Addr, Data)); + +} + +void +odm_ConfigRF_RadioC_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ) +{ + u4Byte content = 0x1001; // RF_Content: radiob_txt + u4Byte maskforPhySet= (u4Byte)(content&0xE000); + + odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_C, Addr|maskforPhySet); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioC] %08X %08X\n", Addr, Data)); + +} + +void +odm_ConfigRF_RadioD_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ) +{ + u4Byte content = 0x1001; // RF_Content: radiob_txt + u4Byte maskforPhySet= (u4Byte)(content&0xE000); + + odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_D, Addr|maskforPhySet); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioD] %08X %08X\n", Addr, Data)); + +} + +void +odm_ConfigMAC_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + IN u1Byte Data + ) +{ + odm_write_1byte(pDM_Odm, Addr, Data); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigMACWithHeaderFile: [MAC_REG] %08X %08X\n", Addr, Data)); +} + +void +odm_ConfigBB_AGC_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Bitmask, + u32 Data + ) +{ + odm_set_bb_reg(pDM_Odm, Addr, Bitmask, Data); + // Add 1us delay between BB/RF register setting. + ODM_delay_us(1); + + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [AGC_TAB] %08X %08X\n", Addr, Data)); +} + +void +odm_ConfigBB_PHY_REG_PG_8814A( + struct dm_struct *pDM_Odm, + u32 Band, + u32 RfPath, + u32 TxNum, + u32 Addr, + u32 Bitmask, + u32 Data + ) +{ + if (Addr == 0xfe || Addr == 0xffe) + #ifdef CONFIG_LONG_DELAY_ISSUE + ODM_sleep_ms(50); + #else + ODM_delay_ms(50); + #endif + else + { +#if !(DM_ODM_SUPPORT_TYPE&ODM_AP) + phy_store_tx_power_by_rate(pDM_Odm->adapter, Band, RfPath, TxNum, Addr, Bitmask, Data); +#endif + } + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\n", Addr, Bitmask, Data)); +} + +void +odm_ConfigBB_PHY_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Bitmask, + u32 Data + ) +{ + if (Addr == 0xfe) + #ifdef CONFIG_LONG_DELAY_ISSUE + ODM_sleep_ms(50); + #else + ODM_delay_ms(50); + #endif + else if (Addr == 0xfd) + ODM_delay_ms(5); + else if (Addr == 0xfc) + ODM_delay_ms(1); + else if (Addr == 0xfb) + ODM_delay_us(50); + else if (Addr == 0xfa) + ODM_delay_us(5); + else if (Addr == 0xf9) + ODM_delay_us(1); + else + { + odm_set_bb_reg(pDM_Odm, Addr, Bitmask, Data); + } + + // Add 1us delay between BB/RF register setting. + ODM_delay_us(1); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X\n", Addr, Data)); +} + +void +odm_ConfigBB_TXPWR_LMT_8814A( + struct dm_struct *pDM_Odm, + u8* Regulation, + u8* Band, + u8* Bandwidth, + u8* RateSection, + u8* RfPath, + u8* Channel, + u8* PowerLimit + ) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) + phy_set_tx_power_limit(pDM_Odm, Regulation, Band, + Bandwidth, RateSection, RfPath, Channel, PowerLimit); +#endif +} +#endif + diff --git a/hal/phydm/rtl8814a/phydm_regconfig8814a.h b/hal/phydm/rtl8814a/phydm_regconfig8814a.h new file mode 100644 index 0000000..bc3f943 --- /dev/null +++ b/hal/phydm/rtl8814a/phydm_regconfig8814a.h @@ -0,0 +1,109 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_ODM_REGCONFIG_H_8814A +#define __INC_ODM_REGCONFIG_H_8814A + +#if (RTL8814A_SUPPORT == 1) + +void +odm_ConfigRFReg_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data, + enum rf_path RF_PATH, + u32 RegAddr + ); + +void +odm_ConfigRF_RadioA_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ); + +void +odm_ConfigRF_RadioB_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ); + +void +odm_ConfigRF_RadioC_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ); + +void +odm_ConfigRF_RadioD_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Data + ); + +void +odm_ConfigMAC_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + IN u1Byte Data + ); + +void +odm_ConfigBB_AGC_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Bitmask, + u32 Data + ); + +void +odm_ConfigBB_PHY_REG_PG_8814A( + struct dm_struct *pDM_Odm, + u32 Band, + u32 RfPath, + u32 TxNum, + u32 Addr, + u32 Bitmask, + u32 Data + ); + +void +odm_ConfigBB_PHY_8814A( + struct dm_struct *pDM_Odm, + u32 Addr, + u32 Bitmask, + u32 Data + ); + +void +odm_ConfigBB_TXPWR_LMT_8814A( + struct dm_struct *pDM_Odm, + u8* Regulation, + u8* Band, + u8* Bandwidth, + u8* RateSection, + u8* RfPath, + u8* Channel, + u8* PowerLimit + ); +#endif +#endif // end of SUPPORT + diff --git a/hal/phydm/rtl8814a/phydm_rtl8814a.c b/hal/phydm/rtl8814a/phydm_rtl8814a.c new file mode 100644 index 0000000..885e063 --- /dev/null +++ b/hal/phydm/rtl8814a/phydm_rtl8814a.c @@ -0,0 +1,503 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +//============================================================ +// include files +//============================================================ + +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8814A_SUPPORT == 1) +s8 phydm_cck_rssi_8814a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx) +{ + s8 rx_pwr_all = 0; + + switch (lna_idx) { + case 7: + if (vga_idx <= 27) + rx_pwr_all = -94 + 2 * (27 - vga_idx); + else + rx_pwr_all = -94; + break; + case 6: + rx_pwr_all = -42 + 2 * (2 - vga_idx); + break; + case 5: + rx_pwr_all = -36 + 2 * (7 - vga_idx); + break; + case 4: + rx_pwr_all = -30 + 2 * (7 - vga_idx); + break; + case 3: + rx_pwr_all = -18 + 2 * (7 - vga_idx); + break; + case 2: + rx_pwr_all = 2 * (5 - vga_idx); + break; + case 1: + rx_pwr_all = 14 - 2 * vga_idx; + break; + case 0: + rx_pwr_all = 20 - 2 * vga_idx; + break; + default: + break; + } + + return rx_pwr_all; +} +#ifdef PHYDM_PRIMARY_CCA +VOID +odm_Write_Dynamic_CCA_8814A( + struct dm_struct *pDM_Odm, + u8 CurrentMFstate + ) +{ + struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); + + if (PrimaryCCA->MF_state != CurrentMFstate){ + + ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, CurrentMFstate); + } + + PrimaryCCA->MF_state = CurrentMFstate; + +} + +VOID +odm_PrimaryCCA_Check_Init_8814A( + struct dm_struct *pDM_Odm) +{ +#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) || (DM_ODM_SUPPORT_TYPE == ODM_AP)) + PADAPTER pAdapter = pDM_Odm->Adapter; + struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + pHalData->RTSEN = 0; + PrimaryCCA->DupRTS_flag = 0; + PrimaryCCA->intf_flag = 0; + PrimaryCCA->intf_type = 0; + PrimaryCCA->Monitor_flag = 0; + PrimaryCCA->PriCCA_flag = 0; + PrimaryCCA->CH_offset = 0; + PrimaryCCA->MF_state = 0; +#endif /*((DM_ODM_SUPPORT_TYPE==ODM_WIN) ||(DM_ODM_SUPPORT_TYPE==ODM_AP)) */ +} + +VOID +odm_DynamicPrimaryCCA_Check_8814A( + struct dm_struct *pDM_Odm + ) +{ + if(pDM_Odm->SupportICType != ODM_RTL8814A) + return; + + switch (pDM_Odm->SupportPlatform) + { + case ODM_WIN: + +#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) + odm_DynamicPrimaryCCAMP_8814A(pDM_Odm); +#endif + break; + + case ODM_CE: +#if(DM_ODM_SUPPORT_TYPE==ODM_CE) + +#endif + break; + + case ODM_AP: +#if (DM_ODM_SUPPORT_TYPE == ODM_AP) + odm_DynamicPrimaryCCAAP_8814A(pDM_Odm); +#endif + break; + } + +} + + +#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) + +VOID +odm_DynamicPrimaryCCAMP_8814A( + struct dm_struct *pDM_Odm + ) +{ + PADAPTER pAdapter = pDM_Odm->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); + struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); + BOOLEAN Is40MHz = FALSE; + u8Byte OFDM_CCA, OFDM_FA, BW_USC_Cnt, BW_LSC_Cnt; + u8 SecCHOffset; + u8 CurMFstate; + static u8 CountDown = Monitor_TIME; + + OFDM_CCA = FalseAlmCnt->Cnt_OFDM_CCA; + OFDM_FA = FalseAlmCnt->Cnt_Ofdm_fail; + BW_USC_Cnt = FalseAlmCnt->Cnt_BW_USC; + BW_LSC_Cnt = FalseAlmCnt->Cnt_BW_LSC; + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: OFDM CCA=%d\n", OFDM_CCA)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: OFDM FA=%d\n", OFDM_FA)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: BW_USC=%d\n", BW_USC_Cnt)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: BW_LSC=%d\n", BW_LSC_Cnt)); + Is40MHz = *(pDM_Odm->pBandWidth); + SecCHOffset = *(pDM_Odm->pSecChOffset); // NIC: 2: sec is below, 1: sec is above + //DbgPrint("8814A: SecCHOffset = %d\n", SecCHOffset); + if(!pDM_Odm->bLinked){ + return; + } + else{ + + if(Is40MHz){ + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Cont Down= %d\n", CountDown)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Primary_CCA_flag=%d\n", PrimaryCCA->PriCCA_flag)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Intf_Type=%d\n", PrimaryCCA->intf_type)); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Intf_flag=%d\n", PrimaryCCA->intf_flag )); + ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Duplicate RTS Flag=%d\n", PrimaryCCA->DupRTS_flag)); + //DbgPrint("8814A RTS_EN=%d\n", pHalData->RTSEN); + + if(PrimaryCCA->PriCCA_flag == 0){ + + if(SecCHOffset == 2){ // Primary channel is above NOTE: duplicate CTS can remove this condition + + if((OFDM_CCA > OFDMCCA_TH) && (BW_LSC_Cnt>(BW_USC_Cnt + BW_Ind_Bias)) + && (OFDM_FA>(OFDM_CCA>>1))){ + + PrimaryCCA->intf_type = 1; + PrimaryCCA->intf_flag = 1; + CurMFstate = MF_USC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + PrimaryCCA->PriCCA_flag = 1; + } + else if((OFDM_CCA > OFDMCCA_TH) && (BW_LSC_Cnt>(BW_USC_Cnt + BW_Ind_Bias)) + && (OFDM_FA < (OFDM_CCA>>1))){ + + PrimaryCCA->intf_type = 2; + PrimaryCCA->intf_flag = 1; + CurMFstate = MF_USC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + PrimaryCCA->PriCCA_flag = 1; + PrimaryCCA->DupRTS_flag = 1; + pHalData->RTSEN = 1; + } + else{ + + PrimaryCCA->intf_type = 0; + PrimaryCCA->intf_flag = 0; + CurMFstate = MF_USC_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + pHalData->RTSEN = 0; + PrimaryCCA->DupRTS_flag = 0; + } + + } + else if (SecCHOffset == 1){ + + if((OFDM_CCA > OFDMCCA_TH) && (BW_USC_Cnt > (BW_LSC_Cnt + BW_Ind_Bias)) + && (OFDM_FA > (OFDM_CCA>>1))){ + + PrimaryCCA->intf_type = 1; + PrimaryCCA->intf_flag = 1; + CurMFstate = MF_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + PrimaryCCA->PriCCA_flag = 1; + } + else if((OFDM_CCA > OFDMCCA_TH) && (BW_USC_Cnt>(BW_LSC_Cnt + BW_Ind_Bias)) + && (OFDM_FA < (OFDM_CCA>>1))){ + + PrimaryCCA->intf_type = 2; + PrimaryCCA->intf_flag = 1; + CurMFstate = MF_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + PrimaryCCA->PriCCA_flag = 1; + PrimaryCCA->DupRTS_flag = 1; + pHalData->RTSEN = 1; + } + else{ + + PrimaryCCA->intf_type = 0; + PrimaryCCA->intf_flag = 0; + CurMFstate = MF_USC_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + pHalData->RTSEN = 0; + PrimaryCCA->DupRTS_flag = 0; + } + + } + + } + else{ // PrimaryCCA->PriCCA_flag==1 + + CountDown--; + if(CountDown == 0){ + CountDown = Monitor_TIME; + PrimaryCCA->PriCCA_flag = 0; + CurMFstate = MF_USC_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); /* default*/ + pHalData->RTSEN = 0; + PrimaryCCA->DupRTS_flag = 0; + PrimaryCCA->intf_type = 0; + PrimaryCCA->intf_flag = 0; + } + + } + + } + else{ + + return; + } + } + +} + +#elif(DM_ODM_SUPPORT_TYPE == ODM_AP) + +VOID +odm_DynamicPrimaryCCAAP_8814A( + struct dm_struct *pDM_Odm + ) +{ + PADAPTER Adapter = pDM_Odm->Adapter; + prtl8192cd_priv priv = pDM_Odm->priv; + PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); + struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 i; + static u4Byte Count_Down = Monitor_TIME; + BOOLEAN STA_BW = FALSE, STA_BW_pre = FALSE, STA_BW_TMP = FALSE; + BOOLEAN bConnected = FALSE; + BOOLEAN Is40MHz = FALSE; + u8 SecCHOffset; + u8 CurMFstate; + PSTA_INFO_T pstat; + + Is40MHz = *(pDM_Odm->pBandWidth); + SecCHOffset = *(pDM_Odm->pSecChOffset); // AP: 1: sec is below, 2: sec is above + + + for(i=0; ipODM_StaInfo[i]; + if(IS_STA_VALID(pstat)){ + + STA_BW_TMP = pstat->tx_bw; + if(STA_BW_TMP > STA_BW){ + STA_BW = STA_BW_TMP; + } + bConnected = TRUE; + } + } + + if(Is40MHz){ + + if(PrimaryCCA->PriCCA_flag == 0){ + + if(bConnected){ + + if(STA_BW == 0){ //2 STA BW=20M + + PrimaryCCA->PriCCA_flag = 1; + if(SecCHOffset==1){ + CurMFstate = MF_USC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + } + else if(SecCHOffset==2){ + CurMFstate = MF_USC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + } + } + else{ //2 STA BW=40M + if(PrimaryCCA->intf_flag == 0){ + + odm_Intf_Detection(pDM_Odm); + } + else{ // intf_flag = 1 + + if(PrimaryCCA->intf_type == 1){ + + if(PrimaryCCA->CH_offset == 1){ + + CurMFstate = MF_USC; + if(SecCHOffset == 1){ // AP, 1: primary is above 2: primary is below + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + } + } + else if(PrimaryCCA->CH_offset == 2){ + + CurMFstate = MF_LSC; + if(SecCHOffset == 2){ + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + } + } + } + else if(PrimaryCCA->intf_type==2){ + + if(PrimaryCCA->CH_offset==1){ + + //ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, MF_USC); + pHalData->RTSEN = 1; + } + else if(PrimaryCCA->CH_offset==2){ + + //ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, MF_LSC); + pHalData->RTSEN = 1; + } + + } + } + } + + } + else{ // disconnected interference detection + + odm_Intf_Detection(pDM_Odm); + }// end of disconnected + + + } + else{ // PrimaryCCA->PriCCA_flag == 1 + + if(STA_BW==0){ + + STA_BW_pre = STA_BW; + return; + } + + Count_Down--; + if((Count_Down == 0) || ((STA_BW & STA_BW_pre) != 1)){ + + Count_Down = Monitor_TIME; + PrimaryCCA->PriCCA_flag = 0; + PrimaryCCA->intf_type = 0; + PrimaryCCA->intf_flag = 0; + CurMFstate = MF_USC_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); /* default*/ + pHalData->RTSEN = 0; + + } + + } + + STA_BW_pre = STA_BW; + + } + else{ + //2 Reset + odm_PrimaryCCA_Check_Init(pDM_Odm); + CurMFstate = MF_USC_LSC; + odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); + Count_Down = Monitor_TIME; + } + +} + + +VOID +odm_Intf_Detection_8814A( + struct dm_struct *pDM_Odm + ) +{ + PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); + struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); + + if((FalseAlmCnt->Cnt_OFDM_CCA>OFDMCCA_TH) + &&(FalseAlmCnt->Cnt_BW_LSC>(FalseAlmCnt->Cnt_BW_USC+BW_Ind_Bias))){ + + PrimaryCCA->intf_flag = 1; + PrimaryCCA->CH_offset = 1; // 1:LSC, 2:USC + if(FalseAlmCnt->Cnt_Ofdm_fail>(FalseAlmCnt->Cnt_OFDM_CCA>>1)){ + PrimaryCCA->intf_type = 1; + } + else{ + PrimaryCCA->intf_type = 2; + } + } + else if((FalseAlmCnt->Cnt_OFDM_CCA>OFDMCCA_TH) + &&(FalseAlmCnt->Cnt_BW_USC>(FalseAlmCnt->Cnt_BW_LSC+BW_Ind_Bias))){ + + PrimaryCCA->intf_flag = 1; + PrimaryCCA->CH_offset = 2; // 1:LSC, 2:USC + if(FalseAlmCnt->Cnt_Ofdm_fail>(FalseAlmCnt->Cnt_OFDM_CCA>>1)){ + PrimaryCCA->intf_type = 1; + } + else{ + PrimaryCCA->intf_type = 2; + } + } + else{ + PrimaryCCA->intf_flag = 0; + PrimaryCCA->intf_type = 0; + PrimaryCCA->CH_offset = 0; + } + +} + +#endif +#endif /* #ifdef PHYDM_PRIMARY_CCA */ + +u8 +phydm_spur_nbi_setting_8814a( + struct dm_struct *pDM_Odm + ) +{ + u8 set_result = 0; + + /*pDM_Odm->pChannel means central frequency, so we can use 20M as input*/ + if (pDM_Odm->rfe_type == 0 || pDM_Odm->rfe_type == 1 || pDM_Odm->rfe_type == 6) { + /*channel asked by RF Jeff*/ + if (*pDM_Odm->channel == 14) + set_result = phydm_nbi_setting(pDM_Odm, FUNC_ENABLE, *pDM_Odm->channel, 40, 2480, PHYDM_DONT_CARE); + else if (*pDM_Odm->channel >= 4 || *pDM_Odm->channel <= 8) + set_result = phydm_nbi_setting(pDM_Odm, FUNC_ENABLE, *pDM_Odm->channel, 40, 2440, PHYDM_DONT_CARE); + else + set_result = phydm_nbi_setting(pDM_Odm, FUNC_ENABLE, *pDM_Odm->channel, 40, 2440, PHYDM_DONT_CARE); + } + ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("%s, set_result = 0x%d, pChannel = %d\n", __func__, set_result, *pDM_Odm->channel)); + //printk("%s, set_result = 0x%d, pChannel = %d\n", __func__, set_result, *pDM_Odm->channel); + pDM_Odm->nbi_set_result = set_result; + return set_result; + +} + +void odm_hw_setting_8814a( + struct dm_struct *p_dm_odm + ) +{ +#ifdef PHYDM_PRIMARY_CCA + odm_PrimaryCCA_Check_Init_8814A(p_dm_odm); + odm_DynamicPrimaryCCA_Check_8814A(p_dm_odm); + odm_Intf_Detection_8814A(p_dm_odm); +#endif +} + + +#endif // RTL8814A_SUPPORT == 1 + + + + + + + + diff --git a/hal/phydm/rtl8814a/phydm_rtl8814a.h b/hal/phydm/rtl8814a/phydm_rtl8814a.h new file mode 100644 index 0000000..a7ff675 --- /dev/null +++ b/hal/phydm/rtl8814a/phydm_rtl8814a.h @@ -0,0 +1,78 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __ODM_RTL8814A_H__ +#define __ODM_RTL8814A_H__ + +#define OFDMCCA_TH 500 +#define BW_Ind_Bias 500 +#define MF_USC 2 +#define MF_LSC 1 +#define MF_USC_LSC 0 +#define Monitor_TIME 30 + +s8 phydm_cck_rssi_8814a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx); + +VOID +odm_Write_Dynamic_CCA_8814A( + struct dm_struct *pDM_Odm, + u8 CurrentMFstate + ); + +VOID +odm_PrimaryCCA_Check_Init_8814A( + struct dm_struct *pDM_Odm + ); + +VOID +odm_DynamicPrimaryCCA_Check_8814A( + struct dm_struct *pDM_Odm + ); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + +VOID +odm_DynamicPrimaryCCAMP_8814A( + struct dm_struct *pDM_Odm + ); + +#elif (DM_ODM_SUPPORT_TYPE == ODM_AP) + +VOID +odm_DynamicPrimaryCCAAP_8814A( + struct dm_struct *pDM_Odm + ); + +VOID +odm_Intf_Detection_8814A( + struct dm_struct *pDM_Odm + ); + +#endif + +u1Byte +phydm_spur_nbi_setting_8814a( + struct dm_struct *pDM_Odm +); + +void odm_hw_setting_8814a( + struct dm_struct *p_dm_odm + ); + +#endif diff --git a/hal/phydm/rtl8814a/version_rtl8814a.h b/hal/phydm/rtl8814a/version_rtl8814a.h new file mode 100644 index 0000000..e9c28bf --- /dev/null +++ b/hal/phydm/rtl8814a/version_rtl8814a.h @@ -0,0 +1,10 @@ +/*RTL8814A PHY Parameters*/ +/* +[Caution] + Since 01/Aug/2015, the commit rules will be simplified. + You do not need to fill up the version.h anymore, + only the maintenance supervisor fills it before formal release. +*/ +#define RELEASE_DATE_8814A 20150908 +#define COMMIT_BY_8814A "BB_LUKE" +#define RELEASE_VERSION_8814A 81 diff --git a/hal/phydm/rtl8821a/halhwimg8821a_bb.c b/hal/phydm/rtl8821a/halhwimg8821a_bb.c new file mode 100644 index 0000000..0dc7ab6 --- /dev/null +++ b/hal/phydm/rtl8821a/halhwimg8821a_bb.c @@ -0,0 +1,923 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.18*/ +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static boolean +check_positive( + struct dm_struct *dm, + const u32 condition1, + const u32 condition2, + const u32 condition3, + const u32 condition4 +) +{ + u8 _board_type = ((dm->board_type & BIT(4)) >> 4) << 0 | /* _GLNA*/ + ((dm->board_type & BIT(3)) >> 3) << 1 | /* _GPA*/ + ((dm->board_type & BIT(7)) >> 7) << 2 | /* _ALNA*/ + ((dm->board_type & BIT(6)) >> 6) << 3 | /* _APA */ + ((dm->board_type & BIT(2)) >> 2) << 4; /* _BT*/ + + u32 cond1 = condition1, cond2 = condition2, cond3 = condition3, cond4 = condition4; + u32 driver1 = dm->cut_version << 24 | + (dm->support_interface & 0xF0) << 16 | + dm->support_platform << 16 | + dm->package_type << 12 | + (dm->support_interface & 0x0F) << 8 | + _board_type; + + u32 driver2 = (dm->type_glna & 0xFF) << 0 | + (dm->type_gpa & 0xFF) << 8 | + (dm->type_alna & 0xFF) << 16 | + (dm->type_apa & 0xFF) << 24; + + u32 driver3 = 0; + + u32 driver4 = (dm->type_glna & 0xFF00) >> 8 | + (dm->type_gpa & 0xFF00) | + (dm->type_alna & 0xFF00) << 8 | + (dm->type_apa & 0xFF00) << 16; + + PHYDM_DBG(dm, ODM_COMP_INIT, + "===> check_positive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); + PHYDM_DBG(dm, ODM_COMP_INIT, + "===> check_positive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); + + PHYDM_DBG(dm, ODM_COMP_INIT, + " (Platform, Interface) = (0x%X, 0x%X)\n", dm->support_platform, dm->support_interface); + PHYDM_DBG(dm, ODM_COMP_INIT, + " (Board, Package) = (0x%X, 0x%X)\n", dm->board_type, dm->package_type); + + + /*============== value Defined Check ===============*/ + /*QFN type [15:12] and cut version [27:24] need to do value check*/ + + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + return false; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return false; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u32 bit_mask = 0; + + if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/ + return true; + + if ((cond1 & BIT(0)) != 0) /*GLNA*/ + bit_mask |= 0x000000FF; + if ((cond1 & BIT(1)) != 0) /*GPA*/ + bit_mask |= 0x0000FF00; + if ((cond1 & BIT(2)) != 0) /*ALNA*/ + bit_mask |= 0x00FF0000; + if ((cond1 & BIT(3)) != 0) /*APA*/ + bit_mask |= 0xFF000000; + + if (((cond2 & bit_mask) == (driver2 & bit_mask)) && ((cond4 & bit_mask) == (driver4 & bit_mask))) /* board_type of each RF path is matched*/ + return true; + else + return false; + } else + return false; +} +static boolean +check_negative( + struct dm_struct *dm, + const u32 condition1, + const u32 condition2 +) +{ + return true; +} + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +u32 array_mp_8821a_agc_tab[] = { + 0x81C, 0xBF000001, + 0x81C, 0xBF020001, + 0x81C, 0xBF040001, + 0x81C, 0xBF060001, + 0x81C, 0xBE080001, + 0x81C, 0xBD0A0001, + 0x81C, 0xBC0C0001, + 0x81C, 0xBA0E0001, + 0x81C, 0xB9100001, + 0x81C, 0xB8120001, + 0x81C, 0xB7140001, + 0x81C, 0xB6160001, + 0x81C, 0xB5180001, + 0x81C, 0xB41A0001, + 0x81C, 0xB31C0001, + 0x81C, 0xB21E0001, + 0x81C, 0xB1200001, + 0x81C, 0xB0220001, + 0x81C, 0xAF240001, + 0x81C, 0xAE260001, + 0x81C, 0xAD280001, + 0x81C, 0xAC2A0001, + 0x81C, 0xAB2C0001, + 0x81C, 0xAA2E0001, + 0x81C, 0xA9300001, + 0x81C, 0xA8320001, + 0x81C, 0xA7340001, + 0x81C, 0xA6360001, + 0x81C, 0xA5380001, + 0x81C, 0xA43A0001, + 0x81C, 0x683C0001, + 0x81C, 0x673E0001, + 0x81C, 0x66400001, + 0x81C, 0x65420001, + 0x81C, 0x64440001, + 0x81C, 0x63460001, + 0x81C, 0x62480001, + 0x81C, 0x614A0001, + 0x81C, 0x474C0001, + 0x81C, 0x464E0001, + 0x81C, 0x45500001, + 0x81C, 0x44520001, + 0x81C, 0x43540001, + 0x81C, 0x42560001, + 0x81C, 0x41580001, + 0x81C, 0x285A0001, + 0x81C, 0x275C0001, + 0x81C, 0x265E0001, + 0x81C, 0x25600001, + 0x81C, 0x24620001, + 0x81C, 0x0A640001, + 0x81C, 0x09660001, + 0x81C, 0x08680001, + 0x81C, 0x076A0001, + 0x81C, 0x066C0001, + 0x81C, 0x056E0001, + 0x81C, 0x04700001, + 0x81C, 0x03720001, + 0x81C, 0x02740001, + 0x81C, 0x01760001, + 0x81C, 0x01780001, + 0x81C, 0x017A0001, + 0x81C, 0x017C0001, + 0x81C, 0x017E0001, + 0x8000020c, 0x00000000, 0x40000000, 0x00000000, + 0x81C, 0xFB000101, + 0x81C, 0xFA020101, + 0x81C, 0xF9040101, + 0x81C, 0xF8060101, + 0x81C, 0xF7080101, + 0x81C, 0xF60A0101, + 0x81C, 0xF50C0101, + 0x81C, 0xF40E0101, + 0x81C, 0xF3100101, + 0x81C, 0xF2120101, + 0x81C, 0xF1140101, + 0x81C, 0xF0160101, + 0x81C, 0xEF180101, + 0x81C, 0xEE1A0101, + 0x81C, 0xED1C0101, + 0x81C, 0xEC1E0101, + 0x81C, 0xEB200101, + 0x81C, 0xEA220101, + 0x81C, 0xE9240101, + 0x81C, 0xE8260101, + 0x81C, 0xE7280101, + 0x81C, 0xE62A0101, + 0x81C, 0xE52C0101, + 0x81C, 0xE42E0101, + 0x81C, 0xE3300101, + 0x81C, 0xA5320101, + 0x81C, 0xA4340101, + 0x81C, 0xA3360101, + 0x81C, 0x87380101, + 0x81C, 0x863A0101, + 0x81C, 0x853C0101, + 0x81C, 0x843E0101, + 0x81C, 0x69400101, + 0x81C, 0x68420101, + 0x81C, 0x67440101, + 0x81C, 0x66460101, + 0x81C, 0x49480101, + 0x81C, 0x484A0101, + 0x81C, 0x474C0101, + 0x81C, 0x2A4E0101, + 0x81C, 0x29500101, + 0x81C, 0x28520101, + 0x81C, 0x27540101, + 0x81C, 0x26560101, + 0x81C, 0x25580101, + 0x81C, 0x245A0101, + 0x81C, 0x235C0101, + 0x81C, 0x055E0101, + 0x81C, 0x04600101, + 0x81C, 0x03620101, + 0x81C, 0x02640101, + 0x81C, 0x01660101, + 0x81C, 0x01680101, + 0x81C, 0x016A0101, + 0x81C, 0x016C0101, + 0x81C, 0x016E0101, + 0x81C, 0x01700101, + 0x81C, 0x01720101, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x81C, 0xFB000101, + 0x81C, 0xFA020101, + 0x81C, 0xF9040101, + 0x81C, 0xF8060101, + 0x81C, 0xF7080101, + 0x81C, 0xF60A0101, + 0x81C, 0xF50C0101, + 0x81C, 0xF40E0101, + 0x81C, 0xF3100101, + 0x81C, 0xF2120101, + 0x81C, 0xF1140101, + 0x81C, 0xF0160101, + 0x81C, 0xEF180101, + 0x81C, 0xEE1A0101, + 0x81C, 0xED1C0101, + 0x81C, 0xEC1E0101, + 0x81C, 0xEB200101, + 0x81C, 0xEA220101, + 0x81C, 0xE9240101, + 0x81C, 0xE8260101, + 0x81C, 0xE7280101, + 0x81C, 0xE62A0101, + 0x81C, 0xE52C0101, + 0x81C, 0xE42E0101, + 0x81C, 0xE3300101, + 0x81C, 0xA5320101, + 0x81C, 0xA4340101, + 0x81C, 0xA3360101, + 0x81C, 0x87380101, + 0x81C, 0x863A0101, + 0x81C, 0x853C0101, + 0x81C, 0x843E0101, + 0x81C, 0x69400101, + 0x81C, 0x68420101, + 0x81C, 0x67440101, + 0x81C, 0x66460101, + 0x81C, 0x49480101, + 0x81C, 0x484A0101, + 0x81C, 0x474C0101, + 0x81C, 0x2A4E0101, + 0x81C, 0x29500101, + 0x81C, 0x28520101, + 0x81C, 0x27540101, + 0x81C, 0x26560101, + 0x81C, 0x25580101, + 0x81C, 0x245A0101, + 0x81C, 0x235C0101, + 0x81C, 0x055E0101, + 0x81C, 0x04600101, + 0x81C, 0x03620101, + 0x81C, 0x02640101, + 0x81C, 0x01660101, + 0x81C, 0x01680101, + 0x81C, 0x016A0101, + 0x81C, 0x016C0101, + 0x81C, 0x016E0101, + 0x81C, 0x01700101, + 0x81C, 0x01720101, + 0xA0000000, 0x00000000, + 0x81C, 0xFF000101, + 0x81C, 0xFF020101, + 0x81C, 0xFE040101, + 0x81C, 0xFD060101, + 0x81C, 0xFC080101, + 0x81C, 0xFD0A0101, + 0x81C, 0xFC0C0101, + 0x81C, 0xFB0E0101, + 0x81C, 0xFA100101, + 0x81C, 0xF9120101, + 0x81C, 0xF8140101, + 0x81C, 0xF7160101, + 0x81C, 0xF6180101, + 0x81C, 0xF51A0101, + 0x81C, 0xF41C0101, + 0x81C, 0xF31E0101, + 0x81C, 0xF2200101, + 0x81C, 0xF1220101, + 0x81C, 0xF0240101, + 0x81C, 0xEF260101, + 0x81C, 0xEE280101, + 0x81C, 0xED2A0101, + 0x81C, 0xEC2C0101, + 0x81C, 0xEB2E0101, + 0x81C, 0xEA300101, + 0x81C, 0xE9320101, + 0x81C, 0xE8340101, + 0x81C, 0xE7360101, + 0x81C, 0xE6380101, + 0x81C, 0xE53A0101, + 0x81C, 0xE43C0101, + 0x81C, 0xE33E0101, + 0x81C, 0xA5400101, + 0x81C, 0xA4420101, + 0x81C, 0xA3440101, + 0x81C, 0x87460101, + 0x81C, 0x86480101, + 0x81C, 0x854A0101, + 0x81C, 0x844C0101, + 0x81C, 0x694E0101, + 0x81C, 0x68500101, + 0x81C, 0x67520101, + 0x81C, 0x66540101, + 0x81C, 0x49560101, + 0x81C, 0x48580101, + 0x81C, 0x475A0101, + 0x81C, 0x2A5C0101, + 0x81C, 0x295E0101, + 0x81C, 0x28600101, + 0x81C, 0x27620101, + 0x81C, 0x26640101, + 0x81C, 0x25660101, + 0x81C, 0x24680101, + 0x81C, 0x236A0101, + 0x81C, 0x056C0101, + 0x81C, 0x046E0101, + 0x81C, 0x03700101, + 0x81C, 0x02720101, + 0xB0000000, 0x00000000, + 0x81C, 0x01740101, + 0x81C, 0x01760101, + 0x81C, 0x01780101, + 0x81C, 0x017A0101, + 0x81C, 0x017C0101, + 0x81C, 0x017E0101, + 0xC50, 0x00000022, + 0xC50, 0x00000020, + +}; + +void +odm_read_and_config_mp_8821a_agc_tab( + struct dm_struct *dm +) +{ + u32 i = 0; + u8 c_cond; + boolean is_matched = true, is_skipped = false; + u32 array_len = sizeof(array_mp_8821a_agc_tab) / sizeof(u32); + u32 *array = array_mp_8821a_agc_tab; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_agc_tab\n"); + + while ((i + 1) < array_len) { + v1 = array[i]; + v2 = array[i + 1]; + + if (v1 & (BIT(31) | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT(31)) {/* positive condition*/ + c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28); + if (c_cond == COND_ENDIF) {/*end*/ + is_matched = true; + is_skipped = false; + PHYDM_DBG(dm, ODM_COMP_INIT, "ENDIF\n"); + } else if (c_cond == COND_ELSE) { /*else*/ + is_matched = is_skipped ? false : true; + PHYDM_DBG(dm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(dm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT(30)) { /*negative condition*/ + if (is_skipped == false) { + if (check_positive(dm, pre_v1, pre_v2, v1, v2)) { + is_matched = true; + is_skipped = true; + } else { + is_matched = false; + is_skipped = false; + } + } else + is_matched = false; + } + } else { + if (is_matched) + odm_config_bb_agc_8821a(dm, v1, MASKDWORD, v2); + } + i = i + 2; + } +} + +u32 +odm_get_version_mp_8821a_agc_tab(void) +{ + return 59; +} + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +u32 array_mp_8821a_phy_reg[] = { + 0x800, 0x0020D090, + 0x804, 0x080112E0, + 0x808, 0x0E028211, + 0x80C, 0x92131111, + 0x810, 0x20101261, + 0x814, 0x020C3D10, + 0x818, 0x03A00385, + 0x820, 0x00000000, + 0x824, 0x00030FE0, + 0x828, 0x00000000, + 0x82C, 0x002081DD, + 0x830, 0x2AAAEEC8, + 0x834, 0x0037A706, + 0x838, 0x06489B44, + 0x83C, 0x0000095B, + 0x840, 0xC0000001, + 0x844, 0x40003CDE, + 0x848, 0x62103F8B, + 0x84C, 0x6CFDFFB8, + 0x850, 0x28874706, + 0x854, 0x0001520C, + 0x858, 0x8060E000, + 0x85C, 0x74210168, + 0x860, 0x6929C321, + 0x864, 0x79727432, + 0x868, 0x8CA7A314, + 0x86C, 0x888C2878, + 0x870, 0x08888888, + 0x874, 0x31612C2E, + 0x878, 0x00000152, + 0x87C, 0x000FD000, + 0x8A0, 0x00000013, + 0x8A4, 0x7F7F7F7F, + 0x8A8, 0xA2000338, + 0x8AC, 0x0FF0FA0A, + 0x8B4, 0x000FC080, + 0x8B8, 0x6C10D7FF, + 0x8BC, 0x0CA52090, + 0x8C0, 0x1BF00020, + 0x8C4, 0x00000000, + 0x8C8, 0x00013169, + 0x8CC, 0x08248492, + 0x8D4, 0x940008A0, + 0x8D8, 0x290B5612, + 0x8F8, 0x400002C0, + 0x8FC, 0x00000000, + 0x900, 0x00000700, + 0x90C, 0x00000000, + 0x910, 0x0000FC00, + 0x914, 0x00000404, + 0x918, 0x1C1028C0, + 0x91C, 0x64B11A1C, + 0x920, 0xE0767233, + 0x924, 0x055AA500, + 0x928, 0x00000004, + 0x92C, 0xFFFE0000, + 0x930, 0xFFFFFFFE, + 0x934, 0x001FFFFF, + 0x960, 0x00000000, + 0x964, 0x00000000, + 0x968, 0x00000000, + 0x96C, 0x00000000, + 0x970, 0x801FFFFF, + 0x974, 0x000003FF, + 0x978, 0x00000000, + 0x97C, 0x00000000, + 0x980, 0x00000000, + 0x984, 0x00000000, + 0x988, 0x00000000, + 0x990, 0x27100000, + 0x994, 0xFFFF0100, + 0x998, 0xFFFFFF5C, + 0x99C, 0xFFFFFFFF, + 0x9A0, 0x000000FF, + 0x9A4, 0x00480080, + 0x9A8, 0x00000000, + 0x9AC, 0x00000000, + 0x9B0, 0x81081008, + 0x9B4, 0x01081008, + 0x9B8, 0x01081008, + 0x9BC, 0x01081008, + 0x9D0, 0x00000000, + 0x9D4, 0x00000000, + 0x9D8, 0x00000000, + 0x9DC, 0x00000000, + 0x9E0, 0x00005D00, + 0x9E4, 0x00000003, + 0x9E8, 0x00000001, + 0xA00, 0x00D047C8, + 0xA04, 0x01FF800C, + 0xA08, 0x8C8A8300, + 0xA0C, 0x2E68000F, + 0xA10, 0x9500BB78, + 0xA14, 0x11144028, + 0xA18, 0x00881117, + 0xA1C, 0x89140F00, + 0xA20, 0x1A1B0000, + 0xA24, 0x090E1317, + 0xA28, 0x00000204, + 0xA2C, 0x00900000, + 0xA70, 0x101FFF00, + 0xA74, 0x00000008, + 0xA78, 0x00000900, + 0xA7C, 0x225B0606, + 0xA80, 0x21805490, + 0xA84, 0x001F0000, + 0xB00, 0x03100040, + 0xB04, 0x0000B000, + 0xB08, 0xAE0201EB, + 0xB0C, 0x01003207, + 0xB10, 0x00009807, + 0xB14, 0x01000000, + 0xB18, 0x00000002, + 0xB1C, 0x00000002, + 0xB20, 0x0000001F, + 0xB24, 0x03020100, + 0xB28, 0x07060504, + 0xB2C, 0x0B0A0908, + 0xB30, 0x0F0E0D0C, + 0xB34, 0x13121110, + 0xB38, 0x17161514, + 0xB3C, 0x0000003A, + 0xB40, 0x00000000, + 0xB44, 0x00000000, + 0xB48, 0x13000032, + 0xB4C, 0x48080000, + 0xB50, 0x00000000, + 0xB54, 0x00000000, + 0xB58, 0x00000000, + 0xB5C, 0x00000000, + 0xC00, 0x00000007, + 0xC04, 0x00042020, + 0xC08, 0x80410231, + 0xC0C, 0x00000000, + 0xC10, 0x00000100, + 0xC14, 0x01000000, + 0xC1C, 0x40000003, + 0xC20, 0x2C2C2C2C, + 0xC24, 0x30303030, + 0xC28, 0x30303030, + 0xC2C, 0x2C2C2C2C, + 0xC30, 0x2C2C2C2C, + 0xC34, 0x2C2C2C2C, + 0xC38, 0x2C2C2C2C, + 0xC3C, 0x2A2A2A2A, + 0xC40, 0x2A2A2A2A, + 0xC44, 0x2A2A2A2A, + 0xC48, 0x2A2A2A2A, + 0xC4C, 0x2A2A2A2A, + 0xC50, 0x00000020, + 0xC54, 0x001C1208, + 0xC58, 0x30000C1C, + 0xC5C, 0x00000058, + 0xC60, 0x34344443, + 0xC64, 0x07003333, + 0xC68, 0x19791979, + 0xC6C, 0x19791979, + 0xC70, 0x19791979, + 0xC74, 0x19791979, + 0xC78, 0x19791979, + 0xC7C, 0x19791979, + 0xC80, 0x19791979, + 0xC84, 0x19791979, + 0xC94, 0x0100005C, + 0xC98, 0x00000000, + 0xC9C, 0x00000000, + 0xCA0, 0x00000029, + 0xCA4, 0x08040201, + 0xCA8, 0x80402010, + 0xCB0, 0x77775747, + 0xCB4, 0x10000077, + 0xCB8, 0x00508240, + +}; + +void +odm_read_and_config_mp_8821a_phy_reg( + struct dm_struct *dm +) +{ + u32 i = 0; + u8 c_cond; + boolean is_matched = true, is_skipped = false; + u32 array_len = sizeof(array_mp_8821a_phy_reg) / sizeof(u32); + u32 *array = array_mp_8821a_phy_reg; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_phy_reg\n"); + + while ((i + 1) < array_len) { + v1 = array[i]; + v2 = array[i + 1]; + + if (v1 & (BIT(31) | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT(31)) {/* positive condition*/ + c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28); + if (c_cond == COND_ENDIF) {/*end*/ + is_matched = true; + is_skipped = false; + PHYDM_DBG(dm, ODM_COMP_INIT, "ENDIF\n"); + } else if (c_cond == COND_ELSE) { /*else*/ + is_matched = is_skipped ? false : true; + PHYDM_DBG(dm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(dm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT(30)) { /*negative condition*/ + if (is_skipped == false) { + if (check_positive(dm, pre_v1, pre_v2, v1, v2)) { + is_matched = true; + is_skipped = true; + } else { + is_matched = false; + is_skipped = false; + } + } else + is_matched = false; + } + } else { + if (is_matched) + odm_config_bb_phy_8821a(dm, v1, MASKDWORD, v2); + } + i = i + 2; + } +} + +u32 +odm_get_version_mp_8821a_phy_reg(void) +{ + return 59; +} + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +u32 array_mp_8821a_phy_reg_pg[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x32343638, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x36363838, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x28303234, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34363838, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x26283032, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x24262830, + 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343636, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x26283032, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x32343636, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x24262830, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x24262830, + 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022 +}; + +void +odm_read_and_config_mp_8821a_phy_reg_pg( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_phy_reg_pg) / sizeof(u32); + u32 *array = array_mp_8821a_phy_reg_pg; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrByRate = array_len / 6; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_phy_reg_pg\n"); + + dm->phy_reg_pg_version = 1; + dm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < array_len; i += 6) { + u32 v1 = array[i]; + u32 v2 = array[i + 1]; + u32 v3 = array[i + 2]; + u32 v4 = array[i + 3]; + u32 v5 = array[i + 4]; + u32 v6 = array[i + 5]; + + odm_config_bb_phy_reg_pg_8821a(dm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrByRate[i / 6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0 ? "2.4G" : " 5G"), (v2 == 0 ? "A" : "B"), (v3 == 0 ? "1Tx" : "2Tx"), v4, v5, v6); +#endif + } +} + + + +/****************************************************************************** +* PHY_REG_PG_DNI_JP.TXT +******************************************************************************/ + +u32 array_mp_8821a_phy_reg_pg_dni_jp[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002424, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x23232323, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x23232323, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x23232323, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x23232323, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x23232323, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x23232323, + 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00002020 +}; + +void +odm_read_and_config_mp_8821a_phy_reg_pg_dni_jp( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_phy_reg_pg_dni_jp) / sizeof(u32); + u32 *array = array_mp_8821a_phy_reg_pg_dni_jp; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrByRate = array_len / 6; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_phy_reg_pg_dni_jp\n"); + + dm->phy_reg_pg_version = 1; + dm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < array_len; i += 6) { + u32 v1 = array[i]; + u32 v2 = array[i + 1]; + u32 v3 = array[i + 2]; + u32 v4 = array[i + 3]; + u32 v5 = array[i + 4]; + u32 v6 = array[i + 5]; + + odm_config_bb_phy_reg_pg_8821a(dm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrByRate[i / 6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0 ? "2.4G" : " 5G"), (v2 == 0 ? "A" : "B"), (v3 == 0 ? "1Tx" : "2Tx"), v4, v5, v6); +#endif + } +} + + + +/****************************************************************************** +* PHY_REG_PG_DNI_US.TXT +******************************************************************************/ + +u32 array_mp_8821a_phy_reg_pg_dni_us[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002424, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00002020 +}; + +void +odm_read_and_config_mp_8821a_phy_reg_pg_dni_us( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_phy_reg_pg_dni_us) / sizeof(u32); + u32 *array = array_mp_8821a_phy_reg_pg_dni_us; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrByRate = array_len / 6; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_phy_reg_pg_dni_us\n"); + + dm->phy_reg_pg_version = 1; + dm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < array_len; i += 6) { + u32 v1 = array[i]; + u32 v2 = array[i + 1]; + u32 v3 = array[i + 2]; + u32 v4 = array[i + 3]; + u32 v5 = array[i + 4]; + u32 v6 = array[i + 5]; + + odm_config_bb_phy_reg_pg_8821a(dm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrByRate[i / 6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0 ? "2.4G" : " 5G"), (v2 == 0 ? "A" : "B"), (v3 == 0 ? "1Tx" : "2Tx"), v4, v5, v6); +#endif + } +} + + + +/****************************************************************************** +* PHY_REG_PG_E202SA.TXT +******************************************************************************/ + +u32 array_mp_8821a_phy_reg_pg_e202sa[] = { + 0, 0, 0, 0x00000c20, 0xffffffff, 0x32323232, + 0, 0, 0, 0x00000c24, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c28, 0xffffffff, 0x28282828, + 0, 0, 0, 0x00000c2c, 0xffffffff, 0x22222222, + 0, 0, 0, 0x00000c30, 0xffffffff, 0x22222222, + 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636, + 0, 0, 0, 0x00000c40, 0xffffffff, 0x24262830, + 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022, + 1, 0, 0, 0x00000c24, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c28, 0xffffffff, 0x26262626, + 1, 0, 0, 0x00000c2c, 0xffffffff, 0x20202020, + 1, 0, 0, 0x00000c30, 0xffffffff, 0x20202020, + 1, 0, 0, 0x00000c3c, 0xffffffff, 0x16161616, + 1, 0, 0, 0x00000c40, 0xffffffff, 0x16161616, + 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00001616 +}; + +void +odm_read_and_config_mp_8821a_phy_reg_pg_e202_sa( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_phy_reg_pg_e202sa) / sizeof(u32); + u32 *array = array_mp_8821a_phy_reg_pg_e202sa; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrByRate = array_len / 6; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_phy_reg_pg_e202_sa\n"); + + dm->phy_reg_pg_version = 1; + dm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; + + for (i = 0; i < array_len; i += 6) { + u32 v1 = array[i]; + u32 v2 = array[i + 1]; + u32 v3 = array[i + 2]; + u32 v4 = array[i + 3]; + u32 v5 = array[i + 4]; + u32 v6 = array[i + 5]; + + odm_config_bb_phy_reg_pg_8821a(dm, v1, v2, v3, v4, v5, v6); + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrByRate[i / 6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", + (v1 == 0 ? "2.4G" : " 5G"), (v2 == 0 ? "A" : "B"), (v3 == 0 ? "1Tx" : "2Tx"), v4, v5, v6); +#endif + } +} + + + +#endif /* end of HWIMG_SUPPORT*/ diff --git a/hal/phydm/rtl8821a/halhwimg8821a_bb.h b/hal/phydm/rtl8821a/halhwimg8821a_bb.h new file mode 100644 index 0000000..791b7d1 --- /dev/null +++ b/hal/phydm/rtl8821a/halhwimg8821a_bb.h @@ -0,0 +1,83 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.18*/ +#if (RTL8821A_SUPPORT == 1) +#ifndef __INC_MP_BB_HW_IMG_8821A_H +#define __INC_MP_BB_HW_IMG_8821A_H + + +/****************************************************************************** +* AGC_TAB.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_agc_tab(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_agc_tab(void); + +/****************************************************************************** +* PHY_REG.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_phy_reg(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_phy_reg(void); + +/****************************************************************************** +* PHY_REG_PG.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_phy_reg_pg(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_phy_reg_pg(void); + +/****************************************************************************** +* PHY_REG_PG_DNI_JP.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_phy_reg_pg_dni_jp(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_phy_reg_pg_dni_jp(void); + +/****************************************************************************** +* PHY_REG_PG_DNI_US.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_phy_reg_pg_dni_us(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_phy_reg_pg_dni_us(void); + +/****************************************************************************** +* PHY_REG_PG_E202SA.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_phy_reg_pg_e202_sa(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_phy_reg_pg_e202sa(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ diff --git a/hal/phydm/rtl8821a/halhwimg8821a_mac.c b/hal/phydm/rtl8821a/halhwimg8821a_mac.c new file mode 100644 index 0000000..b93be49 --- /dev/null +++ b/hal/phydm/rtl8821a/halhwimg8821a_mac.c @@ -0,0 +1,279 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.18*/ +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static boolean +check_positive( + struct dm_struct *dm, + const u32 condition1, + const u32 condition2, + const u32 condition3, + const u32 condition4 +) +{ + u8 _board_type = ((dm->board_type & BIT(4)) >> 4) << 0 | /* _GLNA*/ + ((dm->board_type & BIT(3)) >> 3) << 1 | /* _GPA*/ + ((dm->board_type & BIT(7)) >> 7) << 2 | /* _ALNA*/ + ((dm->board_type & BIT(6)) >> 6) << 3 | /* _APA */ + ((dm->board_type & BIT(2)) >> 2) << 4; /* _BT*/ + + u32 cond1 = condition1, cond2 = condition2, cond3 = condition3, cond4 = condition4; + u32 driver1 = dm->cut_version << 24 | + (dm->support_interface & 0xF0) << 16 | + dm->support_platform << 16 | + dm->package_type << 12 | + (dm->support_interface & 0x0F) << 8 | + _board_type; + + u32 driver2 = (dm->type_glna & 0xFF) << 0 | + (dm->type_gpa & 0xFF) << 8 | + (dm->type_alna & 0xFF) << 16 | + (dm->type_apa & 0xFF) << 24; + + u32 driver3 = 0; + + u32 driver4 = (dm->type_glna & 0xFF00) >> 8 | + (dm->type_gpa & 0xFF00) | + (dm->type_alna & 0xFF00) << 8 | + (dm->type_apa & 0xFF00) << 16; + + PHYDM_DBG(dm, ODM_COMP_INIT, + "===> check_positive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); + PHYDM_DBG(dm, ODM_COMP_INIT, + "===> check_positive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); + + PHYDM_DBG(dm, ODM_COMP_INIT, + " (Platform, Interface) = (0x%X, 0x%X)\n", dm->support_platform, dm->support_interface); + PHYDM_DBG(dm, ODM_COMP_INIT, + " (Board, Package) = (0x%X, 0x%X)\n", dm->board_type, dm->package_type); + + + /*============== value Defined Check ===============*/ + /*QFN type [15:12] and cut version [27:24] need to do value check*/ + + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + return false; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return false; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u32 bit_mask = 0; + + if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/ + return true; + + if ((cond1 & BIT(0)) != 0) /*GLNA*/ + bit_mask |= 0x000000FF; + if ((cond1 & BIT(1)) != 0) /*GPA*/ + bit_mask |= 0x0000FF00; + if ((cond1 & BIT(2)) != 0) /*ALNA*/ + bit_mask |= 0x00FF0000; + if ((cond1 & BIT(3)) != 0) /*APA*/ + bit_mask |= 0xFF000000; + + if (((cond2 & bit_mask) == (driver2 & bit_mask)) && ((cond4 & bit_mask) == (driver4 & bit_mask))) /* board_type of each RF path is matched*/ + return true; + else + return false; + } else + return false; +} +static boolean +check_negative( + struct dm_struct *dm, + const u32 condition1, + const u32 condition2 +) +{ + return true; +} + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +u32 array_mp_8821a_mac_reg[] = { + 0x421, 0x0000000F, + 0x428, 0x0000000A, + 0x429, 0x00000010, + 0x430, 0x00000000, + 0x431, 0x00000000, + 0x432, 0x00000000, + 0x433, 0x00000001, + 0x434, 0x00000004, + 0x435, 0x00000005, + 0x436, 0x00000007, + 0x437, 0x00000008, + 0x43C, 0x00000004, + 0x43D, 0x00000005, + 0x43E, 0x00000007, + 0x43F, 0x00000008, + 0x440, 0x0000005D, + 0x441, 0x00000001, + 0x442, 0x00000000, + 0x444, 0x00000010, + 0x445, 0x00000000, + 0x446, 0x00000000, + 0x447, 0x00000000, + 0x448, 0x00000000, + 0x449, 0x000000F0, + 0x44A, 0x0000000F, + 0x44B, 0x0000003E, + 0x44C, 0x00000010, + 0x44D, 0x00000000, + 0x44E, 0x00000000, + 0x44F, 0x00000000, + 0x450, 0x00000000, + 0x451, 0x000000F0, + 0x452, 0x0000000F, + 0x453, 0x00000000, + 0x456, 0x0000005E, + 0x460, 0x00000066, + 0x461, 0x00000066, + 0x4C8, 0x0000003F, + 0x4C9, 0x000000FF, + 0x4CC, 0x000000FF, + 0x4CD, 0x000000FF, + 0x4CE, 0x00000001, + 0x500, 0x00000026, + 0x501, 0x000000A2, + 0x502, 0x0000002F, + 0x503, 0x00000000, + 0x504, 0x00000028, + 0x505, 0x000000A3, + 0x506, 0x0000005E, + 0x507, 0x00000000, + 0x508, 0x0000002B, + 0x509, 0x000000A4, + 0x50A, 0x0000005E, + 0x50B, 0x00000000, + 0x50C, 0x0000004F, + 0x50D, 0x000000A4, + 0x50E, 0x00000000, + 0x50F, 0x00000000, + 0x512, 0x0000001C, + 0x514, 0x0000000A, + 0x516, 0x0000000A, + 0x525, 0x0000004F, + 0x550, 0x00000010, + 0x551, 0x00000010, + 0x559, 0x00000002, + 0x55C, 0x00000050, + 0x55D, 0x000000FF, + 0x605, 0x00000030, + 0x607, 0x00000007, + 0x608, 0x0000000E, + 0x609, 0x0000002A, + 0x620, 0x000000FF, + 0x621, 0x000000FF, + 0x622, 0x000000FF, + 0x623, 0x000000FF, + 0x624, 0x000000FF, + 0x625, 0x000000FF, + 0x626, 0x000000FF, + 0x627, 0x000000FF, + 0x638, 0x00000050, + 0x63C, 0x0000000A, + 0x63D, 0x0000000A, + 0x63E, 0x0000000E, + 0x63F, 0x0000000E, + 0x640, 0x00000040, + 0x642, 0x00000040, + 0x643, 0x00000000, + 0x652, 0x000000C8, + 0x66E, 0x00000005, + 0x700, 0x00000021, + 0x701, 0x00000043, + 0x702, 0x00000065, + 0x703, 0x00000087, + 0x708, 0x00000021, + 0x709, 0x00000043, + 0x70A, 0x00000065, + 0x70B, 0x00000087, + 0x718, 0x00000040, + +}; + +void +odm_read_and_config_mp_8821a_mac_reg( + struct dm_struct *dm +) +{ + u32 i = 0; + u8 c_cond; + boolean is_matched = true, is_skipped = false; + u32 array_len = sizeof(array_mp_8821a_mac_reg) / sizeof(u32); + u32 *array = array_mp_8821a_mac_reg; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_mac_reg\n"); + + while ((i + 1) < array_len) { + v1 = array[i]; + v2 = array[i + 1]; + + if (v1 & (BIT(31) | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT(31)) {/* positive condition*/ + c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28); + if (c_cond == COND_ENDIF) {/*end*/ + is_matched = true; + is_skipped = false; + PHYDM_DBG(dm, ODM_COMP_INIT, "ENDIF\n"); + } else if (c_cond == COND_ELSE) { /*else*/ + is_matched = is_skipped ? false : true; + PHYDM_DBG(dm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(dm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT(30)) { /*negative condition*/ + if (is_skipped == false) { + if (check_positive(dm, pre_v1, pre_v2, v1, v2)) { + is_matched = true; + is_skipped = true; + } else { + is_matched = false; + is_skipped = false; + } + } else + is_matched = false; + } + } else { + if (is_matched) + odm_config_mac_8821a(dm, v1, (u8)v2); + } + i = i + 2; + } +} + +u32 +odm_get_version_mp_8821a_mac_reg(void) +{ + return 59; +} + +#endif /* end of HWIMG_SUPPORT*/ diff --git a/hal/phydm/rtl8821a/halhwimg8821a_mac.h b/hal/phydm/rtl8821a/halhwimg8821a_mac.h new file mode 100644 index 0000000..35665a4 --- /dev/null +++ b/hal/phydm/rtl8821a/halhwimg8821a_mac.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.18*/ +#if (RTL8821A_SUPPORT == 1) +#ifndef __INC_MP_MAC_HW_IMG_8821A_H +#define __INC_MP_MAC_HW_IMG_8821A_H + + +/****************************************************************************** +* MAC_REG.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_mac_reg(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_mac_reg(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ diff --git a/hal/phydm/rtl8821a/halhwimg8821a_rf.c b/hal/phydm/rtl8821a/halhwimg8821a_rf.c new file mode 100644 index 0000000..05b004b --- /dev/null +++ b/hal/phydm/rtl8821a/halhwimg8821a_rf.c @@ -0,0 +1,5457 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.18*/ +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +static boolean +check_positive( + struct dm_struct *dm, + const u32 condition1, + const u32 condition2, + const u32 condition3, + const u32 condition4 +) +{ + u8 _board_type = ((dm->board_type & BIT(4)) >> 4) << 0 | /* _GLNA*/ + ((dm->board_type & BIT(3)) >> 3) << 1 | /* _GPA*/ + ((dm->board_type & BIT(7)) >> 7) << 2 | /* _ALNA*/ + ((dm->board_type & BIT(6)) >> 6) << 3 | /* _APA */ + ((dm->board_type & BIT(2)) >> 2) << 4; /* _BT*/ + + u32 cond1 = condition1, cond2 = condition2, cond3 = condition3, cond4 = condition4; + u32 driver1 = dm->cut_version << 24 | + (dm->support_interface & 0xF0) << 16 | + dm->support_platform << 16 | + dm->package_type << 12 | + (dm->support_interface & 0x0F) << 8 | + _board_type; + + u32 driver2 = (dm->type_glna & 0xFF) << 0 | + (dm->type_gpa & 0xFF) << 8 | + (dm->type_alna & 0xFF) << 16 | + (dm->type_apa & 0xFF) << 24; + + u32 driver3 = 0; + + u32 driver4 = (dm->type_glna & 0xFF00) >> 8 | + (dm->type_gpa & 0xFF00) | + (dm->type_alna & 0xFF00) << 8 | + (dm->type_apa & 0xFF00) << 16; + + PHYDM_DBG(dm, ODM_COMP_INIT, + "===> check_positive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); + PHYDM_DBG(dm, ODM_COMP_INIT, + "===> check_positive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); + + PHYDM_DBG(dm, ODM_COMP_INIT, + " (Platform, Interface) = (0x%X, 0x%X)\n", dm->support_platform, dm->support_interface); + PHYDM_DBG(dm, ODM_COMP_INIT, + " (Board, Package) = (0x%X, 0x%X)\n", dm->board_type, dm->package_type); + + + /*============== value Defined Check ===============*/ + /*QFN type [15:12] and cut version [27:24] need to do value check*/ + + if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) + return false; + if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) + return false; + + /*=============== Bit Defined Check ================*/ + /* We don't care [31:28] */ + + cond1 &= 0x00FF0FFF; + driver1 &= 0x00FF0FFF; + + if ((cond1 & driver1) == cond1) { + u32 bit_mask = 0; + + if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/ + return true; + + if ((cond1 & BIT(0)) != 0) /*GLNA*/ + bit_mask |= 0x000000FF; + if ((cond1 & BIT(1)) != 0) /*GPA*/ + bit_mask |= 0x0000FF00; + if ((cond1 & BIT(2)) != 0) /*ALNA*/ + bit_mask |= 0x00FF0000; + if ((cond1 & BIT(3)) != 0) /*APA*/ + bit_mask |= 0xFF000000; + + if (((cond2 & bit_mask) == (driver2 & bit_mask)) && ((cond4 & bit_mask) == (driver4 & bit_mask))) /* board_type of each RF path is matched*/ + return true; + else + return false; + } else + return false; +} +static boolean +check_negative( + struct dm_struct *dm, + const u32 condition1, + const u32 condition2 +) +{ + return true; +} + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +u32 array_mp_8821a_radioa[] = { + 0x018, 0x0001712A, + 0x056, 0x00051CF2, + 0x066, 0x00040000, + 0x000, 0x00010000, + 0x01E, 0x00080000, + 0x082, 0x00000830, + 0x083, 0x00021800, + 0x084, 0x00028000, + 0x085, 0x00048000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x086, 0x0009483A, + 0xA0000000, 0x00000000, + 0x086, 0x00094838, + 0xB0000000, 0x00000000, + 0x087, 0x00044980, + 0x088, 0x00048000, + 0x089, 0x0000D480, + 0x08A, 0x00042240, + 0x08B, 0x000F0380, + 0x08C, 0x00090000, + 0x08D, 0x00022852, + 0x08E, 0x00065540, + 0x08F, 0x00088001, + 0x0EF, 0x00020000, + 0x03E, 0x00000380, + 0x03F, 0x00090018, + 0x03E, 0x00020380, + 0x03F, 0x000A0018, + 0x03E, 0x00040308, + 0x03F, 0x000A0018, + 0x03E, 0x00060018, + 0x03F, 0x000A0018, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x089, 0x00000080, + 0x08B, 0x00080180, + 0x0EF, 0x00001000, + 0x03A, 0x00000244, + 0x03B, 0x00038027, + 0x03C, 0x00082000, + 0x03A, 0x00000244, + 0x03B, 0x00030113, + 0x03C, 0x00082000, + 0x03A, 0x0000014C, + 0x03B, 0x00028027, + 0x03C, 0x00082000, + 0x03A, 0x000000CC, + 0x03B, 0x00027027, + 0x03C, 0x00042000, + 0x03A, 0x0000014C, + 0x03B, 0x0001F913, + 0x03C, 0x00042000, + 0x03A, 0x0000010C, + 0x03B, 0x00017F10, + 0x03C, 0x00012000, + 0x03A, 0x000000D0, + 0x03B, 0x00008027, + 0x03C, 0x000CA000, + 0x03A, 0x00000244, + 0x03B, 0x00078027, + 0x03C, 0x00082000, + 0x03A, 0x00000244, + 0x03B, 0x00070113, + 0x03C, 0x00082000, + 0x03A, 0x0000014C, + 0x03B, 0x00068027, + 0x03C, 0x00082000, + 0x03A, 0x000000CC, + 0x03B, 0x00067027, + 0x03C, 0x00042000, + 0x03A, 0x0000014C, + 0x03B, 0x0005F913, + 0x03C, 0x00042000, + 0x03A, 0x0000010C, + 0x03B, 0x00057F10, + 0x03C, 0x00012000, + 0x03A, 0x000000D0, + 0x03B, 0x00048027, + 0x03C, 0x000CA000, + 0x03A, 0x00000244, + 0x03B, 0x000B8027, + 0x03C, 0x00082000, + 0x03A, 0x00000244, + 0x03B, 0x000B0113, + 0x03C, 0x00082000, + 0x03A, 0x0000014C, + 0x03B, 0x000A8027, + 0x03C, 0x00082000, + 0x03A, 0x000000CC, + 0x03B, 0x000A7027, + 0x03C, 0x00042000, + 0x03A, 0x0000014C, + 0x03B, 0x0009F913, + 0x03C, 0x00042000, + 0x03A, 0x0000010C, + 0x03B, 0x00097F10, + 0x03C, 0x00012000, + 0x03A, 0x000000D0, + 0x03B, 0x00088027, + 0x03C, 0x000CA000, + 0x0EF, 0x00000000, + 0x0EF, 0x00001100, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004ADF3, + 0x034, 0x00049DF0, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004ADF3, + 0x034, 0x00049DF0, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004A0F3, + 0x034, 0x000490B1, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004A0F3, + 0x034, 0x000490B1, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004ADF5, + 0x034, 0x00049DF2, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0004ADF3, + 0x034, 0x00049DF0, + 0xA0000000, 0x00000000, + 0x034, 0x0004ADF7, + 0x034, 0x00049DF3, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00048DED, + 0x034, 0x00047DEA, + 0x034, 0x00046DE7, + 0x034, 0x00045CE9, + 0x034, 0x00044CE6, + 0x034, 0x000438C6, + 0x034, 0x00042886, + 0x034, 0x00041486, + 0x034, 0x00040447, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00048DED, + 0x034, 0x00047DEA, + 0x034, 0x00046DE7, + 0x034, 0x00045CE9, + 0x034, 0x00044CE6, + 0x034, 0x000438C6, + 0x034, 0x00042886, + 0x034, 0x00041486, + 0x034, 0x00040447, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000480AE, + 0x034, 0x000470AB, + 0x034, 0x0004608B, + 0x034, 0x00045069, + 0x034, 0x00044048, + 0x034, 0x00043045, + 0x034, 0x00042026, + 0x034, 0x00041023, + 0x034, 0x00040002, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000480AE, + 0x034, 0x000470AB, + 0x034, 0x0004608B, + 0x034, 0x00045069, + 0x034, 0x00044048, + 0x034, 0x00043045, + 0x034, 0x00042026, + 0x034, 0x00041023, + 0x034, 0x00040002, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00048DED, + 0x034, 0x00047DEA, + 0x034, 0x00046DE7, + 0x034, 0x00045CE9, + 0x034, 0x00044CE6, + 0x034, 0x000438C6, + 0x034, 0x00042886, + 0x034, 0x00041486, + 0x034, 0x00040447, + 0xA0000000, 0x00000000, + 0x034, 0x00048DEF, + 0x034, 0x00047DEC, + 0x034, 0x00046DE9, + 0x034, 0x00045CCB, + 0x034, 0x0004488D, + 0x034, 0x0004348D, + 0x034, 0x0004248A, + 0x034, 0x0004108D, + 0x034, 0x0004008A, + 0xB0000000, 0x00000000, + 0x80000210, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002ADF4, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002A0F3, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002A0F3, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0002ADF4, + 0xA0000000, 0x00000000, + 0x034, 0x0002ADF7, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00029DF4, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00029DF4, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00029DF1, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000290F0, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000290F0, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00029DF1, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00029DF4, + 0xA0000000, 0x00000000, + 0x034, 0x00029DF2, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00028DF1, + 0x034, 0x00027DEE, + 0x034, 0x00026DEB, + 0x034, 0x00025CEC, + 0x034, 0x00024CE9, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x00021489, + 0x034, 0x0002044A, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00028DF1, + 0x034, 0x00027DEE, + 0x034, 0x00026DEB, + 0x034, 0x00025CEC, + 0x034, 0x00024CE9, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x00021489, + 0x034, 0x0002044A, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000280AF, + 0x034, 0x000270AC, + 0x034, 0x0002608B, + 0x034, 0x00025069, + 0x034, 0x00024048, + 0x034, 0x00023045, + 0x034, 0x00022026, + 0x034, 0x00021023, + 0x034, 0x00020002, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x000280AF, + 0x034, 0x000270AC, + 0x034, 0x0002608B, + 0x034, 0x00025069, + 0x034, 0x00024048, + 0x034, 0x00023045, + 0x034, 0x00022026, + 0x034, 0x00021023, + 0x034, 0x00020002, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00028DF1, + 0x034, 0x00027DEE, + 0x034, 0x00026DEB, + 0x034, 0x00025CEC, + 0x034, 0x00024CE9, + 0x034, 0x000238CA, + 0x034, 0x00022889, + 0x034, 0x00021489, + 0x034, 0x0002044A, + 0xA0000000, 0x00000000, + 0x034, 0x00028DEE, + 0x034, 0x00027DEB, + 0x034, 0x00026CCD, + 0x034, 0x00025CCA, + 0x034, 0x0002488C, + 0x034, 0x0002384C, + 0x034, 0x00022849, + 0x034, 0x00021449, + 0x034, 0x0002004D, + 0xB0000000, 0x00000000, + 0x8000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000A0D7, + 0x034, 0x000090D3, + 0x034, 0x000080B1, + 0x034, 0x000070AE, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000A0D7, + 0x034, 0x000090D3, + 0x034, 0x000080B1, + 0x034, 0x000070AE, + 0xA0000000, 0x00000000, + 0x034, 0x0000ADF7, + 0x034, 0x00009DF4, + 0x034, 0x00008DF1, + 0x034, 0x00007DEE, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00006DEB, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000038CA, + 0x034, 0x00002889, + 0x034, 0x00001489, + 0x034, 0x0000044A, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00006DEB, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000038CA, + 0x034, 0x00002889, + 0x034, 0x00001489, + 0x034, 0x0000044A, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000608D, + 0x034, 0x0000506B, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x00002044, + 0x034, 0x00001025, + 0x034, 0x00000004, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x0000608D, + 0x034, 0x0000506B, + 0x034, 0x0000404A, + 0x034, 0x00003047, + 0x034, 0x00002044, + 0x034, 0x00001025, + 0x034, 0x00000004, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x034, 0x00006DEB, + 0x034, 0x00005CEC, + 0x034, 0x00004CE9, + 0x034, 0x000038CA, + 0x034, 0x00002889, + 0x034, 0x00001489, + 0x034, 0x0000044A, + 0xA0000000, 0x00000000, + 0x034, 0x00006DCD, + 0x034, 0x00005CCD, + 0x034, 0x00004CCA, + 0x034, 0x0000388C, + 0x034, 0x00002888, + 0x034, 0x00001488, + 0x034, 0x00000486, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000040, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x00000187, + 0x035, 0x00008187, + 0x035, 0x00010187, + 0x035, 0x00020188, + 0x035, 0x00028188, + 0x035, 0x00030188, + 0x035, 0x00040188, + 0x035, 0x00048188, + 0x035, 0x00050188, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x00000187, + 0x035, 0x00008187, + 0x035, 0x00010187, + 0x035, 0x00020188, + 0x035, 0x00028188, + 0x035, 0x00030188, + 0x035, 0x00040188, + 0x035, 0x00048188, + 0x035, 0x00050188, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x00000128, + 0x035, 0x00008128, + 0x035, 0x00010128, + 0x035, 0x000201C8, + 0x035, 0x000281C8, + 0x035, 0x000301C8, + 0x035, 0x000401C8, + 0x035, 0x000481C8, + 0x035, 0x000501C8, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x00000145, + 0x035, 0x00008145, + 0x035, 0x00010145, + 0x035, 0x00020196, + 0x035, 0x00028196, + 0x035, 0x00030196, + 0x035, 0x000401C7, + 0x035, 0x000481C7, + 0x035, 0x000501C7, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x00000128, + 0x035, 0x00008128, + 0x035, 0x00010128, + 0x035, 0x000201C8, + 0x035, 0x000281C8, + 0x035, 0x000301C8, + 0x035, 0x000401C8, + 0x035, 0x000481C8, + 0x035, 0x000501C8, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x035, 0x00000187, + 0x035, 0x00008187, + 0x035, 0x00010187, + 0x035, 0x00020188, + 0x035, 0x00028188, + 0x035, 0x00030188, + 0x035, 0x00040188, + 0x035, 0x00048188, + 0x035, 0x00050188, + 0xA0000000, 0x00000000, + 0x035, 0x00000145, + 0x035, 0x00008145, + 0x035, 0x00010145, + 0x035, 0x00020196, + 0x035, 0x00028196, + 0x035, 0x00030196, + 0x035, 0x000401C7, + 0x035, 0x000481C7, + 0x035, 0x000501C7, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000010, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00085733, + 0x036, 0x0008D733, + 0x036, 0x00095733, + 0x036, 0x0009D733, + 0x036, 0x000A64B4, + 0x036, 0x000AE4B4, + 0x036, 0x000B64B4, + 0x036, 0x000BE4B4, + 0x036, 0x000C64B4, + 0x036, 0x000CE4B4, + 0x036, 0x000D64B4, + 0x036, 0x000DE4B4, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00085733, + 0x036, 0x0008D733, + 0x036, 0x00095733, + 0x036, 0x0009D733, + 0x036, 0x000A64B4, + 0x036, 0x000AE4B4, + 0x036, 0x000B64B4, + 0x036, 0x000BE4B4, + 0x036, 0x000C64B4, + 0x036, 0x000CE4B4, + 0x036, 0x000D64B4, + 0x036, 0x000DE4B4, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x000063B5, + 0x036, 0x0000E3B5, + 0x036, 0x000163B5, + 0x036, 0x0001E3B5, + 0x036, 0x000263B5, + 0x036, 0x0002E3B5, + 0x036, 0x000363B5, + 0x036, 0x0003E3B5, + 0x036, 0x000463B5, + 0x036, 0x0004E3B5, + 0x036, 0x000563B5, + 0x036, 0x0005E3B5, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x000056B3, + 0x036, 0x0000D6B3, + 0x036, 0x000156B3, + 0x036, 0x0001D6B3, + 0x036, 0x00026634, + 0x036, 0x0002E634, + 0x036, 0x00036634, + 0x036, 0x0003E634, + 0x036, 0x000467B4, + 0x036, 0x0004E7B4, + 0x036, 0x000567B4, + 0x036, 0x0005E7B4, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x000063B5, + 0x036, 0x0000E3B5, + 0x036, 0x000163B5, + 0x036, 0x0001E3B5, + 0x036, 0x000263B5, + 0x036, 0x0002E3B5, + 0x036, 0x000363B5, + 0x036, 0x0003E3B5, + 0x036, 0x000463B5, + 0x036, 0x0004E3B5, + 0x036, 0x000563B5, + 0x036, 0x0005E3B5, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x036, 0x00085733, + 0x036, 0x0008D733, + 0x036, 0x00095733, + 0x036, 0x0009D733, + 0x036, 0x000A64B4, + 0x036, 0x000AE4B4, + 0x036, 0x000B64B4, + 0x036, 0x000BE4B4, + 0x036, 0x000C64B4, + 0x036, 0x000CE4B4, + 0x036, 0x000D64B4, + 0x036, 0x000DE4B4, + 0xA0000000, 0x00000000, + 0x036, 0x000056B3, + 0x036, 0x0000D6B3, + 0x036, 0x000156B3, + 0x036, 0x0001D6B3, + 0x036, 0x00026634, + 0x036, 0x0002E634, + 0x036, 0x00036634, + 0x036, 0x0003E634, + 0x036, 0x000467B4, + 0x036, 0x0004E7B4, + 0x036, 0x000567B4, + 0x036, 0x0005E7B4, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0EF, 0x00000008, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x000001C8, + 0x03C, 0x00000492, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x000001C8, + 0x03C, 0x00000492, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x000001B6, + 0x03C, 0x00000492, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x0000022A, + 0x03C, 0x00000594, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x000001B6, + 0x03C, 0x00000492, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x000001C8, + 0x03C, 0x00000492, + 0xA0000000, 0x00000000, + 0x03C, 0x0000022A, + 0x03C, 0x00000594, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000800, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000800, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000800, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000820, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000820, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000800, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x03C, 0x00000800, + 0xA0000000, 0x00000000, + 0x03C, 0x00000900, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x018, 0x0001712A, + 0x0EF, 0x00000002, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x0004E400, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x0004E400, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x00002000, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x00002000, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x00002000, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x00002000, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x008, 0x0004E400, + 0xA0000000, 0x00000000, + 0x008, 0x00002000, + 0xB0000000, 0x00000000, + 0x0EF, 0x00000000, + 0x0DF, 0x000000C0, + 0x01F, 0x00000064, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x058, 0x000A7284, + 0x059, 0x000600EC, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x058, 0x000A7284, + 0x059, 0x000600EC, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x058, 0x00081184, + 0x059, 0x0006016C, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x058, 0x00081184, + 0x059, 0x0006016C, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x058, 0x00081184, + 0x059, 0x0006016C, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x058, 0x000A7284, + 0x059, 0x000600EC, + 0xA0000000, 0x00000000, + 0x058, 0x00081184, + 0x059, 0x0006016C, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x061, 0x000E8D73, + 0x062, 0x00093FC5, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x061, 0x000E8D73, + 0x062, 0x00093FC5, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x061, 0x000EFD83, + 0x062, 0x00093FCC, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x061, 0x000EAD53, + 0x062, 0x00093BC4, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x061, 0x000EFD83, + 0x062, 0x00093FCC, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x061, 0x000E8D73, + 0x062, 0x00093FC5, + 0xA0000000, 0x00000000, + 0x061, 0x000EAD53, + 0x062, 0x00093BC4, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110E9, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110E9, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110EB, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110E9, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110E9, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110EB, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x063, 0x000110E9, + 0xA0000000, 0x00000000, + 0x063, 0x000714E9, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x064, 0x0001C27C, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x064, 0x0001C27C, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x064, 0x0001C27C, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x064, 0x0001C67C, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x064, 0x0001C27C, + 0x90000410, 0x00000000, 0x40000000, 0x00000000, + 0x064, 0x0001C27C, + 0xA0000000, 0x00000000, + 0x064, 0x0001C67C, + 0xB0000000, 0x00000000, + 0x80000111, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x00091016, + 0x90000110, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x00091016, + 0x90000210, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x00093016, + 0x9000020c, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x00093015, + 0x9000040c, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x00093015, + 0x90000200, 0x00000000, 0x40000000, 0x00000000, + 0x065, 0x00093016, + 0xA0000000, 0x00000000, + 0x065, 0x00091016, + 0xB0000000, 0x00000000, + 0x018, 0x00000006, + 0x0EF, 0x00002000, + 0x03B, 0x0003824B, + 0x03B, 0x0003024B, + 0x03B, 0x0002844B, + 0x03B, 0x00020F4B, + 0x03B, 0x00018F4B, + 0x03B, 0x000104B2, + 0x03B, 0x00008049, + 0x03B, 0x00000148, + 0x03B, 0x0007824B, + 0x03B, 0x0007024B, + 0x03B, 0x0006824B, + 0x03B, 0x00060F4B, + 0x03B, 0x00058F4B, + 0x03B, 0x000504B2, + 0x03B, 0x00048049, + 0x03B, 0x00040148, + 0x0EF, 0x00000000, + 0x0EF, 0x00000100, + 0x034, 0x0000ADF3, + 0x034, 0x00009DF0, + 0x034, 0x00008D70, + 0x034, 0x00007D6D, + 0x034, 0x00006CEE, + 0x034, 0x00005CCC, + 0x034, 0x000044EC, + 0x034, 0x000034AC, + 0x034, 0x0000246D, + 0x034, 0x0000106F, + 0x034, 0x0000006C, + 0x0EF, 0x00000000, + 0x0ED, 0x00000010, + 0x044, 0x0000ADF2, + 0x044, 0x00009DEF, + 0x044, 0x00008DEC, + 0x044, 0x00007DE9, + 0x044, 0x00006CEC, + 0x044, 0x00005CE9, + 0x044, 0x000044EC, + 0x044, 0x000034E9, + 0x044, 0x0000246C, + 0x044, 0x00001469, + 0x044, 0x0000006C, + 0x0ED, 0x00000000, + 0x0ED, 0x00000001, + 0x040, 0x00038DA7, + 0x040, 0x000300C2, + 0x040, 0x000288E2, + 0x040, 0x000200B8, + 0x040, 0x000188A5, + 0x040, 0x00010FBC, + 0x040, 0x00008F71, + 0x040, 0x00000240, + 0x0ED, 0x00000000, + 0x0EF, 0x000020A2, + 0x0DF, 0x00000080, + 0x035, 0x00000120, + 0x035, 0x00008120, + 0x035, 0x00010120, + 0x036, 0x00000085, + 0x036, 0x00008085, + 0x036, 0x00010085, + 0x036, 0x00018085, + 0x0EF, 0x00000000, + 0x051, 0x00000C31, + 0x052, 0x00000622, + 0x053, 0x000FC70B, + 0x054, 0x0000017E, + 0x056, 0x00051DF3, + 0x051, 0x00000C01, + 0x052, 0x000006D6, + 0x053, 0x000FC649, + 0x070, 0x00049661, + 0x071, 0x0007843E, + 0x072, 0x00000382, + 0x074, 0x00051400, + 0x035, 0x00000160, + 0x035, 0x00008160, + 0x035, 0x00010160, + 0x036, 0x00000124, + 0x036, 0x00008124, + 0x036, 0x00010124, + 0x036, 0x00018124, + 0x0ED, 0x0000000C, + 0x045, 0x00000140, + 0x045, 0x00008140, + 0x045, 0x00010140, + 0x046, 0x00000124, + 0x046, 0x00008124, + 0x046, 0x00010124, + 0x046, 0x00018124, + 0x0DF, 0x00000088, + 0x0B3, 0x000F0E18, + 0x0B4, 0x0001214C, + 0x0B7, 0x0003000C, + 0x01C, 0x000539D2, + 0x0C4, 0x000AFE00, + 0x018, 0x0001F12A, + 0xFFE, 0x00000000, + 0xFFE, 0x00000000, + 0x018, 0x0001712A, + +}; + +void +odm_read_and_config_mp_8821a_radioa( + struct dm_struct *dm +) +{ + u32 i = 0; + u8 c_cond; + boolean is_matched = true, is_skipped = false; + u32 array_len = sizeof(array_mp_8821a_radioa) / sizeof(u32); + u32 *array = array_mp_8821a_radioa; + + u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_radioa\n"); + + while ((i + 1) < array_len) { + v1 = array[i]; + v2 = array[i + 1]; + + if (v1 & (BIT(31) | BIT30)) {/*positive & negative condition*/ + if (v1 & BIT(31)) {/* positive condition*/ + c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28); + if (c_cond == COND_ENDIF) {/*end*/ + is_matched = true; + is_skipped = false; + PHYDM_DBG(dm, ODM_COMP_INIT, "ENDIF\n"); + } else if (c_cond == COND_ELSE) { /*else*/ + is_matched = is_skipped ? false : true; + PHYDM_DBG(dm, ODM_COMP_INIT, "ELSE\n"); + } else {/*if , else if*/ + pre_v1 = v1; + pre_v2 = v2; + PHYDM_DBG(dm, ODM_COMP_INIT, "IF or ELSE IF\n"); + } + } else if (v1 & BIT(30)) { /*negative condition*/ + if (is_skipped == false) { + if (check_positive(dm, pre_v1, pre_v2, v1, v2)) { + is_matched = true; + is_skipped = true; + } else { + is_matched = false; + is_skipped = false; + } + } else + is_matched = false; + } + } else { + if (is_matched) + odm_config_rf_radio_a_8821a(dm, v1, v2); + } + i = i + 2; + } +} + +u32 +odm_get_version_mp_8821a_radioa(void) +{ + return 59; +} + +/****************************************************************************** +* TxPowerTrack_AP.TXT +******************************************************************************/ + +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) +u8 g_delta_swing_table_idx_mp_5gb_n_txpowertrack_ap_8821a[][DELTA_SWINGIDX_SIZE] = { + {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}, + {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}, + {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}, +}; +u8 g_delta_swing_table_idx_mp_5gb_p_txpowertrack_ap_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20}, + {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, 19, 20, 20, 20}, + {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}, +}; +u8 g_delta_swing_table_idx_mp_5ga_n_txpowertrack_ap_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16}, + {0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_p_txpowertrack_ap_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 19}, + {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}, + {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}, +}; +u8 g_delta_swing_table_idx_mp_2gb_n_txpowertrack_ap_8821a[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u8 g_delta_swing_table_idx_mp_2gb_p_txpowertrack_ap_8821a[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u8 g_delta_swing_table_idx_mp_2ga_n_txpowertrack_ap_8821a[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u8 g_delta_swing_table_idx_mp_2ga_p_txpowertrack_ap_8821a[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_ap_8821a[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_ap_8821a[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_ap_8821a[] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_ap_8821a[] = {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9}; +#endif + +void +odm_read_and_config_mp_8821a_txpowertrack_ap( + struct dm_struct *dm +) +{ +#if (DM_ODM_SUPPORT_TYPE & (ODM_AP)) + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8821A\n"); + + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_p, g_delta_swing_table_idx_mp_2ga_p_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_n, g_delta_swing_table_idx_mp_2ga_n_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_p, g_delta_swing_table_idx_mp_2gb_p_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_n, g_delta_swing_table_idx_mp_2gb_n_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_p, g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_n, g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_p, g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_n, g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_p, g_delta_swing_table_idx_mp_5ga_p_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_n, g_delta_swing_table_idx_mp_5ga_n_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_p, g_delta_swing_table_idx_mp_5gb_p_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_n, g_delta_swing_table_idx_mp_5gb_n_txpowertrack_ap_8821a, DELTA_SWINGIDX_SIZE * 3); +#endif +} + +/****************************************************************************** +* TxPowerTrack_PCIE.TXT +******************************************************************************/ + +#if DEV_BUS_TYPE == RT_PCI_INTERFACE +u8 g_delta_swing_table_idx_mp_5gb_n_txpowertrack_pcie_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5gb_p_txpowertrack_pcie_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_n_txpowertrack_pcie_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_p_txpowertrack_pcie_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_2gb_n_txpowertrack_pcie_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2gb_p_txpowertrack_pcie_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2ga_n_txpowertrack_pcie_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2ga_p_txpowertrack_pcie_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_pcie_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_pcie_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_pcie_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_pcie_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +#endif + +void +odm_read_and_config_mp_8821a_txpowertrack_pcie( + struct dm_struct *dm +) +{ +#if DEV_BUS_TYPE == RT_PCI_INTERFACE + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8821A\n"); + + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_p, g_delta_swing_table_idx_mp_2ga_p_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_n, g_delta_swing_table_idx_mp_2ga_n_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_p, g_delta_swing_table_idx_mp_2gb_p_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_n, g_delta_swing_table_idx_mp_2gb_n_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_p, g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_n, g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_p, g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_n, g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_p, g_delta_swing_table_idx_mp_5ga_p_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_n, g_delta_swing_table_idx_mp_5ga_n_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_p, g_delta_swing_table_idx_mp_5gb_p_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_n, g_delta_swing_table_idx_mp_5gb_n_txpowertrack_pcie_8821a, DELTA_SWINGIDX_SIZE * 3); +#endif +} + +/****************************************************************************** +* TxPowerTrack_SDIO.TXT +******************************************************************************/ + +#if DEV_BUS_TYPE == RT_SDIO_INTERFACE +u8 g_delta_swing_table_idx_mp_5gb_n_txpowertrack_sdio_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5gb_p_txpowertrack_sdio_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_n_txpowertrack_sdio_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_p_txpowertrack_sdio_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_2gb_n_txpowertrack_sdio_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2gb_p_txpowertrack_sdio_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2ga_n_txpowertrack_sdio_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2ga_p_txpowertrack_sdio_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_sdio_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_sdio_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_sdio_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_sdio_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +#endif + +void +odm_read_and_config_mp_8821a_txpowertrack_sdio( + struct dm_struct *dm +) +{ +#if DEV_BUS_TYPE == RT_SDIO_INTERFACE + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8821A\n"); + + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_p, g_delta_swing_table_idx_mp_2ga_p_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_n, g_delta_swing_table_idx_mp_2ga_n_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_p, g_delta_swing_table_idx_mp_2gb_p_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_n, g_delta_swing_table_idx_mp_2gb_n_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_p, g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_n, g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_p, g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_n, g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_p, g_delta_swing_table_idx_mp_5ga_p_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_n, g_delta_swing_table_idx_mp_5ga_n_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_p, g_delta_swing_table_idx_mp_5gb_p_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_n, g_delta_swing_table_idx_mp_5gb_n_txpowertrack_sdio_8821a, DELTA_SWINGIDX_SIZE * 3); +#endif +} + +/****************************************************************************** +* TxPowerTrack_USB.TXT +******************************************************************************/ + +#if DEV_BUS_TYPE == RT_USB_INTERFACE +u8 g_delta_swing_table_idx_mp_5gb_n_txpowertrack_usb_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5gb_p_txpowertrack_usb_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_n_txpowertrack_usb_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_5ga_p_txpowertrack_usb_8821a[][DELTA_SWINGIDX_SIZE] = { + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, +}; +u8 g_delta_swing_table_idx_mp_2gb_n_txpowertrack_usb_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2gb_p_txpowertrack_usb_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2ga_n_txpowertrack_usb_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2ga_p_txpowertrack_usb_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_usb_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_usb_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_usb_8821a[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10}; +u8 g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_usb_8821a[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12}; +#endif + +void +odm_read_and_config_mp_8821a_txpowertrack_usb( + struct dm_struct *dm +) +{ +#if DEV_BUS_TYPE == RT_USB_INTERFACE + struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8821A\n"); + + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_p, g_delta_swing_table_idx_mp_2ga_p_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2ga_n, g_delta_swing_table_idx_mp_2ga_n_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_p, g_delta_swing_table_idx_mp_2gb_p_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2gb_n, g_delta_swing_table_idx_mp_2gb_n_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_p, g_delta_swing_table_idx_mp_2g_cck_a_p_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_a_n, g_delta_swing_table_idx_mp_2g_cck_a_n_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_p, g_delta_swing_table_idx_mp_2g_cck_b_p_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + odm_move_memory(dm, cali_info->delta_swing_table_idx_2g_cck_b_n, g_delta_swing_table_idx_mp_2g_cck_b_n_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE); + + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_p, g_delta_swing_table_idx_mp_5ga_p_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5ga_n, g_delta_swing_table_idx_mp_5ga_n_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_p, g_delta_swing_table_idx_mp_5gb_p_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE * 3); + odm_move_memory(dm, cali_info->delta_swing_table_idx_5gb_n, g_delta_swing_table_idx_mp_5gb_n_txpowertrack_usb_8821a, DELTA_SWINGIDX_SIZE * 3); +#endif +} + +/****************************************************************************** +* TXPWR_LMT_8811AU_FEM.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8811au_fem[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "28", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "26", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "26", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "24", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "24", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "24", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", + "MKK", "5G", "20M", "OFDM", "1T", "36", "32", + "FCC", "5G", "20M", "OFDM", "1T", "40", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", + "MKK", "5G", "20M", "OFDM", "1T", "40", "32", + "FCC", "5G", "20M", "OFDM", "1T", "44", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", + "MKK", "5G", "20M", "OFDM", "1T", "44", "32", + "FCC", "5G", "20M", "OFDM", "1T", "48", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", + "MKK", "5G", "20M", "OFDM", "1T", "48", "32", + "FCC", "5G", "20M", "OFDM", "1T", "52", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", + "MKK", "5G", "20M", "OFDM", "1T", "52", "32", + "FCC", "5G", "20M", "OFDM", "1T", "56", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", + "MKK", "5G", "20M", "OFDM", "1T", "56", "32", + "FCC", "5G", "20M", "OFDM", "1T", "60", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", + "MKK", "5G", "20M", "OFDM", "1T", "60", "32", + "FCC", "5G", "20M", "OFDM", "1T", "64", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", + "MKK", "5G", "20M", "OFDM", "1T", "64", "32", + "FCC", "5G", "20M", "OFDM", "1T", "100", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", + "MKK", "5G", "20M", "OFDM", "1T", "100", "32", + "FCC", "5G", "20M", "OFDM", "1T", "104", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "32", + "MKK", "5G", "20M", "OFDM", "1T", "104", "32", + "FCC", "5G", "20M", "OFDM", "1T", "108", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", + "MKK", "5G", "20M", "OFDM", "1T", "108", "32", + "FCC", "5G", "20M", "OFDM", "1T", "112", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", + "MKK", "5G", "20M", "OFDM", "1T", "112", "32", + "FCC", "5G", "20M", "OFDM", "1T", "116", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", + "MKK", "5G", "20M", "OFDM", "1T", "116", "32", + "FCC", "5G", "20M", "OFDM", "1T", "120", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", + "MKK", "5G", "20M", "OFDM", "1T", "120", "32", + "FCC", "5G", "20M", "OFDM", "1T", "124", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", + "MKK", "5G", "20M", "OFDM", "1T", "124", "32", + "FCC", "5G", "20M", "OFDM", "1T", "128", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", + "MKK", "5G", "20M", "OFDM", "1T", "128", "32", + "FCC", "5G", "20M", "OFDM", "1T", "132", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", + "MKK", "5G", "20M", "OFDM", "1T", "132", "32", + "FCC", "5G", "20M", "OFDM", "1T", "136", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", + "MKK", "5G", "20M", "OFDM", "1T", "136", "32", + "FCC", "5G", "20M", "OFDM", "1T", "140", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", + "MKK", "5G", "20M", "OFDM", "1T", "140", "32", + "FCC", "5G", "20M", "OFDM", "1T", "149", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "34", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "32", + "ETSI", "5G", "20M", "HT", "1T", "36", "32", + "MKK", "5G", "20M", "HT", "1T", "36", "32", + "FCC", "5G", "20M", "HT", "1T", "40", "32", + "ETSI", "5G", "20M", "HT", "1T", "40", "32", + "MKK", "5G", "20M", "HT", "1T", "40", "32", + "FCC", "5G", "20M", "HT", "1T", "44", "32", + "ETSI", "5G", "20M", "HT", "1T", "44", "32", + "MKK", "5G", "20M", "HT", "1T", "44", "32", + "FCC", "5G", "20M", "HT", "1T", "48", "32", + "ETSI", "5G", "20M", "HT", "1T", "48", "32", + "MKK", "5G", "20M", "HT", "1T", "48", "32", + "FCC", "5G", "20M", "HT", "1T", "52", "34", + "ETSI", "5G", "20M", "HT", "1T", "52", "32", + "MKK", "5G", "20M", "HT", "1T", "52", "32", + "FCC", "5G", "20M", "HT", "1T", "56", "34", + "ETSI", "5G", "20M", "HT", "1T", "56", "32", + "MKK", "5G", "20M", "HT", "1T", "56", "32", + "FCC", "5G", "20M", "HT", "1T", "60", "34", + "ETSI", "5G", "20M", "HT", "1T", "60", "32", + "MKK", "5G", "20M", "HT", "1T", "60", "32", + "FCC", "5G", "20M", "HT", "1T", "64", "34", + "ETSI", "5G", "20M", "HT", "1T", "64", "32", + "MKK", "5G", "20M", "HT", "1T", "64", "32", + "FCC", "5G", "20M", "HT", "1T", "100", "34", + "ETSI", "5G", "20M", "HT", "1T", "100", "32", + "MKK", "5G", "20M", "HT", "1T", "100", "32", + "FCC", "5G", "20M", "HT", "1T", "104", "34", + "ETSI", "5G", "20M", "HT", "1T", "104", "32", + "MKK", "5G", "20M", "HT", "1T", "104", "32", + "FCC", "5G", "20M", "HT", "1T", "108", "34", + "ETSI", "5G", "20M", "HT", "1T", "108", "32", + "MKK", "5G", "20M", "HT", "1T", "108", "32", + "FCC", "5G", "20M", "HT", "1T", "112", "34", + "ETSI", "5G", "20M", "HT", "1T", "112", "32", + "MKK", "5G", "20M", "HT", "1T", "112", "32", + "FCC", "5G", "20M", "HT", "1T", "116", "34", + "ETSI", "5G", "20M", "HT", "1T", "116", "32", + "MKK", "5G", "20M", "HT", "1T", "116", "32", + "FCC", "5G", "20M", "HT", "1T", "120", "34", + "ETSI", "5G", "20M", "HT", "1T", "120", "32", + "MKK", "5G", "20M", "HT", "1T", "120", "32", + "FCC", "5G", "20M", "HT", "1T", "124", "34", + "ETSI", "5G", "20M", "HT", "1T", "124", "32", + "MKK", "5G", "20M", "HT", "1T", "124", "32", + "FCC", "5G", "20M", "HT", "1T", "128", "34", + "ETSI", "5G", "20M", "HT", "1T", "128", "32", + "MKK", "5G", "20M", "HT", "1T", "128", "32", + "FCC", "5G", "20M", "HT", "1T", "132", "34", + "ETSI", "5G", "20M", "HT", "1T", "132", "32", + "MKK", "5G", "20M", "HT", "1T", "132", "32", + "FCC", "5G", "20M", "HT", "1T", "136", "34", + "ETSI", "5G", "20M", "HT", "1T", "136", "32", + "MKK", "5G", "20M", "HT", "1T", "136", "32", + "FCC", "5G", "20M", "HT", "1T", "140", "32", + "ETSI", "5G", "20M", "HT", "1T", "140", "32", + "MKK", "5G", "20M", "HT", "1T", "140", "32", + "FCC", "5G", "20M", "HT", "1T", "149", "34", + "ETSI", "5G", "20M", "HT", "1T", "149", "32", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "34", + "ETSI", "5G", "20M", "HT", "1T", "153", "32", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "34", + "ETSI", "5G", "20M", "HT", "1T", "157", "32", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "34", + "ETSI", "5G", "20M", "HT", "1T", "161", "32", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "34", + "ETSI", "5G", "20M", "HT", "1T", "165", "32", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "32", + "ETSI", "5G", "40M", "HT", "1T", "38", "32", + "MKK", "5G", "40M", "HT", "1T", "38", "32", + "FCC", "5G", "40M", "HT", "1T", "46", "32", + "ETSI", "5G", "40M", "HT", "1T", "46", "32", + "MKK", "5G", "40M", "HT", "1T", "46", "32", + "FCC", "5G", "40M", "HT", "1T", "54", "34", + "ETSI", "5G", "40M", "HT", "1T", "54", "32", + "MKK", "5G", "40M", "HT", "1T", "54", "32", + "FCC", "5G", "40M", "HT", "1T", "62", "34", + "ETSI", "5G", "40M", "HT", "1T", "62", "32", + "MKK", "5G", "40M", "HT", "1T", "62", "32", + "FCC", "5G", "40M", "HT", "1T", "102", "34", + "ETSI", "5G", "40M", "HT", "1T", "102", "32", + "MKK", "5G", "40M", "HT", "1T", "102", "32", + "FCC", "5G", "40M", "HT", "1T", "110", "34", + "ETSI", "5G", "40M", "HT", "1T", "110", "32", + "MKK", "5G", "40M", "HT", "1T", "110", "32", + "FCC", "5G", "40M", "HT", "1T", "118", "34", + "ETSI", "5G", "40M", "HT", "1T", "118", "32", + "MKK", "5G", "40M", "HT", "1T", "118", "32", + "FCC", "5G", "40M", "HT", "1T", "126", "34", + "ETSI", "5G", "40M", "HT", "1T", "126", "32", + "MKK", "5G", "40M", "HT", "1T", "126", "32", + "FCC", "5G", "40M", "HT", "1T", "134", "34", + "ETSI", "5G", "40M", "HT", "1T", "134", "32", + "MKK", "5G", "40M", "HT", "1T", "134", "32", + "FCC", "5G", "40M", "HT", "1T", "151", "34", + "ETSI", "5G", "40M", "HT", "1T", "151", "32", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "34", + "ETSI", "5G", "40M", "HT", "1T", "159", "32", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "32", + "ETSI", "5G", "80M", "VHT", "1T", "42", "32", + "MKK", "5G", "80M", "VHT", "1T", "42", "32", + "FCC", "5G", "80M", "VHT", "1T", "58", "34", + "ETSI", "5G", "80M", "VHT", "1T", "58", "32", + "MKK", "5G", "80M", "VHT", "1T", "58", "32", + "FCC", "5G", "80M", "VHT", "1T", "106", "34", + "ETSI", "5G", "80M", "VHT", "1T", "106", "32", + "MKK", "5G", "80M", "VHT", "1T", "106", "32", + "FCC", "5G", "80M", "VHT", "1T", "122", "34", + "ETSI", "5G", "80M", "VHT", "1T", "122", "32", + "MKK", "5G", "80M", "VHT", "1T", "122", "32", + "FCC", "5G", "80M", "VHT", "1T", "155", "34", + "ETSI", "5G", "80M", "VHT", "1T", "155", "32", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8811a_u_fem( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8811au_fem) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8811au_fem; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8811a_u_fem\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_8811AU_IPA.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8811au_ipa[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "28", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "26", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "34", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "26", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "24", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "34", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "24", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "34", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "24", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "30", + "MKK", "5G", "20M", "OFDM", "1T", "36", "30", + "FCC", "5G", "20M", "OFDM", "1T", "40", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "30", + "MKK", "5G", "20M", "OFDM", "1T", "40", "30", + "FCC", "5G", "20M", "OFDM", "1T", "44", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "30", + "MKK", "5G", "20M", "OFDM", "1T", "44", "30", + "FCC", "5G", "20M", "OFDM", "1T", "48", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "30", + "MKK", "5G", "20M", "OFDM", "1T", "48", "30", + "FCC", "5G", "20M", "OFDM", "1T", "52", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "30", + "MKK", "5G", "20M", "OFDM", "1T", "52", "30", + "FCC", "5G", "20M", "OFDM", "1T", "56", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "30", + "MKK", "5G", "20M", "OFDM", "1T", "56", "30", + "FCC", "5G", "20M", "OFDM", "1T", "60", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "30", + "MKK", "5G", "20M", "OFDM", "1T", "60", "30", + "FCC", "5G", "20M", "OFDM", "1T", "64", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "30", + "MKK", "5G", "20M", "OFDM", "1T", "64", "30", + "FCC", "5G", "20M", "OFDM", "1T", "100", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "30", + "MKK", "5G", "20M", "OFDM", "1T", "100", "30", + "FCC", "5G", "20M", "OFDM", "1T", "104", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "30", + "MKK", "5G", "20M", "OFDM", "1T", "104", "30", + "FCC", "5G", "20M", "OFDM", "1T", "108", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "30", + "MKK", "5G", "20M", "OFDM", "1T", "108", "30", + "FCC", "5G", "20M", "OFDM", "1T", "112", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "30", + "MKK", "5G", "20M", "OFDM", "1T", "112", "30", + "FCC", "5G", "20M", "OFDM", "1T", "116", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "30", + "MKK", "5G", "20M", "OFDM", "1T", "116", "30", + "FCC", "5G", "20M", "OFDM", "1T", "120", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "30", + "MKK", "5G", "20M", "OFDM", "1T", "120", "30", + "FCC", "5G", "20M", "OFDM", "1T", "124", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "30", + "MKK", "5G", "20M", "OFDM", "1T", "124", "30", + "FCC", "5G", "20M", "OFDM", "1T", "128", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "30", + "MKK", "5G", "20M", "OFDM", "1T", "128", "30", + "FCC", "5G", "20M", "OFDM", "1T", "132", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "30", + "MKK", "5G", "20M", "OFDM", "1T", "132", "30", + "FCC", "5G", "20M", "OFDM", "1T", "136", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "30", + "MKK", "5G", "20M", "OFDM", "1T", "136", "30", + "FCC", "5G", "20M", "OFDM", "1T", "140", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "30", + "MKK", "5G", "20M", "OFDM", "1T", "140", "30", + "FCC", "5G", "20M", "OFDM", "1T", "149", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "30", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "30", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "30", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "30", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "30", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "30", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "30", + "ETSI", "5G", "20M", "HT", "1T", "36", "30", + "MKK", "5G", "20M", "HT", "1T", "36", "30", + "FCC", "5G", "20M", "HT", "1T", "40", "30", + "ETSI", "5G", "20M", "HT", "1T", "40", "30", + "MKK", "5G", "20M", "HT", "1T", "40", "30", + "FCC", "5G", "20M", "HT", "1T", "44", "30", + "ETSI", "5G", "20M", "HT", "1T", "44", "30", + "MKK", "5G", "20M", "HT", "1T", "44", "30", + "FCC", "5G", "20M", "HT", "1T", "48", "30", + "ETSI", "5G", "20M", "HT", "1T", "48", "30", + "MKK", "5G", "20M", "HT", "1T", "48", "30", + "FCC", "5G", "20M", "HT", "1T", "52", "30", + "ETSI", "5G", "20M", "HT", "1T", "52", "30", + "MKK", "5G", "20M", "HT", "1T", "52", "30", + "FCC", "5G", "20M", "HT", "1T", "56", "30", + "ETSI", "5G", "20M", "HT", "1T", "56", "30", + "MKK", "5G", "20M", "HT", "1T", "56", "30", + "FCC", "5G", "20M", "HT", "1T", "60", "30", + "ETSI", "5G", "20M", "HT", "1T", "60", "30", + "MKK", "5G", "20M", "HT", "1T", "60", "30", + "FCC", "5G", "20M", "HT", "1T", "64", "30", + "ETSI", "5G", "20M", "HT", "1T", "64", "30", + "MKK", "5G", "20M", "HT", "1T", "64", "30", + "FCC", "5G", "20M", "HT", "1T", "100", "30", + "ETSI", "5G", "20M", "HT", "1T", "100", "30", + "MKK", "5G", "20M", "HT", "1T", "100", "30", + "FCC", "5G", "20M", "HT", "1T", "104", "30", + "ETSI", "5G", "20M", "HT", "1T", "104", "30", + "MKK", "5G", "20M", "HT", "1T", "104", "30", + "FCC", "5G", "20M", "HT", "1T", "108", "30", + "ETSI", "5G", "20M", "HT", "1T", "108", "30", + "MKK", "5G", "20M", "HT", "1T", "108", "30", + "FCC", "5G", "20M", "HT", "1T", "112", "30", + "ETSI", "5G", "20M", "HT", "1T", "112", "30", + "MKK", "5G", "20M", "HT", "1T", "112", "30", + "FCC", "5G", "20M", "HT", "1T", "116", "30", + "ETSI", "5G", "20M", "HT", "1T", "116", "30", + "MKK", "5G", "20M", "HT", "1T", "116", "30", + "FCC", "5G", "20M", "HT", "1T", "120", "30", + "ETSI", "5G", "20M", "HT", "1T", "120", "30", + "MKK", "5G", "20M", "HT", "1T", "120", "30", + "FCC", "5G", "20M", "HT", "1T", "124", "30", + "ETSI", "5G", "20M", "HT", "1T", "124", "30", + "MKK", "5G", "20M", "HT", "1T", "124", "30", + "FCC", "5G", "20M", "HT", "1T", "128", "30", + "ETSI", "5G", "20M", "HT", "1T", "128", "30", + "MKK", "5G", "20M", "HT", "1T", "128", "30", + "FCC", "5G", "20M", "HT", "1T", "132", "30", + "ETSI", "5G", "20M", "HT", "1T", "132", "30", + "MKK", "5G", "20M", "HT", "1T", "132", "30", + "FCC", "5G", "20M", "HT", "1T", "136", "30", + "ETSI", "5G", "20M", "HT", "1T", "136", "30", + "MKK", "5G", "20M", "HT", "1T", "136", "30", + "FCC", "5G", "20M", "HT", "1T", "140", "30", + "ETSI", "5G", "20M", "HT", "1T", "140", "30", + "MKK", "5G", "20M", "HT", "1T", "140", "30", + "FCC", "5G", "20M", "HT", "1T", "149", "30", + "ETSI", "5G", "20M", "HT", "1T", "149", "30", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "30", + "ETSI", "5G", "20M", "HT", "1T", "153", "30", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "30", + "ETSI", "5G", "20M", "HT", "1T", "157", "30", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "30", + "ETSI", "5G", "20M", "HT", "1T", "161", "30", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "30", + "ETSI", "5G", "20M", "HT", "1T", "165", "30", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "28", + "ETSI", "5G", "40M", "HT", "1T", "38", "30", + "MKK", "5G", "40M", "HT", "1T", "38", "30", + "FCC", "5G", "40M", "HT", "1T", "46", "28", + "ETSI", "5G", "40M", "HT", "1T", "46", "30", + "MKK", "5G", "40M", "HT", "1T", "46", "30", + "FCC", "5G", "40M", "HT", "1T", "54", "28", + "ETSI", "5G", "40M", "HT", "1T", "54", "30", + "MKK", "5G", "40M", "HT", "1T", "54", "30", + "FCC", "5G", "40M", "HT", "1T", "62", "28", + "ETSI", "5G", "40M", "HT", "1T", "62", "30", + "MKK", "5G", "40M", "HT", "1T", "62", "30", + "FCC", "5G", "40M", "HT", "1T", "102", "28", + "ETSI", "5G", "40M", "HT", "1T", "102", "30", + "MKK", "5G", "40M", "HT", "1T", "102", "30", + "FCC", "5G", "40M", "HT", "1T", "110", "28", + "ETSI", "5G", "40M", "HT", "1T", "110", "30", + "MKK", "5G", "40M", "HT", "1T", "110", "30", + "FCC", "5G", "40M", "HT", "1T", "118", "28", + "ETSI", "5G", "40M", "HT", "1T", "118", "30", + "MKK", "5G", "40M", "HT", "1T", "118", "30", + "FCC", "5G", "40M", "HT", "1T", "126", "28", + "ETSI", "5G", "40M", "HT", "1T", "126", "30", + "MKK", "5G", "40M", "HT", "1T", "126", "30", + "FCC", "5G", "40M", "HT", "1T", "134", "28", + "ETSI", "5G", "40M", "HT", "1T", "134", "30", + "MKK", "5G", "40M", "HT", "1T", "134", "30", + "FCC", "5G", "40M", "HT", "1T", "151", "30", + "ETSI", "5G", "40M", "HT", "1T", "151", "30", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "30", + "ETSI", "5G", "40M", "HT", "1T", "159", "30", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "28", + "ETSI", "5G", "80M", "VHT", "1T", "42", "30", + "MKK", "5G", "80M", "VHT", "1T", "42", "30", + "FCC", "5G", "80M", "VHT", "1T", "58", "26", + "ETSI", "5G", "80M", "VHT", "1T", "58", "30", + "MKK", "5G", "80M", "VHT", "1T", "58", "30", + "FCC", "5G", "80M", "VHT", "1T", "106", "30", + "ETSI", "5G", "80M", "VHT", "1T", "106", "30", + "MKK", "5G", "80M", "VHT", "1T", "106", "30", + "FCC", "5G", "80M", "VHT", "1T", "122", "30", + "ETSI", "5G", "80M", "VHT", "1T", "122", "30", + "MKK", "5G", "80M", "VHT", "1T", "122", "30", + "FCC", "5G", "80M", "VHT", "1T", "155", "30", + "ETSI", "5G", "80M", "VHT", "1T", "155", "30", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8811a_u_ipa( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8811au_ipa) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8811au_ipa; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8811a_u_ipa\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_8821A.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8821a[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "28", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "26", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "30", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "26", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "24", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "30", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "26", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "24", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "26", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "26", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "24", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "26", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "30", + "MKK", "5G", "20M", "OFDM", "1T", "36", "30", + "FCC", "5G", "20M", "OFDM", "1T", "40", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "30", + "MKK", "5G", "20M", "OFDM", "1T", "40", "30", + "FCC", "5G", "20M", "OFDM", "1T", "44", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "30", + "MKK", "5G", "20M", "OFDM", "1T", "44", "30", + "FCC", "5G", "20M", "OFDM", "1T", "48", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "30", + "MKK", "5G", "20M", "OFDM", "1T", "48", "30", + "FCC", "5G", "20M", "OFDM", "1T", "52", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "30", + "MKK", "5G", "20M", "OFDM", "1T", "52", "30", + "FCC", "5G", "20M", "OFDM", "1T", "56", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "30", + "MKK", "5G", "20M", "OFDM", "1T", "56", "30", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "30", + "MKK", "5G", "20M", "OFDM", "1T", "60", "30", + "FCC", "5G", "20M", "OFDM", "1T", "64", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "30", + "MKK", "5G", "20M", "OFDM", "1T", "64", "30", + "FCC", "5G", "20M", "OFDM", "1T", "100", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "30", + "MKK", "5G", "20M", "OFDM", "1T", "100", "30", + "FCC", "5G", "20M", "OFDM", "1T", "104", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "30", + "MKK", "5G", "20M", "OFDM", "1T", "104", "30", + "FCC", "5G", "20M", "OFDM", "1T", "108", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "30", + "MKK", "5G", "20M", "OFDM", "1T", "108", "30", + "FCC", "5G", "20M", "OFDM", "1T", "112", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "30", + "MKK", "5G", "20M", "OFDM", "1T", "112", "30", + "FCC", "5G", "20M", "OFDM", "1T", "116", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "30", + "MKK", "5G", "20M", "OFDM", "1T", "116", "30", + "FCC", "5G", "20M", "OFDM", "1T", "120", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "30", + "MKK", "5G", "20M", "OFDM", "1T", "120", "30", + "FCC", "5G", "20M", "OFDM", "1T", "124", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "30", + "MKK", "5G", "20M", "OFDM", "1T", "124", "30", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "30", + "MKK", "5G", "20M", "OFDM", "1T", "128", "30", + "FCC", "5G", "20M", "OFDM", "1T", "132", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "30", + "MKK", "5G", "20M", "OFDM", "1T", "132", "30", + "FCC", "5G", "20M", "OFDM", "1T", "136", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "30", + "MKK", "5G", "20M", "OFDM", "1T", "136", "30", + "FCC", "5G", "20M", "OFDM", "1T", "140", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "30", + "MKK", "5G", "20M", "OFDM", "1T", "140", "30", + "FCC", "5G", "20M", "OFDM", "1T", "149", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "30", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "30", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "30", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "30", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "30", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "32", + "ETSI", "5G", "20M", "HT", "1T", "36", "30", + "MKK", "5G", "20M", "HT", "1T", "36", "30", + "FCC", "5G", "20M", "HT", "1T", "40", "32", + "ETSI", "5G", "20M", "HT", "1T", "40", "30", + "MKK", "5G", "20M", "HT", "1T", "40", "30", + "FCC", "5G", "20M", "HT", "1T", "44", "32", + "ETSI", "5G", "20M", "HT", "1T", "44", "30", + "MKK", "5G", "20M", "HT", "1T", "44", "30", + "FCC", "5G", "20M", "HT", "1T", "48", "32", + "ETSI", "5G", "20M", "HT", "1T", "48", "30", + "MKK", "5G", "20M", "HT", "1T", "48", "30", + "FCC", "5G", "20M", "HT", "1T", "52", "32", + "ETSI", "5G", "20M", "HT", "1T", "52", "30", + "MKK", "5G", "20M", "HT", "1T", "52", "30", + "FCC", "5G", "20M", "HT", "1T", "56", "32", + "ETSI", "5G", "20M", "HT", "1T", "56", "30", + "MKK", "5G", "20M", "HT", "1T", "56", "30", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "30", + "MKK", "5G", "20M", "HT", "1T", "60", "30", + "FCC", "5G", "20M", "HT", "1T", "64", "32", + "ETSI", "5G", "20M", "HT", "1T", "64", "30", + "MKK", "5G", "20M", "HT", "1T", "64", "30", + "FCC", "5G", "20M", "HT", "1T", "100", "32", + "ETSI", "5G", "20M", "HT", "1T", "100", "30", + "MKK", "5G", "20M", "HT", "1T", "100", "30", + "FCC", "5G", "20M", "HT", "1T", "104", "32", + "ETSI", "5G", "20M", "HT", "1T", "104", "30", + "MKK", "5G", "20M", "HT", "1T", "104", "30", + "FCC", "5G", "20M", "HT", "1T", "108", "32", + "ETSI", "5G", "20M", "HT", "1T", "108", "30", + "MKK", "5G", "20M", "HT", "1T", "108", "30", + "FCC", "5G", "20M", "HT", "1T", "112", "32", + "ETSI", "5G", "20M", "HT", "1T", "112", "30", + "MKK", "5G", "20M", "HT", "1T", "112", "30", + "FCC", "5G", "20M", "HT", "1T", "116", "32", + "ETSI", "5G", "20M", "HT", "1T", "116", "30", + "MKK", "5G", "20M", "HT", "1T", "116", "30", + "FCC", "5G", "20M", "HT", "1T", "120", "32", + "ETSI", "5G", "20M", "HT", "1T", "120", "30", + "MKK", "5G", "20M", "HT", "1T", "120", "30", + "FCC", "5G", "20M", "HT", "1T", "124", "32", + "ETSI", "5G", "20M", "HT", "1T", "124", "30", + "MKK", "5G", "20M", "HT", "1T", "124", "30", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "30", + "MKK", "5G", "20M", "HT", "1T", "128", "30", + "FCC", "5G", "20M", "HT", "1T", "132", "32", + "ETSI", "5G", "20M", "HT", "1T", "132", "30", + "MKK", "5G", "20M", "HT", "1T", "132", "30", + "FCC", "5G", "20M", "HT", "1T", "136", "32", + "ETSI", "5G", "20M", "HT", "1T", "136", "30", + "MKK", "5G", "20M", "HT", "1T", "136", "30", + "FCC", "5G", "20M", "HT", "1T", "140", "32", + "ETSI", "5G", "20M", "HT", "1T", "140", "30", + "MKK", "5G", "20M", "HT", "1T", "140", "30", + "FCC", "5G", "20M", "HT", "1T", "149", "32", + "ETSI", "5G", "20M", "HT", "1T", "149", "30", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "32", + "ETSI", "5G", "20M", "HT", "1T", "153", "30", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "32", + "ETSI", "5G", "20M", "HT", "1T", "157", "30", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "32", + "ETSI", "5G", "20M", "HT", "1T", "161", "30", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "32", + "ETSI", "5G", "20M", "HT", "1T", "165", "30", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "26", + "ETSI", "5G", "40M", "HT", "1T", "38", "30", + "MKK", "5G", "40M", "HT", "1T", "38", "30", + "FCC", "5G", "40M", "HT", "1T", "46", "32", + "ETSI", "5G", "40M", "HT", "1T", "46", "30", + "MKK", "5G", "40M", "HT", "1T", "46", "30", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "30", + "MKK", "5G", "40M", "HT", "1T", "54", "30", + "FCC", "5G", "40M", "HT", "1T", "62", "24", + "ETSI", "5G", "40M", "HT", "1T", "62", "30", + "MKK", "5G", "40M", "HT", "1T", "62", "30", + "FCC", "5G", "40M", "HT", "1T", "102", "24", + "ETSI", "5G", "40M", "HT", "1T", "102", "30", + "MKK", "5G", "40M", "HT", "1T", "102", "30", + "FCC", "5G", "40M", "HT", "1T", "110", "32", + "ETSI", "5G", "40M", "HT", "1T", "110", "30", + "MKK", "5G", "40M", "HT", "1T", "110", "30", + "FCC", "5G", "40M", "HT", "1T", "118", "32", + "ETSI", "5G", "40M", "HT", "1T", "118", "30", + "MKK", "5G", "40M", "HT", "1T", "118", "30", + "FCC", "5G", "40M", "HT", "1T", "126", "32", + "ETSI", "5G", "40M", "HT", "1T", "126", "30", + "MKK", "5G", "40M", "HT", "1T", "126", "30", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "30", + "MKK", "5G", "40M", "HT", "1T", "134", "30", + "FCC", "5G", "40M", "HT", "1T", "151", "30", + "ETSI", "5G", "40M", "HT", "1T", "151", "30", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "32", + "ETSI", "5G", "40M", "HT", "1T", "159", "30", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "22", + "ETSI", "5G", "80M", "VHT", "1T", "42", "30", + "MKK", "5G", "80M", "VHT", "1T", "42", "30", + "FCC", "5G", "80M", "VHT", "1T", "58", "20", + "ETSI", "5G", "80M", "VHT", "1T", "58", "30", + "MKK", "5G", "80M", "VHT", "1T", "58", "30", + "FCC", "5G", "80M", "VHT", "1T", "106", "20", + "ETSI", "5G", "80M", "VHT", "1T", "106", "30", + "MKK", "5G", "80M", "VHT", "1T", "106", "30", + "FCC", "5G", "80M", "VHT", "1T", "122", "20", + "ETSI", "5G", "80M", "VHT", "1T", "122", "30", + "MKK", "5G", "80M", "VHT", "1T", "122", "30", + "FCC", "5G", "80M", "VHT", "1T", "155", "28", + "ETSI", "5G", "80M", "VHT", "1T", "155", "30", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8821a) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8821a; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8821a\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_8821A_E202SA.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8821a_e202sa[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "27", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "27", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "27", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "27", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "22", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "28", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "20", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "20", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "20", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "28", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "28", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "16", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "26", + "MKK", "2.4G", "20M", "HT", "1T", "01", "26", + "FCC", "2.4G", "20M", "HT", "1T", "02", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "26", + "MKK", "2.4G", "20M", "HT", "1T", "02", "26", + "FCC", "2.4G", "20M", "HT", "1T", "03", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "26", + "MKK", "2.4G", "20M", "HT", "1T", "03", "26", + "FCC", "2.4G", "20M", "HT", "1T", "04", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "26", + "MKK", "2.4G", "20M", "HT", "1T", "04", "26", + "FCC", "2.4G", "20M", "HT", "1T", "05", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "26", + "MKK", "2.4G", "20M", "HT", "1T", "05", "26", + "FCC", "2.4G", "20M", "HT", "1T", "06", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "26", + "MKK", "2.4G", "20M", "HT", "1T", "06", "26", + "FCC", "2.4G", "20M", "HT", "1T", "07", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "26", + "MKK", "2.4G", "20M", "HT", "1T", "07", "26", + "FCC", "2.4G", "20M", "HT", "1T", "08", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "26", + "MKK", "2.4G", "20M", "HT", "1T", "08", "26", + "FCC", "2.4G", "20M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "26", + "MKK", "2.4G", "20M", "HT", "1T", "09", "26", + "FCC", "2.4G", "20M", "HT", "1T", "10", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "26", + "MKK", "2.4G", "20M", "HT", "1T", "10", "26", + "FCC", "2.4G", "20M", "HT", "1T", "11", "15", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "26", + "MKK", "2.4G", "20M", "HT", "1T", "11", "26", + "FCC", "2.4G", "20M", "HT", "1T", "12", "15", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "26", + "MKK", "2.4G", "20M", "HT", "1T", "12", "26", + "FCC", "2.4G", "20M", "HT", "1T", "13", "15", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "26", + "MKK", "2.4G", "20M", "HT", "1T", "13", "26", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "16", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "22", + "MKK", "2.4G", "40M", "HT", "1T", "03", "22", + "FCC", "2.4G", "40M", "HT", "1T", "04", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "22", + "MKK", "2.4G", "40M", "HT", "1T", "04", "22", + "FCC", "2.4G", "40M", "HT", "1T", "05", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "22", + "MKK", "2.4G", "40M", "HT", "1T", "05", "22", + "FCC", "2.4G", "40M", "HT", "1T", "06", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "22", + "MKK", "2.4G", "40M", "HT", "1T", "06", "22", + "FCC", "2.4G", "40M", "HT", "1T", "07", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "22", + "MKK", "2.4G", "40M", "HT", "1T", "07", "22", + "FCC", "2.4G", "40M", "HT", "1T", "08", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "22", + "MKK", "2.4G", "40M", "HT", "1T", "08", "22", + "FCC", "2.4G", "40M", "HT", "1T", "09", "16", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "22", + "MKK", "2.4G", "40M", "HT", "1T", "09", "22", + "FCC", "2.4G", "40M", "HT", "1T", "10", "16", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "22", + "MKK", "2.4G", "40M", "HT", "1T", "10", "22", + "FCC", "2.4G", "40M", "HT", "1T", "11", "16", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "22", + "MKK", "2.4G", "40M", "HT", "1T", "11", "22", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "26", + "MKK", "5G", "20M", "OFDM", "1T", "36", "26", + "FCC", "5G", "20M", "OFDM", "1T", "40", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "26", + "MKK", "5G", "20M", "OFDM", "1T", "40", "26", + "FCC", "5G", "20M", "OFDM", "1T", "44", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "26", + "MKK", "5G", "20M", "OFDM", "1T", "44", "26", + "FCC", "5G", "20M", "OFDM", "1T", "48", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "26", + "MKK", "5G", "20M", "OFDM", "1T", "48", "26", + "FCC", "5G", "20M", "OFDM", "1T", "52", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "26", + "MKK", "5G", "20M", "OFDM", "1T", "52", "26", + "FCC", "5G", "20M", "OFDM", "1T", "56", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "26", + "MKK", "5G", "20M", "OFDM", "1T", "56", "26", + "FCC", "5G", "20M", "OFDM", "1T", "60", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "26", + "MKK", "5G", "20M", "OFDM", "1T", "60", "26", + "FCC", "5G", "20M", "OFDM", "1T", "64", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "26", + "MKK", "5G", "20M", "OFDM", "1T", "64", "26", + "FCC", "5G", "20M", "OFDM", "1T", "100", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "26", + "MKK", "5G", "20M", "OFDM", "1T", "100", "26", + "FCC", "5G", "20M", "OFDM", "1T", "104", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "26", + "MKK", "5G", "20M", "OFDM", "1T", "104", "26", + "FCC", "5G", "20M", "OFDM", "1T", "108", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "26", + "MKK", "5G", "20M", "OFDM", "1T", "108", "26", + "FCC", "5G", "20M", "OFDM", "1T", "112", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "26", + "MKK", "5G", "20M", "OFDM", "1T", "112", "26", + "FCC", "5G", "20M", "OFDM", "1T", "116", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "26", + "MKK", "5G", "20M", "OFDM", "1T", "116", "26", + "FCC", "5G", "20M", "OFDM", "1T", "120", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "26", + "MKK", "5G", "20M", "OFDM", "1T", "120", "26", + "FCC", "5G", "20M", "OFDM", "1T", "124", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "26", + "MKK", "5G", "20M", "OFDM", "1T", "124", "26", + "FCC", "5G", "20M", "OFDM", "1T", "128", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "26", + "MKK", "5G", "20M", "OFDM", "1T", "128", "26", + "FCC", "5G", "20M", "OFDM", "1T", "132", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "26", + "MKK", "5G", "20M", "OFDM", "1T", "132", "26", + "FCC", "5G", "20M", "OFDM", "1T", "136", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "26", + "MKK", "5G", "20M", "OFDM", "1T", "136", "26", + "FCC", "5G", "20M", "OFDM", "1T", "140", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "26", + "MKK", "5G", "20M", "OFDM", "1T", "140", "26", + "FCC", "5G", "20M", "OFDM", "1T", "149", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "26", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "26", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "26", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "26", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "26", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "24", + "ETSI", "5G", "20M", "HT", "1T", "36", "24", + "MKK", "5G", "20M", "HT", "1T", "36", "24", + "FCC", "5G", "20M", "HT", "1T", "40", "24", + "ETSI", "5G", "20M", "HT", "1T", "40", "24", + "MKK", "5G", "20M", "HT", "1T", "40", "24", + "FCC", "5G", "20M", "HT", "1T", "44", "24", + "ETSI", "5G", "20M", "HT", "1T", "44", "24", + "MKK", "5G", "20M", "HT", "1T", "44", "24", + "FCC", "5G", "20M", "HT", "1T", "48", "24", + "ETSI", "5G", "20M", "HT", "1T", "48", "24", + "MKK", "5G", "20M", "HT", "1T", "48", "24", + "FCC", "5G", "20M", "HT", "1T", "52", "24", + "ETSI", "5G", "20M", "HT", "1T", "52", "24", + "MKK", "5G", "20M", "HT", "1T", "52", "24", + "FCC", "5G", "20M", "HT", "1T", "56", "24", + "ETSI", "5G", "20M", "HT", "1T", "56", "24", + "MKK", "5G", "20M", "HT", "1T", "56", "24", + "FCC", "5G", "20M", "HT", "1T", "60", "24", + "ETSI", "5G", "20M", "HT", "1T", "60", "24", + "MKK", "5G", "20M", "HT", "1T", "60", "24", + "FCC", "5G", "20M", "HT", "1T", "64", "24", + "ETSI", "5G", "20M", "HT", "1T", "64", "24", + "MKK", "5G", "20M", "HT", "1T", "64", "24", + "FCC", "5G", "20M", "HT", "1T", "100", "24", + "ETSI", "5G", "20M", "HT", "1T", "100", "24", + "MKK", "5G", "20M", "HT", "1T", "100", "24", + "FCC", "5G", "20M", "HT", "1T", "104", "24", + "ETSI", "5G", "20M", "HT", "1T", "104", "24", + "MKK", "5G", "20M", "HT", "1T", "104", "24", + "FCC", "5G", "20M", "HT", "1T", "108", "24", + "ETSI", "5G", "20M", "HT", "1T", "108", "24", + "MKK", "5G", "20M", "HT", "1T", "108", "24", + "FCC", "5G", "20M", "HT", "1T", "112", "24", + "ETSI", "5G", "20M", "HT", "1T", "112", "24", + "MKK", "5G", "20M", "HT", "1T", "112", "24", + "FCC", "5G", "20M", "HT", "1T", "116", "24", + "ETSI", "5G", "20M", "HT", "1T", "116", "24", + "MKK", "5G", "20M", "HT", "1T", "116", "24", + "FCC", "5G", "20M", "HT", "1T", "120", "24", + "ETSI", "5G", "20M", "HT", "1T", "120", "24", + "MKK", "5G", "20M", "HT", "1T", "120", "24", + "FCC", "5G", "20M", "HT", "1T", "124", "24", + "ETSI", "5G", "20M", "HT", "1T", "124", "24", + "MKK", "5G", "20M", "HT", "1T", "124", "24", + "FCC", "5G", "20M", "HT", "1T", "128", "24", + "ETSI", "5G", "20M", "HT", "1T", "128", "24", + "MKK", "5G", "20M", "HT", "1T", "128", "24", + "FCC", "5G", "20M", "HT", "1T", "132", "24", + "ETSI", "5G", "20M", "HT", "1T", "132", "24", + "MKK", "5G", "20M", "HT", "1T", "132", "24", + "FCC", "5G", "20M", "HT", "1T", "136", "24", + "ETSI", "5G", "20M", "HT", "1T", "136", "24", + "MKK", "5G", "20M", "HT", "1T", "136", "24", + "FCC", "5G", "20M", "HT", "1T", "140", "24", + "ETSI", "5G", "20M", "HT", "1T", "140", "24", + "MKK", "5G", "20M", "HT", "1T", "140", "24", + "FCC", "5G", "20M", "HT", "1T", "149", "24", + "ETSI", "5G", "20M", "HT", "1T", "149", "24", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "24", + "ETSI", "5G", "20M", "HT", "1T", "153", "24", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "24", + "ETSI", "5G", "20M", "HT", "1T", "157", "24", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "24", + "ETSI", "5G", "20M", "HT", "1T", "161", "24", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "24", + "ETSI", "5G", "20M", "HT", "1T", "165", "24", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "20", + "ETSI", "5G", "40M", "HT", "1T", "38", "20", + "MKK", "5G", "40M", "HT", "1T", "38", "20", + "FCC", "5G", "40M", "HT", "1T", "46", "20", + "ETSI", "5G", "40M", "HT", "1T", "46", "20", + "MKK", "5G", "40M", "HT", "1T", "46", "20", + "FCC", "5G", "40M", "HT", "1T", "54", "20", + "ETSI", "5G", "40M", "HT", "1T", "54", "20", + "MKK", "5G", "40M", "HT", "1T", "54", "20", + "FCC", "5G", "40M", "HT", "1T", "62", "20", + "ETSI", "5G", "40M", "HT", "1T", "62", "20", + "MKK", "5G", "40M", "HT", "1T", "62", "20", + "FCC", "5G", "40M", "HT", "1T", "102", "20", + "ETSI", "5G", "40M", "HT", "1T", "102", "20", + "MKK", "5G", "40M", "HT", "1T", "102", "20", + "FCC", "5G", "40M", "HT", "1T", "110", "20", + "ETSI", "5G", "40M", "HT", "1T", "110", "20", + "MKK", "5G", "40M", "HT", "1T", "110", "20", + "FCC", "5G", "40M", "HT", "1T", "118", "20", + "ETSI", "5G", "40M", "HT", "1T", "118", "20", + "MKK", "5G", "40M", "HT", "1T", "118", "20", + "FCC", "5G", "40M", "HT", "1T", "126", "20", + "ETSI", "5G", "40M", "HT", "1T", "126", "20", + "MKK", "5G", "40M", "HT", "1T", "126", "20", + "FCC", "5G", "40M", "HT", "1T", "134", "20", + "ETSI", "5G", "40M", "HT", "1T", "134", "20", + "MKK", "5G", "40M", "HT", "1T", "134", "20", + "FCC", "5G", "40M", "HT", "1T", "151", "20", + "ETSI", "5G", "40M", "HT", "1T", "151", "20", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "20", + "ETSI", "5G", "40M", "HT", "1T", "159", "20", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "16", + "ETSI", "5G", "80M", "VHT", "1T", "42", "16", + "MKK", "5G", "80M", "VHT", "1T", "42", "16", + "FCC", "5G", "80M", "VHT", "1T", "58", "16", + "ETSI", "5G", "80M", "VHT", "1T", "58", "16", + "MKK", "5G", "80M", "VHT", "1T", "58", "16", + "FCC", "5G", "80M", "VHT", "1T", "106", "16", + "ETSI", "5G", "80M", "VHT", "1T", "106", "16", + "MKK", "5G", "80M", "VHT", "1T", "106", "16", + "FCC", "5G", "80M", "VHT", "1T", "122", "16", + "ETSI", "5G", "80M", "VHT", "1T", "122", "16", + "MKK", "5G", "80M", "VHT", "1T", "122", "16", + "FCC", "5G", "80M", "VHT", "1T", "155", "16", + "ETSI", "5G", "80M", "VHT", "1T", "155", "16", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_e202sa( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8821a_e202sa) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8821a_e202sa; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8821a_e202sa\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_8821A_SAR_13dBm.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8821a_sar_13dbm[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "28", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "26", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "26", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "24", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "24", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "24", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "26", + "MKK", "5G", "20M", "OFDM", "1T", "36", "26", + "FCC", "5G", "20M", "OFDM", "1T", "40", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "26", + "MKK", "5G", "20M", "OFDM", "1T", "40", "26", + "FCC", "5G", "20M", "OFDM", "1T", "44", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "26", + "MKK", "5G", "20M", "OFDM", "1T", "44", "26", + "FCC", "5G", "20M", "OFDM", "1T", "48", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "26", + "MKK", "5G", "20M", "OFDM", "1T", "48", "26", + "FCC", "5G", "20M", "OFDM", "1T", "52", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "26", + "MKK", "5G", "20M", "OFDM", "1T", "52", "26", + "FCC", "5G", "20M", "OFDM", "1T", "56", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "26", + "MKK", "5G", "20M", "OFDM", "1T", "56", "26", + "FCC", "5G", "20M", "OFDM", "1T", "60", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "26", + "MKK", "5G", "20M", "OFDM", "1T", "60", "26", + "FCC", "5G", "20M", "OFDM", "1T", "64", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "26", + "MKK", "5G", "20M", "OFDM", "1T", "64", "26", + "FCC", "5G", "20M", "OFDM", "1T", "100", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "26", + "MKK", "5G", "20M", "OFDM", "1T", "100", "26", + "FCC", "5G", "20M", "OFDM", "1T", "104", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "26", + "MKK", "5G", "20M", "OFDM", "1T", "104", "26", + "FCC", "5G", "20M", "OFDM", "1T", "108", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "26", + "MKK", "5G", "20M", "OFDM", "1T", "108", "26", + "FCC", "5G", "20M", "OFDM", "1T", "112", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "26", + "MKK", "5G", "20M", "OFDM", "1T", "112", "26", + "FCC", "5G", "20M", "OFDM", "1T", "116", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "26", + "MKK", "5G", "20M", "OFDM", "1T", "116", "26", + "FCC", "5G", "20M", "OFDM", "1T", "120", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "26", + "MKK", "5G", "20M", "OFDM", "1T", "120", "26", + "FCC", "5G", "20M", "OFDM", "1T", "124", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "26", + "MKK", "5G", "20M", "OFDM", "1T", "124", "26", + "FCC", "5G", "20M", "OFDM", "1T", "128", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "26", + "MKK", "5G", "20M", "OFDM", "1T", "128", "26", + "FCC", "5G", "20M", "OFDM", "1T", "132", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "26", + "MKK", "5G", "20M", "OFDM", "1T", "132", "26", + "FCC", "5G", "20M", "OFDM", "1T", "136", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "26", + "MKK", "5G", "20M", "OFDM", "1T", "136", "26", + "FCC", "5G", "20M", "OFDM", "1T", "140", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "26", + "MKK", "5G", "20M", "OFDM", "1T", "140", "26", + "FCC", "5G", "20M", "OFDM", "1T", "149", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "26", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "26", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "26", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "26", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "26", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "26", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "26", + "ETSI", "5G", "20M", "HT", "1T", "36", "26", + "MKK", "5G", "20M", "HT", "1T", "36", "26", + "FCC", "5G", "20M", "HT", "1T", "40", "26", + "ETSI", "5G", "20M", "HT", "1T", "40", "26", + "MKK", "5G", "20M", "HT", "1T", "40", "26", + "FCC", "5G", "20M", "HT", "1T", "44", "26", + "ETSI", "5G", "20M", "HT", "1T", "44", "26", + "MKK", "5G", "20M", "HT", "1T", "44", "26", + "FCC", "5G", "20M", "HT", "1T", "48", "26", + "ETSI", "5G", "20M", "HT", "1T", "48", "26", + "MKK", "5G", "20M", "HT", "1T", "48", "26", + "FCC", "5G", "20M", "HT", "1T", "52", "26", + "ETSI", "5G", "20M", "HT", "1T", "52", "26", + "MKK", "5G", "20M", "HT", "1T", "52", "26", + "FCC", "5G", "20M", "HT", "1T", "56", "26", + "ETSI", "5G", "20M", "HT", "1T", "56", "26", + "MKK", "5G", "20M", "HT", "1T", "56", "26", + "FCC", "5G", "20M", "HT", "1T", "60", "26", + "ETSI", "5G", "20M", "HT", "1T", "60", "26", + "MKK", "5G", "20M", "HT", "1T", "60", "26", + "FCC", "5G", "20M", "HT", "1T", "64", "26", + "ETSI", "5G", "20M", "HT", "1T", "64", "26", + "MKK", "5G", "20M", "HT", "1T", "64", "26", + "FCC", "5G", "20M", "HT", "1T", "100", "26", + "ETSI", "5G", "20M", "HT", "1T", "100", "26", + "MKK", "5G", "20M", "HT", "1T", "100", "26", + "FCC", "5G", "20M", "HT", "1T", "104", "26", + "ETSI", "5G", "20M", "HT", "1T", "104", "26", + "MKK", "5G", "20M", "HT", "1T", "104", "26", + "FCC", "5G", "20M", "HT", "1T", "108", "26", + "ETSI", "5G", "20M", "HT", "1T", "108", "26", + "MKK", "5G", "20M", "HT", "1T", "108", "26", + "FCC", "5G", "20M", "HT", "1T", "112", "26", + "ETSI", "5G", "20M", "HT", "1T", "112", "26", + "MKK", "5G", "20M", "HT", "1T", "112", "26", + "FCC", "5G", "20M", "HT", "1T", "116", "26", + "ETSI", "5G", "20M", "HT", "1T", "116", "26", + "MKK", "5G", "20M", "HT", "1T", "116", "26", + "FCC", "5G", "20M", "HT", "1T", "120", "26", + "ETSI", "5G", "20M", "HT", "1T", "120", "26", + "MKK", "5G", "20M", "HT", "1T", "120", "26", + "FCC", "5G", "20M", "HT", "1T", "124", "26", + "ETSI", "5G", "20M", "HT", "1T", "124", "26", + "MKK", "5G", "20M", "HT", "1T", "124", "26", + "FCC", "5G", "20M", "HT", "1T", "128", "26", + "ETSI", "5G", "20M", "HT", "1T", "128", "26", + "MKK", "5G", "20M", "HT", "1T", "128", "26", + "FCC", "5G", "20M", "HT", "1T", "132", "26", + "ETSI", "5G", "20M", "HT", "1T", "132", "26", + "MKK", "5G", "20M", "HT", "1T", "132", "26", + "FCC", "5G", "20M", "HT", "1T", "136", "26", + "ETSI", "5G", "20M", "HT", "1T", "136", "26", + "MKK", "5G", "20M", "HT", "1T", "136", "26", + "FCC", "5G", "20M", "HT", "1T", "140", "26", + "ETSI", "5G", "20M", "HT", "1T", "140", "26", + "MKK", "5G", "20M", "HT", "1T", "140", "26", + "FCC", "5G", "20M", "HT", "1T", "149", "26", + "ETSI", "5G", "20M", "HT", "1T", "149", "26", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "26", + "ETSI", "5G", "20M", "HT", "1T", "153", "26", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "26", + "ETSI", "5G", "20M", "HT", "1T", "157", "26", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "26", + "ETSI", "5G", "20M", "HT", "1T", "161", "26", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "26", + "ETSI", "5G", "20M", "HT", "1T", "165", "26", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "26", + "ETSI", "5G", "20M", "HT", "2T", "36", "26", + "MKK", "5G", "20M", "HT", "2T", "36", "26", + "FCC", "5G", "20M", "HT", "2T", "40", "26", + "ETSI", "5G", "20M", "HT", "2T", "40", "26", + "MKK", "5G", "20M", "HT", "2T", "40", "26", + "FCC", "5G", "20M", "HT", "2T", "44", "26", + "ETSI", "5G", "20M", "HT", "2T", "44", "26", + "MKK", "5G", "20M", "HT", "2T", "44", "26", + "FCC", "5G", "20M", "HT", "2T", "48", "26", + "ETSI", "5G", "20M", "HT", "2T", "48", "26", + "MKK", "5G", "20M", "HT", "2T", "48", "26", + "FCC", "5G", "20M", "HT", "2T", "52", "26", + "ETSI", "5G", "20M", "HT", "2T", "52", "26", + "MKK", "5G", "20M", "HT", "2T", "52", "26", + "FCC", "5G", "20M", "HT", "2T", "56", "26", + "ETSI", "5G", "20M", "HT", "2T", "56", "26", + "MKK", "5G", "20M", "HT", "2T", "56", "26", + "FCC", "5G", "20M", "HT", "2T", "60", "26", + "ETSI", "5G", "20M", "HT", "2T", "60", "26", + "MKK", "5G", "20M", "HT", "2T", "60", "26", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "26", + "MKK", "5G", "20M", "HT", "2T", "64", "26", + "FCC", "5G", "20M", "HT", "2T", "100", "26", + "ETSI", "5G", "20M", "HT", "2T", "100", "26", + "MKK", "5G", "20M", "HT", "2T", "100", "26", + "FCC", "5G", "20M", "HT", "2T", "104", "26", + "ETSI", "5G", "20M", "HT", "2T", "104", "26", + "MKK", "5G", "20M", "HT", "2T", "104", "26", + "FCC", "5G", "20M", "HT", "2T", "108", "26", + "ETSI", "5G", "20M", "HT", "2T", "108", "26", + "MKK", "5G", "20M", "HT", "2T", "108", "26", + "FCC", "5G", "20M", "HT", "2T", "112", "26", + "ETSI", "5G", "20M", "HT", "2T", "112", "26", + "MKK", "5G", "20M", "HT", "2T", "112", "26", + "FCC", "5G", "20M", "HT", "2T", "116", "26", + "ETSI", "5G", "20M", "HT", "2T", "116", "26", + "MKK", "5G", "20M", "HT", "2T", "116", "26", + "FCC", "5G", "20M", "HT", "2T", "120", "26", + "ETSI", "5G", "20M", "HT", "2T", "120", "26", + "MKK", "5G", "20M", "HT", "2T", "120", "26", + "FCC", "5G", "20M", "HT", "2T", "124", "26", + "ETSI", "5G", "20M", "HT", "2T", "124", "26", + "MKK", "5G", "20M", "HT", "2T", "124", "26", + "FCC", "5G", "20M", "HT", "2T", "128", "26", + "ETSI", "5G", "20M", "HT", "2T", "128", "26", + "MKK", "5G", "20M", "HT", "2T", "128", "26", + "FCC", "5G", "20M", "HT", "2T", "132", "26", + "ETSI", "5G", "20M", "HT", "2T", "132", "26", + "MKK", "5G", "20M", "HT", "2T", "132", "26", + "FCC", "5G", "20M", "HT", "2T", "136", "26", + "ETSI", "5G", "20M", "HT", "2T", "136", "26", + "MKK", "5G", "20M", "HT", "2T", "136", "26", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "26", + "MKK", "5G", "20M", "HT", "2T", "140", "26", + "FCC", "5G", "20M", "HT", "2T", "149", "26", + "ETSI", "5G", "20M", "HT", "2T", "149", "26", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "26", + "ETSI", "5G", "20M", "HT", "2T", "153", "26", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "26", + "ETSI", "5G", "20M", "HT", "2T", "157", "26", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "26", + "ETSI", "5G", "20M", "HT", "2T", "161", "26", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "26", + "ETSI", "5G", "20M", "HT", "2T", "165", "26", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "26", + "ETSI", "5G", "40M", "HT", "1T", "38", "26", + "MKK", "5G", "40M", "HT", "1T", "38", "26", + "FCC", "5G", "40M", "HT", "1T", "46", "26", + "ETSI", "5G", "40M", "HT", "1T", "46", "26", + "MKK", "5G", "40M", "HT", "1T", "46", "26", + "FCC", "5G", "40M", "HT", "1T", "54", "26", + "ETSI", "5G", "40M", "HT", "1T", "54", "26", + "MKK", "5G", "40M", "HT", "1T", "54", "26", + "FCC", "5G", "40M", "HT", "1T", "62", "24", + "ETSI", "5G", "40M", "HT", "1T", "62", "26", + "MKK", "5G", "40M", "HT", "1T", "62", "26", + "FCC", "5G", "40M", "HT", "1T", "102", "24", + "ETSI", "5G", "40M", "HT", "1T", "102", "26", + "MKK", "5G", "40M", "HT", "1T", "102", "26", + "FCC", "5G", "40M", "HT", "1T", "110", "26", + "ETSI", "5G", "40M", "HT", "1T", "110", "26", + "MKK", "5G", "40M", "HT", "1T", "110", "26", + "FCC", "5G", "40M", "HT", "1T", "118", "26", + "ETSI", "5G", "40M", "HT", "1T", "118", "26", + "MKK", "5G", "40M", "HT", "1T", "118", "26", + "FCC", "5G", "40M", "HT", "1T", "126", "26", + "ETSI", "5G", "40M", "HT", "1T", "126", "26", + "MKK", "5G", "40M", "HT", "1T", "126", "26", + "FCC", "5G", "40M", "HT", "1T", "134", "26", + "ETSI", "5G", "40M", "HT", "1T", "134", "26", + "MKK", "5G", "40M", "HT", "1T", "134", "26", + "FCC", "5G", "40M", "HT", "1T", "151", "26", + "ETSI", "5G", "40M", "HT", "1T", "151", "26", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "26", + "ETSI", "5G", "40M", "HT", "1T", "159", "26", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "26", + "ETSI", "5G", "40M", "HT", "2T", "38", "26", + "MKK", "5G", "40M", "HT", "2T", "38", "26", + "FCC", "5G", "40M", "HT", "2T", "46", "26", + "ETSI", "5G", "40M", "HT", "2T", "46", "26", + "MKK", "5G", "40M", "HT", "2T", "46", "26", + "FCC", "5G", "40M", "HT", "2T", "54", "26", + "ETSI", "5G", "40M", "HT", "2T", "54", "26", + "MKK", "5G", "40M", "HT", "2T", "54", "26", + "FCC", "5G", "40M", "HT", "2T", "62", "26", + "ETSI", "5G", "40M", "HT", "2T", "62", "26", + "MKK", "5G", "40M", "HT", "2T", "62", "26", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "26", + "MKK", "5G", "40M", "HT", "2T", "102", "26", + "FCC", "5G", "40M", "HT", "2T", "110", "26", + "ETSI", "5G", "40M", "HT", "2T", "110", "26", + "MKK", "5G", "40M", "HT", "2T", "110", "26", + "FCC", "5G", "40M", "HT", "2T", "118", "26", + "ETSI", "5G", "40M", "HT", "2T", "118", "26", + "MKK", "5G", "40M", "HT", "2T", "118", "26", + "FCC", "5G", "40M", "HT", "2T", "126", "26", + "ETSI", "5G", "40M", "HT", "2T", "126", "26", + "MKK", "5G", "40M", "HT", "2T", "126", "26", + "FCC", "5G", "40M", "HT", "2T", "134", "26", + "ETSI", "5G", "40M", "HT", "2T", "134", "26", + "MKK", "5G", "40M", "HT", "2T", "134", "26", + "FCC", "5G", "40M", "HT", "2T", "151", "26", + "ETSI", "5G", "40M", "HT", "2T", "151", "26", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "26", + "ETSI", "5G", "40M", "HT", "2T", "159", "26", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "22", + "ETSI", "5G", "80M", "VHT", "1T", "42", "26", + "MKK", "5G", "80M", "VHT", "1T", "42", "26", + "FCC", "5G", "80M", "VHT", "1T", "58", "20", + "ETSI", "5G", "80M", "VHT", "1T", "58", "26", + "MKK", "5G", "80M", "VHT", "1T", "58", "26", + "FCC", "5G", "80M", "VHT", "1T", "106", "20", + "ETSI", "5G", "80M", "VHT", "1T", "106", "26", + "MKK", "5G", "80M", "VHT", "1T", "106", "26", + "FCC", "5G", "80M", "VHT", "1T", "122", "20", + "ETSI", "5G", "80M", "VHT", "1T", "122", "26", + "MKK", "5G", "80M", "VHT", "1T", "122", "26", + "FCC", "5G", "80M", "VHT", "1T", "155", "26", + "ETSI", "5G", "80M", "VHT", "1T", "155", "26", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "26", + "ETSI", "5G", "80M", "VHT", "2T", "42", "26", + "MKK", "5G", "80M", "VHT", "2T", "42", "26", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "26", + "MKK", "5G", "80M", "VHT", "2T", "58", "26", + "FCC", "5G", "80M", "VHT", "2T", "106", "26", + "ETSI", "5G", "80M", "VHT", "2T", "106", "26", + "MKK", "5G", "80M", "VHT", "2T", "106", "26", + "FCC", "5G", "80M", "VHT", "2T", "122", "26", + "ETSI", "5G", "80M", "VHT", "2T", "122", "26", + "MKK", "5G", "80M", "VHT", "2T", "122", "26", + "FCC", "5G", "80M", "VHT", "2T", "155", "26", + "ETSI", "5G", "80M", "VHT", "2T", "155", "26", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_13_dbm( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8821a_sar_13dbm) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8821a_sar_13dbm; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_13_dbm\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_8821A_SAR_5mm.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8821a_sar_5mm[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "34", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "28", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "26", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "26", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "24", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "24", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "24", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "30", + "MKK", "5G", "20M", "OFDM", "1T", "36", "30", + "FCC", "5G", "20M", "OFDM", "1T", "40", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "30", + "MKK", "5G", "20M", "OFDM", "1T", "40", "30", + "FCC", "5G", "20M", "OFDM", "1T", "44", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "30", + "MKK", "5G", "20M", "OFDM", "1T", "44", "30", + "FCC", "5G", "20M", "OFDM", "1T", "48", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "30", + "MKK", "5G", "20M", "OFDM", "1T", "48", "30", + "FCC", "5G", "20M", "OFDM", "1T", "52", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "30", + "MKK", "5G", "20M", "OFDM", "1T", "52", "30", + "FCC", "5G", "20M", "OFDM", "1T", "56", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "30", + "MKK", "5G", "20M", "OFDM", "1T", "56", "30", + "FCC", "5G", "20M", "OFDM", "1T", "60", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "30", + "MKK", "5G", "20M", "OFDM", "1T", "60", "30", + "FCC", "5G", "20M", "OFDM", "1T", "64", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "30", + "MKK", "5G", "20M", "OFDM", "1T", "64", "30", + "FCC", "5G", "20M", "OFDM", "1T", "100", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "30", + "MKK", "5G", "20M", "OFDM", "1T", "100", "30", + "FCC", "5G", "20M", "OFDM", "1T", "104", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "30", + "MKK", "5G", "20M", "OFDM", "1T", "104", "30", + "FCC", "5G", "20M", "OFDM", "1T", "108", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "30", + "MKK", "5G", "20M", "OFDM", "1T", "108", "30", + "FCC", "5G", "20M", "OFDM", "1T", "112", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "30", + "MKK", "5G", "20M", "OFDM", "1T", "112", "30", + "FCC", "5G", "20M", "OFDM", "1T", "116", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "30", + "MKK", "5G", "20M", "OFDM", "1T", "116", "30", + "FCC", "5G", "20M", "OFDM", "1T", "120", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "30", + "MKK", "5G", "20M", "OFDM", "1T", "120", "30", + "FCC", "5G", "20M", "OFDM", "1T", "124", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "30", + "MKK", "5G", "20M", "OFDM", "1T", "124", "30", + "FCC", "5G", "20M", "OFDM", "1T", "128", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "30", + "MKK", "5G", "20M", "OFDM", "1T", "128", "30", + "FCC", "5G", "20M", "OFDM", "1T", "132", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "30", + "MKK", "5G", "20M", "OFDM", "1T", "132", "30", + "FCC", "5G", "20M", "OFDM", "1T", "136", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "30", + "MKK", "5G", "20M", "OFDM", "1T", "136", "30", + "FCC", "5G", "20M", "OFDM", "1T", "140", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "30", + "MKK", "5G", "20M", "OFDM", "1T", "140", "30", + "FCC", "5G", "20M", "OFDM", "1T", "149", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "30", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "30", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "30", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "30", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "30", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "32", + "ETSI", "5G", "20M", "HT", "1T", "36", "30", + "MKK", "5G", "20M", "HT", "1T", "36", "30", + "FCC", "5G", "20M", "HT", "1T", "40", "32", + "ETSI", "5G", "20M", "HT", "1T", "40", "30", + "MKK", "5G", "20M", "HT", "1T", "40", "30", + "FCC", "5G", "20M", "HT", "1T", "44", "32", + "ETSI", "5G", "20M", "HT", "1T", "44", "30", + "MKK", "5G", "20M", "HT", "1T", "44", "30", + "FCC", "5G", "20M", "HT", "1T", "48", "32", + "ETSI", "5G", "20M", "HT", "1T", "48", "30", + "MKK", "5G", "20M", "HT", "1T", "48", "30", + "FCC", "5G", "20M", "HT", "1T", "52", "28", + "ETSI", "5G", "20M", "HT", "1T", "52", "30", + "MKK", "5G", "20M", "HT", "1T", "52", "30", + "FCC", "5G", "20M", "HT", "1T", "56", "28", + "ETSI", "5G", "20M", "HT", "1T", "56", "30", + "MKK", "5G", "20M", "HT", "1T", "56", "30", + "FCC", "5G", "20M", "HT", "1T", "60", "28", + "ETSI", "5G", "20M", "HT", "1T", "60", "30", + "MKK", "5G", "20M", "HT", "1T", "60", "30", + "FCC", "5G", "20M", "HT", "1T", "64", "28", + "ETSI", "5G", "20M", "HT", "1T", "64", "30", + "MKK", "5G", "20M", "HT", "1T", "64", "30", + "FCC", "5G", "20M", "HT", "1T", "100", "28", + "ETSI", "5G", "20M", "HT", "1T", "100", "30", + "MKK", "5G", "20M", "HT", "1T", "100", "30", + "FCC", "5G", "20M", "HT", "1T", "104", "28", + "ETSI", "5G", "20M", "HT", "1T", "104", "30", + "MKK", "5G", "20M", "HT", "1T", "104", "30", + "FCC", "5G", "20M", "HT", "1T", "108", "28", + "ETSI", "5G", "20M", "HT", "1T", "108", "30", + "MKK", "5G", "20M", "HT", "1T", "108", "30", + "FCC", "5G", "20M", "HT", "1T", "112", "28", + "ETSI", "5G", "20M", "HT", "1T", "112", "30", + "MKK", "5G", "20M", "HT", "1T", "112", "30", + "FCC", "5G", "20M", "HT", "1T", "116", "28", + "ETSI", "5G", "20M", "HT", "1T", "116", "30", + "MKK", "5G", "20M", "HT", "1T", "116", "30", + "FCC", "5G", "20M", "HT", "1T", "120", "28", + "ETSI", "5G", "20M", "HT", "1T", "120", "30", + "MKK", "5G", "20M", "HT", "1T", "120", "30", + "FCC", "5G", "20M", "HT", "1T", "124", "28", + "ETSI", "5G", "20M", "HT", "1T", "124", "30", + "MKK", "5G", "20M", "HT", "1T", "124", "30", + "FCC", "5G", "20M", "HT", "1T", "128", "28", + "ETSI", "5G", "20M", "HT", "1T", "128", "30", + "MKK", "5G", "20M", "HT", "1T", "128", "30", + "FCC", "5G", "20M", "HT", "1T", "132", "28", + "ETSI", "5G", "20M", "HT", "1T", "132", "30", + "MKK", "5G", "20M", "HT", "1T", "132", "30", + "FCC", "5G", "20M", "HT", "1T", "136", "28", + "ETSI", "5G", "20M", "HT", "1T", "136", "30", + "MKK", "5G", "20M", "HT", "1T", "136", "30", + "FCC", "5G", "20M", "HT", "1T", "140", "28", + "ETSI", "5G", "20M", "HT", "1T", "140", "30", + "MKK", "5G", "20M", "HT", "1T", "140", "30", + "FCC", "5G", "20M", "HT", "1T", "149", "28", + "ETSI", "5G", "20M", "HT", "1T", "149", "30", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "28", + "ETSI", "5G", "20M", "HT", "1T", "153", "30", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "28", + "ETSI", "5G", "20M", "HT", "1T", "157", "30", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "28", + "ETSI", "5G", "20M", "HT", "1T", "161", "30", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "28", + "ETSI", "5G", "20M", "HT", "1T", "165", "30", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "26", + "ETSI", "5G", "40M", "HT", "1T", "38", "30", + "MKK", "5G", "40M", "HT", "1T", "38", "30", + "FCC", "5G", "40M", "HT", "1T", "46", "32", + "ETSI", "5G", "40M", "HT", "1T", "46", "30", + "MKK", "5G", "40M", "HT", "1T", "46", "30", + "FCC", "5G", "40M", "HT", "1T", "54", "28", + "ETSI", "5G", "40M", "HT", "1T", "54", "30", + "MKK", "5G", "40M", "HT", "1T", "54", "30", + "FCC", "5G", "40M", "HT", "1T", "62", "24", + "ETSI", "5G", "40M", "HT", "1T", "62", "30", + "MKK", "5G", "40M", "HT", "1T", "62", "30", + "FCC", "5G", "40M", "HT", "1T", "102", "24", + "ETSI", "5G", "40M", "HT", "1T", "102", "30", + "MKK", "5G", "40M", "HT", "1T", "102", "30", + "FCC", "5G", "40M", "HT", "1T", "110", "28", + "ETSI", "5G", "40M", "HT", "1T", "110", "30", + "MKK", "5G", "40M", "HT", "1T", "110", "30", + "FCC", "5G", "40M", "HT", "1T", "118", "28", + "ETSI", "5G", "40M", "HT", "1T", "118", "30", + "MKK", "5G", "40M", "HT", "1T", "118", "30", + "FCC", "5G", "40M", "HT", "1T", "126", "28", + "ETSI", "5G", "40M", "HT", "1T", "126", "30", + "MKK", "5G", "40M", "HT", "1T", "126", "30", + "FCC", "5G", "40M", "HT", "1T", "134", "28", + "ETSI", "5G", "40M", "HT", "1T", "134", "30", + "MKK", "5G", "40M", "HT", "1T", "134", "30", + "FCC", "5G", "40M", "HT", "1T", "151", "28", + "ETSI", "5G", "40M", "HT", "1T", "151", "30", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "28", + "ETSI", "5G", "40M", "HT", "1T", "159", "30", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "22", + "ETSI", "5G", "80M", "VHT", "1T", "42", "30", + "MKK", "5G", "80M", "VHT", "1T", "42", "30", + "FCC", "5G", "80M", "VHT", "1T", "58", "20", + "ETSI", "5G", "80M", "VHT", "1T", "58", "30", + "MKK", "5G", "80M", "VHT", "1T", "58", "30", + "FCC", "5G", "80M", "VHT", "1T", "106", "20", + "ETSI", "5G", "80M", "VHT", "1T", "106", "30", + "MKK", "5G", "80M", "VHT", "1T", "106", "30", + "FCC", "5G", "80M", "VHT", "1T", "122", "20", + "ETSI", "5G", "80M", "VHT", "1T", "122", "30", + "MKK", "5G", "80M", "VHT", "1T", "122", "30", + "FCC", "5G", "80M", "VHT", "1T", "155", "26", + "ETSI", "5G", "80M", "VHT", "1T", "155", "30", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_5mm( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8821a_sar_5mm) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8821a_sar_5mm; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_5mm\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +/****************************************************************************** +* TXPWR_LMT_8821A_SAR_8mm.TXT +******************************************************************************/ + +const char *array_mp_8821a_txpwr_lmt_8821a_sar_8mm[] = { + "FCC", "2.4G", "20M", "CCK", "1T", "01", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "01", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "02", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "02", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "03", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "04", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "05", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "06", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "07", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", + "ETSI", "2.4G", "20M", "CCK", "1T", "08", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "09", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "09", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "10", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "10", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "11", "32", + "ETSI", "2.4G", "20M", "CCK", "1T", "11", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "12", "28", + "ETSI", "2.4G", "20M", "CCK", "1T", "12", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "13", "26", + "ETSI", "2.4G", "20M", "CCK", "1T", "13", "28", + "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", + "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", + "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", + "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "01", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "02", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32", + "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "09", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "10", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "11", "30", + "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "12", "26", + "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "13", "24", + "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", + "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", + "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", + "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", + "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "1T", "01", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", + "MKK", "2.4G", "20M", "HT", "1T", "01", "32", + "FCC", "2.4G", "20M", "HT", "1T", "02", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", + "MKK", "2.4G", "20M", "HT", "1T", "02", "32", + "FCC", "2.4G", "20M", "HT", "1T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", + "MKK", "2.4G", "20M", "HT", "1T", "03", "32", + "FCC", "2.4G", "20M", "HT", "1T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", + "MKK", "2.4G", "20M", "HT", "1T", "04", "32", + "FCC", "2.4G", "20M", "HT", "1T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", + "MKK", "2.4G", "20M", "HT", "1T", "05", "32", + "FCC", "2.4G", "20M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", + "MKK", "2.4G", "20M", "HT", "1T", "06", "32", + "FCC", "2.4G", "20M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", + "MKK", "2.4G", "20M", "HT", "1T", "07", "32", + "FCC", "2.4G", "20M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", + "MKK", "2.4G", "20M", "HT", "1T", "08", "32", + "FCC", "2.4G", "20M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", + "MKK", "2.4G", "20M", "HT", "1T", "09", "32", + "FCC", "2.4G", "20M", "HT", "1T", "10", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", + "MKK", "2.4G", "20M", "HT", "1T", "10", "32", + "FCC", "2.4G", "20M", "HT", "1T", "11", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", + "MKK", "2.4G", "20M", "HT", "1T", "11", "32", + "FCC", "2.4G", "20M", "HT", "1T", "12", "26", + "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", + "MKK", "2.4G", "20M", "HT", "1T", "12", "32", + "FCC", "2.4G", "20M", "HT", "1T", "13", "24", + "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", + "MKK", "2.4G", "20M", "HT", "1T", "13", "32", + "FCC", "2.4G", "20M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", + "MKK", "2.4G", "20M", "HT", "1T", "14", "63", + "FCC", "2.4G", "20M", "HT", "2T", "01", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "01", "32", + "MKK", "2.4G", "20M", "HT", "2T", "01", "32", + "FCC", "2.4G", "20M", "HT", "2T", "02", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "02", "32", + "MKK", "2.4G", "20M", "HT", "2T", "02", "32", + "FCC", "2.4G", "20M", "HT", "2T", "03", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "03", "32", + "MKK", "2.4G", "20M", "HT", "2T", "03", "32", + "FCC", "2.4G", "20M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "04", "32", + "MKK", "2.4G", "20M", "HT", "2T", "04", "32", + "FCC", "2.4G", "20M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "05", "32", + "MKK", "2.4G", "20M", "HT", "2T", "05", "32", + "FCC", "2.4G", "20M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "06", "32", + "MKK", "2.4G", "20M", "HT", "2T", "06", "32", + "FCC", "2.4G", "20M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "07", "32", + "MKK", "2.4G", "20M", "HT", "2T", "07", "32", + "FCC", "2.4G", "20M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "08", "32", + "MKK", "2.4G", "20M", "HT", "2T", "08", "32", + "FCC", "2.4G", "20M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "09", "32", + "MKK", "2.4G", "20M", "HT", "2T", "09", "32", + "FCC", "2.4G", "20M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "20M", "HT", "2T", "10", "32", + "MKK", "2.4G", "20M", "HT", "2T", "10", "32", + "FCC", "2.4G", "20M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "20M", "HT", "2T", "11", "32", + "MKK", "2.4G", "20M", "HT", "2T", "11", "32", + "FCC", "2.4G", "20M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "12", "32", + "MKK", "2.4G", "20M", "HT", "2T", "12", "32", + "FCC", "2.4G", "20M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "13", "32", + "MKK", "2.4G", "20M", "HT", "2T", "13", "32", + "FCC", "2.4G", "20M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", + "MKK", "2.4G", "20M", "HT", "2T", "14", "63", + "FCC", "2.4G", "40M", "HT", "1T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", + "MKK", "2.4G", "40M", "HT", "1T", "01", "63", + "FCC", "2.4G", "40M", "HT", "1T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", + "MKK", "2.4G", "40M", "HT", "1T", "02", "63", + "FCC", "2.4G", "40M", "HT", "1T", "03", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", + "MKK", "2.4G", "40M", "HT", "1T", "03", "32", + "FCC", "2.4G", "40M", "HT", "1T", "04", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", + "MKK", "2.4G", "40M", "HT", "1T", "04", "32", + "FCC", "2.4G", "40M", "HT", "1T", "05", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", + "MKK", "2.4G", "40M", "HT", "1T", "05", "32", + "FCC", "2.4G", "40M", "HT", "1T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", + "MKK", "2.4G", "40M", "HT", "1T", "06", "32", + "FCC", "2.4G", "40M", "HT", "1T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", + "MKK", "2.4G", "40M", "HT", "1T", "07", "32", + "FCC", "2.4G", "40M", "HT", "1T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", + "MKK", "2.4G", "40M", "HT", "1T", "08", "32", + "FCC", "2.4G", "40M", "HT", "1T", "09", "26", + "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", + "MKK", "2.4G", "40M", "HT", "1T", "09", "32", + "FCC", "2.4G", "40M", "HT", "1T", "10", "24", + "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", + "MKK", "2.4G", "40M", "HT", "1T", "10", "32", + "FCC", "2.4G", "40M", "HT", "1T", "11", "22", + "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", + "MKK", "2.4G", "40M", "HT", "1T", "11", "32", + "FCC", "2.4G", "40M", "HT", "1T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "12", "63", + "MKK", "2.4G", "40M", "HT", "1T", "12", "63", + "FCC", "2.4G", "40M", "HT", "1T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "13", "63", + "MKK", "2.4G", "40M", "HT", "1T", "13", "63", + "FCC", "2.4G", "40M", "HT", "1T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", + "MKK", "2.4G", "40M", "HT", "1T", "14", "63", + "FCC", "2.4G", "40M", "HT", "2T", "01", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", + "MKK", "2.4G", "40M", "HT", "2T", "01", "63", + "FCC", "2.4G", "40M", "HT", "2T", "02", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", + "MKK", "2.4G", "40M", "HT", "2T", "02", "63", + "FCC", "2.4G", "40M", "HT", "2T", "03", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", + "MKK", "2.4G", "40M", "HT", "2T", "03", "30", + "FCC", "2.4G", "40M", "HT", "2T", "04", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", + "MKK", "2.4G", "40M", "HT", "2T", "04", "30", + "FCC", "2.4G", "40M", "HT", "2T", "05", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", + "MKK", "2.4G", "40M", "HT", "2T", "05", "30", + "FCC", "2.4G", "40M", "HT", "2T", "06", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", + "MKK", "2.4G", "40M", "HT", "2T", "06", "30", + "FCC", "2.4G", "40M", "HT", "2T", "07", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", + "MKK", "2.4G", "40M", "HT", "2T", "07", "30", + "FCC", "2.4G", "40M", "HT", "2T", "08", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", + "MKK", "2.4G", "40M", "HT", "2T", "08", "30", + "FCC", "2.4G", "40M", "HT", "2T", "09", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", + "MKK", "2.4G", "40M", "HT", "2T", "09", "30", + "FCC", "2.4G", "40M", "HT", "2T", "10", "32", + "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", + "MKK", "2.4G", "40M", "HT", "2T", "10", "30", + "FCC", "2.4G", "40M", "HT", "2T", "11", "30", + "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", + "MKK", "2.4G", "40M", "HT", "2T", "11", "30", + "FCC", "2.4G", "40M", "HT", "2T", "12", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "12", "32", + "MKK", "2.4G", "40M", "HT", "2T", "12", "32", + "FCC", "2.4G", "40M", "HT", "2T", "13", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "13", "32", + "MKK", "2.4G", "40M", "HT", "2T", "13", "32", + "FCC", "2.4G", "40M", "HT", "2T", "14", "63", + "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", + "MKK", "2.4G", "40M", "HT", "2T", "14", "63", + "FCC", "5G", "20M", "OFDM", "1T", "36", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "36", "30", + "MKK", "5G", "20M", "OFDM", "1T", "36", "30", + "FCC", "5G", "20M", "OFDM", "1T", "40", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "40", "30", + "MKK", "5G", "20M", "OFDM", "1T", "40", "30", + "FCC", "5G", "20M", "OFDM", "1T", "44", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "44", "30", + "MKK", "5G", "20M", "OFDM", "1T", "44", "30", + "FCC", "5G", "20M", "OFDM", "1T", "48", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "48", "30", + "MKK", "5G", "20M", "OFDM", "1T", "48", "30", + "FCC", "5G", "20M", "OFDM", "1T", "52", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "52", "30", + "MKK", "5G", "20M", "OFDM", "1T", "52", "30", + "FCC", "5G", "20M", "OFDM", "1T", "56", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "56", "30", + "MKK", "5G", "20M", "OFDM", "1T", "56", "30", + "FCC", "5G", "20M", "OFDM", "1T", "60", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "60", "30", + "MKK", "5G", "20M", "OFDM", "1T", "60", "30", + "FCC", "5G", "20M", "OFDM", "1T", "64", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "64", "30", + "MKK", "5G", "20M", "OFDM", "1T", "64", "30", + "FCC", "5G", "20M", "OFDM", "1T", "100", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "100", "30", + "MKK", "5G", "20M", "OFDM", "1T", "100", "30", + "FCC", "5G", "20M", "OFDM", "1T", "104", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "104", "30", + "MKK", "5G", "20M", "OFDM", "1T", "104", "30", + "FCC", "5G", "20M", "OFDM", "1T", "108", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "108", "30", + "MKK", "5G", "20M", "OFDM", "1T", "108", "30", + "FCC", "5G", "20M", "OFDM", "1T", "112", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "112", "30", + "MKK", "5G", "20M", "OFDM", "1T", "112", "30", + "FCC", "5G", "20M", "OFDM", "1T", "116", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "116", "30", + "MKK", "5G", "20M", "OFDM", "1T", "116", "30", + "FCC", "5G", "20M", "OFDM", "1T", "120", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "120", "30", + "MKK", "5G", "20M", "OFDM", "1T", "120", "30", + "FCC", "5G", "20M", "OFDM", "1T", "124", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "124", "30", + "MKK", "5G", "20M", "OFDM", "1T", "124", "30", + "FCC", "5G", "20M", "OFDM", "1T", "128", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "128", "30", + "MKK", "5G", "20M", "OFDM", "1T", "128", "30", + "FCC", "5G", "20M", "OFDM", "1T", "132", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "132", "30", + "MKK", "5G", "20M", "OFDM", "1T", "132", "30", + "FCC", "5G", "20M", "OFDM", "1T", "136", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "136", "30", + "MKK", "5G", "20M", "OFDM", "1T", "136", "30", + "FCC", "5G", "20M", "OFDM", "1T", "140", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "140", "30", + "MKK", "5G", "20M", "OFDM", "1T", "140", "30", + "FCC", "5G", "20M", "OFDM", "1T", "149", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "149", "30", + "MKK", "5G", "20M", "OFDM", "1T", "149", "63", + "FCC", "5G", "20M", "OFDM", "1T", "153", "28", + "ETSI", "5G", "20M", "OFDM", "1T", "153", "30", + "MKK", "5G", "20M", "OFDM", "1T", "153", "63", + "FCC", "5G", "20M", "OFDM", "1T", "157", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "157", "30", + "MKK", "5G", "20M", "OFDM", "1T", "157", "63", + "FCC", "5G", "20M", "OFDM", "1T", "161", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "161", "30", + "MKK", "5G", "20M", "OFDM", "1T", "161", "63", + "FCC", "5G", "20M", "OFDM", "1T", "165", "32", + "ETSI", "5G", "20M", "OFDM", "1T", "165", "30", + "MKK", "5G", "20M", "OFDM", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "1T", "36", "32", + "ETSI", "5G", "20M", "HT", "1T", "36", "30", + "MKK", "5G", "20M", "HT", "1T", "36", "30", + "FCC", "5G", "20M", "HT", "1T", "40", "32", + "ETSI", "5G", "20M", "HT", "1T", "40", "30", + "MKK", "5G", "20M", "HT", "1T", "40", "30", + "FCC", "5G", "20M", "HT", "1T", "44", "32", + "ETSI", "5G", "20M", "HT", "1T", "44", "30", + "MKK", "5G", "20M", "HT", "1T", "44", "30", + "FCC", "5G", "20M", "HT", "1T", "48", "32", + "ETSI", "5G", "20M", "HT", "1T", "48", "30", + "MKK", "5G", "20M", "HT", "1T", "48", "30", + "FCC", "5G", "20M", "HT", "1T", "52", "32", + "ETSI", "5G", "20M", "HT", "1T", "52", "30", + "MKK", "5G", "20M", "HT", "1T", "52", "30", + "FCC", "5G", "20M", "HT", "1T", "56", "32", + "ETSI", "5G", "20M", "HT", "1T", "56", "30", + "MKK", "5G", "20M", "HT", "1T", "56", "30", + "FCC", "5G", "20M", "HT", "1T", "60", "32", + "ETSI", "5G", "20M", "HT", "1T", "60", "30", + "MKK", "5G", "20M", "HT", "1T", "60", "30", + "FCC", "5G", "20M", "HT", "1T", "64", "32", + "ETSI", "5G", "20M", "HT", "1T", "64", "30", + "MKK", "5G", "20M", "HT", "1T", "64", "30", + "FCC", "5G", "20M", "HT", "1T", "100", "28", + "ETSI", "5G", "20M", "HT", "1T", "100", "30", + "MKK", "5G", "20M", "HT", "1T", "100", "30", + "FCC", "5G", "20M", "HT", "1T", "104", "28", + "ETSI", "5G", "20M", "HT", "1T", "104", "30", + "MKK", "5G", "20M", "HT", "1T", "104", "30", + "FCC", "5G", "20M", "HT", "1T", "108", "28", + "ETSI", "5G", "20M", "HT", "1T", "108", "30", + "MKK", "5G", "20M", "HT", "1T", "108", "30", + "FCC", "5G", "20M", "HT", "1T", "112", "32", + "ETSI", "5G", "20M", "HT", "1T", "112", "30", + "MKK", "5G", "20M", "HT", "1T", "112", "30", + "FCC", "5G", "20M", "HT", "1T", "116", "32", + "ETSI", "5G", "20M", "HT", "1T", "116", "30", + "MKK", "5G", "20M", "HT", "1T", "116", "30", + "FCC", "5G", "20M", "HT", "1T", "120", "32", + "ETSI", "5G", "20M", "HT", "1T", "120", "30", + "MKK", "5G", "20M", "HT", "1T", "120", "30", + "FCC", "5G", "20M", "HT", "1T", "124", "32", + "ETSI", "5G", "20M", "HT", "1T", "124", "30", + "MKK", "5G", "20M", "HT", "1T", "124", "30", + "FCC", "5G", "20M", "HT", "1T", "128", "32", + "ETSI", "5G", "20M", "HT", "1T", "128", "30", + "MKK", "5G", "20M", "HT", "1T", "128", "30", + "FCC", "5G", "20M", "HT", "1T", "132", "32", + "ETSI", "5G", "20M", "HT", "1T", "132", "30", + "MKK", "5G", "20M", "HT", "1T", "132", "30", + "FCC", "5G", "20M", "HT", "1T", "136", "32", + "ETSI", "5G", "20M", "HT", "1T", "136", "30", + "MKK", "5G", "20M", "HT", "1T", "136", "30", + "FCC", "5G", "20M", "HT", "1T", "140", "32", + "ETSI", "5G", "20M", "HT", "1T", "140", "30", + "MKK", "5G", "20M", "HT", "1T", "140", "30", + "FCC", "5G", "20M", "HT", "1T", "149", "28", + "ETSI", "5G", "20M", "HT", "1T", "149", "30", + "MKK", "5G", "20M", "HT", "1T", "149", "63", + "FCC", "5G", "20M", "HT", "1T", "153", "28", + "ETSI", "5G", "20M", "HT", "1T", "153", "30", + "MKK", "5G", "20M", "HT", "1T", "153", "63", + "FCC", "5G", "20M", "HT", "1T", "157", "32", + "ETSI", "5G", "20M", "HT", "1T", "157", "30", + "MKK", "5G", "20M", "HT", "1T", "157", "63", + "FCC", "5G", "20M", "HT", "1T", "161", "32", + "ETSI", "5G", "20M", "HT", "1T", "161", "30", + "MKK", "5G", "20M", "HT", "1T", "161", "63", + "FCC", "5G", "20M", "HT", "1T", "165", "32", + "ETSI", "5G", "20M", "HT", "1T", "165", "30", + "MKK", "5G", "20M", "HT", "1T", "165", "63", + "FCC", "5G", "20M", "HT", "2T", "36", "28", + "ETSI", "5G", "20M", "HT", "2T", "36", "30", + "MKK", "5G", "20M", "HT", "2T", "36", "30", + "FCC", "5G", "20M", "HT", "2T", "40", "28", + "ETSI", "5G", "20M", "HT", "2T", "40", "30", + "MKK", "5G", "20M", "HT", "2T", "40", "30", + "FCC", "5G", "20M", "HT", "2T", "44", "28", + "ETSI", "5G", "20M", "HT", "2T", "44", "30", + "MKK", "5G", "20M", "HT", "2T", "44", "30", + "FCC", "5G", "20M", "HT", "2T", "48", "28", + "ETSI", "5G", "20M", "HT", "2T", "48", "30", + "MKK", "5G", "20M", "HT", "2T", "48", "30", + "FCC", "5G", "20M", "HT", "2T", "52", "34", + "ETSI", "5G", "20M", "HT", "2T", "52", "30", + "MKK", "5G", "20M", "HT", "2T", "52", "30", + "FCC", "5G", "20M", "HT", "2T", "56", "32", + "ETSI", "5G", "20M", "HT", "2T", "56", "30", + "MKK", "5G", "20M", "HT", "2T", "56", "30", + "FCC", "5G", "20M", "HT", "2T", "60", "30", + "ETSI", "5G", "20M", "HT", "2T", "60", "30", + "MKK", "5G", "20M", "HT", "2T", "60", "30", + "FCC", "5G", "20M", "HT", "2T", "64", "26", + "ETSI", "5G", "20M", "HT", "2T", "64", "30", + "MKK", "5G", "20M", "HT", "2T", "64", "30", + "FCC", "5G", "20M", "HT", "2T", "100", "28", + "ETSI", "5G", "20M", "HT", "2T", "100", "30", + "MKK", "5G", "20M", "HT", "2T", "100", "30", + "FCC", "5G", "20M", "HT", "2T", "104", "28", + "ETSI", "5G", "20M", "HT", "2T", "104", "30", + "MKK", "5G", "20M", "HT", "2T", "104", "30", + "FCC", "5G", "20M", "HT", "2T", "108", "30", + "ETSI", "5G", "20M", "HT", "2T", "108", "30", + "MKK", "5G", "20M", "HT", "2T", "108", "30", + "FCC", "5G", "20M", "HT", "2T", "112", "32", + "ETSI", "5G", "20M", "HT", "2T", "112", "30", + "MKK", "5G", "20M", "HT", "2T", "112", "30", + "FCC", "5G", "20M", "HT", "2T", "116", "32", + "ETSI", "5G", "20M", "HT", "2T", "116", "30", + "MKK", "5G", "20M", "HT", "2T", "116", "30", + "FCC", "5G", "20M", "HT", "2T", "120", "34", + "ETSI", "5G", "20M", "HT", "2T", "120", "30", + "MKK", "5G", "20M", "HT", "2T", "120", "30", + "FCC", "5G", "20M", "HT", "2T", "124", "32", + "ETSI", "5G", "20M", "HT", "2T", "124", "30", + "MKK", "5G", "20M", "HT", "2T", "124", "30", + "FCC", "5G", "20M", "HT", "2T", "128", "30", + "ETSI", "5G", "20M", "HT", "2T", "128", "30", + "MKK", "5G", "20M", "HT", "2T", "128", "30", + "FCC", "5G", "20M", "HT", "2T", "132", "28", + "ETSI", "5G", "20M", "HT", "2T", "132", "30", + "MKK", "5G", "20M", "HT", "2T", "132", "30", + "FCC", "5G", "20M", "HT", "2T", "136", "28", + "ETSI", "5G", "20M", "HT", "2T", "136", "30", + "MKK", "5G", "20M", "HT", "2T", "136", "30", + "FCC", "5G", "20M", "HT", "2T", "140", "26", + "ETSI", "5G", "20M", "HT", "2T", "140", "30", + "MKK", "5G", "20M", "HT", "2T", "140", "30", + "FCC", "5G", "20M", "HT", "2T", "149", "34", + "ETSI", "5G", "20M", "HT", "2T", "149", "30", + "MKK", "5G", "20M", "HT", "2T", "149", "63", + "FCC", "5G", "20M", "HT", "2T", "153", "34", + "ETSI", "5G", "20M", "HT", "2T", "153", "30", + "MKK", "5G", "20M", "HT", "2T", "153", "63", + "FCC", "5G", "20M", "HT", "2T", "157", "34", + "ETSI", "5G", "20M", "HT", "2T", "157", "30", + "MKK", "5G", "20M", "HT", "2T", "157", "63", + "FCC", "5G", "20M", "HT", "2T", "161", "34", + "ETSI", "5G", "20M", "HT", "2T", "161", "30", + "MKK", "5G", "20M", "HT", "2T", "161", "63", + "FCC", "5G", "20M", "HT", "2T", "165", "34", + "ETSI", "5G", "20M", "HT", "2T", "165", "30", + "MKK", "5G", "20M", "HT", "2T", "165", "63", + "FCC", "5G", "40M", "HT", "1T", "38", "26", + "ETSI", "5G", "40M", "HT", "1T", "38", "30", + "MKK", "5G", "40M", "HT", "1T", "38", "30", + "FCC", "5G", "40M", "HT", "1T", "46", "32", + "ETSI", "5G", "40M", "HT", "1T", "46", "30", + "MKK", "5G", "40M", "HT", "1T", "46", "30", + "FCC", "5G", "40M", "HT", "1T", "54", "32", + "ETSI", "5G", "40M", "HT", "1T", "54", "30", + "MKK", "5G", "40M", "HT", "1T", "54", "30", + "FCC", "5G", "40M", "HT", "1T", "62", "24", + "ETSI", "5G", "40M", "HT", "1T", "62", "30", + "MKK", "5G", "40M", "HT", "1T", "62", "30", + "FCC", "5G", "40M", "HT", "1T", "102", "24", + "ETSI", "5G", "40M", "HT", "1T", "102", "30", + "MKK", "5G", "40M", "HT", "1T", "102", "30", + "FCC", "5G", "40M", "HT", "1T", "110", "28", + "ETSI", "5G", "40M", "HT", "1T", "110", "30", + "MKK", "5G", "40M", "HT", "1T", "110", "30", + "FCC", "5G", "40M", "HT", "1T", "118", "28", + "ETSI", "5G", "40M", "HT", "1T", "118", "30", + "MKK", "5G", "40M", "HT", "1T", "118", "30", + "FCC", "5G", "40M", "HT", "1T", "126", "28", + "ETSI", "5G", "40M", "HT", "1T", "126", "30", + "MKK", "5G", "40M", "HT", "1T", "126", "30", + "FCC", "5G", "40M", "HT", "1T", "134", "32", + "ETSI", "5G", "40M", "HT", "1T", "134", "30", + "MKK", "5G", "40M", "HT", "1T", "134", "30", + "FCC", "5G", "40M", "HT", "1T", "151", "28", + "ETSI", "5G", "40M", "HT", "1T", "151", "30", + "MKK", "5G", "40M", "HT", "1T", "151", "63", + "FCC", "5G", "40M", "HT", "1T", "159", "32", + "ETSI", "5G", "40M", "HT", "1T", "159", "30", + "MKK", "5G", "40M", "HT", "1T", "159", "63", + "FCC", "5G", "40M", "HT", "2T", "38", "28", + "ETSI", "5G", "40M", "HT", "2T", "38", "30", + "MKK", "5G", "40M", "HT", "2T", "38", "30", + "FCC", "5G", "40M", "HT", "2T", "46", "28", + "ETSI", "5G", "40M", "HT", "2T", "46", "30", + "MKK", "5G", "40M", "HT", "2T", "46", "30", + "FCC", "5G", "40M", "HT", "2T", "54", "30", + "ETSI", "5G", "40M", "HT", "2T", "54", "30", + "MKK", "5G", "40M", "HT", "2T", "54", "30", + "FCC", "5G", "40M", "HT", "2T", "62", "30", + "ETSI", "5G", "40M", "HT", "2T", "62", "30", + "MKK", "5G", "40M", "HT", "2T", "62", "30", + "FCC", "5G", "40M", "HT", "2T", "102", "26", + "ETSI", "5G", "40M", "HT", "2T", "102", "30", + "MKK", "5G", "40M", "HT", "2T", "102", "30", + "FCC", "5G", "40M", "HT", "2T", "110", "30", + "ETSI", "5G", "40M", "HT", "2T", "110", "30", + "MKK", "5G", "40M", "HT", "2T", "110", "30", + "FCC", "5G", "40M", "HT", "2T", "118", "34", + "ETSI", "5G", "40M", "HT", "2T", "118", "30", + "MKK", "5G", "40M", "HT", "2T", "118", "30", + "FCC", "5G", "40M", "HT", "2T", "126", "32", + "ETSI", "5G", "40M", "HT", "2T", "126", "30", + "MKK", "5G", "40M", "HT", "2T", "126", "30", + "FCC", "5G", "40M", "HT", "2T", "134", "30", + "ETSI", "5G", "40M", "HT", "2T", "134", "30", + "MKK", "5G", "40M", "HT", "2T", "134", "30", + "FCC", "5G", "40M", "HT", "2T", "151", "34", + "ETSI", "5G", "40M", "HT", "2T", "151", "30", + "MKK", "5G", "40M", "HT", "2T", "151", "63", + "FCC", "5G", "40M", "HT", "2T", "159", "34", + "ETSI", "5G", "40M", "HT", "2T", "159", "30", + "MKK", "5G", "40M", "HT", "2T", "159", "63", + "FCC", "5G", "80M", "VHT", "1T", "42", "22", + "ETSI", "5G", "80M", "VHT", "1T", "42", "30", + "MKK", "5G", "80M", "VHT", "1T", "42", "30", + "FCC", "5G", "80M", "VHT", "1T", "58", "20", + "ETSI", "5G", "80M", "VHT", "1T", "58", "30", + "MKK", "5G", "80M", "VHT", "1T", "58", "30", + "FCC", "5G", "80M", "VHT", "1T", "106", "20", + "ETSI", "5G", "80M", "VHT", "1T", "106", "30", + "MKK", "5G", "80M", "VHT", "1T", "106", "30", + "FCC", "5G", "80M", "VHT", "1T", "122", "20", + "ETSI", "5G", "80M", "VHT", "1T", "122", "30", + "MKK", "5G", "80M", "VHT", "1T", "122", "30", + "FCC", "5G", "80M", "VHT", "1T", "155", "28", + "ETSI", "5G", "80M", "VHT", "1T", "155", "30", + "MKK", "5G", "80M", "VHT", "1T", "155", "63", + "FCC", "5G", "80M", "VHT", "2T", "42", "28", + "ETSI", "5G", "80M", "VHT", "2T", "42", "30", + "MKK", "5G", "80M", "VHT", "2T", "42", "30", + "FCC", "5G", "80M", "VHT", "2T", "58", "26", + "ETSI", "5G", "80M", "VHT", "2T", "58", "30", + "MKK", "5G", "80M", "VHT", "2T", "58", "30", + "FCC", "5G", "80M", "VHT", "2T", "106", "28", + "ETSI", "5G", "80M", "VHT", "2T", "106", "30", + "MKK", "5G", "80M", "VHT", "2T", "106", "30", + "FCC", "5G", "80M", "VHT", "2T", "122", "32", + "ETSI", "5G", "80M", "VHT", "2T", "122", "30", + "MKK", "5G", "80M", "VHT", "2T", "122", "30", + "FCC", "5G", "80M", "VHT", "2T", "155", "34", + "ETSI", "5G", "80M", "VHT", "2T", "155", "30", + "MKK", "5G", "80M", "VHT", "2T", "155", "63" +}; + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_8mm( + struct dm_struct *dm +) +{ + u32 i = 0; + u32 array_len = sizeof(array_mp_8821a_txpwr_lmt_8821a_sar_8mm) / sizeof(u8 *); + u8 **array = (u8 **)array_mp_8821a_txpwr_lmt_8821a_sar_8mm; + +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + void *adapter = dm->adapter; + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); + + PlatformZeroMemory(hal_data->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT); + hal_data->nLinesReadPwrLmt = array_len / 7; +#endif + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_8mm\n"); + + for (i = 0; i < array_len; i += 7) { + u8 *regulation = array[i]; + u8 *band = array[i + 1]; + u8 *bandwidth = array[i + 2]; + u8 *rate = array[i + 3]; + u8 *rf_path = array[i + 4]; + u8 *chnl = array[i + 5]; + u8 *val = array[i + 6]; + + odm_config_bb_txpwr_lmt_8821a(dm, regulation, band, bandwidth, rate, rf_path, chnl, val); +#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) + rsprintf((char *)hal_data->BufOfLinesPwrLmt[i / 7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", + regulation, band, bandwidth, rate, rf_path, chnl, val); +#endif + } + +} + +#endif /* end of HWIMG_SUPPORT*/ diff --git a/hal/phydm/rtl8821a/halhwimg8821a_rf.h b/hal/phydm/rtl8821a/halhwimg8821a_rf.h new file mode 100644 index 0000000..e630f7c --- /dev/null +++ b/hal/phydm/rtl8821a/halhwimg8821a_rf.h @@ -0,0 +1,143 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/*Image2HeaderVersion: 2.18*/ +#if (RTL8821A_SUPPORT == 1) +#ifndef __INC_MP_RF_HW_IMG_8821A_H +#define __INC_MP_RF_HW_IMG_8821A_H + + +/****************************************************************************** +* RadioA.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_radioa(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_radioa(void); + +/****************************************************************************** +* TxPowerTrack_AP.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpowertrack_ap(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpowertrack_ap(void); + +/****************************************************************************** +* TxPowerTrack_PCIE.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpowertrack_pcie(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpowertrack_pcie(void); + +/****************************************************************************** +* TxPowerTrack_SDIO.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpowertrack_sdio(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpowertrack_sdio(void); + +/****************************************************************************** +* TxPowerTrack_USB.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpowertrack_usb(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpowertrack_usb(void); + +/****************************************************************************** +* TXPWR_LMT_8811AU_FEM.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8811a_u_fem(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8811a_u_fem(void); + +/****************************************************************************** +* TXPWR_LMT_8811AU_IPA.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8811a_u_ipa(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8811a_u_ipa(void); + +/****************************************************************************** +* TXPWR_LMT_8821A.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8821a(void); + +/****************************************************************************** +* TXPWR_LMT_8821A_E202SA.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_e202sa(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8821a_e202sa(void); + +/****************************************************************************** +* TXPWR_LMT_8821A_SAR_13dBm.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_13_dbm(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8821a_sar_13_dbm(void); + +/****************************************************************************** +* TXPWR_LMT_8821A_SAR_5mm.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_5mm(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8821a_sar_5mm(void); + +/****************************************************************************** +* TXPWR_LMT_8821A_SAR_8mm.TXT +******************************************************************************/ + +void +odm_read_and_config_mp_8821a_txpwr_lmt_8821a_sar_8mm(/* TC: Test Chip, MP: MP Chip*/ + struct dm_struct *dm +); +u32 odm_get_version_mp_8821a_txpwr_lmt_8821a_sar_8mm(void); + +#endif +#endif /* end of HWIMG_SUPPORT*/ diff --git a/hal/phydm/rtl8821a/phydm_regconfig8821a.c b/hal/phydm/rtl8821a/phydm_regconfig8821a.c new file mode 100644 index 0000000..aa96ac7 --- /dev/null +++ b/hal/phydm/rtl8821a/phydm_regconfig8821a.c @@ -0,0 +1,206 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +#include "mp_precomp.h" +#include "../phydm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) + +void +odm_config_rf_reg_8821a( + struct dm_struct *dm, + u32 addr, + u32 data, + enum rf_path RF_PATH, + u32 reg_addr +) +{ + if (addr == 0xfe || addr == 0xffe) { +#ifdef CONFIG_LONG_DELAY_ISSUE + ODM_sleep_ms(50); +#else + ODM_delay_ms(50); +#endif + } else if (addr == 0xfd) + ODM_delay_ms(5); + else if (addr == 0xfc) + ODM_delay_ms(1); + else if (addr == 0xfb) + ODM_delay_us(50); + else if (addr == 0xfa) + ODM_delay_us(5); + else if (addr == 0xf9) + ODM_delay_us(1); + else { + odm_set_rf_reg(dm, RF_PATH, reg_addr, RFREGOFFSETMASK, data); + /* Add 1us delay between BB/RF register setting. */ + ODM_delay_us(1); + } +} + + +void +odm_config_rf_radio_a_8821a( + struct dm_struct *dm, + u32 addr, + u32 data +) +{ + u32 content = 0x1000; /* RF_Content: radioa_txt */ + u32 maskfor_phy_set = (u32)(content & 0xE000); + + odm_config_rf_reg_8821a(dm, addr, data, RF_PATH_A, addr | maskfor_phy_set); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_config_rf_with_header_file: [RadioA] %08X %08X\n", addr, data); +} + +/* 8821 no RF B */ +#if 0 +void +odm_config_rf_radio_b_8821a( + struct dm_struct *dm, + u32 addr, + u32 data +) +{ + u32 content = 0x1001; /* RF_Content: radiob_txt */ + u32 maskfor_phy_set = (u32)(content & 0xE000); + + odm_config_rf_reg_8812a(dm, addr, data, RF_PATH_B, addr | maskfor_phy_set); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_config_rf_with_header_file: [RadioB] %08X %08X\n", addr, data); + +} +#endif + +void +odm_config_mac_8821a( + struct dm_struct *dm, + u32 addr, + u8 data +) +{ + odm_write_1byte(dm, addr, data); + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_config_mac_with_header_file: [MAC_REG] %08X %08X\n", addr, data); +} + +void +odm_config_bb_agc_8821a( + struct dm_struct *dm, + u32 addr, + u32 bitmask, + u32 data +) +{ + odm_set_bb_reg(dm, addr, bitmask, data); + /* Add 1us delay between BB/RF register setting. */ + ODM_delay_us(1); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_config_bb_with_header_file: [AGC_TAB] %08X %08X\n", addr, data); +} + +void +odm_config_bb_phy_reg_pg_8821a( + struct dm_struct *dm, + u32 band, + u32 rf_path, + u32 tx_num, + u32 addr, + u32 bitmask, + u32 data +) +{ + if (addr == 0xfe) +#ifdef CONFIG_LONG_DELAY_ISSUE + ODM_sleep_ms(50); +#else + ODM_delay_ms(50); +#endif + else if (addr == 0xfd) + ODM_delay_ms(5); + else if (addr == 0xfc) + ODM_delay_ms(1); + else if (addr == 0xfb) + ODM_delay_us(50); + else if (addr == 0xfa) + ODM_delay_us(5); + else if (addr == 0xf9) + ODM_delay_us(1); + + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_config_bb_with_header_file: [PHY_REG] %08X %08X %08X\n", addr, bitmask, data); + +#if (DM_ODM_SUPPORT_TYPE & ODM_CE) + phy_store_tx_power_by_rate(dm->adapter, band, rf_path, tx_num, addr, bitmask, data); +#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) + PHY_StoreTxPowerByRate((PADAPTER)dm->adapter, band, rf_path, tx_num, addr, bitmask, data); +#endif + +} + +void +odm_config_bb_phy_8821a( + struct dm_struct *dm, + u32 addr, + u32 bitmask, + u32 data +) +{ + if (addr == 0xfe) +#ifdef CONFIG_LONG_DELAY_ISSUE + ODM_sleep_ms(50); +#else + ODM_delay_ms(50); +#endif + else if (addr == 0xfd) + ODM_delay_ms(5); + else if (addr == 0xfc) + ODM_delay_ms(1); + else if (addr == 0xfb) + ODM_delay_us(50); + else if (addr == 0xfa) + ODM_delay_us(5); + else if (addr == 0xf9) + ODM_delay_us(1); + else if (addr == 0xa24) + dm->rf_calibrate_info.rega24 = data; + odm_set_bb_reg(dm, addr, bitmask, data); + + /* Add 1us delay between BB/RF register setting. */ + ODM_delay_us(1); + PHYDM_DBG(dm, ODM_COMP_INIT, "===> odm_config_bb_with_header_file: [PHY_REG] %08X %08X\n", addr, data); +} + +void +odm_config_bb_txpwr_lmt_8821a( + struct dm_struct *dm, + u8 *regulation, + u8 *band, + u8 *bandwidth, + u8 *rate_section, + u8 *rf_path, + u8 *channel, + u8 *power_limit +) +{ +#if (DM_ODM_SUPPORT_TYPE & ODM_CE) + phy_set_tx_power_limit(dm, regulation, band, + bandwidth, rate_section, rf_path, channel, power_limit); +#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) + PHY_SetTxPowerLimit(dm, regulation, band, + bandwidth, rate_section, rf_path, channel, power_limit); +#endif +} + +#endif /* #if (RTL8821A_SUPPORT == 1)*/ diff --git a/hal/phydm/rtl8821a/phydm_regconfig8821a.h b/hal/phydm/rtl8821a/phydm_regconfig8821a.h new file mode 100644 index 0000000..cf5eeeb --- /dev/null +++ b/hal/phydm/rtl8821a/phydm_regconfig8821a.h @@ -0,0 +1,90 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ +#ifndef __INC_ODM_REGCONFIG_H_8821A +#define __INC_ODM_REGCONFIG_H_8821A + +#if (RTL8821A_SUPPORT == 1) + +void +odm_config_rf_reg_8821a( + struct dm_struct *dm, + u32 addr, + u32 data, + enum rf_path RF_PATH, + u32 reg_addr +); + +void +odm_config_rf_radio_a_8821a( + struct dm_struct *dm, + u32 addr, + u32 data +); + +void +odm_config_rf_radio_b_8821a( + struct dm_struct *dm, + u32 addr, + u32 data +); + +void +odm_config_mac_8821a( + struct dm_struct *dm, + u32 addr, + u8 data +); + +void +odm_config_bb_agc_8821a( + struct dm_struct *dm, + u32 addr, + u32 bitmask, + u32 data +); + +void +odm_config_bb_phy_reg_pg_8821a( + struct dm_struct *dm, + u32 band, + u32 rf_path, + u32 tx_num, + u32 addr, + u32 bitmask, + u32 data +); + +void +odm_config_bb_phy_8821a( + struct dm_struct *dm, + u32 addr, + u32 bitmask, + u32 data +); + +void +odm_config_bb_txpwr_lmt_8821a( + struct dm_struct *dm, + u8 *regulation, + u8 *band, + u8 *bandwidth, + u8 *rate_section, + u8 *rf_path, + u8 *channel, + u8 *power_limit +); + +#endif +#endif /* end of SUPPORT */ diff --git a/hal/phydm/rtl8821a/phydm_rtl8821a.c b/hal/phydm/rtl8821a/phydm_rtl8821a.c new file mode 100644 index 0000000..5de0754 --- /dev/null +++ b/hal/phydm/rtl8821a/phydm_rtl8821a.c @@ -0,0 +1,129 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ + +/* ************************************************************ + * include files + * ************************************************************ */ + +#include "mp_precomp.h" + +#include "../phydm_precomp.h" + +#if (RTL8821A_SUPPORT == 1) +s8 phydm_cck_rssi_8821a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx) +{ + s8 rx_pwr_all = 0; + + switch (lna_idx) { + case 7: + if (vga_idx <= 27) + rx_pwr_all = -94 + 2 * (27 - vga_idx); + else + rx_pwr_all = -94; + break; + case 6: + rx_pwr_all = -42 + 2 * (2 - vga_idx); + break; + case 5: + rx_pwr_all = -36 + 2 * (7 - vga_idx); + break; + case 4: + rx_pwr_all = -30 + 2 * (7 - vga_idx); + break; + case 3: + rx_pwr_all = -18 + 2 * (7 - vga_idx); + break; + case 2: + rx_pwr_all = 2 * (5 - vga_idx); + break; + case 1: + rx_pwr_all = 14 - 2 * vga_idx; + break; + case 0: + rx_pwr_all = 20 - 2 * vga_idx; + break; + default: + break; + } + + return rx_pwr_all; +} + +void +phydm_set_ext_band_switch_8821A( + void *dm_void, + u32 band +) +{ + struct dm_struct *dm = (struct dm_struct *)dm_void; + + /*Output Pin Settings*/ + odm_set_mac_reg(dm, 0x4C, BIT(23), 0); /*select DPDT_P and DPDT_N as output pin*/ + odm_set_mac_reg(dm, 0x4C, BIT(24), 1); /*by WLAN control*/ + + odm_set_bb_reg(dm, 0xCB4, 0xF, 7); /*DPDT_P = 1b'0*/ + odm_set_bb_reg(dm, 0xCB4, 0xF0, 7); /*DPDT_N = 1b'0*/ + + if (band == ODM_BAND_2_4G) { + odm_set_bb_reg(dm, 0xCB4, (BIT(29) | BIT(28)), 1); + PHYDM_DBG(dm, DBG_ANT_DIV, "***8821A set band switch = 2b'01\n"); + } else { + odm_set_bb_reg(dm, 0xCB4, BIT(29) | BIT(28), 2); + PHYDM_DBG(dm, DBG_ANT_DIV, "***8821A set band switch = 2b'10\n"); + } +} + + +void +odm_dynamic_try_state_agg_8821a( + struct dm_struct *dm +) +{ + if ((dm->support_ic_type & ODM_RTL8821) && (dm->support_interface == ODM_ITRF_USB)) { + if (dm->rssi_min > 25) + odm_write_1byte(dm, 0x4CF, 0x02); + else if (dm->rssi_min < 20) + odm_write_1byte(dm, 0x4CF, 0x00); + } +} + +void +odm_dynamic_packet_detection_th_8821a( + struct dm_struct *dm +) +{ + if (dm->support_ic_type & ODM_RTL8821) { + if (dm->rssi_min <= 25) { + /*odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, MASKDWORD, 0x2aaaf1a8);*/ + odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, 0x1ff0, 0x11a); + odm_set_bb_reg(dm, REG_BW_INDICATION_JAGUAR, BIT(26), 1); + } else if (dm->rssi_min >= 30) { + /*odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, MASKDWORD, 0x2aaaeec8);*/ + odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, 0x1ff0, 0xec); + odm_set_bb_reg(dm, REG_BW_INDICATION_JAGUAR, BIT(26), 0); + } + } +} + +void +odm_hw_setting_8821a( + struct dm_struct *dm +) +{ + odm_dynamic_try_state_agg_8821a(dm); + odm_dynamic_packet_detection_th_8821a(dm); +} + +#endif /* #if (RTL8821A_SUPPORT == 1) */ diff --git a/hal/phydm/rtl8821a/phydm_rtl8821a.h b/hal/phydm/rtl8821a/phydm_rtl8821a.h new file mode 100644 index 0000000..2886fdc --- /dev/null +++ b/hal/phydm/rtl8821a/phydm_rtl8821a.h @@ -0,0 +1,31 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ +#ifndef __ODM_RTL8821A_H__ +#define __ODM_RTL8821A_H__ + +s8 phydm_cck_rssi_8821a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx); + +void +phydm_set_ext_band_switch_8821A( + void *dm_void, + u32 band +); + +void +odm_hw_setting_8821a( + struct dm_struct *dm +); + +#endif diff --git a/hal/phydm/rtl8821a/version_rtl8821a.h b/hal/phydm/rtl8821a/version_rtl8821a.h new file mode 100644 index 0000000..63b4ec9 --- /dev/null +++ b/hal/phydm/rtl8821a/version_rtl8821a.h @@ -0,0 +1,24 @@ +/****************************************************************************** + * + * Copyright(c) 2016 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ +/*RTL8821A PHY Parameters*/ +/* +[Caution] + Since 01/Aug/2015, the commit rules will be simplified. + You do not need to fill up the version.h anymore, + only the maintenance supervisor fills it before formal release. +*/ +#define RELEASE_DATE_8821A 20150920 +#define COMMIT_BY_8821A "BB_LUKE" +#define RELEASE_VERSION_8821A 59 diff --git a/hal/rtl8812a/rtl8812a_phycfg.c b/hal/rtl8812a/rtl8812a_phycfg.c index 027c179..164d697 100644 --- a/hal/rtl8812a/rtl8812a_phycfg.c +++ b/hal/rtl8812a/rtl8812a_phycfg.c @@ -473,6 +473,8 @@ PHY_GetTxPowerLevel8812( OUT s32 *powerlevel ) { + /*HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + *powerlevel = pHalData->CurrentTxPwrIdx;*/ #if 0 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); diff --git a/hal/rtl8812a/usb/usb_halinit.c b/hal/rtl8812a/usb/usb_halinit.c index c0c7880..37d6cec 100644 --- a/hal/rtl8812a/usb/usb_halinit.c +++ b/hal/rtl8812a/usb/usb_halinit.c @@ -1055,7 +1055,7 @@ usb_AggSettingRxUpdate_8812A( /* Adjust DMA page and thresh. */ temp = pHalData->rxagg_dma_size | (pHalData->rxagg_dma_timeout << 8); rtw_write16(Adapter, REG_RXDMA_AGG_PG_TH, temp); - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH + 3, BIT(7)); /* for dma agg , 0x280[31]¡GBIT_RXDMA_AGG_OLD_MOD, set 1 */ + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH + 3, BIT(7)); /* for dma agg , 0x280[31]GBIT_RXDMA_AGG_OLD_MOD, set 1 */ } break; case RX_AGG_USB: diff --git a/hal/rtl8814a/Hal8814PwrSeq.c b/hal/rtl8814a/Hal8814PwrSeq.c new file mode 100644 index 0000000..c11a36e --- /dev/null +++ b/hal/rtl8814a/Hal8814PwrSeq.c @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * 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 "Hal8814PwrSeq.h" +#include + +/* + drivers should parse below arrays and do the corresponding actions +*/ +//3 Power on Array +WLAN_PWR_CFG rtl8814A_power_on_flow[RTL8814A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_CARDEMU_TO_ACT + RTL8814A_TRANS_END +}; + +//3Radio off GPIO Array +WLAN_PWR_CFG rtl8814A_radio_off_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_ACT_TO_CARDEMU + RTL8814A_TRANS_END +}; + +//3Card Disable Array +WLAN_PWR_CFG rtl8814A_card_disable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_ACT_TO_CARDEMU + RTL8814A_TRANS_CARDEMU_TO_CARDDIS + RTL8814A_TRANS_END +}; + +//3 Card Enable Array +WLAN_PWR_CFG rtl8814A_card_enable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_CARDDIS_TO_CARDEMU + RTL8814A_TRANS_CARDEMU_TO_ACT + RTL8814A_TRANS_END +}; + +//3Suspend Array +WLAN_PWR_CFG rtl8814A_suspend_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_ACT_TO_CARDEMU + RTL8814A_TRANS_CARDEMU_TO_SUS + RTL8814A_TRANS_END +}; + +//3 Resume Array +WLAN_PWR_CFG rtl8814A_resume_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_SUS_TO_CARDEMU + RTL8814A_TRANS_CARDEMU_TO_ACT + RTL8814A_TRANS_END +}; + + + +//3HWPDN Array +WLAN_PWR_CFG rtl8814A_hwpdn_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + RTL8814A_TRANS_ACT_TO_CARDEMU + RTL8814A_TRANS_CARDEMU_TO_PDN + RTL8814A_TRANS_END +}; + +//3 Enter LPS +WLAN_PWR_CFG rtl8814A_enter_lps_flow[RTL8814A_TRANS_ACT_TO_LPS_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + //FW behavior + RTL8814A_TRANS_ACT_TO_LPS + RTL8814A_TRANS_END +}; + +//3 Leave LPS +WLAN_PWR_CFG rtl8814A_leave_lps_flow[RTL8814A_TRANS_LPS_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS]= +{ + //FW behavior + RTL8814A_TRANS_LPS_TO_ACT + RTL8814A_TRANS_END +}; + diff --git a/hal/rtl8814a/hal8814a_fw.c b/hal/rtl8814a/hal8814a_fw.c new file mode 100644 index 0000000..fb01dd8 --- /dev/null +++ b/hal/rtl8814a/hal8814a_fw.c @@ -0,0 +1,7741 @@ +/****************************************************************************** +* +* 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 "drv_types.h" + +#if (RTL8814A_SUPPORT == 1) +#if(DM_ODM_SUPPORT_TYPE & (ODM_AP)) + + +u8 array_mp_8814a_fw_ap[] = { +0x14, 0x88, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x42, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x1C, 0x13, 0x30, 0xDF, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x80, 0xE8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x68, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x80, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x80, 0xF9, 0x02, 0x00, 0x80, +0x09, 0x03, 0x00, 0x80, 0x19, 0x03, 0x00, 0x80, 0x29, 0x03, 0x00, 0x80, 0x39, 0x03, 0x00, 0x80, +0x49, 0x03, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, +0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, +0x35, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x06, 0x09, 0x0C, 0x12, +0x18, 0x24, 0x30, 0x36, 0x01, 0x02, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, +0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, +0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, +0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, +0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, +0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, +0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, +0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, +0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, +0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, +0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x31, 0x18, +0x0A, 0x00, 0x00, 0x30, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x06, 0x06, 0x08, 0x08, 0x09, 0x09, +0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, +0x05, 0x08, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x20, 0x04, 0x06, 0x08, 0x0A, 0x10, 0x18, 0x18, 0x20, +0x03, 0x05, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x24, 0x2A, 0x2C, 0x05, 0x07, 0x09, 0x0A, 0x10, 0x14, +0x1C, 0x28, 0x2C, 0x30, 0x06, 0x08, 0x0A, 0x0C, 0x12, 0x18, 0x1E, 0x30, 0x38, 0x42, 0x0A, 0x0C, +0x0C, 0x12, 0x16, 0x1C, 0x20, 0x24, 0x24, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x04, 0x06, 0x07, +0x08, 0x0A, 0x0B, 0x0C, 0x03, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, +0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x03, 0x05, +0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, +0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x01, 0x02, 0x03, 0x06, +0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x2C, 0x2D, 0xFF, 0xFF, 0x2E, 0xFF, 0xFF, 0x37, 0x2F, +0xFF, 0x41, 0x38, 0x30, 0x39, 0x42, 0x31, 0x42, 0x3A, 0x32, 0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, +0x3A, 0x44, 0x35, 0x44, 0x3B, 0xFF, 0x37, 0x2E, 0x40, 0x38, 0x30, 0x41, 0x39, 0x42, 0x31, 0x3A, +0x43, 0x32, 0x3B, 0x43, 0x35, 0x3C, 0x44, 0xFF, 0x3D, 0x45, 0xFF, 0x3E, 0x45, 0xFF, 0x45, 0x3F, +0xFF, 0x46, 0xFF, 0xFF, 0x37, 0x41, 0x2F, 0x39, 0x42, 0x31, 0x43, 0x3A, 0x33, 0x44, 0x3B, 0x35, +0x45, 0x3D, 0xFF, 0x46, 0x47, 0x3E, 0x47, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0x49, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x14, 0xFF, 0x15, 0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x10, 0xFF, +0x17, 0x1E, 0x11, 0x1E, 0x18, 0x12, 0x1F, 0x18, 0x13, 0x18, 0x1F, 0xFF, 0x15, 0x0E, 0xFF, 0x16, +0x1D, 0x10, 0x17, 0x1E, 0x10, 0x18, 0x1E, 0x11, 0x19, 0x1F, 0xFF, 0x1A, 0x20, 0xFF, 0x21, 0x1B, +0xFF, 0x21, 0xFF, 0xFF, 0x15, 0x13, 0x0F, 0x17, 0x1E, 0x11, 0x18, 0x1F, 0x13, 0x20, 0x19, 0xFF, +0x21, 0x1B, 0xFF, 0x22, 0xFF, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, +0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x04, 0x04, 0x04, 0x2C, 0xFF, 0xFF, 0x2D, 0xFF, +0xFF, 0x2E, 0x37, 0xFF, 0x38, 0x41, 0x2F, 0x39, 0x42, 0x30, 0x43, 0x39, 0x31, 0x42, 0x39, 0x32, +0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, 0x2D, 0xFF, 0xFF, 0x36, 0x2E, 0xFF, 0x37, 0x2F, 0x40, 0x38, +0x30, 0x41, 0x42, 0x33, 0x39, 0x43, 0x35, 0x3A, 0x3B, 0x43, 0x34, 0x44, 0x3C, 0x3B, 0x45, 0x3D, +0x3C, 0x45, 0x3E, 0x3D, 0x37, 0x2E, 0xFF, 0x38, 0x2F, 0x40, 0x39, 0x31, 0x41, 0x3A, 0x42, 0xFF, +0x43, 0x3B, 0xFF, 0x44, 0x3C, 0xFF, 0x45, 0x3D, 0x3C, 0x46, 0x3F, 0x45, 0x47, 0x46, 0x45, 0x48, +0x47, 0x47, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0x0D, 0x14, 0xFF, 0x0E, 0x15, 0xFF, +0x16, 0x0F, 0xFF, 0x17, 0x10, 0xFF, 0x17, 0x11, 0xFF, 0x17, 0x12, 0xFF, 0x0D, 0x0C, 0xFF, 0x14, +0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x1D, 0x10, 0x17, 0x1E, 0x12, 0x18, 0x1F, 0x13, 0x19, 0x20, +0x19, 0x20, 0x1A, 0x19, 0x14, 0x0E, 0xFF, 0x15, 0x1C, 0xFF, 0x17, 0x1D, 0x11, 0x18, 0x1E, 0x13, +0x19, 0x1F, 0x1E, 0x20, 0x1A, 0x1F, 0x21, 0x1B, 0x20, 0x22, 0x21, 0x1B, 0x14, 0x14, 0x15, 0x15, +0x16, 0x17, 0x17, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1C, 0x1C, 0x1D, 0x1E, +0x1F, 0x20, 0x20, 0x20, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x00, 0x00, +0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x00, 0x00, 0x40, 0x40, 0x41, 0x42, +0x43, 0x44, 0x44, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, +0x23, 0x26, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, +0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x24, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x00, 0x00, +0x00, 0x00, 0x26, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2A, 0x2C, 0x2E, +0x30, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x04, 0x00, 0x04, 0x00, +0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, +0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, +0x90, 0x01, 0xE0, 0x01, 0xC8, 0x00, 0xF0, 0x00, 0x40, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, +0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xF4, 0x01, 0x84, 0x03, 0x20, 0x03, +0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0x20, 0x03, 0xE8, 0x03, +0xB0, 0x04, 0x40, 0x06, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, +0x90, 0x01, 0xE0, 0x01, 0x58, 0x02, 0x20, 0x03, 0x78, 0x00, 0xF0, 0x00, 0x68, 0x01, 0xA4, 0x01, +0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0xB4, 0x00, 0x2C, 0x01, +0xA4, 0x01, 0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0x78, 0x05, +0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0xE8, 0x03, 0xB0, 0x04, 0x40, 0x06, 0xD0, 0x07, +0xD0, 0x07, 0xD0, 0x07, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, +0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x32, 0x00, +0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x64, 0x00, 0x78, 0x00, +0xA0, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, +0xF0, 0x00, 0xFA, 0x00, 0xC2, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, +0xF0, 0x00, 0x68, 0x01, 0xF4, 0x01, 0x20, 0x03, 0xE8, 0x03, 0x78, 0x05, 0x1E, 0x00, 0x32, 0x00, +0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x2C, 0x01, 0x90, 0x01, +0x3C, 0x00, 0x78, 0x00, 0xB4, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, 0x90, 0x01, +0xF4, 0x01, 0x58, 0x02, 0x5A, 0x00, 0x96, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, +0x90, 0x01, 0xF4, 0x01, 0x58, 0x02, 0xBC, 0x02, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x68, 0x01, +0xF4, 0x01, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0x00, 0xF0, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x00, 0x30, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x38, 0x18, 0x00, 0x00, 0x00, +0x00, 0x83, 0x01, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x60, 0xB8, +0x00, 0x00, 0x64, 0xB8, 0x0D, 0x00, 0x78, 0xB8, 0x12, 0x00, 0x78, 0xB8, 0x11, 0x00, 0x78, 0xB8, +0x06, 0x00, 0x78, 0xB8, 0xA7, 0x04, 0x64, 0xB8, 0xA6, 0x04, 0x64, 0xB8, 0xA5, 0x04, 0x64, 0xB8, +0xA4, 0x04, 0x64, 0xB8, 0x14, 0x00, 0x78, 0xB8, 0x09, 0x00, 0x78, 0xB8, 0x29, 0x00, 0x78, 0xB8, +0x1D, 0x04, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0xE0, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFD, +0xE3, 0x00, 0x60, 0xB8, 0x7F, 0x2E, 0x00, 0x80, 0x87, 0x2E, 0x00, 0x80, 0x8F, 0x2E, 0x00, 0x80, +0x97, 0x2E, 0x00, 0x80, 0x9F, 0x2E, 0x00, 0x80, 0xA7, 0x2E, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, +0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x20, +0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x64, 0xB8, +0x04, 0x00, 0x60, 0xB8, 0x04, 0x00, 0x64, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x64, 0xB8, +0xF8, 0x10, 0x60, 0xB8, 0xE8, 0x12, 0x64, 0xB8, 0x80, 0x00, 0x60, 0xB8, 0x50, 0x14, 0x60, 0xB8, +0x50, 0x14, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xFA, 0xFA, 0xFA, 0xFA, +0x4C, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, 0x84, 0x04, 0x64, 0xB8, 0x88, 0x04, 0x64, 0xB8, +0x8C, 0x04, 0x64, 0xB8, 0x90, 0x04, 0x64, 0xB8, 0x94, 0x04, 0x64, 0xB8, 0x98, 0x04, 0x64, 0xB8, +0x9C, 0x04, 0x64, 0xB8, 0xA0, 0x04, 0x64, 0xB8, 0xA4, 0x04, 0x64, 0xB8, 0xA8, 0x04, 0x64, 0xB8, +0xD0, 0x04, 0x64, 0xB8, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, +0x01, 0x00, 0x66, 0xB8, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, +0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x50, 0x6E, 0x74, 0x79, +0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x52, 0x41, 0x5F, 0x55, 0x70, 0x5F, 0x72, 0x61, +0x74, 0x69, 0x6F, 0x5F, 0x66, 0x6F, 0x72, 0x5F, 0x52, 0x41, 0x5F, 0x64, 0x65, 0x62, 0x75, 0x67, +0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x44, 0x6F, 0x77, 0x6E, 0x5F, 0x72, 0x61, 0x74, +0x69, 0x6F, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x38, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, +0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, 0x36, 0x3D, 0x30, 0x78, 0x25, 0x77, 0x78, 0x2C, +0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0x32, 0x3D, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, +0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, 0x69, 0x5F, 0x33, 0x3A, 0x20, 0x5B, 0x31, 0x5D, +0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, +0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x33, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x00, 0x00, +0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, 0x69, 0x5F, 0x32, 0x3A, 0x20, 0x5B, 0x31, 0x5D, +0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, +0x62, 0x58, 0x20, 0x00, 0x46, 0x57, 0x20, 0x74, 0x72, 0x61, 0x20, 0x65, 0x6E, 0x00, 0x00, 0x00, +0xD5, 0x76, 0x00, 0x80, 0x19, 0x77, 0x00, 0x80, 0xDF, 0x76, 0x00, 0x80, 0x11, 0x77, 0x00, 0x80, +0x19, 0x77, 0x00, 0x80, 0x19, 0x77, 0x00, 0x80, 0xE9, 0x76, 0x00, 0x80, 0xF3, 0x76, 0x00, 0x80, +0xFD, 0x76, 0x00, 0x80, 0x07, 0x77, 0x00, 0x80, 0x00, 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x36, +0x40, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, 0xCD, 0x9B, 0x78, 0x56, 0x00, 0x00, 0x66, 0xB8, +0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, +0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, +0x15, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x4F, 0x46, 0x44, 0x4D, 0x25, +0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x43, 0x43, 0x4B, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, +0x52, 0x41, 0x3A, 0x56, 0x31, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, +0x32, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x33, 0x2D, 0x4D, 0x25, +0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, +0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x31, 0x2C, 0x25, 0x62, 0x58, 0x00, 0x52, 0x41, 0x3A, 0x48, +0x2D, 0x4D, 0x32, 0x2C, 0x25, 0x62, 0x58, 0x00, 0x5B, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x52, 0x61, +0x74, 0x65, 0x5F, 0x52, 0x53, 0x53, 0x49, 0x5D, 0x20, 0x6D, 0x61, 0x63, 0x69, 0x64, 0x3A, 0x25, +0x62, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x3A, 0x25, 0x62, 0x58, 0x20, 0x52, 0x61, 0x74, 0x65, +0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, +0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, 0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, +0x79, 0xA4, 0x00, 0x80, 0x79, 0xA4, 0x00, 0x80, 0x79, 0xA4, 0x00, 0x80, 0x15, 0xA4, 0x00, 0x80, +0x57, 0xA4, 0x00, 0x80, 0x57, 0xA4, 0x00, 0x80, 0x15, 0xA4, 0x00, 0x80, 0x95, 0xA4, 0x00, 0x80, +0xB7, 0xA4, 0x00, 0x80, 0x52, 0x41, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00, +0x43, 0x6E, 0x74, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x46, 0x57, 0x46, 0x69, +0x78, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x46, 0x61, 0x73, 0x74, 0x44, 0x65, 0x63, 0x69, 0x73, +0x69, 0x6F, 0x6E, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, +0x46, 0x44, 0x3A, 0x20, 0x44, 0x72, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x4C, 0x56, 0x31, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x31, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x32, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x33, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x55, 0x70, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x55, 0x70, 0x46, 0x61, 0x69, 0x6C, 0x00, 0x00, +0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x44, 0x6F, 0x77, 0x6E, +0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x69, 0x6F, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, +0x4E, 0x73, 0x63, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x4E, 0x54, 0x48, 0x20, 0x25, 0x62, 0x58, +0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x79, 0x00, 0x00, 0x00, 0x00, +0x52, 0x53, 0x54, 0x54, 0x78, 0x52, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, +0x65, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x72, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x25, 0x62, +0x58, 0x00, 0x00, 0x00, 0x49, 0x44, 0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x5B, 0x30, 0x3A, +0x34, 0x5D, 0x20, 0x25, 0x62, 0x58, 0x20, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, +0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, +0x55, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x54, 0x47, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, +0x00, 0x00, 0x00, 0x00, 0x54, 0x47, 0x70, 0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, +0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, +0x20, 0x00, 0x00, 0x00, 0x44, 0x54, 0x50, 0x5F, 0x65, 0x6E, 0x64, 0x00, 0x06, 0x06, 0x06, 0x07, +0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x06, 0x07, 0x0A, 0x0C, 0x0F, 0x10, 0x12, +0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0F, 0x11, 0x12, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0F, 0x11, 0x13, +0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x11, +0x12, 0x12, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x12, 0x12, 0x13, 0x08, 0x0A, 0x0A, 0x0A, +0x0D, 0x10, 0x11, 0x12, 0x14, 0x15, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x0E, 0x0F, 0x12, 0x13, +0x28, 0x28, 0x32, 0x28, 0x1E, 0x19, 0x19, 0x19, 0x18, 0x18, 0x12, 0x0F, 0x1E, 0x1E, 0x19, 0x1E, +0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1E, 0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1C, +0x18, 0x14, 0x0C, 0x0A, 0x1E, 0x1E, 0x19, 0x1E, 0x19, 0x18, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x1E, +0x1C, 0x16, 0x14, 0x12, 0x0C, 0x0A, 0x1E, 0x1E, 0x1E, 0x1E, 0x1A, 0x16, 0x12, 0x10, 0x0C, 0x0A, +0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x16, 0x0D, 0x0D, 0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, +0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x12, 0x14, 0x12, 0x0F, 0x0F, 0x0C, 0x0C, 0x09, 0x08, 0x08, 0x07, +0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, +0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, +0x0A, 0x0A, 0x08, 0x08, 0x08, 0x07, 0x07, 0x06, 0x04, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, +0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x05, 0x04, 0x04, 0x0A, 0x0A, +0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x3F, 0x00, +0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x00, +0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x06, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x38, +0xE0, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x03, 0x0C, 0x00, 0x4A, 0x04, 0x64, 0xB8, +0x49, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x60, 0xB8, +0x01, 0x00, 0x64, 0xB8, 0x02, 0x00, 0x60, 0xB8, 0x02, 0x00, 0x64, 0xB8, 0x03, 0x00, 0x60, 0xB8, +0x03, 0x00, 0x64, 0xB8, 0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, +0x01, 0x00, 0x66, 0xB8, 0x01, 0x1C, 0x66, 0xB8, 0x02, 0x1C, 0x66, 0xB8, 0x03, 0x1C, 0x66, 0xB8, +0x05, 0x1C, 0x66, 0xB8, 0x06, 0x1C, 0x66, 0xB8, 0x07, 0x1C, 0x66, 0xB8, 0xF0, 0x10, 0x60, 0xB8, +0xF1, 0x10, 0x60, 0xB8, 0x06, 0x00, 0x66, 0xB8, 0x23, 0x04, 0x64, 0xB8, 0x30, 0x04, 0x64, 0xB8, +0x00, 0x00, 0x00, 0x02, 0x34, 0x04, 0x64, 0xB8, 0x04, 0x05, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, +0xF3, 0x10, 0x60, 0xB8, 0xF2, 0x10, 0x60, 0xB8, 0x53, 0x04, 0x64, 0xB8, 0x52, 0x04, 0x64, 0xB8, +0x50, 0x04, 0x64, 0xB8, 0x51, 0x04, 0x64, 0xB8, 0xF7, 0x10, 0x60, 0xB8, 0xF4, 0x10, 0x60, 0xB8, +0xF5, 0x10, 0x60, 0xB8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, 0x00, +0x00, 0x00, 0xC0, 0x00, 0x07, 0x10, 0x66, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, +0x01, 0x10, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x04, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, +0x00, 0x00, 0x3C, 0x00, 0x6B, 0x01, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, 0xD4, 0x04, 0x64, 0xB8, +0x88, 0x04, 0x64, 0xB8, 0xD0, 0x04, 0x64, 0xB8, 0x84, 0x04, 0x64, 0xB8, 0xA9, 0x01, 0x64, 0xB8, +0x00, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x40, 0x00, 0x04, 0x04, 0x64, 0xB8, 0x08, 0x04, 0x64, 0xB8, +0x0C, 0x04, 0x64, 0xB8, 0x68, 0x04, 0x64, 0xB8, 0x6C, 0x04, 0x64, 0xB8, 0x70, 0x04, 0x64, 0xB8, +0x74, 0x04, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x96, 0x02, 0x64, 0xB8, 0x00, 0x00, 0x70, 0xB8, +0xFF, 0xFF, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x70, 0xB8, 0x02, 0x00, 0x70, 0xB8, +0x1C, 0x01, 0x64, 0xB8, 0xFF, 0xFF, 0x03, 0x00, 0x94, 0x02, 0x64, 0xB8, 0x97, 0x02, 0x64, 0xB8, +0x1C, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x20, 0x24, 0x04, 0x64, 0xB8, 0x30, 0x01, 0x64, 0xB8, +0xF8, 0x10, 0x60, 0xB8, 0xCC, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, +0x31, 0x00, 0x60, 0xB8, 0x32, 0x00, 0x60, 0xB8, 0x33, 0x00, 0x60, 0xB8, 0x30, 0x00, 0x60, 0xB8, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, +0x64, 0x01, 0x64, 0xB8, 0x53, 0x05, 0x64, 0xB8, 0x77, 0x05, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, +0x51, 0x1C, 0x00, 0x80, 0x9D, 0x1C, 0x00, 0x80, 0xE9, 0x1C, 0x00, 0x80, 0x35, 0x1D, 0x00, 0x80, +0x81, 0x1D, 0x00, 0x80, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x00, 0x1C, 0x66, 0xB8, +0x9A, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, +0xC7, 0x01, 0x64, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0x30, 0x01, 0x64, 0xB8, +0x24, 0x01, 0x64, 0xB8, 0x20, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, 0x20, 0x11, 0x64, 0xB8, +0x2C, 0x11, 0x64, 0xB8, 0x28, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, 0x30, 0x11, 0x64, 0xB8, +0x3C, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, 0x38, 0x11, 0x64, 0xB8, +0x50, 0x00, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0xE0, 0x12, 0x64, 0xB8, 0x09, 0x02, 0x64, 0xB8, +0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x88, 0x00, 0x60, 0xB8, 0x06, 0x01, 0x64, 0xB8, +0xF0, 0x00, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0x34, 0x01, 0x64, 0xB8, +0x24, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, 0x2C, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, +0x3C, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x02, 0x01, 0x64, 0xB8, +0x21, 0x05, 0x64, 0xB8, 0x40, 0x11, 0x64, 0xB8, 0x44, 0x11, 0x64, 0xB8, 0x48, 0x11, 0x64, 0xB8, +0x4C, 0x11, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x00, 0x00, 0x64, 0xB8, +0x00, 0x28, 0x64, 0xB8, 0x00, 0x2C, 0x64, 0xB8, 0x00, 0x38, 0x64, 0xB8, 0x00, 0x3C, 0x64, 0xB8, +0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x04, 0x02, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, +0xFC, 0x10, 0x60, 0xB8, 0xF8, 0x05, 0x64, 0xB8, 0xF9, 0x05, 0x64, 0xB8, 0xFA, 0x05, 0x64, 0xB8, +0xFB, 0x05, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x22, 0x05, 0x64, 0xB8, 0x04, 0x02, 0x64, 0xB8, +0x7A, 0x04, 0x64, 0xB8, 0x20, 0x00, 0x78, 0xB8, 0x10, 0x00, 0x78, 0xB8, 0x03, 0x00, 0x78, 0xB8, +0xFF, 0xFF, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x78, 0xB8, 0x1F, 0x07, 0x64, 0xB8, +0x1C, 0x07, 0x64, 0xB8, 0x68, 0x06, 0x64, 0xB8, 0x24, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xCF, 0xFF, +0x5C, 0x05, 0x64, 0xB8, 0x38, 0x06, 0x64, 0xB8, 0x83, 0x04, 0x64, 0xB8, 0x54, 0x04, 0x64, 0xB8, +0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x08, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x20, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x80, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x04, 0x64, 0xB8, 0x21, 0x04, 0x64, 0xB8, +0x20, 0x04, 0x64, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, 0x04, 0x10, 0x66, 0xB8, +0x03, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, 0x06, 0x10, 0x66, 0xB8, +0x07, 0x10, 0x66, 0xB8, 0x7D, 0x04, 0x64, 0xB8, 0x7C, 0x04, 0x64, 0xB8, 0xF4, 0x00, 0x60, 0xB8, +0x08, 0x00, 0x60, 0xB8, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x01, 0x64, 0xB8, 0x9A, 0x01, 0x64, 0xB8, +0x99, 0x01, 0x64, 0xB8, 0x9B, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xC0, 0xA3, 0x02, 0x80, +0xC0, 0xA7, 0x02, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x58, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x79, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, +0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x19, 0x48, 0x00, 0x65, 0x00, 0xE8, 0x00, 0x65, 0x1A, 0xB8, +0x3B, 0xB8, 0x00, 0xBA, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x30, 0xF0, 0x20, 0x6C, 0x0A, 0xF0, 0x00, 0x4C, 0x02, 0xF0, 0x00, 0x4C, 0xBC, 0x65, 0x00, 0xF0, +0x21, 0x6C, 0x1F, 0xF4, 0x00, 0x4C, 0x8C, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x94, 0xB8, +0x00, 0x6D, 0xFE, 0xF7, 0x1F, 0x4D, 0xAC, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0xF4, +0x00, 0x6D, 0xAD, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6C, 0x00, 0xF0, 0x00, 0x4C, +0x00, 0x6E, 0x30, 0xF0, 0x20, 0x6F, 0x00, 0xF0, 0x00, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, +0xB8, 0x67, 0xFB, 0x2D, 0x30, 0xF0, 0x20, 0x6C, 0xE2, 0xF2, 0x08, 0x4C, 0x00, 0x6E, 0x30, 0xF0, +0x20, 0x6F, 0xE8, 0xF4, 0x10, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, 0xB8, 0x67, 0xFB, 0x2D, +0x10, 0xF0, 0x20, 0x6C, 0x60, 0xF2, 0x1D, 0x4C, 0x00, 0xEC, 0x00, 0x00, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x60, 0xF2, 0x1D, 0x4B, +0x60, 0xDA, 0x00, 0x18, 0x1B, 0x06, 0x00, 0x18, 0x33, 0x06, 0x00, 0x18, 0xC5, 0x08, 0x00, 0x18, +0x69, 0x06, 0x00, 0x18, 0xBB, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0xC0, 0xF5, 0x78, 0x9B, 0x80, 0xAB, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xEC, 0x10, 0xF0, +0x00, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x00, 0x18, +0x46, 0x09, 0x00, 0x18, 0xE0, 0x05, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xA1, 0x05, +0x00, 0x6C, 0x00, 0x18, 0x28, 0x0C, 0xFF, 0x17, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x4C, 0x01, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x56, 0x01, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x21, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x32, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xD6, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE0, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x08, 0xD4, 0x30, 0xF0, 0x20, 0x6A, +0xE0, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x6C, 0x9B, 0x60, 0xDA, 0x48, 0xB8, +0x03, 0xD2, 0x03, 0x92, 0x07, 0xD2, 0x4D, 0xB8, 0x02, 0xD2, 0x02, 0x92, 0x06, 0xD2, 0x4E, 0xB8, +0x01, 0xD2, 0x01, 0x92, 0x05, 0xD2, 0x4C, 0xB8, 0x00, 0xD2, 0x00, 0x92, 0x04, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0xE0, 0xF5, 0x50, 0x9A, 0x08, 0x93, 0x7C, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0xE0, 0xF5, 0x54, 0x9A, 0x07, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, +0x58, 0x9A, 0x06, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x5C, 0x9A, 0x04, 0x93, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x7B, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x44, 0x9A, 0x08, 0x93, 0x7D, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x00, 0xF6, 0x48, 0x9A, 0x08, 0x93, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0xF6, 0x4C, 0x9A, 0x08, 0x93, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, +0x50, 0x9A, 0x08, 0x93, 0x66, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x54, 0x9A, +0x08, 0x93, 0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x58, 0x9A, 0x08, 0x93, +0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x5C, 0x9A, 0x08, 0x93, 0x63, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x70, 0x9B, 0x60, 0xDA, +0xFF, 0x17, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, +0x20, 0x31, 0x08, 0x49, 0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, +0x58, 0x67, 0x58, 0xD9, 0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, +0xCE, 0xB8, 0x9E, 0xD9, 0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x0D, 0xB8, 0x7F, 0x69, 0x0C, 0xE9, +0x2D, 0x21, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, 0x20, 0x31, 0x08, 0x49, +0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x58, 0x67, 0x58, 0xD9, +0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, 0xCE, 0xB8, 0x9E, 0xD9, +0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x00, 0xF0, 0x20, 0x6D, 0xE0, 0xF6, 0x04, 0x4D, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x68, 0x00, 0xF0, 0x08, 0x48, 0x18, 0x48, 0x20, 0x98, 0x00, 0x65, 0x20, 0xDD, +0x00, 0x65, 0x1D, 0x67, 0x01, 0xDD, 0x00, 0x65, 0x00, 0xE9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, +0x00, 0xF0, 0x08, 0x49, 0x1F, 0xF4, 0x00, 0x6C, 0x8C, 0xE8, 0x80, 0xF2, 0x02, 0x30, 0x0B, 0x20, +0x01, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x40, 0x99, 0x00, 0x65, 0x40, 0xEA, 0x00, 0x65, 0x06, 0x30, +0x24, 0x41, 0xF5, 0x17, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, 0x0A, 0xF0, 0x08, 0x49, 0x58, 0x99, +0x1A, 0x65, 0x5B, 0x99, 0xBA, 0x65, 0x5D, 0x99, 0xFA, 0x65, 0x9E, 0x99, 0xBF, 0x99, 0x32, 0xEC, +0x30, 0xED, 0x42, 0x99, 0x63, 0x99, 0x84, 0x99, 0xA5, 0x99, 0xC6, 0x99, 0xE7, 0x99, 0x80, 0xF0, +0x20, 0x99, 0xC9, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x1A, 0xB8, 0x3B, 0xB8, 0x00, 0xBA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x11, 0x4B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, +0x11, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x60, 0xDA, 0x00, 0x18, +0xF1, 0x12, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0x9A, 0x20, 0xF1, 0x1C, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x00, 0x18, 0x56, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x20, 0x6A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5A, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x13, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xAC, 0x17, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x5C, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, +0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x60, 0x13, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x00, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x01, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x01, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x01, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x02, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x02, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x02, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x4C, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x03, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x50, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x03, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x03, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x04, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x04, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x04, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x05, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x05, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x05, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, +0x15, 0x22, 0x06, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x06, 0x6C, +0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x06, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x6C, 0xEA, +0x14, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x45, 0x9A, 0x00, 0x52, 0x58, 0x67, 0x04, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x7C, 0x14, 0x05, 0x10, +0x07, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x46, 0x9A, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x66, 0x9A, +0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x9F, 0x13, 0x01, 0x10, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x47, 0x9A, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x47, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xA3, 0x13, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x48, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xBF, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, +0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, +0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x00, 0x18, 0xE1, 0x12, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x4D, 0x9A, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, +0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF0, 0x05, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, +0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x09, 0x4B, 0x60, 0xDA, 0x00, 0x18, +0x38, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x51, 0x9A, 0xA0, 0xF0, 0x05, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x51, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC1, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x71, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC2, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0xC3, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0xC4, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, +0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC5, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x71, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC6, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0xCA, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0xCB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, +0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCC, 0x13, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0xCD, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x08, 0xF0, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCE, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x71, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCF, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x00, 0x18, 0xD8, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD9, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, +0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xDA, 0x13, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x52, 0x9A, 0x80, 0xF0, 0x03, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x72, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD0, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0xD1, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD2, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x72, 0x9A, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD3, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x00, 0x18, 0xD4, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x01, 0xF0, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD5, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x03, 0x22, +0x00, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x01, 0x6C, 0x00, 0x18, +0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x02, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, +0x6C, 0xEA, 0x03, 0x22, 0x03, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, +0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, +0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, +0x10, 0xF0, 0x20, 0x6B, 0x41, 0xF3, 0x19, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, +0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x41, 0xF3, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF3, 0x01, 0x4B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF3, +0x01, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x7D, 0x67, +0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x74, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, +0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, +0x54, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, +0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x20, 0xF5, 0x78, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, +0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x7C, 0x9B, +0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x1F, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x60, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, +0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, +0x44, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x48, 0x9A, 0x00, 0x6B, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x4C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x50, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x02, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, +0x40, 0xF5, 0x74, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, +0x00, 0xF6, 0x83, 0x34, 0x40, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, +0x83, 0x34, 0xBD, 0x67, 0x60, 0x85, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x01, 0xD5, +0x7D, 0x67, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE3, +0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0x3F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x2A, 0x22, +0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x40, 0xF5, 0x7C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, +0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, +0x58, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x78, 0x9B, 0x6D, 0xE4, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x27, 0x10, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, +0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x78, 0x9B, +0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, +0x60, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x60, 0xF0, 0x50, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x60, 0xF0, 0x70, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x40, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x52, 0x32, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x34, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x44, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0xFF, 0x6C, +0x26, 0x6D, 0x00, 0x18, 0x1A, 0x16, 0x00, 0x18, 0xF2, 0x15, 0x01, 0x6B, 0x6E, 0xEA, 0x1D, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, +0x20, 0xF0, 0x44, 0xA4, 0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x25, 0x16, +0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0x3F, 0x03, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0xEA, 0x02, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, +0x27, 0x6D, 0x00, 0x18, 0x1A, 0x16, 0x1D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x83, 0x67, 0x01, 0x6D, +0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x25, 0x16, 0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, +0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3F, 0x03, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, +0xEA, 0x02, 0x00, 0x18, 0x86, 0x10, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x02, 0xD4, +0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, +0x09, 0x10, 0x01, 0x92, 0x03, 0x93, 0x60, 0xDA, 0x01, 0x92, 0x04, 0x4A, 0x01, 0xD2, 0x04, 0x92, +0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xF3, 0x22, 0x02, 0x92, 0x00, 0xD2, +0x08, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, +0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, +0xFF, 0x4B, 0x04, 0xD3, 0xEE, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, +0x45, 0x67, 0x04, 0xD6, 0x7D, 0x67, 0x4C, 0xC3, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, +0x9D, 0x67, 0x6C, 0xA4, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x04, 0x92, 0xFF, 0x4A, +0x04, 0xD2, 0x04, 0x92, 0xF4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x04, 0xD4, +0x05, 0xD5, 0x06, 0xD6, 0x04, 0x92, 0x03, 0xD2, 0x05, 0x92, 0x02, 0xD2, 0x05, 0x93, 0x03, 0x6A, +0x6C, 0xEA, 0x16, 0x2A, 0x04, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, 0x0D, 0x10, 0x02, 0x92, +0x60, 0x9A, 0x03, 0x92, 0x60, 0xDA, 0x03, 0x92, 0x04, 0x4A, 0x03, 0xD2, 0x02, 0x92, 0x04, 0x4A, +0x02, 0xD2, 0x06, 0x92, 0xFC, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xEF, 0x22, +0x03, 0x92, 0x01, 0xD2, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, +0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, +0x06, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x06, 0x93, 0xFF, 0x4B, 0x06, 0xD3, +0xEC, 0x2A, 0x04, 0x92, 0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, +0x02, 0x93, 0x03, 0x92, 0x63, 0xEA, 0x58, 0x67, 0x1A, 0x2A, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, +0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, +0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, +0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x1D, 0x10, 0x02, 0x93, +0x04, 0x92, 0x49, 0xE3, 0x01, 0xD2, 0x03, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x00, 0xD2, 0x0A, 0x10, +0x01, 0x92, 0xFF, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x60, 0x82, +0x01, 0x92, 0x60, 0xC2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x02, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x04, 0x92, +0x02, 0xD2, 0x05, 0x92, 0x01, 0xD2, 0x15, 0x10, 0x02, 0x92, 0x60, 0xA2, 0x01, 0x92, 0x40, 0xA2, +0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x0C, 0x2A, +0x02, 0x92, 0x01, 0x4A, 0x02, 0xD2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x06, 0x92, 0xFF, 0x4A, +0x06, 0xD2, 0x06, 0x92, 0xE9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x06, 0x92, 0x02, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x04, 0x92, +0x49, 0xE3, 0x00, 0xD2, 0x0B, 0x10, 0x01, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x92, 0x6E, 0xEA, +0x02, 0x2A, 0x01, 0x92, 0x08, 0x10, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x01, 0x93, 0x00, 0x92, +0x6E, 0xEA, 0xF1, 0x2A, 0x01, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, +0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x00, 0xD2, 0x12, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, +0x00, 0x92, 0x40, 0xA2, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, +0x00, 0x93, 0x01, 0x4B, 0x00, 0xD3, 0x03, 0x22, 0x00, 0x92, 0xFF, 0x4A, 0x0B, 0x10, 0x00, 0x6A, +0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, +0xE4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x46, 0x67, +0x7D, 0x67, 0x50, 0xC3, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, +0x60, 0xA2, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, +0x00, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x70, 0xA4, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x9D, 0x67, 0x70, 0xA4, 0xFF, 0x4B, 0x9D, 0x67, 0x70, 0xC4, 0xE9, 0x2A, 0x02, 0x92, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0xA0, 0xF4, 0x73, 0xC2, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, +0x44, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x40, 0x9A, +0x7D, 0x67, 0x84, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x64, 0x9A, 0x9D, 0x67, 0x44, 0xAC, 0x42, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, +0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x03, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, +0x20, 0x6C, 0xA1, 0xF4, 0x84, 0x9C, 0xA0, 0xA4, 0xFF, 0x6C, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x35, +0x00, 0xF6, 0xA3, 0x35, 0x04, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, +0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x68, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x48, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x05, 0x10, +0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x00, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0xE8, 0x2A, +0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x92, 0x60, 0xC2, 0x01, 0x6A, 0x01, 0x10, +0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, +0x01, 0x6A, 0x9D, 0x67, 0x41, 0xC4, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x48, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xA2, 0x9D, 0x67, +0x40, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x6C, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x02, 0x4A, +0x9D, 0x67, 0x41, 0xC4, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x7D, 0x67, +0x40, 0xA3, 0x04, 0x5A, 0x58, 0x67, 0xE9, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, +0x4C, 0xA4, 0x06, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x52, 0x32, 0x9D, 0x67, 0x40, 0xC4, 0x19, 0x10, +0x7D, 0x67, 0x48, 0xA3, 0x56, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0x5D, 0x67, 0x8C, 0xA2, 0xF0, 0x6A, 0x8C, 0xEA, 0x47, 0x32, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, +0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x4C, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x58, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x4D, 0xCD, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, +0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, +0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6D, 0xAA, 0x00, 0xF0, 0x1D, 0x02, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0x66, 0x04, 0x01, 0x6B, 0x6E, 0xEA, 0x60, 0xF1, 0x0E, 0x2A, 0x9D, 0x67, 0x58, 0xA4, +0x05, 0x2A, 0xBD, 0x67, 0x5D, 0xA5, 0xFF, 0x6B, 0x6E, 0xEA, 0x32, 0x22, 0x9D, 0x67, 0x58, 0xA4, +0x15, 0x2A, 0xBD, 0x67, 0x5D, 0xA5, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, +0x06, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, 0x07, 0x10, 0x7D, 0x67, +0x5D, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x04, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x8D, 0xAD, +0x5D, 0x67, 0x7D, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xC2, +0x7D, 0x67, 0x58, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x4D, 0xAD, 0x01, 0x4A, +0x7D, 0x67, 0x4D, 0xCB, 0x9D, 0x67, 0x4D, 0xAC, 0x00, 0xF4, 0x00, 0x5A, 0x58, 0x67, 0xA8, 0x2A, +0x7D, 0x67, 0x4D, 0xAB, 0x01, 0x4A, 0x9D, 0x67, 0x4B, 0xCC, 0xBD, 0x67, 0x8B, 0xAD, 0x7D, 0x67, +0x4B, 0xAB, 0x6E, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, +0xFF, 0x4A, 0xBD, 0x67, 0x4B, 0xCD, 0x7D, 0x67, 0x4B, 0xAB, 0x02, 0x5A, 0x58, 0x67, 0xE5, 0x22, +0x02, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x02, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x00, 0x6A, 0xBD, 0x67, +0x50, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, +0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, +0x10, 0xF0, 0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, 0x02, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, +0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, +0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, 0x28, 0x2A, 0x9D, 0x67, 0x4B, 0xAC, 0x61, 0x42, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, +0xA2, 0x04, 0x01, 0x4A, 0xBD, 0x67, 0x55, 0xC5, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x4B, 0xAC, 0x81, 0x42, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xB8, 0x04, 0xBD, 0x67, 0x54, 0xC5, 0x1B, 0x10, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x04, +0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x6B, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, +0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xB8, 0x04, 0xBD, 0x67, 0x54, 0xC5, +0x7D, 0x67, 0x54, 0xA3, 0x26, 0x5A, 0x58, 0x67, 0x1C, 0x22, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF6, 0x08, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0x4E, 0x04, 0x5D, 0x67, 0x75, 0xA2, 0x9D, 0x67, 0x49, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x49, 0xCD, +0x20, 0x10, 0x7D, 0x67, 0x54, 0xA3, 0x38, 0x5A, 0x58, 0x67, 0x1B, 0x2A, 0x5D, 0x67, 0x70, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF0, 0x18, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0x4E, 0x04, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x49, 0xE3, 0xBD, 0x67, +0x50, 0xC5, 0x5D, 0x67, 0x75, 0xA2, 0x9D, 0x67, 0x4B, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x4B, 0xCD, +0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x4D, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x5F, 0xF7, 0x0C, 0x22, +0x5D, 0x67, 0x69, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x68, 0xC2, +0x7D, 0x67, 0x49, 0xAB, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x9D, 0x67, 0x70, 0xA4, 0x80, 0xF4, 0x70, 0xC2, 0x00, 0x6A, 0xBD, 0x67, 0x4B, 0xCD, +0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, +0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, +0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, 0x04, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x7D, 0x67, 0x8B, 0xAB, 0x30, 0xF0, +0x20, 0x6B, 0xE1, 0xF6, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, +0x01, 0x4A, 0xBD, 0x67, 0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x49, 0xAC, 0x43, 0xEB, +0x58, 0x67, 0xD1, 0x2A, 0x01, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x72, 0x10, +0x9D, 0x67, 0x50, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x50, 0x9A, 0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0x82, 0xF6, 0x05, 0x4B, +0x6D, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, +0x52, 0xC4, 0x7D, 0x67, 0x52, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x5D, 0x67, 0x72, 0xA2, 0x0F, 0x6A, +0x6C, 0xEA, 0x50, 0x22, 0x9D, 0x67, 0x72, 0xA4, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x08, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x12, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, +0x3A, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x02, 0x6A, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x72, 0xA2, +0x20, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x00, 0x18, 0xCF, 0x04, 0x06, 0x2A, 0x9D, 0x67, 0x71, 0xA4, +0x20, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x5C, 0x9A, +0x00, 0x6B, 0x60, 0xC2, 0x9D, 0x67, 0x71, 0xA4, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, +0x51, 0xC3, 0x19, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, +0x71, 0xA2, 0x05, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x0C, 0x10, 0x9D, 0x67, +0x72, 0xA4, 0x08, 0x6A, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x09, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x58, 0x9A, 0x9D, 0x67, +0x71, 0xA4, 0x60, 0xC2, 0x00, 0x18, 0xE0, 0x05, 0x8B, 0x2A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x10, 0xF0, +0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x01, 0x6A, 0x0F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, +0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x01, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, +0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, +0x68, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0xF0, 0x08, 0x4A, 0x61, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x00, 0xF3, 0x09, 0x4B, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x62, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, +0x00, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x63, 0xDA, 0x10, 0xF0, +0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, +0x64, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0xF0, 0x08, 0x4A, 0x65, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF3, 0x09, 0x4B, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x66, 0xDA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x42, 0x33, 0x72, 0x33, 0xFF, 0x6A, +0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, +0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x09, 0x23, 0x0C, 0x2A, 0x19, 0x6A, 0x7D, 0x67, +0x51, 0xC3, 0x0C, 0x10, 0x32, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x08, 0x10, 0x64, 0x6A, 0x7D, 0x67, +0x51, 0xC3, 0x04, 0x10, 0x38, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x05, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0xF8, 0x05, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0xA0, 0xF4, 0x73, 0xC2, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA0, 0xF4, +0x63, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, +0x10, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x2B, 0x10, 0x7D, 0x67, +0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x5C, 0x9A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x09, 0x10, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xE0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x4A, +0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x10, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x41, 0x06, 0x00, 0x18, 0x71, 0x06, +0x00, 0x18, 0xD5, 0x08, 0x00, 0x18, 0xDA, 0x18, 0x00, 0x18, 0x64, 0x0F, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, +0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6F, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x20, 0xE8, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x40, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x64, 0x9B, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x68, 0x9B, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x08, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0xE1, 0xF4, 0x64, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF4, 0x68, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, +0xCB, 0x03, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x0E, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x04, 0x6B, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, +0x20, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x7D, 0x67, 0x48, 0xAB, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, +0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x6C, 0x9A, 0x00, 0xF4, 0x00, 0x6A, 0x83, 0x67, +0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xCB, 0x03, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x0B, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, +0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF4, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x01, 0x6A, +0x01, 0x10, 0x00, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x58, 0x9A, 0x10, 0xF0, +0x20, 0x6B, 0x43, 0xF3, 0x1D, 0x4B, 0x60, 0xDA, 0x32, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x82, 0xF3, +0x08, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0xE1, 0xF4, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF5, 0x40, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x1F, 0x10, 0x7D, 0x67, +0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x7D, 0x67, +0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0B, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x06, 0x2A, 0x00, 0x18, +0xB8, 0x06, 0x01, 0x6B, 0x6E, 0xEA, 0xC9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x40, 0x9A, 0x02, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, +0x58, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x43, 0xF3, 0x1D, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x82, 0x67, 0x00, 0x18, +0x5D, 0x0C, 0x00, 0x18, 0xA8, 0x0C, 0x04, 0xD2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x05, 0x5A, 0x58, 0x67, 0xC0, 0xF0, 0x06, 0x22, 0x00, 0x92, +0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, +0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, +0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x97, 0x10, 0x00, 0x94, 0x00, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x71, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, +0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x4B, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, +0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x00, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x25, 0x10, +0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, +0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, +0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x2B, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, +0x4E, 0xEB, 0x46, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x64, 0x22, 0x83, 0x10, 0x00, 0x94, 0x00, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, +0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, +0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x62, 0x10, 0x00, 0x94, +0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, +0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x41, 0x10, +0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x00, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, +0x20, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, +0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, 0x01, 0x6B, 0x6E, 0xEA, +0x2A, 0x22, 0x51, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF5, 0x50, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x54, 0x9A, +0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, +0x60, 0x9B, 0x60, 0xDA, 0x28, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, +0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, +0x5C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, +0x01, 0x6B, 0x6E, 0xEA, 0x25, 0x22, 0x47, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, +0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x23, 0x10, +0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, +0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, +0x5C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0x02, 0xF4, +0x68, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x61, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x00, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF4, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x62, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, +0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6E, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, +0x6F, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6C, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, +0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, +0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x01, 0x6B, +0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x50, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, +0x3F, 0xF4, 0x10, 0x6B, 0x6B, 0xEB, 0x02, 0xF4, 0x68, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x08, 0xF0, 0x00, 0x6B, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x01, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x63, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x64, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x61, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, +0x08, 0x4B, 0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, +0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x64, 0x9B, 0x60, 0xDA, 0x20, 0xE8, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, +0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x06, 0x6B, 0x6E, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, +0x6F, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x40, 0xF0, 0x70, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x40, 0xF0, 0x70, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x02, 0x6D, 0xC2, 0x67, +0x00, 0x18, 0x6D, 0x0B, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x40, 0xF0, 0x50, 0xAA, +0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x03, 0x6D, +0xC2, 0x67, 0x00, 0x18, 0x6D, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x12, 0x08, 0x00, 0x18, 0x4A, 0x08, 0x00, 0x18, 0x63, 0x08, 0x00, 0x18, 0x95, 0x08, +0x00, 0x18, 0x8C, 0x08, 0x00, 0x18, 0xA6, 0x08, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE9, 0x08, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF0, 0x74, 0xC2, 0x00, 0x18, 0x95, 0x06, 0x00, 0x18, +0xC4, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x48, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x00, 0x18, +0x80, 0x06, 0x00, 0x18, 0x84, 0x06, 0x00, 0x18, 0xF8, 0x08, 0x00, 0x18, 0x9E, 0x06, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0xE0, 0xF1, 0x1B, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x41, 0xCB, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0x9D, 0x67, 0x61, 0xAC, 0x60, 0xCA, 0x0F, 0x6A, +0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x60, 0xA4, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, +0x50, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x5C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x4A, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x02, 0x2A, 0x02, 0x6A, 0x08, 0x10, 0x7D, 0x67, 0x40, 0xA3, +0x03, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x03, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x01, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF6, 0x40, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xFF, 0xF6, 0x1F, 0x6C, +0x8C, 0xEA, 0x40, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0xC1, 0xF6, 0x64, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF6, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x68, 0x9B, 0x80, 0x9B, 0x00, 0xF4, +0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, +0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x40, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, +0x50, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x54, 0x9A, +0x80, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, +0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, 0x0D, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x7C, 0x9B, 0x60, 0xDA, +0x11, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x80, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x0A, 0x6C, 0x00, 0x18, +0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF6, +0x60, 0x9B, 0x60, 0xDA, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, +0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x60, 0xBA, 0x20, 0xE8, 0x40, 0xBA, 0x20, 0xE8, +0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, +0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, +0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, +0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, +0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, +0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, +0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, +0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, +0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x4B, 0x10, +0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, +0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, +0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, +0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, +0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, +0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, +0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, +0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, +0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, +0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, +0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, +0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, +0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, +0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, +0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, +0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, +0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, +0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, +0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, +0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, +0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, +0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, +0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0xBD, 0x67, +0x4C, 0xC5, 0xDD, 0x67, 0x48, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x9D, 0x67, 0x68, 0xA4, +0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x42, 0xC5, 0xDD, 0x67, 0x43, 0xA6, 0x42, 0xF4, 0x10, 0x4A, +0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, 0x4C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0xC0, 0xF0, 0x0E, 0x2A, +0xDD, 0x67, 0x83, 0xA6, 0x5D, 0x67, 0x63, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, +0x42, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, +0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, +0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, +0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, +0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, +0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x40, 0xC3, 0x14, 0x11, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, +0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, +0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, +0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, +0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, +0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, +0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, +0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0xC8, 0x10, 0x5D, 0x67, 0x83, 0xA2, +0xBD, 0x67, 0x63, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, +0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x42, 0xA6, 0x01, 0x6D, +0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, +0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, +0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, +0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, +0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, +0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, +0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, +0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, +0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, +0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, +0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, +0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, +0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, +0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, +0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0x7D, 0x67, +0x41, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, +0x61, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, +0x62, 0x67, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x00, 0xD2, 0x0E, 0x10, 0x00, 0x92, 0x02, 0x93, 0x83, 0x67, +0x86, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, +0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x20, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x01, 0x10, +0x00, 0x65, 0x00, 0x92, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, +0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x06, 0xD2, +0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x06, 0x93, 0x0B, 0x92, 0x4C, 0xEB, +0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x05, 0xD2, 0x05, 0x92, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x0B, 0x92, +0x01, 0x4A, 0x21, 0x22, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x05, 0xD2, 0x0B, 0x92, +0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, 0x05, 0x92, 0x0C, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, +0x6D, 0xEA, 0x04, 0xD2, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, +0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, +0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x02, 0xD4, +0x03, 0xD5, 0x04, 0xD6, 0x03, 0x92, 0x01, 0x4A, 0x1A, 0x22, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x03, 0x92, 0x4F, 0xEB, 0x01, 0x92, +0x4C, 0xEB, 0x04, 0x94, 0x03, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x00, 0xD2, 0x02, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x02, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, +0xD8, 0x67, 0xBD, 0x67, 0xCC, 0xCD, 0xBD, 0x67, 0x9C, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x60, 0xC6, +0x7D, 0x67, 0x52, 0xCB, 0x0A, 0x92, 0x00, 0x6B, 0x60, 0xCA, 0x0B, 0x10, 0x01, 0x6C, 0x00, 0x18, +0xB4, 0x0C, 0x0A, 0x92, 0x40, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x0A, 0x92, +0x60, 0xCA, 0x9D, 0x67, 0x6C, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6D, +0xAE, 0xEA, 0x06, 0x22, 0xDD, 0x67, 0x6C, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, +0x5D, 0x67, 0x6C, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x10, 0x9D, 0x67, 0x6C, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, +0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x7C, 0xA5, 0x4C, 0xEB, +0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x6E, 0xEA, 0x07, 0x22, 0x0A, 0x92, 0x40, 0xAA, 0x9D, 0x67, +0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0xC2, 0x2A, 0x0A, 0x92, 0x40, 0xAA, 0x9D, 0x67, 0x72, 0xAC, +0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, +0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0x32, +0x40, 0x32, 0x6D, 0xEA, 0x00, 0xD2, 0xBD, 0x67, 0x48, 0xA5, 0x08, 0x2A, 0x00, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x07, 0x10, 0x00, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x60, 0xF5, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, +0x58, 0x9A, 0x00, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x58, 0x9A, 0x00, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0x60, 0xF5, 0x7C, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF5, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, +0x0B, 0xD5, 0x0C, 0xD6, 0x0D, 0xD7, 0x0E, 0x93, 0x0F, 0x92, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xC5, +0x9D, 0x67, 0x78, 0xC4, 0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0x05, 0xD2, 0x00, 0x6A, 0x04, 0xD2, +0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x01, 0x0C, 0x02, 0x2A, 0x00, 0x6A, +0xCD, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x06, 0x5A, 0x78, 0x67, 0x20, 0x23, 0x48, 0x33, +0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x02, 0xF2, +0x00, 0x6A, 0x05, 0xD2, 0x16, 0x10, 0x02, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x12, 0x10, 0x22, 0xF2, +0x00, 0x6A, 0x05, 0xD2, 0x0E, 0x10, 0x22, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x0A, 0x10, 0x42, 0xF2, +0x00, 0x6A, 0x05, 0xD2, 0x06, 0x10, 0x42, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x02, 0x10, 0x00, 0x6A, +0xA5, 0x10, 0x0D, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x5C, 0x9A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0xA0, 0xF5, 0x40, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x7D, 0x67, 0x5C, 0xA3, 0x08, 0x22, +0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x44, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x07, 0x10, +0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0xD2, 0x9D, 0x67, +0x58, 0xA4, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x4C, 0x9A, 0x6D, 0xEA, +0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x6C, 0xEA, +0x04, 0xD2, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6D, 0xAE, 0xEA, +0x05, 0x22, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x05, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xA0, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, +0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, +0x5C, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, 0x78, 0x9B, 0x8C, 0xEB, +0x60, 0xDA, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x06, 0x22, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, +0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0xA0, 0xF5, 0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xC0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, +0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, +0x48, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xC0, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x6A, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0xE0, 0xF3, 0x08, 0x6A, 0x04, 0xD2, 0x17, 0x10, 0x01, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x04, 0x92, +0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x50, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x70, 0x9B, 0x80, 0x9B, 0x08, 0xF0, 0x00, 0x6B, 0x8D, 0xEB, +0x60, 0xDA, 0x00, 0x6A, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x60, 0xAA, +0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6C, +0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x01, 0x52, 0x58, 0x67, 0xD5, 0x22, 0x01, 0x6A, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, +0x54, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, +0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x01, 0x6B, 0x6E, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, +0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0xA6, 0xF0, 0x01, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, +0x00, 0x18, 0x47, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, +0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x03, 0x6A, +0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, +0x41, 0x12, 0x00, 0x18, 0x46, 0x09, 0x00, 0x18, 0x47, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x77, 0x9A, 0x05, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0x19, 0x10, 0x00, 0x18, 0x46, 0x09, 0x00, 0x18, 0x47, 0x09, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x11, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0xBB, 0x30, 0x00, 0x18, +0x46, 0x09, 0x9C, 0x17, 0x00, 0xD4, 0x00, 0x92, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x6B, +0xE2, 0xF2, 0x6C, 0xDA, 0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x93, 0xE2, 0xF2, 0x6C, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x4C, 0x9A, 0x28, 0x6B, 0x4E, 0xEB, 0x42, 0x23, 0x29, 0x5A, +0x78, 0x67, 0x0A, 0x23, 0x14, 0x6B, 0x4E, 0xEB, 0x24, 0x23, 0x19, 0x6B, 0x4E, 0xEB, 0x2D, 0x23, +0x0A, 0x6B, 0x6E, 0xEA, 0x12, 0x22, 0x72, 0x10, 0x50, 0x6B, 0x4E, 0xEB, 0x4A, 0x23, 0x51, 0x5A, +0x78, 0x67, 0x04, 0x23, 0x32, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0x68, 0x10, 0x64, 0x6B, 0x4E, 0xEB, +0x4C, 0x23, 0xC8, 0x6B, 0x6E, 0xEA, 0x55, 0x22, 0x61, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0x6B, +0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, +0x55, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x49, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x09, 0x6B, +0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x04, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, +0x3D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x05, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x31, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0x6B, +0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x08, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, +0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x0A, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x05, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x19, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0x6B, +0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, +0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x43, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF6, 0x64, 0x9B, 0xE2, 0xF2, 0x74, 0xDA, 0x20, 0xE8, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x4C, 0x9A, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, +0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x54, 0x9A, 0x02, 0x93, 0x58, 0xEB, 0x12, 0xEA, 0x00, 0xD2, +0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x50, 0x9A, 0x02, 0x93, 0x58, 0xEB, +0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x04, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x62, 0x67, 0xC3, 0xF0, 0x10, 0x4B, 0x04, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, +0x00, 0x18, 0x4E, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x01, 0x6B, 0x6C, 0xEA, 0x26, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, +0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x1D, 0x2A, 0x00, 0x6C, 0x20, 0x6D, 0x00, 0x18, 0xBD, 0x07, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x5A, 0x33, 0xFF, 0x6A, +0x6C, 0xEA, 0xFF, 0x6B, 0x69, 0x4B, 0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xB9, 0x12, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xBD, 0x07, +0x5A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, +0x6C, 0xEA, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x02, 0x6B, 0x6C, 0xEA, 0x13, 0x2A, 0x00, 0x6C, 0x20, 0x6D, 0x00, 0x18, 0xEA, 0x07, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF4, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, +0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xEA, 0x07, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x12, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x09, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xBD, 0x07, +0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, +0x6C, 0xEA, 0x11, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x02, 0x6B, 0x6C, 0xEA, 0x08, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, +0xA2, 0x67, 0x00, 0x18, 0xEA, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, +0x08, 0xD4, 0x08, 0x92, 0x60, 0xA2, 0x01, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x53, 0xC3, 0x08, 0x92, +0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x56, 0x32, 0xDD, 0x67, +0x51, 0xC6, 0x5D, 0x67, 0x72, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0xBD, 0x67, +0x91, 0xA5, 0xDD, 0x67, 0x70, 0xA6, 0xBD, 0x67, 0x53, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0x81, 0x0D, 0xDD, 0x67, 0x53, 0xA6, 0x3B, 0x22, 0x5D, 0x67, 0x91, 0xA2, 0xBD, 0x67, 0x71, 0xA5, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x61, 0x9A, 0xDD, 0x67, 0x50, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4D, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, +0x6C, 0xEA, 0x4C, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x51, 0xE3, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, +0x1A, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x37, 0x10, 0xBD, 0x67, +0x91, 0xA5, 0xDD, 0x67, 0x71, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x50, 0xA5, 0x01, 0x6D, 0xC5, 0x67, +0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, +0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x51, 0xA3, +0x48, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, +0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x52, 0xC3, 0x9D, 0x67, 0x52, 0xA4, 0x56, 0x32, 0xBD, 0x67, 0x51, 0xC5, 0xDD, 0x67, 0x72, 0xA6, +0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x71, 0xA4, 0xBD, 0x67, 0x50, 0xA5, +0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xDD, 0x67, 0x91, 0xA6, 0x5D, 0x67, +0x71, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x50, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE4, 0x61, 0xDA, 0x7D, 0x67, 0x51, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x51, 0xE3, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, +0x1A, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x80, 0xC5, 0xDD, 0x67, 0x64, 0xC6, +0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x5A, 0x22, 0xBD, 0x67, 0x40, 0xA5, 0x01, 0x6B, +0x4E, 0xEB, 0x1E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0xAC, 0x10, 0x02, 0x6B, +0x4E, 0xEB, 0x28, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0xA5, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x7C, 0x9B, 0x80, 0x9B, 0xBD, 0x67, +0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x93, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x60, 0x9B, +0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, +0x60, 0xDA, 0x81, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x21, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, +0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x65, 0x6E, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x68, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, +0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x5C, 0x10, 0x7D, 0x67, +0x40, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x1F, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, +0x52, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x2A, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x3A, 0x22, 0x4B, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x7C, 0x9B, +0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, +0x8C, 0xEB, 0x60, 0xDA, 0x38, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0x21, 0xF4, 0x60, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, +0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xBD, 0x67, +0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, +0x12, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, +0x68, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, +0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x20, 0xE8, 0xD9, 0x63, 0x4D, 0x62, 0x0B, 0x03, 0x80, 0x6A, +0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xCB, 0x03, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, +0x20, 0xF0, 0x4C, 0xC3, 0x2B, 0x03, 0x80, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, +0xCB, 0x03, 0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x58, 0xC5, 0x00, 0x6A, +0x05, 0xD2, 0x00, 0x6A, 0xDD, 0x67, 0x51, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xEB, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x69, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x41, 0x9A, +0xC0, 0xF0, 0x16, 0x22, 0x00, 0x6A, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xC6, 0xCA, 0x10, 0x5D, 0x67, +0x20, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x01, 0x6C, 0xA4, 0x67, +0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0xA0, 0xF0, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, +0x58, 0x9A, 0x40, 0x9A, 0x09, 0xD2, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x54, 0x33, 0x9D, 0x67, +0x20, 0xF0, 0x48, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x41, 0x9A, 0x08, 0xD2, 0x09, 0x93, 0x08, 0x92, 0x43, 0xEB, +0x58, 0x67, 0x04, 0x2A, 0x09, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x05, 0x10, 0x08, 0x92, 0x4F, 0xEB, +0x09, 0x92, 0x49, 0xE3, 0x01, 0x4A, 0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0xC0, 0xF4, 0x48, 0xA2, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x44, 0x67, 0x4C, 0x32, +0x54, 0x33, 0x4F, 0xE3, 0x78, 0x32, 0x6B, 0xE2, 0x89, 0xE2, 0x58, 0x32, 0x62, 0x67, 0x07, 0x92, +0x43, 0xEB, 0x58, 0x67, 0x50, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x48, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xBD, 0x67, 0x20, 0xF0, +0x89, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x69, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, +0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, +0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x7D, 0x67, +0x20, 0xF0, 0x49, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x4C, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x69, 0xA5, +0x74, 0x34, 0xFF, 0x6B, 0x6C, 0xEC, 0xDD, 0x67, 0x20, 0xF0, 0x68, 0xA6, 0x71, 0xE4, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x1F, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x69, 0xA4, +0x74, 0x34, 0xFF, 0x6B, 0x6C, 0xEC, 0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x71, 0xE4, 0xFF, 0x6B, +0x8C, 0xEB, 0x04, 0x04, 0x49, 0xE4, 0x7C, 0xC2, 0xDD, 0x67, 0x59, 0xA6, 0x08, 0x94, 0xFF, 0x6B, +0x8C, 0xEB, 0x04, 0x04, 0x49, 0xE4, 0x80, 0xF0, 0x7C, 0xC2, 0x7D, 0x67, 0x59, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x59, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x20, 0xF0, +0x48, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0x3F, 0xF7, 0x0F, 0x2A, +0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, +0x20, 0xF0, 0x49, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0x1F, 0xF7, 0x0E, 0x2A, 0x00, 0x6A, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x11, 0x11, 0xBD, 0x67, 0x20, 0xF0, +0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x5C, 0xA2, 0xFF, 0x6E, 0xCE, 0xEA, 0x00, 0xF1, 0x00, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x58, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xDD, 0x67, 0x58, 0xA6, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x40, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x40, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x58, 0xC6, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x44, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xDD, 0x67, 0x58, 0xA6, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, +0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xF6, +0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x58, 0xC6, +0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, +0x20, 0xF0, 0x69, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0xFF, 0xF6, 0x06, 0x2A, +0x5D, 0x67, 0x78, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x4A, 0x32, 0x82, 0x67, 0x0F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x62, 0xEA, 0x58, 0x67, +0xA0, 0xF0, 0x01, 0x22, 0x7D, 0x67, 0xA0, 0xF0, 0x4C, 0xA3, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, +0x4C, 0xA4, 0xBD, 0x67, 0x51, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x50, 0xC6, 0x01, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x49, 0xC3, 0x36, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, +0x80, 0xF0, 0x5C, 0xA2, 0x62, 0x67, 0x05, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x23, 0x22, 0x7D, 0x67, +0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x80, 0xF0, 0x5C, 0xA2, 0x05, 0x93, 0x4F, 0xE3, +0xFF, 0xF7, 0x1F, 0x6A, 0x43, 0xEB, 0x58, 0x67, 0x15, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, +0x04, 0x03, 0x49, 0xE3, 0x80, 0xF0, 0x5C, 0xA2, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, +0x04, 0x03, 0x49, 0xE3, 0x5C, 0xA2, 0xBD, 0x67, 0x51, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, +0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, +0x49, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x69, 0xA6, 0x9D, 0x67, 0x59, 0xA4, 0x43, 0xEB, 0x58, 0x67, +0xC2, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x56, 0x32, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, +0x71, 0xA5, 0x1F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xC6, 0x5D, 0x67, 0x20, 0xF0, +0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0x81, 0x0D, 0xBD, 0x67, 0x50, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x7C, 0xC2, +0xDD, 0x67, 0x20, 0xF0, 0x89, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, +0x20, 0xF0, 0x48, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x61, 0xDA, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, +0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0xBD, 0x67, 0x78, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x4A, 0x32, 0x82, 0x67, 0x0F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, +0x8C, 0xEA, 0x62, 0xEA, 0x58, 0x67, 0x1F, 0xF6, 0x19, 0x2A, 0x4D, 0x97, 0x27, 0x63, 0x00, 0xEF, +0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, +0x1D, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x61, 0xDA, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x04, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x11, 0x10, 0x5D, 0x67, +0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, +0x7D, 0x67, 0x50, 0x83, 0x00, 0x52, 0x58, 0x67, 0xEA, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC3, 0xF0, +0x10, 0x4A, 0x82, 0x67, 0x00, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0xCB, 0x03, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x1C, 0x10, +0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x74, 0x9B, 0x80, 0x9B, 0x80, 0x6B, +0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x16, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, +0x48, 0xCB, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0xD7, 0x2A, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, +0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x10, 0x10, 0x5D, 0x67, +0x64, 0xA2, 0x03, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, +0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x44, 0xA3, 0x04, 0x4A, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, +0x44, 0xA3, 0x18, 0x5A, 0x58, 0x67, 0xEB, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0xE7, 0xF7, 0x1F, 0x6A, +0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x40, 0x9A, 0x6C, 0xEA, +0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x44, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, +0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, +0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x03, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x61, 0xF4, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, +0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, +0x06, 0xD4, 0x07, 0xD5, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5A, 0xA2, 0x07, 0x93, 0x41, 0xC3, +0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7A, 0xC2, 0x06, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x07, 0x92, 0x83, 0x67, +0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x06, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x4C, 0x9A, 0x49, 0xE3, 0x82, 0x67, 0x07, 0x92, 0x62, 0x42, 0x07, 0x92, 0x47, 0xAA, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, +0x0A, 0xD4, 0x00, 0x18, 0x8D, 0x0F, 0x02, 0x2A, 0x00, 0x6A, 0x58, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x6C, 0xEA, +0x07, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, +0x06, 0x94, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, +0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x00, 0xF6, +0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x06, 0x93, 0x62, 0x33, 0x62, 0x33, 0x00, 0xF6, 0x60, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x0A, 0x92, 0x47, 0xAA, 0x02, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x5D, 0x67, +0x68, 0xAA, 0x06, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA7, 0x0F, 0x06, 0x92, 0x18, 0x4A, +0x05, 0xD2, 0x05, 0x93, 0x0A, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCF, 0x0F, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x01, 0x6A, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x4D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x50, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF7, 0x16, 0x4A, +0x49, 0xE3, 0x82, 0x67, 0x00, 0x18, 0xE7, 0x0F, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x61, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, +0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, +0x00, 0xF4, 0x6E, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x00, 0xF4, 0x4F, 0xA2, 0x09, 0x6B, 0x6E, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x00, 0xF4, 0x4E, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, +0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x74, 0x9B, 0x80, 0x9B, 0x00, 0xF2, 0x00, 0x6B, +0x8D, 0xEB, 0x60, 0xDA, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, +0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x70, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x4D, 0xE3, +0x06, 0x92, 0x60, 0xF3, 0x8E, 0x43, 0x62, 0x67, 0x10, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x61, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6F, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x0A, 0x6B, 0x6E, 0xEA, +0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6F, 0xC2, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF4, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x60, 0x9B, 0x80, 0x9B, 0x30, 0xF0, +0x20, 0x6B, 0x81, 0xF4, 0x64, 0x9B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0xF4, 0x1F, 0x6B, 0x04, 0xF7, +0x10, 0x6A, 0x00, 0xF0, 0x1A, 0x04, 0x04, 0xD4, 0x83, 0x67, 0x20, 0x6D, 0x00, 0x6E, 0xE2, 0x67, +0x00, 0x18, 0x3D, 0x0B, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x00, 0xD2, 0x00, 0x92, 0x60, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x71, 0xC2, 0x00, 0x92, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x72, 0xC2, 0x00, 0x92, 0x62, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x73, 0xC2, 0x00, 0x92, 0x63, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x74, 0xC2, 0x00, 0x92, 0x64, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x75, 0xC2, 0x00, 0x92, 0x65, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x76, 0xC2, 0x00, 0x92, 0x66, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x77, 0xC2, 0x01, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x05, 0xD2, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, +0x51, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x05, 0x22, 0x05, 0x92, 0x42, 0xA2, +0x9D, 0x67, 0x50, 0xC4, 0x04, 0x10, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, +0x51, 0xA4, 0x7D, 0x67, 0x52, 0xC3, 0x22, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x05, 0x92, 0x80, 0xA2, +0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x01, 0x0A, +0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDC, 0x0A, 0x06, 0x2A, 0x9D, 0x67, 0x52, 0xA4, +0x82, 0x67, 0x00, 0x18, 0xA7, 0x09, 0x05, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, +0x48, 0x09, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x52, 0xC3, 0x9D, 0x67, 0x72, 0xA4, +0x9D, 0x67, 0x50, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0xD7, 0x22, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x07, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, +0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x07, 0x92, 0x80, 0xA2, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, +0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x07, 0x92, +0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x07, 0x92, 0x40, 0xA2, 0x5A, 0x32, 0x82, 0x67, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, +0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xA4, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x64, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x7C, 0x33, +0xA4, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, +0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x60, 0x9A, 0xE0, 0xF7, 0x1F, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x64, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, +0x2A, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x64, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x01, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, +0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x58, 0x84, 0x6D, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x58, 0xC3, 0x9D, 0x67, 0x50, 0xA4, +0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x08, 0x5A, 0x58, 0x67, 0xD1, 0x2A, +0x7D, 0x67, 0x58, 0xA3, 0x00, 0xF6, 0x40, 0x33, 0x9D, 0x67, 0x58, 0xA4, 0x40, 0x32, 0x40, 0x32, +0x6D, 0xEA, 0x05, 0x93, 0x6D, 0xEA, 0x05, 0xD2, 0x05, 0x92, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, +0x0C, 0x07, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, +0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x60, 0x5A, 0x58, 0x67, 0x08, 0x22, 0x5D, 0x67, 0x78, 0xA2, 0x07, 0x92, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0xAB, 0x1D, 0x41, 0x10, 0x7D, 0x67, 0x58, 0xA3, 0x0C, 0x6B, 0x4E, 0xEB, +0x1C, 0x23, 0x0D, 0x52, 0x78, 0x67, 0x05, 0x23, 0x0E, 0x22, 0x01, 0x6B, 0x6E, 0xEA, 0x10, 0x22, +0x28, 0x10, 0xC2, 0x6B, 0x4E, 0xEB, 0x20, 0x23, 0xC5, 0x6B, 0x4E, 0xEB, 0x18, 0x23, 0x0D, 0x6B, +0x6E, 0xEA, 0x10, 0x22, 0x1E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x99, 0x10, 0x25, 0x10, +0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB8, 0x10, 0x20, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, +0xBD, 0x0C, 0x1B, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x0B, 0x0D, 0x16, 0x10, 0x07, 0x92, +0x82, 0x67, 0x00, 0x18, 0xDC, 0x10, 0x11, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x61, 0x04, +0x0C, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, +0x70, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x80, 0xF1, 0x03, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x76, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x60, 0xF3, 0x4D, 0xA2, 0x07, 0x6E, 0xCE, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x60, 0xF3, 0x4C, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, +0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x70, 0x9B, 0x80, 0x9B, 0xFF, 0x6B, 0x01, 0x4B, +0x8D, 0xEB, 0x60, 0xDA, 0x4C, 0x11, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, +0x9B, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x20, 0xF1, 0x0C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0xBE, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0xA2, 0x67, 0xDD, 0x67, 0x80, 0xA6, 0x30, 0xF0, +0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, +0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, +0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, +0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, +0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, +0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xB4, 0x35, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE5, 0x89, 0xE2, +0x60, 0xF2, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, +0xA2, 0x67, 0x7D, 0x67, 0x40, 0xA3, 0x84, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, +0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, +0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xB4, 0x35, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE5, 0x89, 0xE2, 0x60, 0xF2, 0x6C, 0xC2, 0x7D, 0x67, +0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0xDD, 0x67, 0x40, 0xA6, 0x04, 0x5A, 0x58, 0x67, +0x3F, 0xF7, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x41, 0x86, 0x6C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE2, 0xF3, 0x9B, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, +0x01, 0x6C, 0x84, 0xEB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, +0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xE2, 0xF3, 0x7B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x03, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0xE2, 0xF3, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x70, 0x9B, 0x80, 0x9B, 0x02, 0x6B, +0x8D, 0xEB, 0x60, 0xDA, 0x04, 0x10, 0xDD, 0x67, 0x41, 0xA6, 0x9F, 0xF6, 0x06, 0x2A, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, +0x6E, 0xEA, 0x5F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x74, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xF2, +0x4C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, +0x54, 0x32, 0x60, 0xF2, 0x89, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x04, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x46, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, +0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x08, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0x74, 0x11, +0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, +0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, +0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, +0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, +0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, +0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x92, 0x54, 0x33, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, +0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, +0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, +0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x94, 0x64, 0x67, 0x68, 0x32, 0x62, 0x67, 0x74, 0x32, 0x6B, 0xE2, +0x89, 0xE2, 0x40, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, +0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, +0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x00, 0x92, +0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x40, 0x9A, +0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6C, 0x9A, 0x00, 0x92, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6D, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, +0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0x9B, 0x60, 0xDA, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, 0x40, 0x9A, +0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, 0x40, 0x9A, 0x03, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, +0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, +0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x68, 0x9A, 0x04, 0x92, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x61, 0x9A, 0x03, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x66, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x62, 0x9A, 0x02, 0x92, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x67, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x63, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x68, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x64, 0x9A, 0x00, 0x92, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x69, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x66, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, +0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF4, 0x08, 0x4B, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x69, 0x9B, 0x60, 0xDA, 0x03, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x6E, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x71, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6F, 0x9A, 0x00, 0x92, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, +0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x71, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x72, 0x9B, +0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x74, 0x11, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x1E, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x23, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, +0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x64, 0xA2, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x5E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x64, 0x9A, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x45, 0xA2, 0x49, 0xE3, +0x5C, 0x32, 0x21, 0x4A, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, +0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x44, 0xA2, 0x5A, 0x32, +0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x5C, 0x32, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, +0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x44, 0xA2, 0x5E, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x58, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x44, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x7D, 0x67, 0x44, 0xC3, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x7D, 0x16, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, +0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0xA0, 0xF4, 0x53, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x11, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF5, 0x70, 0x9B, 0x80, 0xA3, +0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, +0x40, 0xC3, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE2, 0x0D, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x00, 0xF1, 0x0B, 0x22, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0x13, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, +0x22, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x12, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x16, 0x22, 0x1B, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x14, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x06, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, +0x40, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0xC7, 0x10, 0xBD, 0x67, +0x52, 0xA5, 0x01, 0x6B, 0xC3, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x62, 0x67, 0x05, 0x92, 0x4C, 0xEB, +0x9D, 0x67, 0x52, 0xA4, 0xA3, 0x67, 0xA6, 0xEA, 0x45, 0x67, 0xDD, 0x67, 0x51, 0xC6, 0x5D, 0x67, +0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, +0x45, 0x67, 0x4C, 0xEB, 0xDD, 0x67, 0x52, 0xA6, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0xBD, 0x67, +0x50, 0xC5, 0xDD, 0x67, 0x71, 0xA6, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0x80, 0xF0, 0x11, 0x22, +0xBD, 0x67, 0x51, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x48, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, +0x9D, 0x67, 0x52, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xBD, 0x67, +0x20, 0xF0, 0x80, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x60, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, +0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x52, 0xA5, +0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, +0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x5A, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x52, 0xA4, 0x51, 0xE3, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF5, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4C, 0x88, 0x34, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x44, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x3B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, +0x60, 0xA5, 0xDD, 0x67, 0x52, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0x81, 0x0D, +0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xDD, 0x67, +0x52, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x52, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x61, 0xDA, 0xBD, 0x67, 0x52, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x52, 0xA3, +0x20, 0x5A, 0x58, 0x67, 0x3F, 0xF7, 0x13, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x05, 0x93, +0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x20, 0xE8, 0x00, 0x65, +0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xBD, 0x67, +0x8C, 0xC5, 0x9D, 0x67, 0x70, 0xC4, 0xBD, 0x67, 0x54, 0xC5, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x50, 0xA4, +0x08, 0x6B, 0x4B, 0xE3, 0xFF, 0x6B, 0x67, 0xEA, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x84, 0xEA, +0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0x85, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x74, 0xA4, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, +0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, +0xA3, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, +0x41, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x40, 0xC5, +0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x60, 0xA4, +0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, +0x84, 0xCD, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, +0x61, 0xA4, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x87, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, +0xA7, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6C, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, 0x7D, 0x67, 0x54, 0xCB, +0x00, 0x6A, 0x06, 0xD2, 0x9D, 0x67, 0x74, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, +0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x02, 0x2A, 0x05, 0x92, 0x0E, 0x10, +0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x05, 0x93, 0x0B, 0x92, 0x4C, 0xEB, +0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, 0x0C, 0xD6, 0x7D, 0x67, +0x54, 0xCB, 0x5D, 0x67, 0x74, 0xAA, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0xD9, 0x14, 0x06, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x5D, 0x67, 0x74, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x19, 0x10, 0x0B, 0x92, +0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, +0x04, 0x92, 0x0C, 0x94, 0x84, 0xEA, 0x0B, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x05, 0xD2, 0x5D, 0x67, +0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x01, 0x6B, +0x4E, 0xEB, 0x13, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, 0x4E, 0xEB, 0x16, 0x23, +0x03, 0x6B, 0x6E, 0xEA, 0x1C, 0x22, 0x24, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x1C, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x13, 0x10, 0x01, 0x92, 0x48, 0x33, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x0A, 0x10, 0x01, 0x92, +0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0x10, +0x00, 0x6A, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x00, 0x6A, +0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF4, 0x1C, 0x4A, 0x05, 0xD2, 0x05, 0x92, 0x67, 0x42, +0x0D, 0x4B, 0x0A, 0x92, 0x4C, 0x32, 0x4C, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x04, 0xD2, 0x0B, 0x92, +0x00, 0xF5, 0x40, 0x33, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x40, 0x9A, 0x8C, 0xEA, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, 0x6C, 0xEA, 0x06, 0xD2, 0x04, 0x92, +0x64, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x01, 0x6B, 0x6B, 0xEB, 0x06, 0x92, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, +0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x0C, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x9D, 0x67, +0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x0A, 0x15, +0x18, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0x0A, 0x15, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, +0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, +0x06, 0x92, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, +0x0C, 0xD6, 0x0D, 0xD7, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x0C, 0x92, +0x01, 0x4A, 0x0B, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x0D, 0x92, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x25, 0x15, 0x24, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, +0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x0A, 0x15, 0x06, 0xD2, 0x0C, 0x92, +0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x0C, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, +0x04, 0x92, 0x0D, 0x94, 0x84, 0xEA, 0x0C, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x05, 0xD2, 0x5D, 0x67, +0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0x25, 0x15, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF4, +0x1C, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x81, 0xF4, 0x10, 0x6B, 0x69, 0xDA, 0x00, 0x92, 0x81, 0xF6, +0x10, 0x6B, 0x7B, 0xDA, 0x00, 0x92, 0x83, 0xF0, 0x10, 0x6B, 0xA0, 0xF0, 0x74, 0xDA, 0x00, 0x92, +0x83, 0xF2, 0x10, 0x6B, 0xE0, 0xF0, 0x7C, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, +0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, +0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x48, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, +0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x48, 0xCC, 0x5D, 0x67, 0x68, 0xAA, +0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x49, 0xE3, 0x5C, 0x32, 0x06, 0xD2, 0x00, 0x6A, 0x7D, 0x67, +0x4E, 0xCB, 0x31, 0x10, 0x9D, 0x67, 0x4E, 0xAC, 0x48, 0x32, 0x62, 0x67, 0x06, 0x92, 0x4D, 0xE3, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x7D, 0x67, +0x4E, 0xAB, 0x13, 0x2A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x09, 0x10, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x4E, 0xAC, +0x01, 0x4A, 0x7D, 0x67, 0x4E, 0xCB, 0x9D, 0x67, 0x6E, 0xAC, 0x9D, 0x67, 0x56, 0xAC, 0x43, 0xEB, +0x58, 0x67, 0xC8, 0x2A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x56, 0x32, +0x7D, 0x67, 0x41, 0xC3, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, +0x7D, 0x67, 0x41, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, +0x2D, 0x22, 0x37, 0x10, 0x04, 0x6B, 0x4E, 0xEB, 0x10, 0x23, 0x06, 0x6B, 0x6E, 0xEA, 0x31, 0x2A, +0x7D, 0x67, 0x40, 0xA3, 0x11, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x24, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x07, 0x6B, +0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x42, 0xC3, 0x17, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, +0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x0B, 0x10, 0x7D, 0x67, 0x40, 0xA3, +0x08, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x42, 0xC3, 0x7D, 0x67, 0x42, 0x83, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, +0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x9F, 0xF7, 0x1D, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, +0x40, 0x83, 0x14, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x0D, 0x10, 0x7D, 0x67, 0x40, 0x83, +0x00, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x64, 0x6A, 0x06, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x67, 0x42, +0x5D, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, +0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xCA, 0xF7, +0x09, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x12, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x0A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x02, 0x2A, 0x01, 0x6A, 0x1D, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x09, 0x5A, +0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0xE1, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x20, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x09, 0x10, +0x32, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, +0xC1, 0x17, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, +0x7D, 0x67, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x48, 0x9A, 0x9D, 0x67, 0x60, 0xA4, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xF0, +0x72, 0xC2, 0x20, 0xE8, 0xFE, 0x63, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, +0xBD, 0x67, 0xC8, 0xCD, 0xBD, 0x67, 0x94, 0xC5, 0xDD, 0x67, 0x78, 0xC6, 0x7D, 0x67, 0x5C, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x4C, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x45, 0xCC, 0xBD, 0x67, 0x68, 0xAD, 0xDD, 0x67, +0x45, 0xAE, 0x49, 0xE3, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0x03, 0xD2, 0x03, 0x92, +0x5C, 0x32, 0x03, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x68, 0xAD, +0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x40, 0xAA, +0xDD, 0x67, 0x44, 0xCE, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x01, 0xD2, 0x7D, 0x67, 0x54, 0xA3, 0x08, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x10, 0xF0, +0x00, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0xBD, 0x67, 0x44, 0xCD, 0xDD, 0x67, 0x64, 0xAE, 0x47, 0xF7, +0x00, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xCB, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xAC, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, +0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xC5, 0xDD, 0x67, 0x40, 0xA6, 0x07, 0x22, 0x01, 0x93, 0x03, 0xF7, +0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x0C, 0x10, 0x01, 0x93, 0x1F, 0xF7, 0x01, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x5C, 0xA3, 0x40, 0x32, 0x01, 0x93, 0x6D, 0xEA, +0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x01, 0xD2, +0x9D, 0x67, 0x58, 0xA4, 0x80, 0xF4, 0x40, 0x33, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF6, 0x44, 0x9A, 0x6D, 0xEA, 0x01, 0xD2, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, +0x58, 0x9A, 0x49, 0xE3, 0x01, 0x93, 0x60, 0xDA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, +0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x03, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, +0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF7, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x03, 0x92, +0x02, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x6C, 0x9A, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, +0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x7D, 0x67, +0x56, 0xC3, 0x02, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, +0x82, 0x67, 0x00, 0x18, 0x4B, 0x10, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x02, 0xD2, 0x00, 0x6A, 0x01, 0xD2, 0x00, 0x6A, 0x9D, 0x67, +0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x54, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x02, 0x93, +0x80, 0xF1, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, +0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x5C, 0x9A, +0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6C, +0x8E, 0xEA, 0x0B, 0x2A, 0x02, 0x93, 0x80, 0x6A, 0x6D, 0xEA, 0x02, 0xD2, 0x06, 0x10, 0x02, 0x93, +0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x02, 0xD2, 0x00, 0x65, 0x50, 0x6A, 0x7D, 0x67, 0x40, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x54, 0x9A, 0x02, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF6, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x40, 0x9A, +0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x44, 0x9A, 0x9D, 0x67, +0x60, 0xA4, 0x60, 0xC2, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x00, 0x6A, +0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, +0x51, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x9D, 0x67, 0x51, 0xA4, 0x03, 0x6D, 0xAE, 0xEA, +0x04, 0x2A, 0x09, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x03, 0x10, 0x0A, 0x6A, 0x9D, 0x67, 0x52, 0xC4, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x68, 0x9A, 0xBD, 0x67, 0x91, 0x85, 0xFF, 0x6A, 0x8C, 0xEA, +0x0F, 0x6C, 0x8C, 0xEA, 0xBD, 0x67, 0x92, 0xA5, 0x90, 0x34, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, +0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x40, 0xC3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x93, 0x16, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF6, 0x4C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x70, 0xA5, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x24, 0x5A, +0x58, 0x67, 0x07, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, +0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, +0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x20, 0xF0, 0x64, 0xA2, 0xBD, 0x67, +0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBE, 0x16, 0x7D, 0x67, 0x54, 0xA3, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, +0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x54, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x45, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x41, 0xCB, +0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x40, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, +0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x42, 0x32, +0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x1F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x4A, 0x32, 0x00, 0xD2, 0x02, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x4B, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x4E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, +0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, +0x4F, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, +0x42, 0x32, 0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0xE0, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x7D, 0x67, +0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x5E, 0x32, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, +0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF6, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x54, 0x9A, 0x40, 0xA2, 0x7D, 0x67, +0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, +0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x51, 0xA4, 0x6E, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x4E, 0xEB, 0x12, 0x23, +0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0x1E, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x10, 0x23, +0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x22, 0x17, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, +0x5A, 0x31, 0x11, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x17, 0x0B, 0x10, +0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x27, 0x17, 0x05, 0x10, 0x7D, 0x67, 0x50, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x59, 0x17, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, +0x9D, 0x67, 0x71, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0xC0, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF6, 0x54, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0x00, 0xD4, 0x00, 0x92, 0x05, 0x6B, 0x62, 0xDA, 0x00, 0x94, 0x00, 0x6A, +0x00, 0x6B, 0x40, 0xDC, 0x61, 0xDC, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, +0x18, 0x4A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x03, 0x6B, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, +0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x02, 0x6B, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, +0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x6C, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, +0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, +0x68, 0x9B, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0xDC, 0x63, 0x47, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x07, 0x04, 0x62, 0x67, 0x01, 0xF2, +0x0C, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, +0x1C, 0x04, 0x62, 0x67, 0x61, 0xF2, 0x00, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x31, 0x04, 0x62, 0x67, 0xA1, 0xF2, 0x14, 0x4B, 0x54, 0x6A, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x87, 0x10, +0x7D, 0x67, 0x58, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, +0x18, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x05, 0x92, 0x49, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x00, 0x6B, +0x61, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x63, 0xC2, 0x05, 0x92, 0x09, 0x6B, 0x64, 0xC2, 0x05, 0x92, +0x8E, 0xA2, 0x0D, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x04, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0x6F, 0xC2, +0x05, 0x92, 0x8E, 0xA2, 0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, +0x40, 0x6B, 0x8D, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, +0x6E, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, +0x9D, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x7C, 0xC2, +0x05, 0x92, 0x91, 0xA2, 0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, 0x00, 0x6B, +0x72, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, +0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x08, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x71, 0xC2, 0x05, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, +0x00, 0x6B, 0x76, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, +0x68, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, +0x49, 0x6B, 0x67, 0xC2, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, +0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0x7F, 0xF7, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, 0x66, 0xC2, 0x00, 0x18, 0x8D, 0x1E, 0x00, 0x18, 0xE2, 0x17, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x4C, 0x9A, 0x33, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x62, 0x67, 0x65, 0xF7, 0x0C, 0x4B, 0x07, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, +0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC5, 0xF7, 0x00, 0x4B, 0x31, 0x02, 0x83, 0x67, +0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x06, 0xF0, +0x14, 0x4B, 0x1C, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x47, 0x97, +0x24, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, +0x06, 0x04, 0x00, 0x18, 0x4B, 0x10, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, +0x08, 0xD4, 0x09, 0xD5, 0x0A, 0xD6, 0x0B, 0xD7, 0x0A, 0x92, 0x01, 0x4A, 0x2D, 0x22, 0x09, 0x93, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, +0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, +0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0A, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, +0x04, 0xD2, 0x0A, 0x92, 0x4F, 0xEB, 0x05, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0B, 0x94, 0xA4, 0x67, +0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x0B, 0xD2, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x09, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x0B, 0x93, +0x60, 0xDA, 0x08, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, +0x0B, 0x93, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, +0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x08, 0x2A, 0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x48, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x07, 0x10, 0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x05, 0x93, +0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x66, 0xF0, 0x18, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x24, 0x10, 0x9D, 0x67, +0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x50, 0x9A, 0x49, 0xE3, +0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF6, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, +0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0xD7, 0x22, +0x00, 0x18, 0x16, 0x18, 0x00, 0x18, 0xCB, 0x30, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x17, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xF9, 0x63, 0x0E, 0xD4, 0x0F, 0xD5, 0x10, 0xD6, +0x04, 0x6A, 0x04, 0xD2, 0x00, 0x6A, 0x03, 0xD2, 0x10, 0x92, 0x02, 0xD2, 0x0E, 0x92, 0x06, 0xD2, +0x07, 0x11, 0x0F, 0x92, 0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x0F, 0x92, 0x60, 0x82, +0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0xF7, 0x10, 0x08, 0x02, 0x05, 0xD2, +0x03, 0x92, 0x13, 0x22, 0x05, 0x92, 0x30, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, +0x9D, 0x67, 0x67, 0xA4, 0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, +0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, +0x62, 0x6B, 0x6E, 0xEA, 0x40, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, +0x06, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x02, 0x92, +0x40, 0x82, 0x9D, 0x67, 0x46, 0xC4, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, +0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x04, 0x6A, 0x04, 0xD2, +0x1B, 0x10, 0x5D, 0x67, 0x66, 0xA2, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF6, 0x14, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, +0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, +0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, +0x0F, 0x92, 0x02, 0x4A, 0x0F, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x77, 0x6B, 0x6E, 0xEA, +0x41, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, +0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x35, 0x2A, 0x02, 0x92, 0x40, 0xAA, 0x9D, 0x67, +0x42, 0xCC, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, +0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x0C, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, +0x62, 0xAA, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, +0x14, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, +0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, +0x0F, 0xD2, 0x3E, 0x10, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x58, 0x6C, 0x8E, 0xEA, 0x32, 0x2A, 0x02, 0x92, 0x40, 0x9A, +0x00, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, +0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x1C, 0x6A, 0x04, 0xD2, 0x1A, 0x10, 0x00, 0x93, +0x04, 0x92, 0x66, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x14, 0x4A, +0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, +0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE2, 0x22, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, +0x08, 0x02, 0x07, 0xD2, 0x0A, 0x10, 0x07, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, +0x01, 0x4A, 0x06, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x07, 0xD2, 0x07, 0x93, 0x05, 0x92, 0x43, 0xEB, +0x58, 0x67, 0xF1, 0x2A, 0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, +0x0F, 0x92, 0x40, 0x82, 0xFF, 0xF6, 0x15, 0x2A, 0x0E, 0x92, 0x03, 0x22, 0x06, 0x92, 0x00, 0x6B, +0x60, 0xC2, 0x06, 0x93, 0x0E, 0x92, 0x4B, 0xE3, 0x07, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, +0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x63, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x63, 0xF4, 0x49, 0xA2, 0x12, 0x2A, 0x06, 0x93, 0x06, 0x02, 0x04, 0x4A, 0x30, 0xF0, +0x20, 0x6C, 0xE2, 0xF2, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xFA, 0x18, 0x30, 0xF0, +0x20, 0x6A, 0xE2, 0xF2, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x46, 0xC3, +0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, +0x45, 0xC4, 0x7D, 0x67, 0x46, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x5E, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, +0x7C, 0x33, 0xAE, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, +0x78, 0x33, 0xAE, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x9D, 0x67, +0x45, 0xA4, 0x80, 0xF0, 0x0B, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x1F, 0x6B, 0x6C, 0xEA, +0x00, 0x93, 0x44, 0xC3, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAE, 0xA2, 0x04, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAE, 0xA2, +0x0D, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, +0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, +0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAF, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x30, 0x6A, +0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x70, 0x33, 0xAE, 0xA2, 0x31, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x18, 0x10, +0x9D, 0x67, 0x46, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x44, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x03, 0x4B, 0x02, 0x94, +0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x44, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x44, 0xC4, +0x7D, 0x67, 0x44, 0xA3, 0x04, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x51, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x18, 0x10, 0x7D, 0x67, 0x51, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x9D, 0x67, 0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x54, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x03, 0x4B, 0x08, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, +0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x5A, +0x58, 0x67, 0xE3, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xEA, 0x28, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, +0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x01, 0x6A, 0xBD, 0x67, 0x53, 0xC5, 0x00, 0x6A, 0x7D, 0x67, +0x51, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x57, 0xC5, 0x22, 0x10, +0x7D, 0x67, 0x57, 0xA3, 0x0C, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x22, 0x22, 0x9D, 0x67, 0x54, 0xA4, +0x01, 0x4A, 0xBD, 0x67, 0x54, 0xC5, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, +0xBD, 0x67, 0x56, 0xA5, 0x0B, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x00, 0x6A, 0x9D, 0x67, 0x56, 0xC4, +0xBD, 0x67, 0x53, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x57, 0xA4, 0x01, 0x4A, +0xBD, 0x67, 0x57, 0xC5, 0x7D, 0x67, 0x57, 0xA3, 0x37, 0x5A, 0x58, 0x67, 0xD9, 0x2A, 0x01, 0x10, +0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, 0x0F, 0x5A, +0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, +0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, +0x67, 0xC2, 0x07, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, +0x67, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, 0x50, 0x32, +0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x57, 0xC4, 0x8E, 0x10, 0xBD, 0x67, 0x77, 0xA5, +0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x6B, 0xE2, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, +0x73, 0xA4, 0xBD, 0x67, 0x57, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, +0x4C, 0xEB, 0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0xBD, 0x67, +0x51, 0xA5, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x9D, 0x67, 0x77, 0xA4, +0xBD, 0x67, 0x53, 0xA5, 0xFF, 0x4A, 0x6E, 0xEA, 0x3A, 0x2A, 0x7D, 0x67, 0x53, 0xA3, 0x01, 0x6B, +0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, +0x6F, 0xE2, 0xFF, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x54, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x52, 0xC5, +0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x13, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x4A, 0xBD, 0x67, +0x96, 0xA5, 0xBD, 0x67, 0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, +0x49, 0xE4, 0x6A, 0xC2, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, +0x76, 0xA5, 0x9D, 0x67, 0x52, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x52, 0xA3, +0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x53, 0xCC, 0x1F, 0x10, 0x00, 0x6A, +0xBD, 0x67, 0x56, 0xC5, 0x13, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, +0xBD, 0x67, 0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, +0x6A, 0xC2, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, +0x0B, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x00, 0x6A, 0x9D, 0x67, +0x58, 0xC4, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0xBD, 0x67, +0x57, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x57, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, +0x43, 0xEB, 0x58, 0x67, 0x7F, 0xF7, 0x0A, 0x2A, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0x7D, 0x67, +0x20, 0xF0, 0x54, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, +0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x05, 0x6A, 0x7D, 0x67, +0x51, 0xCB, 0x0F, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, +0x56, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x20, 0xF0, +0x45, 0xA2, 0x7D, 0x67, 0x58, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x9D, 0x67, 0x59, 0xC4, +0x04, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, +0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xF7, 0x63, 0x11, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF7, 0x78, 0x9A, +0x09, 0xD3, 0x62, 0x67, 0x20, 0xF7, 0x18, 0x4B, 0x61, 0x9B, 0x0A, 0xD3, 0x20, 0xF7, 0x18, 0x4A, +0x48, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x4C, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x64, 0x9A, +0x0C, 0xD3, 0x62, 0x67, 0x40, 0xF7, 0x04, 0x4B, 0x61, 0x9B, 0x0D, 0xD3, 0x40, 0xF7, 0x04, 0x4A, +0x48, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x58, 0xC5, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x01, 0x6C, +0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, +0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, +0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, +0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, +0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, +0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, +0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, +0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x63, 0xF3, 0x64, 0xA3, +0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, +0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, +0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0xC7, 0x10, +0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x08, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, +0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, +0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, +0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, +0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x08, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, +0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, +0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, +0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, +0x08, 0x4B, 0x6D, 0xE4, 0xA3, 0xF3, 0x78, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, +0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, +0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, +0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, +0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x63, 0x10, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x09, 0x6C, +0x8E, 0xEA, 0x5D, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, +0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, +0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, +0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, +0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, +0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, +0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, +0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x03, 0xF4, 0x6C, 0xA3, +0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, +0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, +0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x11, 0x97, +0x09, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x01, 0x4A, 0x40, 0xA2, +0x7D, 0x67, 0x59, 0xC3, 0x0A, 0x92, 0x05, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, +0x06, 0x22, 0x7D, 0x67, 0x59, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC7, 0x1A, 0x89, 0x10, 0x0A, 0x92, +0x40, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x0A, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x58, 0xC3, +0x0A, 0x92, 0x04, 0x4A, 0x40, 0xA2, 0x50, 0x32, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, +0x0A, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x6D, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, +0x7D, 0x67, 0x4B, 0xCB, 0x7D, 0x67, 0x59, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF6, 0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, 0x5D, 0x67, 0x98, 0xA2, +0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE4, 0x63, 0xF3, 0x64, 0xC2, 0x54, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x08, 0x6B, 0x6E, 0xEA, +0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, +0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA3, 0xF3, 0x78, 0xC2, 0x3A, 0x10, 0x7D, 0x67, 0x59, 0xA3, +0x09, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x14, 0x4A, 0x82, 0x67, +0x00, 0x18, 0x25, 0x1A, 0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x03, 0xF4, 0x6C, 0xC2, 0x20, 0x10, +0x7D, 0x67, 0x59, 0xA3, 0x0A, 0x6B, 0x6E, 0xEA, 0x1B, 0x2A, 0x07, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, +0x54, 0xC3, 0x28, 0xF3, 0x01, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, +0x58, 0x9A, 0x04, 0xD2, 0x5D, 0x67, 0xB4, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x82, 0x67, 0x80, 0xF6, 0x04, 0x4C, 0x04, 0x92, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, +0x40, 0xA2, 0x7D, 0x67, 0x55, 0xC3, 0x7D, 0x67, 0x55, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, +0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5A, 0xA2, +0x7D, 0x67, 0x54, 0xC3, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x04, 0x92, 0x7A, 0xC2, 0x08, 0x92, +0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, +0x8C, 0xEB, 0x74, 0x33, 0xBD, 0xA2, 0x21, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, +0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, +0x01, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, +0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xBD, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x47, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, +0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xBD, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, +0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, +0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, +0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xBD, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x04, 0x92, 0x5D, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x16, 0x22, +0x7D, 0x67, 0x55, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x15, 0x31, 0x5D, 0x67, 0x95, 0xA2, 0x04, 0x92, +0x5A, 0xA2, 0x62, 0x67, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, +0xFF, 0x6A, 0xAC, 0xEA, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xB2, 0x25, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x50, 0xC3, 0x08, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, +0x63, 0xC2, 0x08, 0x92, 0x01, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x63, 0xF4, 0x64, 0xC2, 0x7D, 0x67, 0x50, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x2A, 0x08, 0x92, +0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x60, 0xC2, +0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, +0x61, 0xC2, 0x08, 0x92, 0x04, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x63, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x40, 0xA2, +0xA2, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x41, 0xA2, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x42, 0xA2, 0x30, 0xF0, 0x20, 0x6C, +0xA0, 0xF6, 0x10, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x34, 0x10, 0x7D, 0x67, +0x50, 0xA3, 0x02, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x60, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x6B, 0xEB, 0x63, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x40, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x63, 0xF4, 0x41, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0xE0, 0xF6, 0x00, 0x4C, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, +0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, +0x65, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, +0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, 0x08, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, +0x08, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x01, 0x6B, 0x63, 0xF4, 0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x9D, 0x67, 0x72, 0xA4, 0x63, 0xF4, 0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x9D, 0x67, 0x71, 0xA4, 0x63, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x9D, 0x67, 0x70, 0xA4, 0x63, 0xF4, 0x6A, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x02, 0x22, 0x00, 0x18, +0x9E, 0x21, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x0C, 0x92, +0x40, 0xA2, 0x7D, 0x67, 0x53, 0xC3, 0x0C, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, +0x0C, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, +0x0B, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x00, 0x6B, 0x66, 0xC2, 0x7D, 0x67, +0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x0C, 0x5A, 0x58, 0x67, +0xF0, 0x2A, 0x5D, 0x67, 0x71, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x48, 0x22, +0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x43, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, +0x58, 0x67, 0x3E, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x45, 0xF6, 0x78, 0x9A, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, +0x42, 0x33, 0x62, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, 0x00, 0xF6, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x5A, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x45, 0xF6, 0x78, 0xDA, 0xDF, 0x11, +0x5D, 0x67, 0x71, 0xA2, 0x02, 0x6A, 0x6C, 0xEA, 0xC0, 0xF0, 0x16, 0x22, 0x02, 0x6A, 0x7D, 0x67, +0x56, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x73, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, +0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, +0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, +0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x5A, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, +0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x73, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0x62, 0xCA, 0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x7D, 0x67, +0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, +0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, +0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, +0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, +0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, +0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, +0x09, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x03, 0x11, 0x7D, 0x67, 0x51, 0xA3, 0xE0, 0xF0, 0x19, 0x2A, +0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x6F, 0x22, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, +0x56, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, +0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, +0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, +0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, +0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, +0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, +0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x71, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, +0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, +0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, +0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x5F, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, +0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x52, 0xA3, +0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x60, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x52, 0xA3, +0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x51, 0xCB, +0x06, 0x10, 0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, +0x82, 0x67, 0x00, 0x18, 0x4B, 0x10, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x07, 0xD5, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0xC0, 0x4A, 0x0A, 0x5A, +0x78, 0x67, 0x2A, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x10, 0x4A, 0x49, 0xE3, +0x40, 0x9A, 0x00, 0xEA, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xA1, 0x19, 0x1D, 0x10, 0x07, 0x92, +0x82, 0x67, 0x00, 0x18, 0xC2, 0x1B, 0x18, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x0D, 0x1A, +0x13, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x71, 0x1B, 0x0E, 0x10, 0x07, 0x92, 0x82, 0x67, +0x00, 0x18, 0x11, 0x1C, 0x09, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x5E, 0x1C, 0x04, 0x10, +0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x7E, 0x1C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x08, 0x22, +0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, +0x00, 0x6A, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x40, 0x5A, +0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, +0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, +0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x60, 0x5A, +0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, +0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, +0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0xFF, 0x6A, +0x6C, 0xEA, 0xF0, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, +0x4C, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF3, 0x50, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x54, 0x9A, 0x6C, 0xEA, +0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, +0x58, 0x9A, 0x6C, 0xEA, 0x13, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, +0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, +0xDD, 0x1D, 0x62, 0x67, 0xE0, 0xF3, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, +0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, +0x62, 0x67, 0xE1, 0xF7, 0x10, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x5C, 0x9A, 0x6C, 0xEA, +0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, +0x40, 0x9A, 0x6C, 0xEA, 0x16, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x0C, 0xF0, 0x18, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, +0x48, 0x9A, 0x6C, 0xEA, 0x18, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x4C, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, +0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF3, 0x54, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x58, 0x9A, 0x6C, 0xEA, +0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x00, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x5C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x40, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x54, 0xA3, +0xE0, 0xF5, 0x07, 0x22, 0x80, 0xF4, 0x0C, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x80, 0xF4, 0x10, 0x6A, +0x7D, 0x67, 0x48, 0xCB, 0x80, 0xF4, 0x14, 0x6A, 0x9D, 0x67, 0x47, 0xCC, 0x80, 0xF4, 0x18, 0x6A, +0x7D, 0x67, 0x46, 0xCB, 0x9D, 0x67, 0x57, 0xA4, 0x10, 0x22, 0x80, 0xF4, 0x1C, 0x6A, 0x7D, 0x67, +0x49, 0xCB, 0xA0, 0xF4, 0x00, 0x6A, 0x9D, 0x67, 0x48, 0xCC, 0xA0, 0xF4, 0x04, 0x6A, 0x7D, 0x67, +0x47, 0xCB, 0xA0, 0xF4, 0x08, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x7D, 0x67, 0x56, 0xA3, 0x4C, 0x32, +0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x02, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0xE6, 0xF2, 0x00, 0x4A, 0x01, 0xD2, 0x9D, 0x67, 0x55, 0xA4, 0x01, 0x6B, +0x4E, 0xEB, 0xA0, 0xF3, 0x0E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x03, 0x23, 0x0C, 0x22, 0xA0, 0xF5, +0x09, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0xC0, 0xF1, 0x01, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x80, 0xF4, +0x03, 0x22, 0x80, 0xF5, 0x1F, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x7D, 0x67, +0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, +0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, +0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, +0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x8E, 0xA3, +0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, +0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, 0x69, 0xAC, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0D, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, +0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, +0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, +0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, +0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x61, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, +0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x68, 0xAC, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6F, 0xA3, 0x6A, 0x33, +0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, +0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6F, 0xA3, +0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, +0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, +0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, +0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x64, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, +0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, +0x20, 0x6B, 0x61, 0xF3, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x12, 0x10, 0x5D, 0x67, +0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, +0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, +0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, +0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x68, 0x9B, 0x6D, 0xE4, +0x60, 0x9B, 0x60, 0xDA, 0xF7, 0x13, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, +0x61, 0xF3, 0x68, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xE4, 0x13, 0x5D, 0x67, 0x69, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x6A, 0x33, 0x83, 0x67, +0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x9D, 0x67, 0x69, 0xAC, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x6A, 0x33, +0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, +0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, +0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, +0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, +0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, 0x60, 0xC2, 0x0A, 0x10, +0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x65, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, +0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, +0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, +0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, +0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, +0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, +0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, +0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, +0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, +0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, +0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x9D, 0x67, +0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, +0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, +0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, +0x64, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x0D, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x54, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x0C, 0x10, +0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x30, 0xF0, +0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x63, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, +0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, +0x61, 0xA3, 0x60, 0xC2, 0x0F, 0x12, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, +0x40, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, 0x61, 0xA3, 0x60, 0xC2, +0x01, 0x12, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, +0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, +0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x6C, 0x9B, 0x6D, 0xE4, +0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, +0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x6C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, +0x70, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, +0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, +0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x70, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, +0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, +0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x9D, 0x67, +0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, +0x29, 0x11, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, 0x1E, 0x11, 0x5D, 0x67, 0x69, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, +0x5D, 0x67, 0x68, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, +0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, +0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, +0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, +0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, +0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, +0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x67, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, +0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x67, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, +0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, +0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, +0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, +0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, +0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, +0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x61, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, +0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, +0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x01, 0xF5, +0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, +0x54, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, 0x60, 0xA3, +0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, 0x60, 0xA3, 0x60, 0xC2, +0x01, 0x10, 0x00, 0x65, 0x03, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x4A, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x7D, 0x67, 0x54, 0xA3, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, +0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x49, 0xA2, 0x02, 0x6B, +0x4E, 0xEB, 0x6B, 0x23, 0x03, 0x52, 0x78, 0x67, 0x04, 0x23, 0x01, 0x6B, 0x6E, 0xEA, 0x0A, 0x22, +0x77, 0x11, 0x03, 0x6B, 0x4E, 0xEB, 0xE0, 0xF0, 0x12, 0x23, 0x04, 0x6B, 0x6E, 0xEA, 0x40, 0xF1, +0x13, 0x22, 0x6E, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, +0x0C, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, +0x43, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, 0x6E, 0xA2, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x45, 0xA2, 0x7D, 0x67, +0x5F, 0xC3, 0x04, 0x92, 0x46, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x04, 0x92, 0x4E, 0xA2, +0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x04, 0x92, 0x4E, 0xA2, +0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, +0x42, 0xC3, 0x04, 0x92, 0x4F, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x53, 0xA2, 0x7D, 0x67, 0x20, 0xF0, +0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, +0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x13, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, +0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x44, 0xA2, +0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x41, 0xA2, +0x7D, 0x67, 0x5D, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, +0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x54, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, 0x7D, 0x67, 0x54, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x20, 0xF0, 0x43, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, +0x44, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, +0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, +0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x81, 0x10, 0x0C, 0x6A, +0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0E, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, +0x04, 0x92, 0x56, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x40, 0xA2, 0x7D, 0x67, +0x5C, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, 0x20, 0xF0, +0x42, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x43, 0xA2, 0x7D, 0x67, 0x5F, 0xC3, +0x04, 0x92, 0x20, 0xF0, 0x44, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x54, 0xA3, +0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x6C, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, +0x0F, 0x6B, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x4C, 0xAA, 0x62, 0x67, +0xF0, 0x6A, 0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, +0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, +0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x1C, 0x10, 0x03, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, +0x7D, 0x67, 0x58, 0xC3, 0x0F, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, +0x48, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, 0x08, 0x4A, 0x41, 0xA2, +0x7D, 0x67, 0x5C, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, +0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, +0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x25, 0x22, 0x7D, 0x67, 0x4C, 0xA3, +0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0xA2, +0x9D, 0x67, 0x40, 0xC4, 0x5D, 0x67, 0x60, 0xA2, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, +0x40, 0xC3, 0x9D, 0x67, 0x60, 0xA4, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, +0x4C, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, +0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, +0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, +0x20, 0xF0, 0xD8, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x9C, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x60, 0xC6, +0x7D, 0x67, 0x40, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, +0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x07, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x06, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xC5, +0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xC3, 0x9D, 0x67, +0x20, 0xF0, 0x78, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x47, 0xC5, 0x00, 0x6A, +0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, +0x60, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0xC4, 0x07, 0x92, 0x41, 0xA2, +0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x7C, 0xA6, 0x7F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, +0x48, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x27, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x02, 0x6B, +0x6E, 0xEA, 0x21, 0x2A, 0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, +0x05, 0x2A, 0x47, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x0B, 0x10, 0x07, 0x92, 0x4C, 0xA2, +0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x45, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x6D, 0xEA, +0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x20, 0xF0, +0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, +0x49, 0xE3, 0x47, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x07, 0x92, 0x6C, 0xCA, 0xDD, 0x67, +0x20, 0xF0, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x12, 0x22, 0x9D, 0x67, 0x20, 0xF0, +0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x63, 0xEA, 0x58, 0x67, 0x16, 0x22, 0x5D, 0x67, +0x20, 0xF0, 0x7C, 0x82, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0xBD, 0x67, 0x20, 0xF0, 0x5C, 0xC5, 0x0F, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x68, 0xA6, +0x9D, 0x67, 0x20, 0xF0, 0x41, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, +0x41, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x78, 0xA5, 0xDD, 0x67, +0x20, 0xF0, 0x48, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x87, 0x22, 0x7D, 0x67, 0x40, 0xF0, +0x40, 0xA3, 0x1A, 0x2A, 0x07, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, +0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x78, 0xA5, +0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0x00, 0x6C, 0x04, 0xD4, 0x00, 0x6C, 0x00, 0x6D, 0xC3, 0x67, +0xE2, 0x67, 0x00, 0x18, 0x8D, 0x26, 0x56, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x65, 0xA2, 0x01, 0x6A, +0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x07, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xAF, 0xA2, +0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, +0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x40, 0x6A, 0x6D, 0xEA, 0xDD, 0x67, +0x20, 0xF0, 0x46, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF1, +0x04, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x07, 0x92, 0x73, 0xC2, 0x07, 0x92, 0x7A, 0xA2, 0xBD, 0x67, +0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, +0x43, 0xEB, 0x58, 0x67, 0x07, 0x22, 0x07, 0x92, 0x53, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x07, 0x92, 0x73, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x4C, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, +0x03, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x4C, 0x9A, 0x9D, 0x67, +0x20, 0xF0, 0x7C, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x50, 0x9A, 0xBD, 0x67, +0x20, 0xF0, 0x66, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, +0xE0, 0xF0, 0x02, 0x2A, 0x9D, 0x67, 0x40, 0xF0, 0x40, 0xA4, 0xC0, 0xF0, 0x1D, 0x2A, 0xBD, 0x67, +0x20, 0xF0, 0x5C, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0x19, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, +0x0C, 0x5A, 0x58, 0x67, 0x13, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x6C, 0x42, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF0, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF7, +0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBE, 0x10, 0x9D, 0x67, 0x20, 0xF0, +0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x12, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF0, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF7, +0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xA6, 0x10, 0x07, 0x92, 0x4E, 0xA2, +0x30, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x4C, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, +0x2C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x36, 0x5A, 0x58, 0x67, +0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF7, +0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x86, 0x10, 0x9D, 0x67, 0x20, 0xF0, +0x5C, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x40, 0x5A, +0x58, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xCA, 0x4A, 0x30, 0xF0, 0x20, 0x6B, +0xE0, 0xF7, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x65, 0x6C, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x63, 0x2A, 0x7D, 0x67, 0x20, 0xF0, +0x5C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x5F, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xC0, 0x4A, +0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF0, 0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x53, 0x10, 0x07, 0x92, 0x4E, 0xA2, 0x30, 0x6B, 0x6C, 0xEA, 0x4E, 0x2A, 0x9D, 0x67, 0x20, 0xF0, +0x5C, 0xA4, 0x0C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x16, 0x5A, +0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, +0x01, 0xF0, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x35, 0x10, 0x9D, 0x67, +0x20, 0xF0, 0x5C, 0xA4, 0x16, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, +0x20, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xEA, 0x4A, 0x30, 0xF0, +0x20, 0x6B, 0x21, 0xF0, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x1C, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x16, 0x2A, 0x7D, 0x67, 0x20, 0xF0, +0x5C, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xE0, 0x4A, +0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0xBD, 0x67, 0x20, 0xF0, +0x7C, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x20, 0xF0, 0x66, 0xA4, 0x60, 0xC2, +0xBD, 0x67, 0x20, 0xF0, 0x58, 0xA5, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, +0x54, 0x9A, 0x49, 0xE3, 0xDD, 0x67, 0x20, 0xF0, 0x65, 0xA6, 0x60, 0xC2, 0x00, 0x65, 0x01, 0x10, +0x00, 0x65, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, +0x68, 0xCC, 0x7D, 0x67, 0x4A, 0xCB, 0x01, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x00, 0x6A, 0x7D, 0x67, +0x40, 0xCB, 0x9D, 0x67, 0x68, 0xAC, 0x9D, 0x67, 0x4A, 0xAC, 0x6E, 0xEA, 0x04, 0x2A, 0x64, 0x6A, +0x7D, 0x67, 0x46, 0xCB, 0x87, 0x10, 0x9D, 0x67, 0x48, 0xAC, 0x07, 0x22, 0x5D, 0x67, 0x68, 0xAA, +0x9D, 0x67, 0x4A, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x46, 0xCB, +0x79, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x04, 0x6A, +0x7D, 0x67, 0x40, 0xCB, 0x1C, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x04, 0xF0, 0x00, 0x5A, 0x58, 0x67, +0x04, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x12, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x08, 0xF0, +0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x08, 0x10, 0x9D, 0x67, +0x4A, 0x8C, 0x00, 0x52, 0x58, 0x67, 0x03, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, +0x6A, 0xAC, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x02, 0xD2, 0x5D, 0x67, +0x68, 0xAA, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0xD2, 0x00, 0x6A, +0x7D, 0x67, 0x4E, 0xC3, 0x33, 0x10, 0x02, 0x92, 0x46, 0x32, 0x02, 0xD2, 0x01, 0x93, 0x02, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x26, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x81, 0xF4, 0x00, 0x6B, 0x67, 0xEA, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x46, 0xAC, 0x49, 0xE3, 0x7D, 0x67, 0x46, 0xCB, +0x01, 0x93, 0x02, 0x92, 0x4B, 0xE3, 0x01, 0xD2, 0x02, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, +0x01, 0x92, 0x02, 0x5A, 0x58, 0x67, 0x03, 0x2A, 0x02, 0x6A, 0x02, 0xD2, 0x0A, 0x10, 0x02, 0x92, +0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x01, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x0E, 0x22, 0x01, 0x92, +0x0B, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x4E, 0xC4, 0x7D, 0x67, 0x4E, 0xA3, +0x0C, 0x5A, 0x58, 0x67, 0xC8, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x46, 0xAB, 0x5A, 0x32, +0x9D, 0x67, 0x46, 0xCC, 0x5D, 0x67, 0x66, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x09, 0xD5, 0x0A, 0xD6, 0x47, 0x67, 0x9D, 0x67, 0x20, 0xF0, +0x60, 0xC4, 0xBD, 0x67, 0x56, 0xCD, 0x0A, 0x92, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, +0x01, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0x1D, 0x10, 0xBD, 0x67, 0x52, 0xA5, 0x7D, 0x67, 0x51, 0xC3, +0x0E, 0x10, 0x9D, 0x67, 0x51, 0xA4, 0x48, 0x32, 0x09, 0x93, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0x93, +0x49, 0xE3, 0x05, 0xD2, 0xBD, 0x67, 0x51, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, +0x51, 0xA4, 0x05, 0x5A, 0x58, 0x67, 0xED, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x92, 0x04, 0x2A, +0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x23, 0x10, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x0A, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x9D, 0x67, 0x56, 0xAC, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x05, 0x94, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0xBD, 0x67, 0x56, 0xAD, 0x53, 0xE4, 0xFF, 0xF7, 0x1F, 0x6A, +0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xE6, 0x23, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, +0x50, 0xA4, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, +0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x09, 0x22, 0x7D, 0x67, 0x48, 0xA3, +0xE0, 0x4A, 0x9D, 0x67, 0x48, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x40, 0xC5, 0x03, 0x10, 0x01, 0x6A, +0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x48, 0x32, 0x03, 0x93, 0x49, 0xE3, 0x60, 0x9A, +0xBD, 0x67, 0x48, 0xA5, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x02, 0x22, +0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, +0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, +0x48, 0xA3, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x50, 0xA5, 0x05, 0x22, 0x7D, 0x67, 0x44, 0xA3, +0xE0, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x44, 0xA5, 0x20, 0x5A, 0x58, 0x67, 0x11, 0x2A, +0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, +0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0xE0, 0x4A, 0xBD, 0x67, 0x44, 0xC5, +0x0B, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, +0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0x01, 0x6B, 0xA3, 0x67, +0xA4, 0xEA, 0x45, 0x67, 0x62, 0x67, 0x00, 0x92, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x48, 0xA3, +0x01, 0x10, 0xFF, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x1C, 0x65, 0x85, 0x67, +0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0x40, 0xF0, 0xC0, 0xC5, 0xBD, 0x67, 0x40, 0xF0, +0x84, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x4C, 0xC3, 0x9D, 0x67, +0x40, 0xF0, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, +0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x5D, 0xC5, 0x03, 0x6A, 0xDD, 0x67, +0x55, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x60, 0xA4, 0x7F, 0x6A, +0x6C, 0xEA, 0xBD, 0x67, 0x56, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x39, 0x2A, 0x7D, 0x67, +0x56, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF1, 0x0C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x60, 0x10, +0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, +0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF2, 0x14, 0x4C, 0x5D, 0x67, 0x7A, 0xA2, +0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x4A, 0x10, 0x7D, 0x67, 0x5A, 0xA3, +0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xA0, 0xF1, 0x18, 0x4C, +0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x38, 0x10, +0xDD, 0x67, 0x56, 0xA6, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, +0x27, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, +0x4C, 0xA6, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xC0, 0xF2, 0x04, 0x4C, 0x5D, 0x67, +0x7A, 0xA2, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x11, 0x10, 0x7D, 0x67, +0x5A, 0xA3, 0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x60, 0xF2, +0x08, 0x4C, 0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, +0xDD, 0x67, 0x54, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x0B, 0x92, 0x40, 0xA2, 0x9D, 0x67, +0x5B, 0xC4, 0xBD, 0x67, 0x9B, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xA6, 0xBD, 0x67, 0x40, 0xF0, +0x4C, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x7F, 0x24, 0xDD, 0x67, 0x5C, 0xC6, 0x04, 0x92, +0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x7D, 0x67, 0x5C, 0xA3, 0xFF, 0x6C, +0x8E, 0xEA, 0x02, 0x2A, 0xFF, 0x6A, 0x54, 0x11, 0xBD, 0x67, 0x5C, 0xA5, 0x51, 0x11, 0x00, 0x6A, +0xDD, 0x67, 0x59, 0xC6, 0x0D, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, +0x6B, 0xEB, 0x20, 0xF0, 0x60, 0xC2, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x59, 0xC5, +0xDD, 0x67, 0x59, 0xA6, 0x03, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, +0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x55, 0x10, 0xBD, 0x67, 0x59, 0xA5, 0x0B, 0x93, 0x49, 0xE3, +0x40, 0xA2, 0xDD, 0x67, 0x5B, 0xC6, 0x7D, 0x67, 0x5B, 0xA3, 0x2C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, +0xBD, 0x67, 0x40, 0xF0, 0x4C, 0xA5, 0x03, 0x2A, 0x0C, 0x6A, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, +0x9B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x68, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0x7F, 0x24, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, +0xBD, 0x67, 0x59, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x18, 0x2A, 0x9D, 0x67, +0x5B, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x0C, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x04, 0x2A, +0x47, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x24, 0x10, 0x45, 0x6A, 0x9D, 0x67, 0x5C, 0xC4, 0x20, 0x10, +0xBD, 0x67, 0x7D, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x49, 0xE3, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, +0x5C, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x0D, 0x22, 0xDD, 0x67, 0x58, 0xA6, 0x04, 0x03, 0x49, 0xE3, +0x9D, 0x67, 0x7C, 0xA4, 0x20, 0xF0, 0x60, 0xC2, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, +0x58, 0xC6, 0x5D, 0x67, 0x79, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xA4, 0x2A, +0x7D, 0x67, 0x58, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, +0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x9D, 0x67, 0x5D, 0xA4, 0x06, 0x5A, +0x58, 0x67, 0x02, 0x2A, 0xFF, 0x6A, 0xBC, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x10, 0x6A, 0x9D, 0x67, 0x5F, 0xC4, 0x10, 0x6A, 0xBD, 0x67, 0x5E, 0xC5, 0x04, 0x92, 0x51, 0xA2, +0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x57, 0xC6, +0x00, 0x6A, 0x09, 0xD2, 0x04, 0x92, 0x5D, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x33, 0x22, 0x7D, 0x67, +0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x0C, 0x4A, 0x0A, 0xD2, +0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x14, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, +0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x1E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x09, 0xD2, +0x09, 0x92, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, +0x6C, 0xEA, 0x10, 0x22, 0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x5C, 0xC6, 0x7D, 0x67, +0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xC4, 0xBD, 0x67, 0x5C, 0xA5, 0xDD, 0x67, +0x20, 0xF0, 0x50, 0xC6, 0x04, 0x92, 0x5D, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x2C, 0x22, 0x7D, 0x67, +0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x1C, 0x4A, 0x0A, 0xD2, +0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF5, 0x04, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, +0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x17, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x01, 0x6B, +0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, 0x6C, 0xEA, 0x0B, 0x22, +0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x50, 0xC6, 0x01, 0x6A, 0x4B, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x51, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, +0x11, 0x22, 0xDD, 0x67, 0x20, 0xF0, 0x52, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0B, 0x22, 0x9D, 0x67, +0x20, 0xF0, 0x71, 0xA4, 0x04, 0x92, 0x65, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x72, 0xA5, 0x04, 0x92, +0x66, 0xC2, 0x23, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x51, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0C, 0x22, +0x9D, 0x67, 0x20, 0xF0, 0x52, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x06, 0x2A, 0xDD, 0x67, 0x20, 0xF0, +0x71, 0xA6, 0x04, 0x92, 0x66, 0xC2, 0x11, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0xFF, 0x6C, +0x8E, 0xEA, 0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x52, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x05, 0x22, +0x5D, 0x67, 0x20, 0xF0, 0x72, 0xA2, 0x04, 0x92, 0x66, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, +0x0F, 0x97, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, +0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x04, 0x92, +0x60, 0xA2, 0x04, 0x92, 0x42, 0xA2, 0x4B, 0xE3, 0xBD, 0x67, 0x57, 0xC5, 0x04, 0x92, 0x61, 0xA2, +0x04, 0x92, 0x42, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, +0x38, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x1A, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x57, 0xA3, +0x9D, 0x67, 0x54, 0xC4, 0x0F, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x15, 0x5A, 0x58, 0x67, +0x05, 0x2A, 0x7D, 0x67, 0x56, 0xA3, 0x9D, 0x67, 0x54, 0xC4, 0x04, 0x10, 0x04, 0x92, 0x41, 0xA2, +0xBD, 0x67, 0x54, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x74, 0xA5, 0xBD, 0x67, +0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x5D, 0x67, +0x20, 0xF0, 0xA0, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xA4, 0x9D, 0x67, 0x54, 0xA4, 0x30, 0xF0, +0x20, 0x6C, 0x21, 0xF0, 0x18, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, +0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x44, 0xC3, +0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x03, 0x6C, 0x8E, 0xEA, 0x38, 0x2A, 0x7D, 0x67, +0x4C, 0xA3, 0x48, 0x5A, 0x58, 0x67, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, +0x18, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x7B, 0x22, 0x7D, 0x67, 0x4C, 0xA3, +0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, +0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, +0x6F, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x47, 0x6C, 0x8E, 0xEA, 0x65, 0x2A, 0x00, 0x92, 0x4E, 0xA2, +0x0C, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x60, 0x2A, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, +0x6C, 0xEA, 0x5D, 0x22, 0x3B, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x44, 0xC4, 0x59, 0x10, 0x00, 0x92, +0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, +0x3E, 0x5A, 0x58, 0x67, 0x4D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x48, 0x22, +0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x43, 0x22, 0x7D, 0x67, 0x4C, 0xA3, 0x6F, 0x42, +0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, +0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, 0x30, 0x10, +0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x9D, 0x67, +0x4C, 0xA4, 0x34, 0x5A, 0x58, 0x67, 0x24, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x36, 0x5A, 0x58, 0x67, +0x1F, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, 0x7D, 0x67, 0x4C, 0xA3, +0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, +0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, +0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x7D, 0x67, 0x44, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, +0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, +0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x5D, 0x67, 0x6C, 0xA2, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x45, 0xC3, 0x9D, 0x67, 0x6C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x0A, 0x22, 0x7D, 0x67, 0x45, 0xA3, +0x48, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x49, 0x6A, 0x62, 0x10, 0x7D, 0x67, 0x45, 0xA3, 0x5F, 0x10, +0x01, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x46, 0xC4, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, +0x03, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x9D, 0x67, 0x45, 0xA4, 0x45, 0x5A, 0x58, 0x67, 0x4D, 0x2A, +0x7D, 0x67, 0x45, 0xA3, 0x49, 0x5A, 0x58, 0x67, 0x48, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, +0x6C, 0xEA, 0x43, 0x22, 0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, +0x46, 0xC3, 0x3B, 0x10, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6C, 0x8E, 0xEA, +0x17, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x3D, 0x5A, 0x58, 0x67, 0x2F, 0x2A, 0x7D, 0x67, 0x45, 0xA3, +0x3F, 0x5A, 0x58, 0x67, 0x2A, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x25, 0x22, +0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x1D, 0x10, +0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6C, 0x8E, 0xEA, 0x16, 0x2A, 0x7D, 0x67, +0x45, 0xA3, 0x33, 0x5A, 0x58, 0x67, 0x11, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x35, 0x5A, 0x58, 0x67, +0x0C, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x65, 0xA2, +0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x9D, 0x67, 0x46, 0xA4, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x86, 0x67, 0x67, 0x67, 0x12, 0x92, +0xF8, 0x67, 0xDD, 0x67, 0x20, 0xF0, 0xF8, 0xC6, 0xDD, 0x67, 0x20, 0xF0, 0xBC, 0xC6, 0xFD, 0x67, +0x40, 0xF0, 0x80, 0xC7, 0x9D, 0x67, 0x40, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, +0xDD, 0x67, 0x40, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5B, 0xA2, 0xFD, 0x67, 0x40, 0xF0, +0x64, 0xA7, 0x6E, 0xEA, 0x38, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x56, 0xC4, +0xBD, 0x67, 0x40, 0xF0, 0x40, 0xA5, 0xDD, 0x67, 0x57, 0xC6, 0xFD, 0x67, 0x20, 0xF0, 0x5C, 0xA7, +0x44, 0x32, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0x84, +0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, +0x58, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0xFD, 0x67, 0x5A, 0xC7, 0x04, 0x92, 0x56, 0xA2, +0x7D, 0x67, 0x5B, 0xC3, 0x0C, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x06, 0x6A, 0xBD, 0x67, 0x51, 0xCD, +0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x04, 0x92, 0xDD, 0x67, +0x40, 0xF0, 0x64, 0xA6, 0x7B, 0xC2, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, +0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x4C, 0xC5, +0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xBD, 0x67, +0x54, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x18, 0x6A, +0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x82, 0x67, +0x00, 0x18, 0xDC, 0x0A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4E, 0x32, 0x9D, 0x67, 0x58, 0xC4, +0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, +0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, +0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x80, 0xF0, 0x04, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x4C, 0xA3, +0x22, 0x22, 0x04, 0x92, 0x8C, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6C, 0xC2, 0x04, 0x92, +0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, +0x5D, 0x67, 0x74, 0xA2, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, +0x8C, 0x22, 0x04, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, +0x00, 0x6B, 0x72, 0xC2, 0x41, 0x10, 0x04, 0x92, 0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x18, 0x2A, +0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, +0x0F, 0x6B, 0x8C, 0xEB, 0xB1, 0xA2, 0x10, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x71, 0xC2, +0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x06, 0x52, 0x58, 0x67, +0x12, 0x2A, 0x04, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, +0x04, 0x92, 0x7A, 0xA2, 0x04, 0x92, 0x72, 0xC2, 0x04, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x71, 0xC2, 0x03, 0x10, 0x04, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x20, 0xF0, +0x48, 0xA4, 0x82, 0x67, 0x00, 0x18, 0xAD, 0x28, 0x04, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x02, 0x6B, 0x8D, 0xEB, 0x70, 0xC2, 0x04, 0x92, 0x72, 0xA2, 0x04, 0x92, 0x90, 0xA2, 0x07, 0x6A, +0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x04, 0x92, 0x72, 0xC2, +0x01, 0x10, 0x00, 0x65, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, +0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0x90, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x74, 0xC6, +0x7D, 0x67, 0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, +0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, +0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, +0x20, 0xF0, 0x40, 0xC5, 0x05, 0x92, 0x40, 0xA2, 0xDD, 0x67, 0x5A, 0xC6, 0x05, 0x92, 0x41, 0xA2, +0x7D, 0x67, 0x5B, 0xC3, 0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xC4, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, +0xDD, 0x67, 0x7D, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, +0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x5D, 0x67, 0x20, 0xF0, 0x62, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, +0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x05, 0x92, +0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, +0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, +0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x7D, 0xA4, 0xBD, 0x67, 0x5A, 0xA5, 0x63, 0xEA, +0x58, 0x67, 0x05, 0x22, 0x7D, 0x67, 0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, +0x20, 0xF0, 0x54, 0xA5, 0x04, 0x2A, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0xAA, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x0A, 0x22, +0xDD, 0x67, 0x5D, 0xA6, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0xFF, 0x4A, +0xBD, 0x67, 0x5C, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, +0x90, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xA5, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0xED, 0x25, 0xDD, 0x67, 0x59, 0xC6, 0x7D, 0x67, 0x59, 0xA3, 0xFF, 0x6C, +0x8E, 0xEA, 0x1A, 0x22, 0xBD, 0x67, 0x59, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, +0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, +0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xC5, 0xDD, 0x67, +0x5C, 0xA6, 0xFF, 0x4A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x04, 0x2A, 0x01, 0x6A, +0xBD, 0x67, 0x58, 0xC5, 0x5E, 0x10, 0xDD, 0x67, 0x7D, 0xA6, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, +0x58, 0x67, 0x0C, 0x2A, 0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x00, 0x6A, +0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0x4B, 0x10, 0x01, 0x6A, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x5E, 0xC4, 0x3D, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, +0x2D, 0x10, 0xDD, 0x67, 0x9D, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0xBD, 0x67, 0x20, 0xF0, +0x41, 0xA5, 0x01, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xA2, 0x24, 0xDD, 0x67, 0x20, 0xF0, +0x43, 0xC6, 0x5D, 0x67, 0x7D, 0xA2, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x06, 0x2A, +0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x17, 0x10, 0xBD, 0x67, 0x20, 0xF0, +0x43, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x5D, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, +0x5D, 0xC4, 0xBD, 0x67, 0x5F, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5F, 0xA3, +0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x5E, 0xC4, 0xBD, 0x67, 0x7E, 0xA5, 0xDD, 0x67, 0x5C, 0xA6, 0x43, 0xEB, 0x58, 0x67, +0xBC, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x09, 0x2A, 0x00, 0x6A, +0xBD, 0x67, 0x58, 0xC5, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, +0x05, 0x92, 0xDD, 0x67, 0x20, 0xF0, 0x63, 0xA6, 0x6A, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xA3, +0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, +0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0xA1, 0xF3, 0x70, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, 0x8D, 0xEB, +0x6C, 0xC2, 0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA3, 0xA3, 0xDD, 0x67, +0x78, 0xA6, 0xDD, 0x67, 0x20, 0xF0, 0x42, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, +0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, +0x50, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, +0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x7D, 0x67, +0x20, 0xF0, 0x50, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, +0x7F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5F, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x80, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x5A, 0xC4, +0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0xBD, 0x67, 0x59, 0xC5, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x05, 0x92, +0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x6A, 0xC2, 0xBD, 0x67, 0x7B, 0xA5, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, +0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, +0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, +0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, +0xDD, 0x67, 0x7F, 0xA6, 0x9D, 0x67, 0x5A, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x57, 0x22, 0x5D, 0x67, +0x20, 0xF0, 0x70, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0x46, 0x26, 0xBD, 0x67, 0x58, 0xC5, 0xDD, 0x67, 0x58, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, +0x9D, 0x67, 0x58, 0x84, 0x00, 0x52, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x9D, 0x67, +0x20, 0xF0, 0x40, 0xC4, 0x6D, 0x10, 0xBD, 0x67, 0x58, 0xA5, 0xDD, 0x67, 0x5F, 0xC6, 0x00, 0x6A, +0x7D, 0x67, 0x5E, 0xC3, 0x2D, 0x10, 0xBD, 0x67, 0x9F, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x70, 0xA6, +0xBD, 0x67, 0x59, 0xA5, 0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xA2, 0x24, 0xDD, 0x67, +0x20, 0xF0, 0x40, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0xFF, 0x6C, 0x8E, 0xEA, 0x4F, 0x2A, +0xBD, 0x67, 0x7F, 0xA5, 0xDD, 0x67, 0x5A, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x2A, 0x7D, 0x67, +0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0x00, 0x65, 0x42, 0x10, 0xBD, 0x67, 0x5F, 0xA5, +0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x5E, 0xC4, +0xBD, 0x67, 0x5E, 0xA5, 0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x32, 0x10, 0x5D, 0x67, 0x7F, 0xA2, +0x9D, 0x67, 0x5A, 0xA4, 0x6E, 0xEA, 0x1D, 0x2A, 0x05, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, +0x0C, 0x22, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x2A, 0xDD, 0x67, 0x7A, 0xA6, 0x80, 0x6A, 0x4B, 0xEA, +0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x7F, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, +0x4E, 0x10, 0xBD, 0x67, 0x5A, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xC6, 0x01, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x54, 0xC3, 0x05, 0x92, 0x9D, 0x67, 0x7A, 0xA4, 0x6A, 0xC2, 0x01, 0x10, 0x00, 0x65, +0xBD, 0x67, 0x20, 0xF0, 0x54, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x0A, 0x2A, 0x00, 0x6A, 0x7D, 0x67, +0x5D, 0xC3, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x03, 0x10, +0x01, 0x6A, 0x9D, 0x67, 0x5D, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, 0x58, 0x67, +0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, +0x74, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, 0x8D, 0xEB, 0x6C, 0xC2, +0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA0, 0xA3, 0xDD, 0x67, 0x7D, 0xA6, +0xDD, 0x67, 0x5B, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x00, 0x65, 0x0B, 0x97, +0x06, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x40, 0xA2, 0xBD, 0x67, 0x54, 0xC5, +0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, 0x6F, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x77, 0xA5, 0x7F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0x54, 0xA5, 0x63, 0xEA, 0x58, 0x67, +0x04, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x4A, 0xA2, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x57, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x7D, 0x67, 0x57, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x77, 0xA2, +0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x48, 0xA3, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, +0x00, 0xD2, 0x00, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x00, 0x92, 0x8F, 0xA2, +0x7F, 0x6B, 0x8C, 0xEB, 0x6F, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, +0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, +0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x44, 0xA2, +0x7D, 0x67, 0x20, 0xF0, 0x46, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xA4, 0x0F, 0x5A, 0x78, 0x67, +0x7B, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF0, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, +0x00, 0xEA, 0x04, 0x92, 0x1B, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, +0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, 0x8D, 0xEB, +0x6B, 0xC2, 0x6C, 0x10, 0x04, 0x92, 0x3D, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, +0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, +0x8D, 0xEB, 0x6B, 0xC2, 0x5B, 0x10, 0x04, 0x92, 0x13, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x04, 0x92, 0x33, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x9D, 0x67, +0x20, 0xF0, 0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x3A, 0x10, 0x04, 0x92, 0x0B, 0x6B, 0x67, 0xC2, 0x03, 0x6A, +0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x6B, 0xC2, 0x2C, 0x10, 0x04, 0x92, 0x47, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, +0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, +0x8D, 0xEB, 0x6B, 0xC2, 0x1B, 0x10, 0x04, 0x92, 0x23, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x03, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x0A, 0x10, 0x03, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xC4, +0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x00, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xC3, 0x5C, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, +0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, +0x44, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0x5D, 0x67, 0x20, 0xF0, 0xA6, 0xA2, 0x5D, 0x67, 0x20, 0xF0, +0x8B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA4, 0x35, 0x91, 0xE5, 0x88, 0x34, 0x60, 0xF7, 0x00, 0x4A, +0x49, 0xE4, 0x40, 0x9A, 0x6C, 0xEA, 0x05, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x03, 0x6B, 0x6C, 0xEA, +0x02, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, +0x05, 0x2A, 0x05, 0x93, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, +0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, 0x7D, 0x67, +0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, +0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, +0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0x9E, 0x2A, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x4A, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, +0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x08, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0xD2, +0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x07, 0x92, 0x07, 0x22, 0x20, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, +0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x1F, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xC3, 0x2E, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, +0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, +0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x48, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x11, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, +0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x08, 0x92, 0x07, 0x22, 0x00, 0x6A, 0x9D, 0x67, +0x20, 0xF0, 0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x20, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x2E, 0x10, +0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, +0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, +0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x47, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x47, 0xC4, 0x11, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, +0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x60, 0xC2, 0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, +0x67, 0xA4, 0x61, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, +0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, +0x20, 0xF0, 0x48, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x07, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, +0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x0F, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, +0x20, 0xF0, 0x47, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, +0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x98, 0xA2, 0x5D, 0x67, 0x20, 0xF0, +0x69, 0xA2, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, +0xAC, 0xEA, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x04, 0x92, 0x9D, 0x67, +0x20, 0xF0, 0x64, 0xA4, 0x62, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x48, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x86, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x40, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x76, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x36, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x38, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x66, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x30, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x56, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x24, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x28, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x46, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x36, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x18, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x26, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x16, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x04, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x08, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x06, 0x10, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x70, 0xC2, 0x00, 0x18, 0x8D, 0x1E, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x06, 0xD4, 0x65, 0x67, 0x46, 0x67, 0x9D, 0x67, 0x7C, 0xC4, 0x7D, 0x67, 0x20, 0xF0, +0x40, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x66, 0xF5, +0x00, 0x4B, 0x9D, 0x67, 0x5C, 0xA4, 0x48, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x01, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, +0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x02, 0xD2, 0x00, 0x92, 0x4C, 0xAA, 0x05, 0xD2, +0x00, 0x6A, 0x7D, 0x67, 0x4C, 0xC3, 0x15, 0x10, 0x9D, 0x67, 0x4C, 0xA4, 0x48, 0x32, 0x01, 0x93, +0x49, 0xE3, 0x80, 0x9A, 0x7D, 0x67, 0x4C, 0xA3, 0x02, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, +0x12, 0xEB, 0x05, 0x92, 0x69, 0xE2, 0x05, 0xD2, 0x7D, 0x67, 0x4C, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x4C, 0xC4, 0x7D, 0x67, 0x4C, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE6, 0x2A, 0x02, 0x92, 0x05, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x04, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x05, 0x93, 0x04, 0x92, 0x4B, 0xE3, 0x01, 0x10, 0x00, 0x6A, +0x05, 0xD2, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x6C, 0xCA, 0x05, 0x92, +0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x00, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x0F, 0x4A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, +0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, +0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, +0xA4, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, +0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, +0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xA4, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x0F, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, +0x18, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xC3, 0xC0, 0xF5, 0x03, 0x10, +0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0xA5, 0x82, 0x67, +0x00, 0x18, 0xDC, 0x0A, 0xA0, 0xF5, 0x03, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, +0x80, 0xF5, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, +0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x0E, 0xD2, 0x7D, 0x67, +0x40, 0xF0, 0x4B, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xF0, 0x49, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x6A, 0xA4, +0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xC5, 0x06, 0x92, 0x40, 0xA2, +0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x06, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xC4, 0x06, 0x92, 0x4F, 0xA2, +0x40, 0x6B, 0x6C, 0xEA, 0x00, 0xF4, 0x16, 0x2A, 0x0E, 0x92, 0x65, 0x5A, 0x58, 0x67, 0x1C, 0x2A, +0x06, 0x92, 0x52, 0xA2, 0x19, 0x22, 0x06, 0x92, 0x52, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x06, 0x92, 0x72, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF0, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, +0x8B, 0x19, 0x06, 0x92, 0x52, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF0, 0x10, 0x4B, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xF9, 0x13, 0x06, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x7D, 0x67, +0x40, 0xF0, 0x4B, 0xA3, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF5, +0x00, 0x4A, 0x49, 0xE3, 0x13, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0xD7, 0x03, +0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0xC4, 0xF0, 0x58, 0xA2, 0xBD, 0x67, 0x5A, 0xCD, 0x14, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x15, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x16, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x17, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x49, 0xE3, 0x7D, 0x67, 0x58, 0xCB, 0x13, 0x93, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x58, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x59, 0xCD, +0x14, 0x93, 0x15, 0x92, 0x44, 0x32, 0x4D, 0xE3, 0x16, 0x92, 0x44, 0x34, 0x16, 0x92, 0x49, 0xE4, +0x4D, 0xE3, 0x17, 0x92, 0x48, 0x32, 0x49, 0xE3, 0x0B, 0xD2, 0x06, 0x92, 0x5C, 0xA2, 0x05, 0x5A, +0x58, 0x67, 0xE0, 0xF4, 0x00, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x47, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x19, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, +0x40, 0xF0, 0x49, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xA5, 0x09, 0x22, 0x5D, 0x67, 0x20, 0xF0, +0x67, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0x06, 0x92, 0x7A, 0xA2, 0xBD, 0x67, +0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, +0x43, 0xEB, 0x58, 0x67, 0x0E, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF3, 0x44, 0xA2, 0x6E, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, +0x0A, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x63, 0xF3, 0x44, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x7D, 0x67, 0x40, 0xF0, +0x48, 0xA3, 0x07, 0x22, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x02, 0x4A, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0xFF, 0x6B, 0x4C, 0xEB, 0x1C, 0x5B, 0x78, 0x67, +0x01, 0x2B, 0x1B, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, +0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x47, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, +0x20, 0xF0, 0x48, 0xA4, 0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x11, 0xD2, 0xBD, 0x67, +0x40, 0xF0, 0x8B, 0xA5, 0x7D, 0x67, 0x5A, 0xAB, 0x13, 0x05, 0x0E, 0x93, 0xC3, 0x67, 0xE2, 0x67, +0x00, 0x18, 0x38, 0x24, 0x9D, 0x67, 0x20, 0xF0, 0x45, 0xC4, 0x06, 0x92, 0x56, 0xA2, 0x46, 0x33, +0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x20, 0xF0, 0x45, 0xA5, 0x46, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x76, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, +0x03, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x5C, 0x9A, 0x06, 0x93, +0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x5A, 0xAB, 0x03, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, +0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0xED, 0x12, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x20, 0x6A, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF0, 0x1C, 0x4A, 0x82, 0x67, +0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x40, 0x9A, 0x40, 0xA2, 0x9D, 0x67, +0x40, 0xF0, 0x4A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x44, 0x9A, 0x40, 0xA2, 0xBD, 0x67, +0x5C, 0xC5, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, +0x5C, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0xBE, 0x12, 0x0E, 0x92, +0x19, 0x5A, 0x58, 0x67, 0x1F, 0x22, 0x0E, 0x92, 0x1D, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x52, 0x58, 0x67, 0x15, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x78, 0x33, 0xAB, 0xA2, 0x3F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, +0x6B, 0xC2, 0x05, 0x10, 0x06, 0x92, 0x8B, 0xA2, 0x3F, 0x6B, 0x8C, 0xEB, 0x6B, 0xC2, 0x06, 0x92, +0x4B, 0xA2, 0xC0, 0x6B, 0x6C, 0xEA, 0x80, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x10, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF0, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x9D, 0x67, 0x40, 0xF0, +0x4B, 0xA4, 0x03, 0x5A, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x48, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x17, 0x93, 0x16, 0x92, 0x4D, 0xE3, 0x15, 0x92, 0x4D, 0xE3, +0x14, 0x92, 0x4D, 0xE3, 0x0E, 0x92, 0x4A, 0x32, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x17, 0x92, +0x33, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF0, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x4C, 0x9A, 0x0E, 0x94, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x50, 0x9A, 0x17, 0x94, 0xFF, 0x6B, 0x6C, 0xEC, 0x16, 0x95, +0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x15, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, +0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x14, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, +0x00, 0x18, 0x2F, 0x27, 0x00, 0x65, 0x31, 0x12, 0x9D, 0x67, 0x5A, 0xAC, 0x10, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF0, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x40, 0xF0, +0x4B, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0x1E, 0x12, 0x13, 0x93, +0x0E, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x44, 0xC3, 0x06, 0x92, 0x6B, 0xA2, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x52, +0x58, 0x67, 0x51, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x43, 0xEB, +0x58, 0x67, 0x16, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF0, 0x0C, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF0, 0x1C, 0x4A, +0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x33, 0x10, +0x06, 0x92, 0x5A, 0xA2, 0x32, 0x5A, 0x58, 0x67, 0x15, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, +0x06, 0x92, 0x47, 0xA2, 0xFE, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x44, 0xC3, 0x19, 0x10, 0x06, 0x92, 0x5A, 0xA2, 0x28, 0x5A, 0x58, 0x67, 0x14, 0x22, 0x5D, 0x67, +0x40, 0xF0, 0x69, 0xA2, 0x06, 0x92, 0x47, 0xA2, 0xFC, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0B, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, +0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, +0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x9E, 0x11, 0x06, 0x92, +0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x45, 0xA2, +0xBD, 0x67, 0x40, 0xF0, 0x4A, 0xC5, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, +0xAF, 0xA2, 0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x5D, 0x67, 0x40, 0xF0, +0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, +0x01, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x68, 0x11, 0x06, 0x92, 0x4F, 0xA2, 0x18, 0x6B, +0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x46, 0xA2, 0x9D, 0x67, 0x40, 0xF0, +0x4A, 0xC4, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, 0x19, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0xBD, 0x67, 0x40, 0xF0, 0x8B, 0xA5, 0x5D, 0x67, +0x40, 0xF0, 0x6A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, 0x01, 0x6E, 0xE2, 0x67, +0x00, 0x18, 0x8C, 0x22, 0x32, 0x11, 0x06, 0x92, 0x4C, 0xAA, 0x0F, 0xD2, 0x00, 0x6A, 0x7D, 0x67, +0x5D, 0xC3, 0x17, 0x10, 0x9D, 0x67, 0x5D, 0xA4, 0x48, 0x32, 0x04, 0x03, 0x49, 0xE3, 0x8F, 0x9A, +0xBD, 0x67, 0x5D, 0xA5, 0x11, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, 0x12, 0xEA, 0x10, 0xD2, +0x0F, 0x93, 0x10, 0x92, 0x49, 0xE3, 0x0F, 0xD2, 0x7D, 0x67, 0x5D, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x5D, 0xC4, 0xBD, 0x67, 0x5D, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x11, 0x92, 0x05, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x0E, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x08, 0xD2, 0x0F, 0x93, 0x08, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x05, 0x22, 0x0F, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x0F, 0xD2, 0x02, 0x10, +0x00, 0x6A, 0x0F, 0xD2, 0x0F, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x6C, 0xCA, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x10, 0x6A, 0x6C, 0xEA, 0x7B, 0x22, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x0F, 0x2A, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, +0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0xD6, 0x10, 0x0E, 0x92, +0x65, 0x5A, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x06, 0x92, 0x76, 0xA2, 0x5D, 0x67, 0x40, 0xF0, +0x89, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x03, 0xF4, 0x4C, 0xA2, +0x63, 0xEA, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, +0x00, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x6B, 0xC2, 0xB3, 0x10, 0x06, 0x92, 0x76, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA3, 0xF3, 0x58, 0xA2, 0x43, 0xEB, 0x58, 0x67, +0xA0, 0xF0, 0x03, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x07, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAB, 0xA2, +0x39, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6B, 0xC2, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, +0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x52, 0x58, 0x67, 0x7D, 0x2A, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x06, 0x92, +0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x6F, 0x10, 0x9D, 0x67, 0x40, 0xF0, +0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, +0x62, 0x67, 0x0F, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, +0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x00, 0x4A, +0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x51, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0x0F, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x05, 0x2A, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x32, 0x2A, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x6E, 0x00, 0x18, 0x2F, 0x27, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x06, 0x92, +0x56, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF1, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0x8B, 0x19, 0x0F, 0x92, 0x4E, 0x33, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, 0x4E, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, +0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0x61, 0xF1, 0x00, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0x8B, 0x19, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, +0x8B, 0x19, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0x8D, 0x1E, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF1, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x40, 0xF0, +0x4B, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x2F, 0x31, 0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, +0x62, 0x67, 0xBD, 0x67, 0x5A, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, +0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, +0xBD, 0x67, 0x5A, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xA2, 0xF6, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xCA, 0x0E, 0x10, +0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x9D, 0x67, 0x40, 0xF0, +0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x59, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, +0x62, 0xEA, 0x58, 0x67, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, +0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x60, 0xAA, 0xBD, 0x67, 0x59, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, +0x60, 0xCA, 0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, +0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x78, 0x9A, 0x9D, 0x67, 0x58, 0xAC, +0x4F, 0xEA, 0x63, 0xEA, 0x58, 0x67, 0x10, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x45, 0xF6, 0x78, 0x9A, 0x9D, 0x67, 0x58, 0xAC, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x45, 0xF6, 0x78, 0xDA, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x01, 0x6B, 0x6B, 0xEB, 0x45, 0xF6, 0x78, 0xDA, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, +0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0B, 0x92, 0x4B, 0xE4, 0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, +0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0x0B, 0x95, +0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x62, 0xCA, +0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, +0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x62, 0xCA, 0x9D, 0x67, +0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0E, 0x92, 0x4B, 0xE4, +0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, +0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x62, 0xAA, 0x0E, 0x95, 0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, +0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE4, 0x62, 0xCA, 0x18, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, +0x6B, 0xEB, 0x62, 0xCA, 0x09, 0x10, 0x06, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x10, 0x00, 0x65, +0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0x85, 0x00, 0x52, 0x58, 0x67, +0x3F, 0xF2, 0x16, 0x22, 0x19, 0x97, 0x0D, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, +0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x15, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x9D, 0x67, 0x55, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, +0x7D, 0x67, 0x55, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x55, 0xA3, 0x04, 0x5A, +0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x56, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x21, 0xF1, 0x1C, 0x6C, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6B, +0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x28, 0x13, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x02, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x16, 0x13, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x04, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0xED, 0x14, 0x04, 0x13, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x08, 0x6B, 0x6E, 0xEA, 0xE0, 0xF2, +0x1D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xF1, 0x12, 0x9D, 0x67, 0x54, 0xA4, 0x02, 0x6B, +0x6E, 0xEA, 0x20, 0xF1, 0x12, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, +0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, +0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x03, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, +0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, +0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, +0xA5, 0x12, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x05, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, +0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, +0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, +0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x76, 0x12, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x09, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, +0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x47, 0x12, 0x9D, 0x67, +0x20, 0xF0, 0x40, 0xA4, 0x06, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x18, 0x12, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x0A, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xE9, 0x11, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, +0x0C, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x02, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xB9, 0x11, 0x9D, 0x67, 0x54, 0xA4, 0x03, 0x6B, +0x6E, 0xEA, 0xA0, 0xF1, 0x13, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, +0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, +0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x41, 0xF1, 0x00, 0x6C, 0x30, 0xF0, +0x20, 0x6B, 0xE1, 0xF3, 0x68, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x07, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, +0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, +0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, +0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x2B, 0x11, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0B, 0x6C, 0x8E, 0xEA, +0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, +0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xC7, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x0D, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, +0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, +0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, +0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x63, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0E, 0x6C, 0x8E, 0xEA, +0x5D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, +0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, +0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, +0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x2D, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, +0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, +0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x14, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, +0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, +0x9D, 0x67, 0x48, 0xA4, 0x1C, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x24, 0x5A, +0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x07, 0x6A, 0x9D, 0x67, 0x40, 0xC4, +0x29, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, +0x36, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, +0x48, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, +0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x40, 0x5A, +0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, +0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x44, 0xA2, +0x03, 0x6C, 0x8E, 0xEA, 0x4E, 0x2A, 0x7D, 0x67, 0x42, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, +0x7D, 0x67, 0x48, 0xA3, 0x9D, 0x67, 0x41, 0xC4, 0x6F, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, +0x8E, 0xEA, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, +0xF4, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, +0x41, 0xC3, 0x5A, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xD2, 0x4B, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x4D, 0x10, 0x9D, 0x67, +0x42, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x48, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, 0x0D, 0x2A, 0x7D, 0x67, +0x48, 0xA3, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x14, 0x4A, 0x49, 0xE3, +0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, 0x38, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x68, 0x42, 0xDC, 0x4B, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, +0x2B, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x48, 0xA3, +0x9D, 0x67, 0x41, 0xC4, 0x21, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x1C, 0x2A, +0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, +0x20, 0x6A, 0x00, 0xF3, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x0C, 0x10, +0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xDC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x04, 0x4A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x01, 0x63, 0x20, 0xE8, +0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD0, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, +0x45, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0xBD, 0x67, 0x5E, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, +0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x5E, 0xA3, 0x58, 0x2A, +0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x4C, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, +0x06, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0xDC, 0x0A, 0x32, 0x22, +0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0x2D, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, +0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, +0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x61, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, +0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, 0x18, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, +0x00, 0x18, 0x2F, 0x31, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x20, 0xF0, +0x42, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0x85, 0x00, 0x52, 0x58, 0x67, 0xAE, 0x22, 0x06, 0x11, +0x7D, 0x67, 0x5E, 0xA3, 0x00, 0xF1, 0x02, 0x22, 0xBD, 0x67, 0x5E, 0xA5, 0x04, 0x5A, 0x58, 0x67, +0xE0, 0xF0, 0x1C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0xF0, 0x10, 0xBD, 0x67, +0x20, 0xF0, 0x42, 0xA5, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, +0x18, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, +0xDC, 0x0A, 0xC0, 0xF0, 0x15, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0xC0, 0xF0, +0x0F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, +0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x5D, 0xC3, 0xBD, 0x67, +0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xC4, 0xF0, +0x58, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x48, 0x32, 0x48, 0x33, +0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF5, 0x00, 0x4A, 0x49, 0xE3, 0x09, 0x03, 0x83, 0x67, +0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x7D, 0x67, 0x5E, 0xA3, 0x0F, 0x42, 0xBD, 0x67, +0x20, 0xF0, 0x82, 0xA5, 0x5D, 0x67, 0x7D, 0xA2, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x05, 0xC3, 0x67, +0xE2, 0x67, 0x00, 0x18, 0x38, 0x24, 0x64, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, +0x09, 0xE2, 0x20, 0xF0, 0x65, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x6D, 0xAE, 0xEA, +0x29, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF1, 0x04, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x09, 0x95, 0x0A, 0x93, 0x0B, 0x92, 0x0C, 0x97, +0x0D, 0x96, 0x30, 0xF0, 0x20, 0x6C, 0xA1, 0xF1, 0x0C, 0x4C, 0x04, 0xD7, 0x05, 0xD6, 0xC3, 0x67, +0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x5E, 0xA5, 0xFF, 0x4A, 0x06, 0x93, 0x49, 0xE3, +0x20, 0xF0, 0x45, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF1, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x2F, 0x31, +0xBD, 0x67, 0x5E, 0xA5, 0x03, 0x6B, 0x6E, 0xEA, 0x53, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, +0x06, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x0D, 0x2A, 0x06, 0x92, 0x20, 0xF0, +0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x00, 0x6A, +0x7D, 0x67, 0x5F, 0xC3, 0x10, 0x10, 0x06, 0x92, 0x20, 0xF0, 0x66, 0xA2, 0x06, 0x92, 0x20, 0xF0, +0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x03, 0x10, +0x02, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x6D, 0xAE, 0xEA, +0x27, 0x2A, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x63, 0xF4, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA3, 0x2D, 0x7D, 0x67, 0x5F, 0xA3, 0x30, 0xF0, +0x20, 0x6B, 0xC1, 0xF1, 0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, +0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, +0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, +0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x7D, 0x67, +0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0x1F, 0xF7, 0x09, 0x22, 0x7D, 0x67, 0x5E, 0xA3, +0x03, 0x5A, 0x58, 0x67, 0x34, 0x22, 0x5D, 0x67, 0x7E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x14, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x7E, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA3, 0x2D, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x45, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x65, 0xC2, 0x1A, 0x10, 0x7D, 0x67, +0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF2, 0x04, 0x4A, +0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, +0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, +0x65, 0xC2, 0x0F, 0x97, 0x0E, 0x90, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x59, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0xE2, 0xF3, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x59, 0xA2, 0x02, 0x5A, +0x58, 0x67, 0x08, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0xE2, 0xF3, 0x79, 0xC2, 0x00, 0x18, +0xB3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, +0x7D, 0x67, 0x41, 0xC3, 0x80, 0x10, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, 0x5D, 0x67, +0x61, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, +0xA9, 0xE2, 0x41, 0xF0, 0x16, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, +0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC4, 0xF0, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0x60, 0xDA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x45, 0xF3, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC5, 0xF3, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, +0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, +0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x7D, 0x67, 0x41, 0xA3, +0x01, 0x4A, 0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x41, 0x83, 0x00, 0x52, 0x58, 0x67, 0x7F, 0xF7, +0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x45, 0xF6, 0x78, 0xDA, +0x01, 0x63, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x62, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, +0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, 0x5D, 0x67, 0x68, 0xA2, +0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, 0xA9, 0xE2, +0x41, 0xF0, 0x16, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, +0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC4, 0xF0, 0x78, 0xC2, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x45, 0xF3, +0x78, 0xC2, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0xC5, 0xF3, 0x78, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x10, 0x6A, 0x6C, 0xEA, 0x40, 0xF1, 0x1F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, +0x56, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, +0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x56, 0x32, +0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x56, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, +0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x51, 0xA5, 0x49, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x01, 0x6A, +0x7D, 0x67, 0x50, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, +0x58, 0x67, 0x7A, 0x22, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x4C, 0x32, 0x48, 0x34, +0x89, 0xE2, 0x02, 0xF4, 0x08, 0x4B, 0x69, 0xE2, 0x00, 0xF7, 0x5F, 0xA2, 0x5A, 0x32, 0x62, 0x67, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x67, 0x22, 0x9D, 0x67, 0x55, 0xA4, 0x37, 0x2A, +0xBD, 0x67, 0x56, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE2, 0x45, 0xF3, +0x78, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, 0x08, 0x4C, +0x89, 0xE2, 0x45, 0xF3, 0x78, 0xC2, 0xDD, 0x67, 0x76, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x45, 0xF3, 0x78, 0xA2, 0x9D, 0x67, 0x56, 0xA4, 0x30, 0xF0, 0x20, 0x6C, +0x4C, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x02, 0xF4, 0x08, 0x4C, 0x89, 0xE2, 0x20, 0xF7, 0x43, 0xA2, +0x6E, 0xEA, 0xC0, 0xF0, 0x02, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, +0xBF, 0x26, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x18, 0x4E, 0x31, 0xB9, 0x10, 0x7D, 0x67, +0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE2, 0xC5, 0xF3, 0x78, 0xA3, +0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, 0x08, 0x4C, 0x89, 0xE2, +0xC5, 0xF3, 0x78, 0xC2, 0x9D, 0x67, 0x76, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE3, 0xC5, 0xF3, 0x58, 0xA2, 0xBD, 0x67, 0x70, 0xA5, 0x6E, 0xEA, 0x80, 0xF0, 0x17, 0x2A, +0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xBF, 0x26, 0x7D, 0x67, 0x56, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x4E, 0x31, 0x8C, 0x10, 0x9D, 0x67, 0x55, 0xA4, 0xFF, 0x6B, 0x4C, 0xEB, +0x05, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x04, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x54, 0xC5, 0xDD, 0x67, +0x20, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x4C, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x53, 0xC3, +0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0xD5, 0xA5, 0x5D, 0x67, 0x96, 0xA2, 0xBD, 0x67, 0xF5, 0xA5, +0x30, 0xF0, 0x20, 0x6D, 0x44, 0x67, 0x48, 0x32, 0x89, 0xE2, 0xE9, 0xE2, 0x41, 0xF0, 0x16, 0x4A, +0x48, 0x34, 0x45, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x80, 0x9A, 0xBD, 0x67, 0x54, 0xA5, +0x51, 0xE4, 0x30, 0xF0, 0x20, 0x6D, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, 0xC9, 0xE2, 0x41, 0xF0, +0x16, 0x4A, 0x48, 0x33, 0x45, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x80, 0xDA, 0xDD, 0x67, +0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, +0xC4, 0xF0, 0x78, 0xA2, 0xBD, 0x67, 0x53, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xC4, 0xF0, 0x78, 0xC2, 0xDD, 0x67, 0x96, 0xA6, +0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0xDD, 0x67, 0xB4, 0xA6, 0xDD, 0x67, 0x53, 0xA6, 0x49, 0xE5, +0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, +0x49, 0xE4, 0x60, 0xDA, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xEE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + +}; +u32 array_length_mp_8814a_fw_ap = 56224; + + +#else + + +u8 array_mp_8814a_fw_nic[] = { +0x14, 0x88, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x42, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x1C, 0x13, 0x30, 0xDF, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x00, 0x00, 0x20, 0x80, 0xF8, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x80, 0x00, 0x00, 0x00, 0x80, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x80, 0xF9, 0x02, 0x00, 0x80, +0x09, 0x03, 0x00, 0x80, 0x19, 0x03, 0x00, 0x80, 0x29, 0x03, 0x00, 0x80, 0x39, 0x03, 0x00, 0x80, +0x49, 0x03, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, +0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, +0x35, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x06, 0x09, 0x0C, 0x12, +0x18, 0x24, 0x30, 0x36, 0x01, 0x02, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, +0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, +0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, +0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, +0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, +0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, +0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, +0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, +0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, +0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, +0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x31, 0x18, +0x0A, 0x00, 0x00, 0x30, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x06, 0x06, 0x08, 0x08, 0x09, 0x09, +0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, +0x05, 0x08, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x20, 0x04, 0x06, 0x08, 0x0A, 0x10, 0x18, 0x18, 0x20, +0x03, 0x05, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x24, 0x2A, 0x2C, 0x05, 0x07, 0x09, 0x0A, 0x10, 0x14, +0x1C, 0x28, 0x2C, 0x30, 0x06, 0x08, 0x0A, 0x0C, 0x12, 0x18, 0x1E, 0x30, 0x38, 0x42, 0x0A, 0x0C, +0x0C, 0x12, 0x16, 0x1C, 0x20, 0x24, 0x24, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x04, 0x06, 0x07, +0x08, 0x0A, 0x0B, 0x0C, 0x03, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, +0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x03, 0x05, +0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, +0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x01, 0x02, 0x03, 0x06, +0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x2C, 0x2D, 0xFF, 0xFF, 0x2E, 0xFF, 0xFF, 0x37, 0x2F, +0xFF, 0x41, 0x38, 0x30, 0x39, 0x42, 0x31, 0x42, 0x3A, 0x32, 0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, +0x3A, 0x44, 0x35, 0x44, 0x3B, 0xFF, 0x37, 0x2E, 0x40, 0x38, 0x30, 0x41, 0x39, 0x42, 0x31, 0x3A, +0x43, 0x32, 0x3B, 0x43, 0x35, 0x3C, 0x44, 0xFF, 0x3D, 0x45, 0xFF, 0x3E, 0x45, 0xFF, 0x45, 0x3F, +0xFF, 0x46, 0xFF, 0xFF, 0x37, 0x41, 0x2F, 0x39, 0x42, 0x31, 0x43, 0x3A, 0x33, 0x44, 0x3B, 0x35, +0x45, 0x3D, 0xFF, 0x46, 0x47, 0x3E, 0x47, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0x49, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x14, 0xFF, 0x15, 0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x10, 0xFF, +0x17, 0x1E, 0x11, 0x1E, 0x18, 0x12, 0x1F, 0x18, 0x13, 0x18, 0x1F, 0xFF, 0x15, 0x0E, 0xFF, 0x16, +0x1D, 0x10, 0x17, 0x1E, 0x10, 0x18, 0x1E, 0x11, 0x19, 0x1F, 0xFF, 0x1A, 0x20, 0xFF, 0x21, 0x1B, +0xFF, 0x21, 0xFF, 0xFF, 0x15, 0x13, 0x0F, 0x17, 0x1E, 0x11, 0x18, 0x1F, 0x13, 0x20, 0x19, 0xFF, +0x21, 0x1B, 0xFF, 0x22, 0xFF, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, +0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x04, 0x04, 0x04, 0x2C, 0xFF, 0xFF, 0x2D, 0xFF, +0xFF, 0x2E, 0x37, 0xFF, 0x38, 0x41, 0x2F, 0x39, 0x42, 0x30, 0x43, 0x39, 0x31, 0x42, 0x39, 0x32, +0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, 0x2D, 0xFF, 0xFF, 0x36, 0x2E, 0xFF, 0x37, 0x2F, 0x40, 0x38, +0x30, 0x41, 0x42, 0x33, 0x39, 0x43, 0x35, 0x3A, 0x3B, 0x43, 0x34, 0x44, 0x3C, 0x3B, 0x45, 0x3D, +0x3C, 0x45, 0x3E, 0x3D, 0x37, 0x2E, 0xFF, 0x38, 0x2F, 0x40, 0x39, 0x31, 0x41, 0x3A, 0x42, 0xFF, +0x43, 0x3B, 0xFF, 0x44, 0x3C, 0xFF, 0x45, 0x3D, 0x3C, 0x46, 0x3F, 0x45, 0x47, 0x46, 0x45, 0x48, +0x47, 0x47, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0x0D, 0x14, 0xFF, 0x0E, 0x15, 0xFF, +0x16, 0x0F, 0xFF, 0x17, 0x10, 0xFF, 0x17, 0x11, 0xFF, 0x17, 0x12, 0xFF, 0x0D, 0x0C, 0xFF, 0x14, +0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x1D, 0x10, 0x17, 0x1E, 0x12, 0x18, 0x1F, 0x13, 0x19, 0x20, +0x19, 0x20, 0x1A, 0x19, 0x14, 0x0E, 0xFF, 0x15, 0x1C, 0xFF, 0x17, 0x1D, 0x11, 0x18, 0x1E, 0x13, +0x19, 0x1F, 0x1E, 0x20, 0x1A, 0x1F, 0x21, 0x1B, 0x20, 0x22, 0x21, 0x1B, 0x14, 0x14, 0x15, 0x15, +0x16, 0x17, 0x17, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1C, 0x1C, 0x1D, 0x1E, +0x1F, 0x20, 0x20, 0x20, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x00, 0x00, +0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x00, 0x00, 0x40, 0x40, 0x41, 0x42, +0x43, 0x44, 0x44, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, +0x23, 0x26, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, +0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x24, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x00, 0x00, +0x00, 0x00, 0x26, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2A, 0x2C, 0x2E, +0x30, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x04, 0x00, 0x04, 0x00, +0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, +0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, +0x90, 0x01, 0xE0, 0x01, 0xC8, 0x00, 0xF0, 0x00, 0x40, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, +0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xF4, 0x01, 0x84, 0x03, 0x20, 0x03, +0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0x20, 0x03, 0xE8, 0x03, +0xB0, 0x04, 0x40, 0x06, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, +0x90, 0x01, 0xE0, 0x01, 0x58, 0x02, 0x20, 0x03, 0x78, 0x00, 0xF0, 0x00, 0x68, 0x01, 0xA4, 0x01, +0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0xB4, 0x00, 0x2C, 0x01, +0xA4, 0x01, 0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0x78, 0x05, +0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0xE8, 0x03, 0xB0, 0x04, 0x40, 0x06, 0xD0, 0x07, +0xD0, 0x07, 0xD0, 0x07, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, +0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x32, 0x00, +0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x64, 0x00, 0x78, 0x00, +0xA0, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, +0xF0, 0x00, 0xFA, 0x00, 0xC2, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, +0xF0, 0x00, 0x68, 0x01, 0xF4, 0x01, 0x20, 0x03, 0xE8, 0x03, 0x78, 0x05, 0x1E, 0x00, 0x32, 0x00, +0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x2C, 0x01, 0x90, 0x01, +0x3C, 0x00, 0x78, 0x00, 0xB4, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, 0x90, 0x01, +0xF4, 0x01, 0x58, 0x02, 0x5A, 0x00, 0x96, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, +0x90, 0x01, 0xF4, 0x01, 0x58, 0x02, 0xBC, 0x02, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x68, 0x01, +0xF4, 0x01, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0x00, 0xF0, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x00, 0x30, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x38, 0x18, 0x00, 0x00, 0x00, +0x00, 0x83, 0x01, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x60, 0xB8, +0x00, 0x00, 0x64, 0xB8, 0x81, 0x39, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xF9, 0x39, 0x00, 0x80, +0xBB, 0x3A, 0x00, 0x80, 0x11, 0x39, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, +0xBB, 0x3A, 0x00, 0x80, 0x7B, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, +0xBB, 0x3A, 0x00, 0x80, 0x8F, 0x38, 0x00, 0x80, 0x5B, 0x01, 0x64, 0xB8, 0x92, 0x06, 0x64, 0xB8, +0x3C, 0x01, 0x64, 0xB8, 0x53, 0x04, 0x64, 0xB8, 0x89, 0x00, 0x60, 0xB8, 0x8A, 0x00, 0x60, 0xB8, +0x04, 0x06, 0x64, 0xB8, 0x0A, 0x06, 0x64, 0xB8, 0x1A, 0x04, 0x64, 0xB8, 0x1B, 0x04, 0x64, 0xB8, +0x00, 0x00, 0x1E, 0x00, 0x58, 0x05, 0x64, 0xB8, 0x57, 0x01, 0x64, 0xB8, 0x87, 0x02, 0x64, 0xB8, +0x96, 0x02, 0x64, 0xB8, 0x86, 0x02, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0xA8, 0x06, 0x64, 0xB8, +0x60, 0x05, 0x64, 0xB8, 0x73, 0x05, 0x64, 0xB8, 0xAB, 0x06, 0x64, 0xB8, 0xAA, 0x06, 0x64, 0xB8, +0x0D, 0x00, 0x78, 0xB8, 0x12, 0x00, 0x78, 0xB8, 0x11, 0x00, 0x78, 0xB8, 0x06, 0x00, 0x78, 0xB8, +0xA7, 0x04, 0x64, 0xB8, 0xA6, 0x04, 0x64, 0xB8, 0xA5, 0x04, 0x64, 0xB8, 0xA4, 0x04, 0x64, 0xB8, +0x14, 0x00, 0x78, 0xB8, 0x09, 0x00, 0x78, 0xB8, 0x29, 0x00, 0x78, 0xB8, 0x1D, 0x04, 0x64, 0xB8, +0x7A, 0x04, 0x64, 0xB8, 0x04, 0x02, 0x64, 0xB8, 0x04, 0x06, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, +0x00, 0x00, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, +0xE0, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFD, 0xE3, 0x00, 0x60, 0xB8, 0xA3, 0x4D, 0x00, 0x80, +0xAB, 0x4D, 0x00, 0x80, 0xB3, 0x4D, 0x00, 0x80, 0xBB, 0x4D, 0x00, 0x80, 0xC3, 0x4D, 0x00, 0x80, +0xCB, 0x4D, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, +0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x60, 0xB8, +0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x64, 0xB8, 0x04, 0x00, 0x60, 0xB8, 0x04, 0x00, 0x64, 0xB8, +0x08, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0xE8, 0x12, 0x64, 0xB8, +0x80, 0x00, 0x60, 0xB8, 0x50, 0x14, 0x60, 0xB8, 0x50, 0x14, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, +0xFC, 0x10, 0x60, 0xB8, 0xFA, 0xFA, 0xFA, 0xFA, 0x4C, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, +0x84, 0x04, 0x64, 0xB8, 0x88, 0x04, 0x64, 0xB8, 0x8C, 0x04, 0x64, 0xB8, 0x90, 0x04, 0x64, 0xB8, +0x94, 0x04, 0x64, 0xB8, 0x98, 0x04, 0x64, 0xB8, 0x9C, 0x04, 0x64, 0xB8, 0xA0, 0x04, 0x64, 0xB8, +0xA4, 0x04, 0x64, 0xB8, 0xA8, 0x04, 0x64, 0xB8, 0xD0, 0x04, 0x64, 0xB8, 0x00, 0x0C, 0x01, 0x00, +0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x66, 0xB8, 0x30, 0x31, 0x32, 0x33, +0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, +0x53, 0x65, 0x74, 0x5F, 0x50, 0x6E, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, +0x52, 0x41, 0x5F, 0x55, 0x70, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x5F, 0x66, 0x6F, 0x72, 0x5F, +0x52, 0x41, 0x5F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, +0x44, 0x6F, 0x77, 0x6E, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, +0x65, 0x38, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, +0x36, 0x3D, 0x30, 0x78, 0x25, 0x77, 0x78, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0x32, +0x3D, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, +0x69, 0x5F, 0x33, 0x3A, 0x20, 0x5B, 0x31, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, +0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x33, 0x5D, +0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, +0x69, 0x5F, 0x32, 0x3A, 0x20, 0x5B, 0x31, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, +0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x20, 0x00, 0x46, 0x57, 0x20, 0x74, +0x72, 0x61, 0x20, 0x65, 0x6E, 0x00, 0x00, 0x00, 0x81, 0x9F, 0x00, 0x80, 0xC7, 0x9F, 0x00, 0x80, +0x8B, 0x9F, 0x00, 0x80, 0xBD, 0x9F, 0x00, 0x80, 0xCF, 0x9F, 0x00, 0x80, 0xCF, 0x9F, 0x00, 0x80, +0x95, 0x9F, 0x00, 0x80, 0x9F, 0x9F, 0x00, 0x80, 0xA9, 0x9F, 0x00, 0x80, 0xB3, 0x9F, 0x00, 0x80, +0x00, 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x36, 0x40, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, +0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, +0xCD, 0x9B, 0x78, 0x56, 0x00, 0x00, 0x66, 0xB8, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x15, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, +0x52, 0x41, 0x3A, 0x4F, 0x46, 0x44, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x43, +0x43, 0x4B, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x31, 0x2D, 0x4D, 0x25, +0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x32, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, +0x52, 0x41, 0x3A, 0x56, 0x33, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, +0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x31, 0x2C, +0x25, 0x62, 0x58, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x32, 0x2C, 0x25, 0x62, 0x58, 0x00, +0x5B, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x52, 0x61, 0x74, 0x65, 0x5F, 0x52, 0x53, 0x53, 0x49, 0x5D, +0x20, 0x6D, 0x61, 0x63, 0x69, 0x64, 0x3A, 0x25, 0x62, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x3A, +0x25, 0x62, 0x58, 0x20, 0x52, 0x61, 0x74, 0x65, 0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, +0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, 0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, +0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, 0x29, 0xCD, 0x00, 0x80, 0x29, 0xCD, 0x00, 0x80, +0x29, 0xCD, 0x00, 0x80, 0xC5, 0xCC, 0x00, 0x80, 0x07, 0xCD, 0x00, 0x80, 0x07, 0xCD, 0x00, 0x80, +0xC5, 0xCC, 0x00, 0x80, 0x45, 0xCD, 0x00, 0x80, 0x67, 0xCD, 0x00, 0x80, 0x52, 0x41, 0x50, 0x65, +0x6E, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x43, 0x6E, 0x74, 0x3A, 0x20, 0x25, 0x62, 0x58, +0x00, 0x00, 0x00, 0x00, 0x46, 0x57, 0x46, 0x69, 0x78, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x46, +0x61, 0x73, 0x74, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x44, 0x72, 0x6F, 0x70, +0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x4C, 0x56, 0x31, 0x3A, 0x20, 0x25, 0x62, 0x58, +0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x31, +0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x32, +0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x33, +0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x55, 0x70, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, +0x55, 0x70, 0x46, 0x61, 0x69, 0x6C, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x00, 0x00, +0x52, 0x61, 0x74, 0x65, 0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x69, +0x6F, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x4E, 0x73, 0x63, 0x20, 0x25, 0x62, 0x58, 0x2C, +0x20, 0x4E, 0x54, 0x48, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, +0x53, 0x74, 0x61, 0x79, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x54, 0x54, 0x78, 0x52, 0x50, 0x54, +0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, +0x72, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x49, 0x44, 0x3A, 0x25, +0x62, 0x58, 0x00, 0x00, 0x52, 0x5B, 0x30, 0x3A, 0x34, 0x5D, 0x20, 0x25, 0x62, 0x58, 0x20, 0x2C, +0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, +0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x55, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, +0x54, 0x47, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x54, 0x47, 0x70, 0x61, +0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x50, +0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x44, 0x54, 0x50, 0x5F, +0x65, 0x6E, 0x64, 0x00, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, +0x06, 0x06, 0x07, 0x0A, 0x0C, 0x0F, 0x10, 0x12, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0F, 0x11, 0x12, +0x09, 0x09, 0x09, 0x09, 0x0C, 0x0F, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, +0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x11, 0x12, 0x12, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, +0x10, 0x12, 0x12, 0x13, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x11, 0x12, 0x14, 0x15, 0x08, 0x0A, +0x0B, 0x0C, 0x0D, 0x0F, 0x0E, 0x0F, 0x12, 0x13, 0x28, 0x28, 0x32, 0x28, 0x1E, 0x19, 0x19, 0x19, +0x18, 0x18, 0x12, 0x0F, 0x1E, 0x1E, 0x19, 0x1E, 0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1E, +0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1C, 0x18, 0x14, 0x0C, 0x0A, 0x1E, 0x1E, 0x19, 0x1E, +0x19, 0x18, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x16, 0x14, 0x12, 0x0C, 0x0A, 0x1E, 0x1E, +0x1E, 0x1E, 0x1A, 0x16, 0x12, 0x10, 0x0C, 0x0A, 0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x16, 0x0D, 0x0D, +0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x12, 0x14, 0x12, +0x0F, 0x0F, 0x0C, 0x0C, 0x09, 0x08, 0x08, 0x07, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, +0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, +0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x07, 0x07, 0x06, +0x04, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, +0x09, 0x07, 0x07, 0x05, 0x04, 0x04, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, +0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 0xFF, +0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x00, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x06, +0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x38, 0xE0, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0xC0, +0x00, 0x03, 0x0C, 0x00, 0x4A, 0x04, 0x64, 0xB8, 0x49, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, +0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x60, 0xB8, 0x01, 0x00, 0x64, 0xB8, 0x02, 0x00, 0x60, 0xB8, +0x02, 0x00, 0x64, 0xB8, 0x03, 0x00, 0x60, 0xB8, 0x03, 0x00, 0x64, 0xB8, 0x00, 0x1C, 0x66, 0xB8, +0x04, 0x1C, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x01, 0x00, 0x66, 0xB8, 0x01, 0x1C, 0x66, 0xB8, +0x02, 0x1C, 0x66, 0xB8, 0x03, 0x1C, 0x66, 0xB8, 0x05, 0x1C, 0x66, 0xB8, 0x06, 0x1C, 0x66, 0xB8, +0x07, 0x1C, 0x66, 0xB8, 0xF0, 0x10, 0x60, 0xB8, 0xF1, 0x10, 0x60, 0xB8, 0x06, 0x00, 0x66, 0xB8, +0x23, 0x04, 0x64, 0xB8, 0x30, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x02, 0x34, 0x04, 0x64, 0xB8, +0x04, 0x05, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0xF3, 0x10, 0x60, 0xB8, 0xF2, 0x10, 0x60, 0xB8, +0x53, 0x04, 0x64, 0xB8, 0x52, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, 0x51, 0x04, 0x64, 0xB8, +0xF7, 0x10, 0x60, 0xB8, 0xF4, 0x10, 0x60, 0xB8, 0xF5, 0x10, 0x60, 0xB8, 0x00, 0x00, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, +0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x10, 0x66, 0xB8, +0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, +0x04, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x96, 0x02, 0x64, 0xB8, +0x00, 0x00, 0x70, 0xB8, 0xFF, 0xFF, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x70, 0xB8, +0x02, 0x00, 0x70, 0xB8, 0x1C, 0x01, 0x64, 0xB8, 0xFF, 0xFF, 0x03, 0x00, 0x94, 0x02, 0x64, 0xB8, +0x97, 0x02, 0x64, 0xB8, 0x1C, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x20, 0x24, 0x04, 0x64, 0xB8, +0x30, 0x01, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0xCC, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, +0x00, 0x00, 0x64, 0xB8, 0x31, 0x00, 0x60, 0xB8, 0x32, 0x00, 0x60, 0xB8, 0x33, 0x00, 0x60, 0xB8, +0x30, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x60, 0xB8, +0x00, 0x00, 0x64, 0xB8, 0x64, 0x01, 0x64, 0xB8, 0x53, 0x05, 0x64, 0xB8, 0x77, 0x05, 0x64, 0xB8, +0x68, 0x05, 0x64, 0xB8, 0x85, 0x1E, 0x00, 0x80, 0xD1, 0x1E, 0x00, 0x80, 0x1D, 0x1F, 0x00, 0x80, +0x69, 0x1F, 0x00, 0x80, 0xB5, 0x1F, 0x00, 0x80, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x66, 0xB8, +0x00, 0x1C, 0x66, 0xB8, 0x9A, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, +0xF8, 0x10, 0x60, 0xB8, 0xC7, 0x01, 0x64, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, +0x30, 0x01, 0x64, 0xB8, 0x24, 0x01, 0x64, 0xB8, 0x20, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, +0x20, 0x11, 0x64, 0xB8, 0x2C, 0x11, 0x64, 0xB8, 0x28, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, +0x30, 0x11, 0x64, 0xB8, 0x3C, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, +0x38, 0x11, 0x64, 0xB8, 0x50, 0x00, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0x00, 0x40, 0x20, 0x00, +0xE0, 0x12, 0x64, 0xB8, 0x09, 0x02, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x78, 0xB8, +0x88, 0x00, 0x60, 0xB8, 0x06, 0x01, 0x64, 0xB8, 0xF0, 0x00, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, +0x54, 0x00, 0x60, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0x24, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, +0x2C, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, 0x3C, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, +0x00, 0x00, 0x78, 0xB8, 0x60, 0x05, 0x64, 0xB8, 0x61, 0x05, 0x64, 0xB8, 0x62, 0x05, 0x64, 0xB8, +0x63, 0x05, 0x64, 0xB8, 0x92, 0x06, 0x64, 0xB8, 0x2F, 0x01, 0x64, 0xB8, 0xE0, 0x04, 0x64, 0xB8, +0x57, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0xFD, 0x70, 0x00, 0x80, +0xFD, 0x70, 0x00, 0x80, 0xFD, 0x70, 0x00, 0x80, 0x5B, 0x71, 0x00, 0x80, 0xD7, 0x71, 0x00, 0x80, +0x43, 0x72, 0x00, 0x80, 0xB3, 0x72, 0x00, 0x80, 0x1D, 0x73, 0x00, 0x80, 0x7B, 0x73, 0x00, 0x80, +0xE5, 0x73, 0x00, 0x80, 0x7B, 0x73, 0x00, 0x80, 0x61, 0x74, 0x00, 0x80, 0x00, 0x00, 0x64, 0xB8, +0x00, 0x28, 0x64, 0xB8, 0x00, 0x2C, 0x64, 0xB8, 0x00, 0x38, 0x64, 0xB8, 0x00, 0x3C, 0x64, 0xB8, +0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x04, 0x02, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, +0x00, 0x00, 0xFE, 0x1F, 0x00, 0x03, 0x07, 0x00, 0xFF, 0x03, 0x07, 0x00, 0x54, 0x04, 0x64, 0xB8, +0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0xF0, 0x3F, 0x70, 0x77, 0x33, 0x54, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x10, 0x00, 0x17, 0x77, 0x33, 0x77, 0x77, 0x77, 0x33, 0x77, 0x17, 0x77, 0x33, 0x54, +0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFC, 0x10, 0x60, 0xB8, +0xF8, 0x05, 0x64, 0xB8, 0xF9, 0x05, 0x64, 0xB8, 0xFA, 0x05, 0x64, 0xB8, 0xFB, 0x05, 0x64, 0xB8, +0xF8, 0x10, 0x60, 0xB8, 0x83, 0x00, 0x60, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x08, 0x01, 0x64, 0xB8, +0x90, 0x00, 0x60, 0xB8, 0x92, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x22, 0x05, 0x64, 0xB8, +0x04, 0x02, 0x64, 0xB8, 0x7A, 0x04, 0x64, 0xB8, 0x20, 0x00, 0x78, 0xB8, 0x10, 0x00, 0x78, 0xB8, +0x03, 0x00, 0x78, 0xB8, 0xFF, 0xFF, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x78, 0xB8, +0x38, 0x00, 0x78, 0xB8, 0x05, 0x41, 0x10, 0x04, 0x24, 0x04, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, +0x2C, 0x04, 0x64, 0xB8, 0x1C, 0x04, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, 0x14, 0x00, 0x78, 0xB8, +0x1F, 0x04, 0x64, 0xB8, 0x5F, 0x01, 0x64, 0xB8, 0x1F, 0x07, 0x64, 0xB8, 0x1C, 0x07, 0x64, 0xB8, +0x2D, 0x04, 0x64, 0xB8, 0x68, 0x06, 0x64, 0xB8, 0x24, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xCF, 0xFF, +0x5C, 0x05, 0x64, 0xB8, 0x38, 0x06, 0x64, 0xB8, 0x83, 0x04, 0x64, 0xB8, 0x54, 0x04, 0x64, 0xB8, +0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, +0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, +0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7E, 0x04, 0x64, 0xB8, +0x21, 0x04, 0x64, 0xB8, 0x20, 0x04, 0x64, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, +0x04, 0x10, 0x66, 0xB8, 0x03, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, +0x06, 0x10, 0x66, 0xB8, 0x07, 0x10, 0x66, 0xB8, 0x7D, 0x04, 0x64, 0xB8, 0x7C, 0x04, 0x64, 0xB8, +0xF4, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x01, 0x64, 0xB8, +0x9A, 0x01, 0x64, 0xB8, 0x99, 0x01, 0x64, 0xB8, 0x9B, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, +0xC0, 0xA3, 0x02, 0x80, 0xC0, 0xA7, 0x02, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x01, 0x64, 0xB8, +0x00, 0x01, 0x64, 0xB8, 0xB7, 0x06, 0x64, 0xB8, 0xB4, 0x06, 0x64, 0xB8, 0x02, 0x10, 0x60, 0xB8, +0xF0, 0xFF, 0x03, 0x00, 0x53, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x58, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x79, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, +0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x19, 0x48, 0x00, 0x65, 0x00, 0xE8, 0x00, 0x65, 0x1A, 0xB8, +0x3B, 0xB8, 0x00, 0xBA, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x30, 0xF0, 0x20, 0x6C, 0x0A, 0xF0, 0x00, 0x4C, 0x02, 0xF0, 0x00, 0x4C, 0xBC, 0x65, 0x00, 0xF0, +0x21, 0x6C, 0x1F, 0xF4, 0x00, 0x4C, 0x8C, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x94, 0xB8, +0x00, 0x6D, 0xFE, 0xF7, 0x1F, 0x4D, 0xAC, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0xF4, +0x00, 0x6D, 0xAD, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6C, 0x00, 0xF0, 0x00, 0x4C, +0x00, 0x6E, 0x30, 0xF0, 0x20, 0x6F, 0x00, 0xF0, 0x00, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, +0xB8, 0x67, 0xFB, 0x2D, 0x30, 0xF0, 0x20, 0x6C, 0xE2, 0xF3, 0x18, 0x4C, 0x00, 0x6E, 0x30, 0xF0, +0x20, 0x6F, 0x48, 0xF4, 0x18, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, 0xB8, 0x67, 0xFB, 0x2D, +0x10, 0xF0, 0x20, 0x6C, 0x60, 0xF2, 0x1D, 0x4C, 0x00, 0xEC, 0x00, 0x00, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x60, 0xF2, 0x1D, 0x4B, +0x60, 0xDA, 0x00, 0x18, 0xAB, 0x06, 0x00, 0x18, 0xC3, 0x06, 0x00, 0x18, 0x53, 0x09, 0x00, 0x18, +0xF5, 0x06, 0x00, 0x18, 0x49, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x50, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0x60, 0xF6, 0x70, 0x9B, 0x80, 0xAB, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xEC, 0x10, 0xF0, +0x00, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x00, 0x18, +0xD4, 0x09, 0x00, 0x18, 0x63, 0x06, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x24, 0x06, +0x00, 0x6C, 0x00, 0x18, 0xF1, 0x13, 0xFF, 0x17, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x4C, 0x01, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x56, 0x01, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x09, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x1A, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xB8, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xC2, 0x02, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x08, 0xD4, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF6, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x48, 0xB8, +0x03, 0xD2, 0x03, 0x92, 0x07, 0xD2, 0x4D, 0xB8, 0x02, 0xD2, 0x02, 0x92, 0x06, 0xD2, 0x4E, 0xB8, +0x01, 0xD2, 0x01, 0x92, 0x05, 0xD2, 0x4C, 0xB8, 0x00, 0xD2, 0x00, 0x92, 0x04, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x80, 0xF6, 0x48, 0x9A, 0x08, 0x93, 0x7C, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x80, 0xF6, 0x4C, 0x9A, 0x07, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, +0x50, 0x9A, 0x06, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x54, 0x9A, 0x04, 0x93, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x58, 0x9A, 0x08, 0x93, 0x7B, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x5C, 0x9A, 0x08, 0x93, 0x7D, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0xA0, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF6, 0x44, 0x9A, 0x08, 0x93, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, +0x48, 0x9A, 0x08, 0x93, 0x66, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x4C, 0x9A, +0x08, 0x93, 0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x50, 0x9A, 0x08, 0x93, +0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x54, 0x9A, 0x08, 0x93, 0x63, 0x9B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x58, 0x9A, 0x08, 0x93, 0x70, 0x9B, 0x60, 0xDA, +0xFF, 0x17, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, +0x20, 0x31, 0x08, 0x49, 0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, +0x58, 0x67, 0x58, 0xD9, 0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, +0xCE, 0xB8, 0x9E, 0xD9, 0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x0D, 0xB8, 0x7F, 0x69, 0x0C, 0xE9, +0x2D, 0x21, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, 0x20, 0x31, 0x08, 0x49, +0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x58, 0x67, 0x58, 0xD9, +0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, 0xCE, 0xB8, 0x9E, 0xD9, +0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x00, 0xF0, 0x20, 0x6D, 0xE0, 0xF6, 0x04, 0x4D, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x68, 0x00, 0xF0, 0x08, 0x48, 0x18, 0x48, 0x20, 0x98, 0x00, 0x65, 0x20, 0xDD, +0x00, 0x65, 0x1D, 0x67, 0x01, 0xDD, 0x00, 0x65, 0x00, 0xE9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, +0x00, 0xF0, 0x08, 0x49, 0x1F, 0xF4, 0x00, 0x6C, 0x8C, 0xE8, 0x80, 0xF2, 0x02, 0x30, 0x0B, 0x20, +0x01, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x40, 0x99, 0x00, 0x65, 0x40, 0xEA, 0x00, 0x65, 0x06, 0x30, +0x24, 0x41, 0xF5, 0x17, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, 0x0A, 0xF0, 0x08, 0x49, 0x58, 0x99, +0x1A, 0x65, 0x5B, 0x99, 0xBA, 0x65, 0x5D, 0x99, 0xFA, 0x65, 0x9E, 0x99, 0xBF, 0x99, 0x32, 0xEC, +0x30, 0xED, 0x42, 0x99, 0x63, 0x99, 0x84, 0x99, 0xA5, 0x99, 0xC6, 0x99, 0xE7, 0x99, 0x80, 0xF0, +0x20, 0x99, 0xC9, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x1A, 0xB8, 0x3B, 0xB8, 0x00, 0xBA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x11, 0x4B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, +0x11, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x60, 0xDA, 0x00, 0x18, +0x29, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x45, 0x9A, 0xA0, 0xF0, 0x1A, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x00, 0x18, 0x8E, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x20, 0x6A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x92, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x65, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x93, 0x18, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xEC, 0x20, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x94, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, +0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x98, 0x18, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x44, 0x9A, 0x6C, 0xEA, +0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x48, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x01, 0x6C, +0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF7, 0x4C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x02, 0x6C, 0x00, 0x18, 0x9C, 0x18, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, +0x50, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x03, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x54, 0x9A, 0x6C, 0xEA, +0x03, 0x22, 0x04, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x58, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x05, 0x6C, +0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF7, 0x5C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x06, 0x6C, 0x00, 0x18, 0x9C, 0x18, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, +0x40, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, +0x4F, 0x1A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x46, 0x9A, +0x52, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF7, 0x44, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xDB, 0x19, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x48, 0x9A, +0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xE6, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x4C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, +0x00, 0x6C, 0x00, 0x18, 0xFE, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x50, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, +0x22, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF7, 0x54, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x36, 0x1A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, +0x00, 0x18, 0xD7, 0x18, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x47, 0x9A, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x47, 0x9A, 0x62, 0x67, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xDB, 0x18, +0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x48, 0x9A, 0x62, 0x67, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x30, 0x19, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x68, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, +0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x7A, 0x06, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, +0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, +0x10, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x00, 0x18, 0x19, 0x18, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x4D, 0x9A, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, +0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x05, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, +0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x61, 0xF0, 0x09, 0x4B, 0x60, 0xDA, 0x00, 0x18, +0x70, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x51, 0x9A, 0xA0, 0xF0, 0x05, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x51, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x35, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x71, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x36, 0x19, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0x3E, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x53, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, +0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x57, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x71, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x58, 0x19, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0x59, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x5A, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, +0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x19, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0x5C, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x08, 0xF0, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5D, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x71, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5E, 0x19, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x00, 0x18, 0xD2, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF7, 0x58, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD3, 0x19, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x48, 0x9A, +0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xD4, 0x19, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x52, 0x9A, 0x78, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x52, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0x5F, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x89, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, +0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x90, 0x19, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0xAF, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x8A, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, +0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x72, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8C, 0x19, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0x22, 0x00, 0x18, 0x8D, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, +0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8E, 0x19, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x01, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0x8F, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x61, 0xF0, +0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xE1, 0xF2, 0x01, 0x4B, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xE1, 0xF2, +0x01, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, +0x10, 0xF0, 0x20, 0x6B, 0x01, 0xF3, 0x09, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, +0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x01, 0xF3, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, +0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6C, 0x2F, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0xA3, 0x21, +0x01, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x39, 0x21, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, +0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x60, 0x9B, +0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, +0x02, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, +0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, +0x44, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, +0x1F, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xC0, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x6C, 0x9B, +0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, +0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x5C, 0x9A, +0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x40, 0x9A, +0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x60, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, +0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x40, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xBD, 0x67, 0x60, 0x85, 0x8D, 0xEB, +0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x01, 0xD5, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, +0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x3F, 0x6C, 0x8C, 0xEA, +0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x2A, 0x22, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, +0x48, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x68, 0x9B, 0x6D, 0xE4, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0xE0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, +0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x27, 0x10, 0x01, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xE0, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, +0xE0, 0xF5, 0x48, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, +0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x01, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, +0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x52, 0x32, +0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, 0x11, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x80, 0xF4, 0x52, 0xA2, 0x82, 0x67, 0x00, 0x6D, 0x18, 0x6E, 0x00, 0x6F, 0x00, 0x18, +0x5F, 0x1E, 0x05, 0xD2, 0x00, 0x18, 0x8F, 0x15, 0x7D, 0x67, 0x50, 0xC3, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x50, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x54, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, +0x1F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4B, 0xE3, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x9D, 0x67, 0x70, 0xA4, 0x6E, 0xEA, +0x73, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, +0x6E, 0xEA, 0x26, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x66, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, +0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, +0x58, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x6C, +0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x44, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6B, 0x6E, 0xEA, +0x3B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x37, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x78, 0x9B, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x78, 0x9B, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0xC0, 0xF4, 0x68, 0xC2, +0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x60, 0xC4, 0x7D, 0x67, +0x20, 0xF0, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, 0x50, 0xA2, +0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, +0x70, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x52, 0x32, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x3A, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0xE0, 0xF5, 0x5C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0xFF, 0x6C, 0x26, 0x6D, 0x00, 0x18, +0x54, 0x1E, 0x00, 0x18, 0x9B, 0x1D, 0x01, 0x6B, 0x6E, 0xEA, 0x1D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, +0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x05, 0xD2, 0x5D, 0x67, +0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x31, 0x03, 0x05, 0x92, +0x82, 0x67, 0x00, 0x18, 0xDC, 0x02, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x27, 0x6D, 0x00, 0x18, +0x54, 0x1E, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x79, 0x03, 0x23, 0x10, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x79, 0x03, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, +0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x05, 0xD2, 0x5D, 0x67, +0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x31, 0x03, 0x05, 0x92, +0x82, 0x67, 0x00, 0x18, 0xDC, 0x02, 0x00, 0x18, 0x8F, 0x15, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x03, 0x6A, +0x6C, 0xEA, 0x0E, 0x2A, 0x09, 0x10, 0x01, 0x92, 0x03, 0x93, 0x60, 0xDA, 0x01, 0x92, 0x04, 0x4A, +0x01, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xF3, 0x22, +0x02, 0x92, 0x00, 0xD2, 0x08, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x60, 0xC2, +0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, +0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEE, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x02, 0xD4, 0x45, 0x67, 0x04, 0xD6, 0x7D, 0x67, 0x4C, 0xC3, 0x02, 0x92, 0x00, 0xD2, +0x0A, 0x10, 0x00, 0x92, 0x9D, 0x67, 0x6C, 0xA4, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, +0x04, 0x92, 0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0xF4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, +0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x04, 0x92, 0x03, 0xD2, 0x05, 0x92, 0x02, 0xD2, +0x05, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x16, 0x2A, 0x04, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, +0x0D, 0x10, 0x02, 0x92, 0x60, 0x9A, 0x03, 0x92, 0x60, 0xDA, 0x03, 0x92, 0x04, 0x4A, 0x03, 0xD2, +0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x06, 0x92, 0xFC, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0x04, 0x5A, +0x58, 0x67, 0xEF, 0x22, 0x03, 0x92, 0x01, 0xD2, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, +0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, +0x00, 0xD2, 0x00, 0x6A, 0x06, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x06, 0x93, +0xFF, 0x4B, 0x06, 0xD3, 0xEC, 0x2A, 0x04, 0x92, 0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, +0x03, 0xD5, 0x04, 0xD6, 0x02, 0x93, 0x03, 0x92, 0x63, 0xEA, 0x58, 0x67, 0x1A, 0x2A, 0x02, 0x92, +0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, +0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, +0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, +0x1D, 0x10, 0x02, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x01, 0xD2, 0x03, 0x93, 0x04, 0x92, 0x49, 0xE3, +0x00, 0xD2, 0x0A, 0x10, 0x01, 0x92, 0xFF, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, +0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, +0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x02, 0x92, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x00, 0x6A, 0x7D, 0x67, +0x40, 0xC3, 0x04, 0x92, 0x02, 0xD2, 0x05, 0x92, 0x01, 0xD2, 0x15, 0x10, 0x02, 0x92, 0x60, 0xA2, +0x01, 0x92, 0x40, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, +0x40, 0x83, 0x0C, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x02, 0xD2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, +0x06, 0x92, 0xFF, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0xE9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x06, 0x92, +0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, +0x01, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x00, 0xD2, 0x0B, 0x10, 0x01, 0x92, 0x40, 0xA2, 0x62, 0x67, +0x03, 0x92, 0x6E, 0xEA, 0x02, 0x2A, 0x01, 0x92, 0x08, 0x10, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, +0x01, 0x93, 0x00, 0x92, 0x6E, 0xEA, 0xF1, 0x2A, 0x01, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x00, 0xD2, 0x12, 0x10, 0x03, 0x93, +0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x40, 0xA2, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x62, 0x67, +0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0x93, 0x01, 0x4B, 0x00, 0xD3, 0x03, 0x22, 0x00, 0x92, 0xFF, 0x4A, +0x0B, 0x10, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, +0xFF, 0x4B, 0x04, 0xD3, 0xE4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, +0x03, 0xD5, 0x46, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, +0x0A, 0x10, 0x00, 0x92, 0x60, 0xA2, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, +0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x70, 0xA4, 0x01, 0x23, 0x01, 0x6A, +0xFF, 0x6B, 0x6C, 0xEA, 0x9D, 0x67, 0x70, 0xA4, 0xFF, 0x4B, 0x9D, 0x67, 0x70, 0xC4, 0xE9, 0x2A, +0x02, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, +0x04, 0xD2, 0x04, 0x92, 0x42, 0xA2, 0x40, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x04, 0x92, +0x41, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x4A, 0xCB, 0x04, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, +0x4A, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x54, 0x1B, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x54, 0x9A, 0x7D, 0x67, 0x84, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x78, 0x9A, 0x9D, 0x67, 0x44, 0xAC, 0x42, 0x34, +0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, +0x8C, 0xEA, 0x03, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0xE1, 0xF4, 0x98, 0x9C, 0xA0, 0xA4, +0xFF, 0x6C, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x35, 0x00, 0xF6, 0xA3, 0x35, 0x04, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, +0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, +0x7C, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, +0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x05, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, +0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, +0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x03, 0x92, 0x60, 0xC2, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xF9, 0x63, 0x0D, 0x62, 0x0E, 0xD4, 0x0E, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x05, 0xD2, 0x00, 0x6A, +0x7D, 0x67, 0x50, 0xC3, 0x06, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, +0x00, 0x6D, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x84, 0x1B, 0x01, 0x6A, 0x4B, 0xEA, 0x00, 0x6C, +0x18, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x0D, 0x1B, 0x05, 0xD2, 0x05, 0x92, 0x9D, 0x67, 0x50, 0xC4, +0x06, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x70, 0xA4, 0x6E, 0xEA, 0x0B, 0x22, 0x06, 0x92, 0x40, 0xA2, +0x62, 0x67, 0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, 0x00, 0x6D, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, +0x84, 0x1B, 0x10, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x1F, 0x6A, 0x9D, 0x67, 0x55, 0xCC, 0x06, 0x92, +0x40, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x07, 0x02, 0x82, 0x67, 0x00, 0x18, 0x54, 0x15, 0x0D, 0x97, +0x07, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x01, 0x6A, 0x9D, 0x67, +0x41, 0xC4, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x40, 0xC4, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xA2, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, +0x01, 0x6A, 0x6C, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x02, 0x4A, 0x9D, 0x67, 0x41, 0xC4, +0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x5A, +0x58, 0x67, 0xE9, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, +0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x06, 0x2A, +0x7D, 0x67, 0x48, 0xA3, 0x52, 0x32, 0x9D, 0x67, 0x40, 0xC4, 0x19, 0x10, 0x7D, 0x67, 0x48, 0xA3, +0x56, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, +0x8C, 0xA2, 0xF0, 0x6A, 0x8C, 0xEA, 0x47, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, +0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF5, 0x44, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x58, 0xC4, +0x00, 0x6A, 0xBD, 0x67, 0x4D, 0xCD, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, +0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, +0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x42, 0xF5, 0x09, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, +0x5D, 0x67, 0x6D, 0xAA, 0x00, 0xF0, 0x1D, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xC8, 0x04, +0x01, 0x6B, 0x6E, 0xEA, 0x60, 0xF1, 0x0E, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x05, 0x2A, 0xBD, 0x67, +0x5D, 0xA5, 0xFF, 0x6B, 0x6E, 0xEA, 0x32, 0x22, 0x9D, 0x67, 0x58, 0xA4, 0x15, 0x2A, 0xBD, 0x67, +0x5D, 0xA5, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, 0x06, 0x2A, 0x9D, 0x67, +0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, 0x07, 0x10, 0x7D, 0x67, 0x5D, 0xA3, 0x82, 0x67, +0x00, 0x18, 0x25, 0x05, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x8D, 0xAD, 0x5D, 0x67, 0x7D, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, +0xFF, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x4D, 0xAD, 0x01, 0x4A, 0x7D, 0x67, 0x4D, 0xCB, +0x9D, 0x67, 0x4D, 0xAC, 0x00, 0xF4, 0x00, 0x5A, 0x58, 0x67, 0xA8, 0x2A, 0x7D, 0x67, 0x4D, 0xAB, +0x01, 0x4A, 0x9D, 0x67, 0x4B, 0xCC, 0xBD, 0x67, 0x8B, 0xAD, 0x7D, 0x67, 0x4B, 0xAB, 0x6E, 0x42, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, 0xFF, 0x4A, 0xBD, 0x67, +0x4B, 0xCD, 0x7D, 0x67, 0x4B, 0xAB, 0x02, 0x5A, 0x58, 0x67, 0xE5, 0x22, 0x02, 0x6A, 0x7D, 0x67, +0x4B, 0xCB, 0x02, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x00, 0x6A, 0xBD, 0x67, 0x50, 0xC5, 0x00, 0x6A, +0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, +0x42, 0xF5, 0x09, 0x4B, 0x02, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, +0x0F, 0x6B, 0x6E, 0xEA, 0x28, 0x2A, 0x9D, 0x67, 0x4B, 0xAC, 0x61, 0x42, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0x25, 0x05, 0x01, 0x4A, +0xBD, 0x67, 0x55, 0xC5, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, +0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x4B, 0xAC, 0x81, 0x42, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x40, 0xA2, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3B, 0x05, +0xBD, 0x67, 0x54, 0xC5, 0x1B, 0x10, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, +0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0x25, 0x05, 0x7D, 0x67, 0x55, 0xC3, +0x9D, 0x67, 0x6B, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, +0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x3B, 0x05, 0xBD, 0x67, 0x54, 0xC5, 0x7D, 0x67, 0x54, 0xA3, +0x26, 0x5A, 0x58, 0x67, 0x1C, 0x22, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, +0x18, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, +0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xA7, 0x04, 0x5D, 0x67, +0x75, 0xA2, 0x9D, 0x67, 0x49, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x49, 0xCD, 0x20, 0x10, 0x7D, 0x67, +0x54, 0xA3, 0x38, 0x5A, 0x58, 0x67, 0x1B, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x23, 0xF1, 0x08, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, +0x18, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xA7, 0x04, +0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, +0x75, 0xA2, 0x9D, 0x67, 0x4B, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, +0x9D, 0x67, 0x4D, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x5F, 0xF7, 0x0C, 0x22, 0x5D, 0x67, 0x69, 0xAA, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x78, 0xC2, 0x7D, 0x67, 0x49, 0xAB, +0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x18, 0x4A, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, +0x70, 0xA4, 0x80, 0xF4, 0x70, 0xC2, 0x00, 0x6A, 0xBD, 0x67, 0x4B, 0xCD, 0x00, 0x6A, 0x7D, 0x67, +0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x42, 0xF5, +0x09, 0x4B, 0x04, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x7D, 0x67, 0x8B, 0xAB, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, +0x18, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, 0x01, 0x4A, 0xBD, 0x67, +0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x49, 0xAC, 0x43, 0xEB, 0x58, 0x67, 0xD1, 0x2A, +0x01, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x72, 0x10, 0x9D, 0x67, 0x50, 0xA4, +0x01, 0x6B, 0x6E, 0xEA, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, +0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF0, 0x11, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x50, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x52, 0xC4, 0x7D, 0x67, +0x52, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x5D, 0x67, 0x72, 0xA2, 0x0F, 0x6A, 0x6C, 0xEA, 0x50, 0x22, +0x9D, 0x67, 0x72, 0xA4, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, +0x71, 0xA2, 0x12, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x3A, 0x10, 0x9D, 0x67, +0x72, 0xA4, 0x02, 0x6A, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x20, 0x6A, 0x6C, 0xEA, +0x0F, 0x2A, 0x00, 0x18, 0x52, 0x05, 0x06, 0x2A, 0x9D, 0x67, 0x71, 0xA4, 0x20, 0x6A, 0x6D, 0xEA, +0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, +0x9D, 0x67, 0x71, 0xA4, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x19, 0x10, +0x9D, 0x67, 0x72, 0xA4, 0x04, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x05, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x0C, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x08, 0x6A, +0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x09, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, +0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x50, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, +0x00, 0x18, 0x63, 0x06, 0x8B, 0x2A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF5, 0x7C, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x00, 0x6B, 0x8D, 0xEB, +0x60, 0xDA, 0x01, 0x6A, 0x0F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0xA1, 0xF5, 0x7C, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x01, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x60, 0xDA, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x18, 0xA1, 0x0F, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, +0x68, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0xF0, 0x08, 0x4A, 0x61, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x00, 0xF3, 0x09, 0x4B, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x62, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, +0x00, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x63, 0xDA, 0x10, 0xF0, +0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, +0x64, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0xF0, 0x08, 0x4A, 0x65, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF3, 0x09, 0x4B, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x66, 0xDA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0x33, 0x72, 0x33, 0xFF, 0x6A, +0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, +0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x09, 0x23, 0x0C, 0x2A, 0x19, 0x6A, 0x7D, 0x67, +0x51, 0xC3, 0x0C, 0x10, 0x32, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x08, 0x10, 0x64, 0x6A, 0x7D, 0x67, +0x51, 0xC3, 0x04, 0x10, 0x38, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x92, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0x88, 0x06, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA0, 0xF4, +0x63, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, +0x10, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x2B, 0x10, 0x7D, 0x67, +0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x54, 0x9A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x09, 0x10, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x60, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x4A, +0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x10, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xCD, 0x06, 0x00, 0x18, 0xFE, 0x06, +0x00, 0x18, 0x64, 0x09, 0x00, 0x18, 0x05, 0x23, 0x00, 0x18, 0xB7, 0x1E, 0x00, 0x18, 0xDC, 0x0B, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0x00, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0x00, 0xF4, 0x6F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, +0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, +0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x01, 0x6B, 0x60, 0xC2, +0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x01, 0xF5, 0x78, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x01, 0xF5, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x08, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF5, 0x78, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, +0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x7C, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, +0xC2, 0x67, 0x00, 0x18, 0x24, 0x04, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x0E, 0x10, 0x5D, 0x67, +0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x04, 0x6B, 0x60, 0xC2, +0x7D, 0x67, 0x48, 0xAB, 0x20, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x7D, 0x67, 0x48, 0xAB, 0x02, 0xF0, +0x00, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x60, 0x9A, 0x00, 0xF4, +0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x24, 0x04, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x44, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x40, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x0B, 0x6A, 0x6D, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x44, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, +0x02, 0x2A, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, +0x4C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF5, 0x11, 0x4B, 0x60, 0xDA, 0x32, 0x10, 0x7D, 0x67, +0x48, 0xAB, 0x82, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, +0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF5, 0x70, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, +0x1F, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, 0x00, 0x18, +0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0B, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, +0x06, 0x2A, 0x00, 0x18, 0x45, 0x07, 0x01, 0x6B, 0x6E, 0xEA, 0xC9, 0x2A, 0x01, 0x10, 0x00, 0x65, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x02, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF5, 0x4C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF5, 0x11, 0x4B, 0x01, 0x4B, +0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, +0x82, 0x67, 0x00, 0x18, 0x36, 0x14, 0x00, 0x18, 0x81, 0x14, 0x04, 0xD2, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x05, 0x5A, 0x58, 0x67, 0xC0, 0xF0, +0x06, 0x22, 0x00, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x04, 0x4A, 0x49, 0xE3, +0x40, 0x9A, 0x00, 0xEA, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x5C, 0x9A, +0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x00, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x97, 0x10, +0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x44, 0x9A, 0x01, 0x93, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x71, 0x10, 0x00, 0x94, 0x00, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x4B, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x54, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, +0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x25, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, +0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x00, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, +0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x2B, 0x23, 0x01, 0x5A, 0x78, 0x67, +0x07, 0x2B, 0x02, 0x6B, 0x4E, 0xEB, 0x46, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x64, 0x22, 0x83, 0x10, +0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x00, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, +0x62, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, +0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x41, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, +0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, +0x60, 0x9B, 0x60, 0xDA, 0x20, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x58, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, +0x01, 0x6B, 0x6E, 0xEA, 0x2A, 0x22, 0x51, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF5, 0x48, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, +0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x28, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, +0x00, 0x92, 0x04, 0x22, 0x01, 0x6B, 0x6E, 0xEA, 0x25, 0x22, 0x47, 0x10, 0x00, 0x94, 0x00, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, +0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x00, 0x94, +0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, +0x60, 0xDA, 0x23, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0x6B, 0x02, 0xF5, 0x78, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x62, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, +0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x61, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0x6E, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0x6E, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0x6F, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF5, 0x5C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, +0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, +0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x01, 0x6B, +0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x20, 0xE8, +0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF3, 0x10, 0x6B, 0x02, 0xF5, 0x78, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF5, 0x7C, 0x9B, 0x61, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x01, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0x64, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, +0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x63, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0x64, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x0E, 0x6B, 0x6E, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x0C, 0xF0, 0x01, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, +0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6F, 0x9B, 0x60, 0xDA, 0x20, 0xE8, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x40, 0xF0, +0x70, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF0, 0x70, 0xAA, 0xFF, 0x6A, +0x6C, 0xEA, 0x01, 0x6C, 0x02, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x36, 0x13, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF0, 0x50, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x03, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x36, 0x13, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x9F, 0x08, 0x00, 0x18, 0xD7, 0x08, +0x00, 0x18, 0xF0, 0x08, 0x00, 0x18, 0x23, 0x09, 0x00, 0x18, 0x1A, 0x09, 0x00, 0x18, 0x34, 0x09, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x78, 0x09, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, +0x74, 0xC2, 0x00, 0x18, 0x22, 0x07, 0x00, 0x18, 0x52, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, +0x40, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x00, 0x18, 0x0D, 0x07, 0x00, 0x18, 0x11, 0x07, 0x00, 0x18, +0x87, 0x09, 0x00, 0x18, 0x47, 0x1B, 0x00, 0x18, 0x2B, 0x07, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0xE0, 0xF1, 0x1B, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x41, 0xCB, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF7, 0x5C, 0x9A, 0x9D, 0x67, 0x61, 0xAC, 0x60, 0xCA, 0x0F, 0x6A, 0x7D, 0x67, 0x40, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x40, 0x9A, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF7, 0x64, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x44, 0x9A, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x4A, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, +0x40, 0xA3, 0x02, 0x2A, 0x02, 0x6A, 0x08, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, +0x02, 0x2A, 0x03, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x54, 0x9A, +0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xFF, 0xF6, 0x1F, 0x6C, 0x8C, 0xEA, 0x40, 0xCB, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF7, 0x78, 0x9B, +0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x5C, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF7, 0x7C, 0x9B, 0x80, 0x9B, 0x00, 0xF4, 0x00, 0x6B, 0x8D, 0xEB, +0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, +0x40, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF7, 0x44, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, +0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x44, 0x9A, 0x9D, 0x67, +0x71, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x48, 0x9A, 0x80, 0x6B, 0x6B, 0xEB, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, +0x6E, 0xEA, 0x0D, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, +0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x70, 0x9B, 0x60, 0xDA, 0x11, 0x10, 0x9D, 0x67, +0x50, 0xA4, 0x80, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x74, 0x9B, 0x60, 0xDA, +0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0xC1, 0xF7, 0x78, 0x9B, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0x60, 0xBA, 0x20, 0xE8, 0x40, 0xBA, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, +0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, +0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, +0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, +0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, +0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, +0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, +0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, +0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, +0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, +0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x4B, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, +0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, +0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, +0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, +0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, +0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, +0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, +0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, +0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, +0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, +0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, +0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, +0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, +0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, +0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, +0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, +0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, +0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0xBD, 0x67, 0x4C, 0xC5, 0xDD, 0x67, 0x48, 0xA6, 0x4E, 0x32, +0x7D, 0x67, 0x43, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x42, 0xC5, +0xDD, 0x67, 0x43, 0xA6, 0x42, 0xF4, 0x10, 0x4A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, 0x4C, 0xA4, +0x01, 0x6D, 0xAE, 0xEA, 0xC0, 0xF0, 0x0E, 0x2A, 0xDD, 0x67, 0x83, 0xA6, 0x5D, 0x67, 0x63, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, +0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, +0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, +0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, +0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, +0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, +0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, +0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x14, 0x11, 0x5D, 0x67, 0x60, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, +0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, +0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, +0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, +0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x40, 0xC3, 0xC8, 0x10, 0x5D, 0x67, 0x83, 0xA2, 0xBD, 0x67, 0x63, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0xDD, 0x67, 0x42, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, +0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, +0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, +0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, +0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, +0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, +0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, +0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, +0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, +0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, +0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, +0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, +0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, +0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x61, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, +0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x45, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x06, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, +0x48, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x4C, 0x9A, 0x02, 0x6B, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x4A, 0xA2, 0x46, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0xFF, 0x6B, 0x59, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, +0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, +0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0x1A, 0x23, 0x02, 0x6B, +0x4E, 0xEB, 0x20, 0x23, 0x27, 0x2A, 0x5D, 0x67, 0x64, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x83, 0x67, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0x8C, 0xEB, +0xC0, 0xF4, 0xA5, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, +0x11, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0xC0, 0xF4, +0x68, 0xC2, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, +0xC0, 0xF4, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x41, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x00, 0x52, +0x78, 0x67, 0x3C, 0x2B, 0x02, 0x52, 0x78, 0x67, 0x04, 0x2B, 0x02, 0x6B, 0x6E, 0xEA, 0x2B, 0x22, +0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, +0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF5, 0x18, 0x4C, 0xC0, 0xF4, +0xA5, 0xA4, 0x01, 0x6C, 0x8C, 0xED, 0xFF, 0x6C, 0xAC, 0xEC, 0x9C, 0x34, 0x00, 0xF6, 0x80, 0x34, +0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, +0x8C, 0xEA, 0x40, 0xC3, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x64, 0xA3, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC3, 0xF1, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x6D, +0x68, 0x6E, 0x00, 0x18, 0x24, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x02, 0x6B, +0xC0, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xC0, 0xF4, +0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xC0, 0xF4, 0x6C, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0xC0, 0xF4, 0x72, 0xCA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x7F, 0xC2, 0x00, 0x18, 0xEB, 0x10, 0x00, 0x6C, 0x00, 0x6D, +0x00, 0x18, 0x9A, 0x0B, 0x02, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x01, 0x6C, 0x0C, 0x6D, +0x00, 0x18, 0x9A, 0x0B, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, 0x54, 0xA2, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE3, 0xF1, 0x08, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, +0x00, 0x18, 0x1D, 0x21, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x02, 0x6B, 0x20, 0xF5, +0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0F, 0x6B, 0x20, 0xF5, 0x69, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x8A, 0xA2, 0x01, 0x6B, 0x8C, 0xEB, +0x83, 0x67, 0x28, 0x6B, 0x8D, 0xEB, 0x20, 0xF5, 0x6A, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x07, 0x6B, 0x20, 0xF5, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, +0xC0, 0xF4, 0x7F, 0xC2, 0x01, 0x6C, 0x00, 0x18, 0x36, 0x12, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, +0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, +0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x64, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x80, 0xF5, 0x44, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF8, 0x6C, 0x8C, 0xEA, +0x40, 0xC3, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, +0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0xC0, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x85, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x11, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, +0x66, 0xC2, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, +0x99, 0x07, 0x10, 0xF0, 0x00, 0x6A, 0x03, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x00, 0x08, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0xFF, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x10, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, +0x07, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, +0x00, 0x18, 0x99, 0x07, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x64, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, +0x6C, 0xEC, 0x07, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, +0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x21, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x04, 0x6C, 0x01, 0x6D, +0x00, 0x18, 0x09, 0x0E, 0x0A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x85, 0xA2, 0x20, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x60, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x00, 0x08, +0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x58, 0x9A, +0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x02, 0x6B, 0x60, 0xDA, +0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x26, 0x2A, 0x00, 0x18, 0x39, 0x21, 0x00, 0x18, 0x83, 0x0D, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, +0x66, 0xC2, 0x04, 0x10, 0x0C, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, +0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x64, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, +0x44, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF8, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x02, 0x10, +0x00, 0x18, 0x6C, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, +0x04, 0x23, 0x02, 0x6B, 0x6E, 0xEA, 0x1F, 0x22, 0x4F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x02, 0x6B, 0xC0, 0xF4, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, +0xC0, 0xF4, 0x65, 0xC2, 0x31, 0x10, 0x9D, 0x67, 0x44, 0xA4, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x6B, 0xC2, 0x0B, 0x10, 0x7D, 0x67, 0x44, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, +0x40, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x06, 0xD4, 0x00, 0x18, 0x3C, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x60, 0xA2, 0x7F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x00, 0x18, 0x98, 0x0C, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, +0x0D, 0x22, 0x06, 0x92, 0x61, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCF, 0x0C, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x5D, 0x0C, 0x01, 0x6B, 0x6E, 0xEA, +0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x04, 0x6B, +0x6C, 0xEA, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, +0x05, 0x5A, 0x58, 0x67, 0x06, 0x22, 0x01, 0x6A, 0x06, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, +0x01, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x5D, 0x0C, 0x01, 0x6B, 0x6E, 0xEA, 0x37, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x2F, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, 0x2A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x22, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x10, 0x6A, +0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, +0x20, 0x6B, 0x6C, 0xEA, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, +0x4D, 0xA2, 0x0E, 0x2A, 0x01, 0x6A, 0x0E, 0x10, 0x00, 0x65, 0x0B, 0x10, 0x00, 0x65, 0x09, 0x10, +0x00, 0x65, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, +0x00, 0x65, 0x00, 0x6A, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF5, 0x44, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, +0x06, 0x22, 0x01, 0x6A, 0x06, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x00, 0x6A, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, +0x58, 0xA3, 0x38, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x32, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x0F, 0x6C, 0x2B, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x30, 0xF0, +0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0xBF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, +0xC8, 0x03, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x86, 0xA2, 0x01, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x01, 0x6C, 0x06, 0x6D, +0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x00, 0x6C, 0x00, 0x6D, +0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x46, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, +0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, +0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, +0x9A, 0x0B, 0x12, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, +0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x6C, 0x00, 0x18, +0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x24, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x86, 0xA2, 0x09, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x6F, 0x6C, +0x2C, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0xC8, 0x03, 0x01, 0x6B, +0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, +0x02, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x01, 0x6C, 0x0E, 0x6D, 0x00, 0x18, 0x9A, 0x0B, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x08, 0x6B, 0x6C, 0xEA, 0x05, 0x2A, 0x01, 0x6C, +0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, +0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, +0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, +0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6C, 0x2D, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0x9B, 0x1D, +0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x48, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x00, 0x6C, 0x08, 0x6D, +0x00, 0x18, 0x99, 0x07, 0x00, 0x18, 0xA3, 0x21, 0x01, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x9A, 0x0B, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x6F, 0x6C, 0x2E, 0x6D, +0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x02, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x00, 0x18, +0x39, 0x21, 0x7D, 0x67, 0x58, 0xA3, 0x04, 0x22, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, +0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x22, 0x1E, 0x00, 0x18, 0x43, 0x1E, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x78, 0xC4, +0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, +0x01, 0x6B, 0x6C, 0xEA, 0x20, 0xF1, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x46, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x20, 0xF1, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x9D, 0x67, 0x78, 0xA4, 0x6E, 0xEA, 0x20, 0xF1, +0x04, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x0D, 0x5A, 0x78, 0x67, 0x00, 0xF1, 0x1E, 0x23, 0x48, 0x33, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, +0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x03, 0x2A, 0x01, 0x6C, 0x00, 0x18, 0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, +0x9D, 0x67, 0x5C, 0xA4, 0x06, 0x22, 0x7D, 0x67, 0x5C, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x61, 0x0D, +0x02, 0x10, 0x00, 0x18, 0x83, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x48, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0xC0, 0xF0, 0x0D, 0x2A, 0x00, 0x18, 0xD4, 0x02, 0xD5, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x03, 0x2A, 0x01, 0x6C, +0x00, 0x18, 0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x06, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, +0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6C, 0x8E, 0xEA, 0x80, 0xF0, 0x1D, 0x2A, 0x00, 0x18, +0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x80, 0xF0, 0x19, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x9D, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6C, 0x8E, 0xEA, +0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6C, 0x8E, 0xEA, +0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6C, 0x8E, 0xEA, +0x02, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x48, 0xA2, 0x04, 0x6B, 0x6E, 0xEA, 0x64, 0x2A, 0x00, 0x18, 0x27, 0x0D, 0x01, 0x6C, 0x8E, 0xEA, +0x61, 0x2A, 0x00, 0x18, 0xE4, 0x0D, 0x61, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6C, +0x8E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, +0x00, 0x18, 0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x03, 0x2A, 0x01, 0x6C, 0x00, 0x18, +0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x6C, +0x8E, 0xEA, 0x22, 0x2A, 0x00, 0x18, 0xF2, 0x0D, 0x20, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x0E, 0x22, 0x00, 0x18, +0xCC, 0x02, 0x0B, 0x10, 0x00, 0x65, 0x09, 0x10, 0x00, 0x65, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, +0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, +0x09, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x08, 0x6B, +0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x4F, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, +0x04, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0xB0, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x7D, 0x0B, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, +0x16, 0x22, 0x0C, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, +0x54, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x01, 0x6B, +0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0xC8, 0x03, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, +0x20, 0x6A, 0xA0, 0xF5, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x48, 0xCB, 0x5D, 0x67, 0x68, 0xAA, +0x18, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, +0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, +0x00, 0x18, 0xC6, 0x0E, 0x7B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, +0x2C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, +0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x69, 0xA2, 0x01, 0x6A, 0x4D, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, +0x67, 0x03, 0x11, 0x10, 0x00, 0x18, 0xCE, 0x0E, 0x0E, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, +0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x7D, 0x67, 0x48, 0x8B, 0x00, 0x52, 0x58, 0x67, 0x28, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x02, 0x6A, 0x4D, 0xEB, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x49, 0xA2, 0xFF, 0x6B, 0x55, 0x4B, +0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x02, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x0E, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0xA0, 0xF0, +0x1D, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0xA0, 0xF0, 0x16, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0xF5, 0x7C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x61, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x3A, 0x22, 0x00, 0x52, 0x78, 0x67, +0x3C, 0x2B, 0x03, 0x52, 0x58, 0x67, 0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x4C, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x4C, 0xA2, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, +0x1B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x0C, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x05, 0x10, +0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x50, 0xA3, 0x5E, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x10, 0x6A, 0x4D, 0xEB, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x09, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x16, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x49, 0xE3, 0xFF, 0x6B, 0x55, 0x4B, +0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x62, 0x67, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0xFE, 0x4A, +0x49, 0xE4, 0xFF, 0x6B, 0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, +0x6C, 0xEA, 0x04, 0x2A, 0x04, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x54, 0x22, +0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x4E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x6B, 0xA3, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x7C, 0xDA, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6C, 0xC2, 0x7D, 0x67, 0x50, 0xA3, +0x2B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x10, 0x6A, +0x4D, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0xFF, 0x6B, +0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x04, 0x2A, +0x04, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, +0x13, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, +0x6C, 0xEA, 0xE0, 0xF0, 0x09, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x41, 0xA2, 0x0F, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x07, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4B, 0xA2, 0x06, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0xC0, 0xF4, 0x4C, 0xC3, 0x00, 0x18, 0xFD, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x85, 0xA2, 0x20, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, +0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x49, 0xA2, 0xEF, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x61, 0xA2, +0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0x4A, 0x03, 0x5A, 0x58, 0x67, 0x02, 0x22, +0x00, 0x18, 0xE1, 0x0E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, +0x40, 0x6B, 0x6C, 0xEA, 0x49, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x46, 0xA2, 0x10, 0x6B, 0x6C, 0xEA, 0x40, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4B, 0xA2, +0x6E, 0xEA, 0x32, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, +0x10, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x54, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x6B, 0xA3, 0x60, 0xC2, 0x10, 0xF0, +0x00, 0x6A, 0x03, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x99, 0x07, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, +0x00, 0x08, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xC0, 0xC5, 0xBD, 0x67, +0x84, 0xC5, 0xDD, 0x67, 0x68, 0xC6, 0x7D, 0x67, 0x4C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x00, 0xF1, 0x0C, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x1F, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x63, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7A, 0xC2, 0x13, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0xC0, 0xF4, 0x7B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0xC0, 0xF4, 0x7A, 0xC2, 0x9D, 0x67, 0x48, 0xA4, 0x05, 0x4A, +0xBD, 0x67, 0x48, 0xC5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x79, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5A, 0xA2, 0x63, 0xEA, 0x58, 0x67, +0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x68, 0xA4, 0xC0, 0xF4, +0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xA2, 0xBD, 0x67, +0x44, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x2B, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5A, 0xA2, 0x9D, 0x67, 0x64, 0xA4, +0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x48, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x5A, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x5E, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5B, 0xA2, +0x0A, 0x4A, 0x62, 0xEA, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x5B, 0xA2, 0x67, 0x42, 0x03, 0x4B, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x5E, 0xA2, 0x23, 0x4A, 0x62, 0xEA, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, 0x67, 0x42, 0x1C, 0x4B, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x72, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x52, 0xAA, +0x6E, 0xEA, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0xC0, 0xF4, 0x66, 0xC2, 0x0A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x86, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0x20, 0xF5, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x03, 0x6B, 0x20, 0xF5, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x64, 0x6B, 0x20, 0xF5, 0x62, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, +0x20, 0xF5, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0x20, 0xF5, +0x65, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x53, 0xC4, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, +0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x43, 0xEB, 0x58, 0x67, 0x80, 0xF0, 0x08, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, +0x30, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x4B, 0xE3, 0x42, 0x33, 0x6A, 0x33, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, +0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, +0x43, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x20, 0xF5, 0x40, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x0E, 0x4A, 0x7D, 0x67, 0x53, 0xC3, +0x26, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x4B, 0xE3, 0x42, 0x33, 0x6A, 0x33, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, +0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, +0x41, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x4A, 0x9D, 0x67, 0x53, 0xC4, 0x7D, 0x67, +0x53, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0x24, 0x22, 0x5D, 0x67, 0x93, 0xA2, 0x5D, 0x67, 0x73, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, 0x44, 0xA2, 0x61, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xE0, 0xF4, +0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5C, 0xA2, 0x61, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7C, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x42, 0xAA, 0x43, 0xEB, 0x58, 0x67, 0x20, 0xF1, +0x18, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x23, 0x10, +0x5D, 0x67, 0x74, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, +0x64, 0xA2, 0x9D, 0x67, 0x52, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x52, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x44, 0xA2, 0x9D, 0x67, 0x72, 0xA4, 0x63, 0xEA, 0x58, 0x67, +0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x0A, 0x10, 0x7D, 0x67, 0x54, 0xA3, +0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x54, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0xD8, 0x2A, +0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x2B, 0x10, 0x5D, 0x67, +0x74, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, 0x64, 0xA2, +0x9D, 0x67, 0x52, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x52, 0xC3, 0x9D, 0x67, 0x72, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x42, 0xAA, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x44, 0xA2, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, 0x05, 0x22, +0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x50, 0xC4, 0x0A, 0x10, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x54, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x71, 0xA4, 0xE0, 0xF4, 0x61, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x70, 0xA4, 0xE0, 0xF4, 0x62, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x0A, 0x5A, 0x58, 0x67, 0x18, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x68, 0x42, 0xFE, 0x4B, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x79, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x78, 0xC2, 0x17, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x79, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x0A, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x62, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x19, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, +0x40, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x18, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x20, 0xF5, 0x41, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0x0A, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0x62, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x03, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x00, 0x6C, 0x00, 0x18, +0x36, 0x12, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x20, 0xF5, 0x48, 0xA2, 0x63, 0xEA, 0x58, 0x67, 0x64, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xE0, 0xF4, 0x40, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xE0, 0xF4, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x45, 0xA2, +0x63, 0xEA, 0x58, 0x67, 0x46, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x58, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x8D, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x62, 0x67, 0x43, 0x67, +0x44, 0x32, 0x6D, 0xE2, 0xFF, 0x6A, 0x6C, 0xEA, 0x4D, 0xE4, 0xFF, 0x6A, 0x6C, 0xEA, 0x6E, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x04, 0x6F, 0x00, 0x18, +0x54, 0x10, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, +0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xE0, 0xF4, +0x64, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, +0x2D, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0xC0, 0xF4, 0x7C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xE0, 0xF4, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x78, 0xC2, +0x7D, 0x67, 0x48, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x2D, 0x6B, 0xE0, 0xF4, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0xE0, 0xF4, 0x62, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, +0x01, 0x6B, 0x6E, 0xEA, 0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x0B, 0x22, 0x0C, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x09, 0x0E, +0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0x7D, 0x0B, 0x0B, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x2A, 0x04, 0x6C, 0x01, 0x6D, +0x00, 0x18, 0x09, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, +0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x10, 0x6B, +0x6C, 0xEA, 0x04, 0x22, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x26, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, +0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, +0x6C, 0xEA, 0x43, 0x2A, 0x00, 0x18, 0xC6, 0x0E, 0x40, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x49, 0xA2, 0xEF, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x48, 0xA2, 0x63, 0xEA, 0x58, 0x67, +0x12, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0xC0, 0xF4, 0x65, 0xC2, 0x02, 0x10, 0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x00, 0xD2, 0x0E, 0x10, 0x00, 0x92, +0x02, 0x93, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x08, 0x2A, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x20, 0x5A, 0x58, 0x67, +0xEE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x00, 0x92, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, +0x0A, 0xD4, 0x0B, 0xD5, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x06, 0x93, +0x0B, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x05, 0xD2, 0x05, 0x92, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, +0x0C, 0xD6, 0x0B, 0x92, 0x01, 0x4A, 0x21, 0x22, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, +0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, +0x05, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, 0x05, 0x92, 0x0C, 0x94, 0xA4, 0x67, +0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x04, 0xD2, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, +0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x03, 0x92, 0x01, 0x4A, 0x1A, 0x22, 0x02, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x03, 0x92, +0x4F, 0xEB, 0x01, 0x92, 0x4C, 0xEB, 0x04, 0x94, 0x03, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x00, 0xD2, +0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, +0x08, 0x10, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, +0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x1C, 0x65, 0x85, 0x67, +0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xCC, 0xCD, 0xBD, 0x67, 0x9C, 0xC5, 0xDD, 0x67, +0x20, 0xF0, 0x60, 0xC6, 0x7D, 0x67, 0x52, 0xCB, 0x0A, 0x92, 0x00, 0x6B, 0x60, 0xCA, 0x0B, 0x10, +0x01, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x0A, 0x92, 0x40, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, +0x4C, 0xEB, 0x0A, 0x92, 0x60, 0xCA, 0x9D, 0x67, 0x6C, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6D, 0xAE, 0xEA, 0x06, 0x22, 0xDD, 0x67, 0x6C, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x6C, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x44, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x10, 0x9D, 0x67, 0x6C, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, +0x7C, 0xA5, 0x4C, 0xEB, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x6E, 0xEA, 0x07, 0x22, 0x0A, 0x92, +0x40, 0xAA, 0x9D, 0x67, 0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0xC2, 0x2A, 0x0A, 0x92, 0x40, 0xAA, +0x9D, 0x67, 0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, +0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, +0x4C, 0xA4, 0x40, 0x32, 0x40, 0x32, 0x6D, 0xEA, 0x00, 0xD2, 0xBD, 0x67, 0x48, 0xA5, 0x08, 0x2A, +0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x07, 0x10, +0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x4C, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0x00, 0xF6, 0x50, 0x9A, 0x00, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, +0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x00, 0xF6, 0x74, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, +0xFB, 0x63, 0x09, 0x62, 0x0B, 0xD5, 0x0C, 0xD6, 0x0D, 0xD7, 0x0E, 0x93, 0x0F, 0x92, 0xBD, 0x67, +0x20, 0xF0, 0x88, 0xC5, 0x9D, 0x67, 0x78, 0xC4, 0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0x05, 0xD2, +0x00, 0x6A, 0x04, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xCA, 0x13, +0x02, 0x2A, 0x00, 0x6A, 0xCD, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x06, 0x5A, 0x78, 0x67, +0x20, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0x9A, +0x00, 0xEA, 0x02, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x16, 0x10, 0x02, 0xF2, 0x10, 0x6A, 0x05, 0xD2, +0x12, 0x10, 0x22, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x0E, 0x10, 0x22, 0xF2, 0x10, 0x6A, 0x05, 0xD2, +0x0A, 0x10, 0x42, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x06, 0x10, 0x42, 0xF2, 0x10, 0x6A, 0x05, 0xD2, +0x02, 0x10, 0x00, 0x6A, 0xA5, 0x10, 0x0D, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x54, 0x9A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x58, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x7D, 0x67, +0x5C, 0xA3, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x5C, 0x9A, 0x6D, 0xEA, +0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, +0x04, 0xD2, 0x9D, 0x67, 0x58, 0xA4, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, +0x44, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, +0x48, 0x9A, 0x6C, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6D, 0xAE, 0xEA, 0x05, 0x22, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, +0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF6, 0x54, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF6, +0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0E, 0x2A, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x58, 0x9A, 0x49, 0xE3, +0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, +0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, +0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x05, 0x92, +0x67, 0x42, 0x01, 0x4B, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x05, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x60, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x05, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x6A, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xC3, 0xE0, 0xF3, 0x08, 0x6A, 0x04, 0xD2, 0x17, 0x10, 0x01, 0x6C, 0x00, 0x18, +0x8D, 0x14, 0x04, 0x92, 0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x60, 0xF6, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x60, 0xF6, 0x68, 0x9B, 0x80, 0x9B, 0x08, 0xF0, +0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, +0x4C, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x01, 0x52, 0x58, 0x67, +0xD5, 0x22, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, +0x20, 0x6A, 0x60, 0xF6, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, +0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, +0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x60, 0xF6, 0x5C, 0x9A, 0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0xC9, 0xF7, 0x05, 0x4B, +0x6D, 0xE4, 0x60, 0xDA, 0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x77, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x77, 0x9A, 0x03, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x77, 0xDA, 0x00, 0x18, 0x79, 0x17, 0x00, 0x18, 0xD4, 0x09, 0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x05, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0x22, 0x15, 0x00, 0x18, 0xD4, 0x09, +0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, +0x7F, 0x6B, 0x6C, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x64, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x6E, 0xEA, +0x02, 0x22, 0x00, 0x18, 0xC6, 0x0E, 0x00, 0x18, 0xBE, 0x0E, 0x00, 0x18, 0xD4, 0x09, 0x00, 0x18, +0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, +0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x11, 0x6A, 0x4B, 0xEA, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0xE4, 0x3A, +0x00, 0x18, 0xD4, 0x09, 0x7D, 0x17, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x92, 0x06, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x64, 0x6B, 0xE2, 0xF3, 0x7C, 0xDA, 0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x93, +0xE2, 0xF3, 0x7C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5C, 0x9A, 0x28, 0x6B, 0x4E, 0xEB, +0x42, 0x23, 0x29, 0x5A, 0x78, 0x67, 0x0A, 0x23, 0x14, 0x6B, 0x4E, 0xEB, 0x24, 0x23, 0x19, 0x6B, +0x4E, 0xEB, 0x2D, 0x23, 0x0A, 0x6B, 0x6E, 0xEA, 0x12, 0x22, 0x72, 0x10, 0x50, 0x6B, 0x4E, 0xEB, +0x4A, 0x23, 0x51, 0x5A, 0x78, 0x67, 0x04, 0x23, 0x32, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0x68, 0x10, +0x64, 0x6B, 0x4E, 0xEB, 0x4C, 0x23, 0xC8, 0x6B, 0x6E, 0xEA, 0x55, 0x22, 0x61, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF0, 0x00, 0x6B, +0x02, 0xF4, 0x64, 0xDA, 0x55, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0x6B, 0x02, 0xF4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x49, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x09, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x04, 0xF4, 0x00, 0x6B, +0x02, 0xF4, 0x64, 0xDA, 0x3D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x05, 0x6B, 0x02, 0xF4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x31, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x11, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x08, 0xF4, 0x00, 0x6B, +0x02, 0xF4, 0x64, 0xDA, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x0A, 0x6B, 0x02, 0xF4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x05, 0xF0, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x19, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x22, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0xF0, 0x00, 0x6B, +0x02, 0xF4, 0x64, 0xDA, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x43, 0x6B, 0x02, 0xF4, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF6, 0x7C, 0x9B, 0x02, 0xF4, 0x64, 0xDA, +0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5C, 0x9A, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x44, 0x9A, 0x02, 0x93, 0x58, 0xEB, +0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x40, 0x9A, +0x02, 0x93, 0x58, 0xEB, 0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, +0xFB, 0x2A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, +0x48, 0xCB, 0x1C, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0E, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x68, 0x9B, +0x80, 0x9B, 0x80, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x16, 0x10, 0x7D, 0x67, 0x48, 0xAB, +0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF4, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0xD7, 0x2A, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, +0x10, 0x10, 0x5D, 0x67, 0x64, 0xA2, 0x03, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x50, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x44, 0xA3, 0x04, 0x4A, 0x7D, 0x67, +0x44, 0xC3, 0x7D, 0x67, 0x44, 0xA3, 0x18, 0x5A, 0x58, 0x67, 0xEB, 0x2A, 0x5D, 0x67, 0x64, 0xAA, +0xE7, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x54, 0x9A, 0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, +0x6D, 0xEA, 0x00, 0xD2, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, +0x00, 0x93, 0x60, 0xDA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, +0x03, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x7C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, +0x6C, 0xEC, 0x10, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, +0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x4A, 0xA2, +0x07, 0x93, 0x41, 0xC3, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x6A, 0xC2, 0x06, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, +0x07, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x06, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x82, 0x67, 0x07, 0x92, 0x62, 0x42, 0x07, 0x92, +0x47, 0xAA, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x00, 0x18, 0x96, 0x14, 0x02, 0x2A, 0x00, 0x6A, 0x58, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, +0x48, 0x9A, 0x6C, 0xEA, 0x07, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF4, 0x4C, 0x9A, 0x06, 0x94, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x70, 0x9B, 0x80, 0xA3, +0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x10, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x06, 0x93, 0x62, 0x33, 0x62, 0x33, +0x00, 0xF6, 0x60, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, +0x83, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0A, 0x92, 0x47, 0xAA, 0x02, 0x4A, 0x7D, 0x67, +0x48, 0xCB, 0x5D, 0x67, 0x68, 0xAA, 0x06, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB0, 0x14, +0x06, 0x92, 0x18, 0x4A, 0x05, 0xD2, 0x05, 0x93, 0x0A, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0xD8, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x01, 0x6A, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, +0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x4D, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x50, 0x33, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF0, 0x06, 0x4A, 0x49, 0xE3, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x14, 0x7D, 0x67, 0x50, 0xC3, +0x7D, 0x67, 0x50, 0xA3, 0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, +0x4E, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x0C, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0xF4, 0x4E, 0xA2, 0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6E, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, +0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x09, 0x6B, 0x6E, 0xEA, 0x10, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x68, 0x9B, 0x80, 0x9B, +0x00, 0xF2, 0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x70, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x4D, 0xE3, 0x06, 0x92, 0x60, 0xF3, 0x8E, 0x43, 0x62, 0x67, 0x10, 0x6A, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, +0x4F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0xF4, 0x6F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, +0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0x00, 0xF4, 0x6F, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x74, 0x9B, +0x80, 0x9B, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x78, 0x9B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0xF4, +0x1F, 0x6B, 0x04, 0xF7, 0x10, 0x6A, 0x00, 0xF0, 0x1A, 0x04, 0x04, 0xD4, 0x83, 0x67, 0x20, 0x6D, +0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x06, 0x13, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x00, 0xD2, +0x00, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x71, 0xC2, +0x00, 0x92, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x72, 0xC2, +0x00, 0x92, 0x62, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x73, 0xC2, +0x00, 0x92, 0x63, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x74, 0xC2, +0x00, 0x92, 0x64, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x75, 0xC2, +0x00, 0x92, 0x65, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x76, 0xC2, +0x00, 0x92, 0x66, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x77, 0xC2, +0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x05, 0xD2, 0x05, 0x92, +0x41, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x05, 0x22, +0x05, 0x92, 0x42, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0x04, 0x10, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, +0x50, 0xC3, 0x9D, 0x67, 0x51, 0xA4, 0x7D, 0x67, 0x52, 0xC3, 0x22, 0x10, 0x9D, 0x67, 0x72, 0xA4, +0x05, 0x92, 0x80, 0xA2, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0x8F, 0x0A, 0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0x06, 0x2A, +0x9D, 0x67, 0x52, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x35, 0x0A, 0x05, 0x10, 0x7D, 0x67, 0x52, 0xA3, +0x82, 0x67, 0x00, 0x18, 0xD6, 0x09, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x52, 0xC3, +0x9D, 0x67, 0x72, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0xD7, 0x22, 0x7D, 0x67, +0x51, 0xA3, 0x29, 0x2A, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x25, 0x2A, 0x00, 0x18, 0x39, 0x21, +0x00, 0x18, 0x83, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, +0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, +0x08, 0xD4, 0x08, 0x92, 0x04, 0xD2, 0x04, 0x92, 0x30, 0xF0, 0x20, 0x6B, 0xC3, 0xF1, 0x18, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x05, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x04, 0x92, 0x82, 0x67, 0x00, 0x18, +0xFF, 0x0C, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, +0x07, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, +0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x92, 0x80, 0xA2, 0x01, 0x6A, +0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x8C, 0xEB, 0xA6, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x92, 0x40, 0xA2, 0x5A, 0x32, 0x82, 0x67, +0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, +0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xA6, 0xA2, +0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, +0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x40, 0xA2, +0x5E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, 0x84, 0x34, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x7C, 0x33, 0xA6, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, +0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, +0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x67, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, +0x5C, 0x9A, 0x60, 0x9A, 0xE0, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x40, 0xF5, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x40, 0x9A, 0x40, 0x9A, +0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x2A, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x66, 0xA2, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x9D, 0x67, +0x50, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0x9D, 0x67, 0x58, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x7D, 0x67, 0x58, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, +0x50, 0xA4, 0x08, 0x5A, 0x58, 0x67, 0xD1, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x00, 0xF6, 0x40, 0x33, +0x9D, 0x67, 0x58, 0xA4, 0x40, 0x32, 0x40, 0x32, 0x6D, 0xEA, 0x05, 0x93, 0x6D, 0xEA, 0x05, 0xD2, +0x05, 0x92, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x99, 0x07, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, +0x40, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x60, 0x5A, 0x58, 0x67, 0x08, 0x22, +0x5D, 0x67, 0x78, 0xA2, 0x07, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD6, 0x27, 0x5D, 0x10, +0x7D, 0x67, 0x58, 0xA3, 0x20, 0x6B, 0x4E, 0xEB, 0x35, 0x23, 0x21, 0x52, 0x78, 0x67, 0x0F, 0x23, +0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x1C, 0x22, 0x39, 0x10, +0x0B, 0x6B, 0x4E, 0xEB, 0x22, 0x23, 0x14, 0x6B, 0x6E, 0xEA, 0x40, 0x22, 0x32, 0x10, 0x25, 0x6B, +0x4E, 0xEB, 0x3E, 0x23, 0x26, 0x52, 0x78, 0x67, 0x07, 0x23, 0x21, 0x6B, 0x4E, 0xEB, 0x3A, 0x23, +0x23, 0x6B, 0x6E, 0xEA, 0x39, 0x22, 0x25, 0x10, 0x87, 0x6B, 0x4E, 0xEB, 0x18, 0x23, 0xC5, 0x6B, +0x6E, 0xEA, 0x1A, 0x22, 0x1E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x15, 0x2D, 0x10, +0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xC1, 0x15, 0x28, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, +0xBA, 0x04, 0x23, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xFB, 0x15, 0x1E, 0x10, 0x07, 0x92, +0x82, 0x67, 0x00, 0x18, 0x04, 0x05, 0x19, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x06, 0x16, +0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, +0x64, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, +0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x80, 0xF1, 0x03, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x02, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x76, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x60, 0xF3, 0x4D, 0xA2, 0x07, 0x6E, 0xCE, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x60, 0xF3, 0x4C, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, +0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xFF, 0x6B, 0x01, 0x4B, +0x8D, 0xEB, 0x60, 0xDA, 0x4C, 0x11, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x8B, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x20, 0xF1, 0x0C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0xBE, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0xA2, 0x67, 0xDD, 0x67, 0x80, 0xA6, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, +0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, +0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, +0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, +0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x4C, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xB4, 0x35, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE5, 0x89, 0xE2, +0x60, 0xF2, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, +0xA2, 0x67, 0x7D, 0x67, 0x40, 0xA3, 0x84, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, +0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xB4, 0x35, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE5, 0x89, 0xE2, 0x60, 0xF2, 0x6C, 0xC2, 0x7D, 0x67, +0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0xDD, 0x67, 0x40, 0xA6, 0x04, 0x5A, 0x58, 0x67, +0x3F, 0xF7, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x41, 0x86, 0x6C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x8B, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, +0x01, 0x6C, 0x84, 0xEB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x03, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x4B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0x02, 0x6B, +0x8D, 0xEB, 0x60, 0xDA, 0x04, 0x10, 0xDD, 0x67, 0x41, 0xA6, 0x9F, 0xF6, 0x06, 0x2A, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, +0x6E, 0xEA, 0x5F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x74, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xF2, +0x4C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, +0x54, 0x32, 0x60, 0xF2, 0x89, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, +0x04, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x70, 0x16, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, +0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x02, 0x6A, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x08, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0xAC, 0x16, +0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, +0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, +0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, +0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, +0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, +0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x92, 0x54, 0x33, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, +0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, +0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, +0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x94, 0x64, 0x67, 0x68, 0x32, 0x62, 0x67, 0x74, 0x32, 0x6B, 0xE2, +0x89, 0xE2, 0x40, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, +0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, +0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, +0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x00, 0x92, +0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x40, 0x9A, 0x40, 0x9A, +0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6C, 0x9A, 0x00, 0x92, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6D, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, +0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0x9B, 0x60, 0xDA, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, 0x40, 0x9A, +0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x48, 0x9A, 0x40, 0x9A, 0x03, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, +0x50, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, 0x40, 0x9A, +0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x78, 0x9A, 0x04, 0x92, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x61, 0x9A, 0x03, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x62, 0x9A, 0x02, 0x92, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x67, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x63, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x68, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x64, 0x9A, 0x00, 0x92, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x69, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x66, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x02, 0xF5, 0x18, 0x4B, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x69, 0x9B, 0x60, 0xDA, 0x03, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x6E, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x71, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6F, 0x9A, 0x00, 0x92, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, +0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x71, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x72, 0x9B, +0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xAC, 0x16, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE7, 0x13, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xEC, 0x13, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x66, 0xA2, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x5E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF5, 0x60, 0x9A, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF2, 0x14, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x47, 0xA2, 0x49, 0xE3, +0x5C, 0x32, 0x21, 0x4A, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, +0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x46, 0xA2, 0x5A, 0x32, +0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x5C, 0x32, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, +0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x46, 0xA2, 0x5E, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x58, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x44, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x7D, 0x67, 0x44, 0xC3, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x6C, 0x1F, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x80, 0xF0, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x5D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x44, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x48, 0x9A, +0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, +0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF5, 0x50, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, +0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x74, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, +0x40, 0x6B, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x59, 0xA2, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0xA3, 0x67, +0xC2, 0x67, 0x05, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x86, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x11, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, +0x08, 0x22, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, +0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x4D, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x00, 0x18, 0x39, 0x0F, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, +0x73, 0x12, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x1B, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, +0x6C, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x7D, 0x0B, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, +0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x5B, 0x1F, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x00, 0x18, 0xC3, 0x1D, 0x7D, 0x67, 0x50, 0xC3, 0x5D, 0x67, 0x70, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x04, 0x10, +0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x5D, 0x67, 0x70, 0xA2, 0x40, 0x6A, 0x6C, 0xEA, +0x1C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x07, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF5, 0x58, 0x9A, 0x80, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x02, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, +0x01, 0x6B, 0x6C, 0xEA, 0x30, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x86, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, +0x66, 0xC2, 0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, +0x37, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x5C, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x0B, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x08, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, +0x66, 0xC2, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, +0x09, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC6, 0x0E, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x48, 0xA2, 0x02, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, 0xD4, 0x0F, 0x01, 0x10, 0x00, 0x65, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x19, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF6, 0x44, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x20, 0xF5, 0x49, 0xA2, 0xFF, 0x6B, 0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, +0xD2, 0x17, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x3A, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x31, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF6, 0x44, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xC0, 0xF4, 0x85, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, 0x00, 0x18, +0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x10, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, +0x20, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x67, 0x03, 0x02, 0x10, 0x00, 0x18, 0xCE, 0x0E, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x23, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, +0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, +0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x12, 0x05, 0x97, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, +0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x85, 0x67, 0x66, 0x67, +0x47, 0x67, 0xBD, 0x67, 0x8C, 0xC5, 0x9D, 0x67, 0x70, 0xC4, 0xBD, 0x67, 0x54, 0xC5, 0x02, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, +0x9D, 0x67, 0x50, 0xA4, 0x08, 0x6B, 0x4B, 0xE3, 0xFF, 0x6B, 0x67, 0xEA, 0xBD, 0x67, 0x4C, 0xA5, +0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, +0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0x85, 0x6C, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x74, 0xA4, 0xBD, 0x67, +0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x4C, 0xEB, +0x9D, 0x67, 0x4C, 0xA4, 0xA3, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, +0x63, 0x33, 0x9D, 0x67, 0x41, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0xBD, 0x67, 0x40, 0xC5, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, +0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, +0x46, 0x67, 0xBD, 0x67, 0x84, 0xCD, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, +0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, +0x41, 0xC3, 0x9D, 0x67, 0x61, 0xA4, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x87, 0xEA, 0x44, 0x67, +0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, +0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, +0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, +0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, +0x7D, 0x67, 0x54, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x9D, 0x67, 0x74, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x02, 0x2A, +0x05, 0x92, 0x0E, 0x10, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, +0x0B, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, +0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, +0x0C, 0xD6, 0x7D, 0x67, 0x54, 0xCB, 0x5D, 0x67, 0x74, 0xAA, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x06, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x5D, 0x67, +0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, +0x19, 0x10, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, +0x06, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0C, 0x94, 0x84, 0xEA, 0x0B, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, +0x05, 0xD2, 0x5D, 0x67, 0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, +0x05, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, +0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x13, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, +0x4E, 0xEB, 0x16, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x1C, 0x22, 0x24, 0x10, 0x01, 0x92, 0x48, 0x33, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x1C, 0x10, 0x01, 0x92, +0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x13, 0x10, +0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, +0x0A, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, +0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0xF5, 0x0C, 0x4A, 0x05, 0xD2, +0x05, 0x92, 0x67, 0x42, 0x0D, 0x4B, 0x0A, 0x92, 0x4C, 0x32, 0x4C, 0x34, 0x89, 0xE2, 0x49, 0xE3, +0x04, 0xD2, 0x0B, 0x92, 0x00, 0xF5, 0x40, 0x33, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, +0x50, 0x9A, 0x8C, 0xEA, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, +0x06, 0xD2, 0x04, 0x92, 0x64, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x01, 0x6B, +0x6B, 0xEB, 0x06, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x9D, 0x67, +0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x0C, 0x92, 0x01, 0x4A, +0x0A, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xD7, 0x1A, 0x18, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x9D, 0x67, 0x56, 0xAC, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD7, 0x1A, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, +0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, +0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, +0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x0D, 0xD7, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, +0x56, 0xCB, 0x0C, 0x92, 0x01, 0x4A, 0x0B, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, +0x76, 0xAA, 0x0D, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xF2, 0x1A, 0x24, 0x10, 0x9D, 0x67, +0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD7, 0x1A, +0x06, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0C, 0x92, 0x4F, 0xEB, +0x06, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0D, 0x94, 0x84, 0xEA, 0x0C, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, +0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x05, 0x92, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xF2, 0x1A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x30, 0xF0, +0x20, 0x6A, 0x82, 0xF5, 0x0C, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x81, 0xF4, 0x10, 0x6B, 0x69, 0xDA, +0x00, 0x92, 0x81, 0xF6, 0x10, 0x6B, 0x7B, 0xDA, 0x00, 0x92, 0x83, 0xF0, 0x10, 0x6B, 0xA0, 0xF0, +0x74, 0xDA, 0x00, 0x92, 0x83, 0xF2, 0x10, 0x6B, 0xE0, 0xF0, 0x7C, 0xDA, 0x01, 0x63, 0x20, 0xE8, +0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, +0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x58, 0x9A, 0x60, 0xAA, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x48, 0xCC, +0x5D, 0x67, 0x68, 0xAA, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x49, 0xE3, 0x5C, 0x32, 0x06, 0xD2, +0x00, 0x6A, 0x7D, 0x67, 0x4E, 0xCB, 0x31, 0x10, 0x9D, 0x67, 0x4E, 0xAC, 0x48, 0x32, 0x62, 0x67, +0x06, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, +0x05, 0xD2, 0x7D, 0x67, 0x4E, 0xAB, 0x13, 0x2A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, +0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x09, 0x10, 0x83, 0xF1, +0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0x9D, 0x67, 0x4E, 0xAC, 0x01, 0x4A, 0x7D, 0x67, 0x4E, 0xCB, 0x9D, 0x67, 0x6E, 0xAC, 0x9D, 0x67, +0x56, 0xAC, 0x43, 0xEB, 0x58, 0x67, 0xC8, 0x2A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFA, 0x63, 0x0B, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, +0x20, 0xF0, 0xD0, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x94, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x78, 0xC6, +0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, +0x20, 0xF0, 0x50, 0xA5, 0x24, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, +0x31, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, +0x60, 0x9A, 0x80, 0xF4, 0x14, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x51, 0x10, +0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x32, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, +0x50, 0xA3, 0x41, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x60, 0x9A, 0x40, 0xF4, 0x13, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0x38, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x50, 0xA3, 0x75, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x40, 0xF4, 0x12, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0x1F, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x76, 0x5A, 0x58, 0x67, 0x0D, 0x2A, +0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x00, 0xF4, 0x12, 0x6A, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x0C, 0x10, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x61, 0xF1, 0x0A, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x56, 0x10, 0x9D, 0x67, 0x20, 0xF0, +0x50, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x0A, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x41, 0x5A, +0x58, 0x67, 0x04, 0x22, 0xFF, 0x6A, 0x02, 0x4A, 0x07, 0xD2, 0x1C, 0x10, 0x7D, 0x67, 0x20, 0xF0, +0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0A, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x8D, 0x5A, +0x58, 0x67, 0x04, 0x22, 0x00, 0xF3, 0x01, 0x6A, 0x07, 0xD2, 0x0C, 0x10, 0x7D, 0x67, 0x20, 0xF0, +0x50, 0xA3, 0x8D, 0x5A, 0x58, 0x67, 0x04, 0x2A, 0x00, 0xF5, 0x01, 0x6A, 0x07, 0xD2, 0x02, 0x10, +0x00, 0x6A, 0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x44, 0x9A, 0x04, 0xD2, 0x04, 0x92, +0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0x05, 0x92, +0x07, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x48, 0x9A, 0x04, 0xD2, 0xDD, 0x67, 0x20, 0xF0, 0x80, 0xA6, 0x04, 0x93, 0x06, 0x92, +0x18, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x27, 0x1B, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, +0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x04, 0x5A, +0x58, 0x67, 0xA4, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x0E, 0x2A, +0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x41, 0x5A, 0x58, 0x67, 0x08, 0x22, 0x41, 0xF1, 0x18, 0x6A, +0x82, 0x67, 0x1F, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0x10, 0x7D, 0x67, 0x20, 0xF0, +0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x91, 0x5A, +0x58, 0x67, 0x08, 0x22, 0x41, 0xF1, 0x18, 0x6A, 0x82, 0x67, 0x1F, 0x6D, 0x02, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0x0D, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x95, 0x5A, 0x58, 0x67, 0x07, 0x2A, +0x41, 0xF1, 0x18, 0x6A, 0x82, 0x67, 0x1F, 0x6D, 0x03, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x0B, 0x97, +0x06, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x02, 0x22, +0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x78, 0xC4, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0x0F, 0x5A, 0x58, 0x67, +0x0F, 0x22, 0x00, 0x18, 0x11, 0x1C, 0x1D, 0x22, 0x00, 0x18, 0x11, 0x1C, 0x01, 0x6B, 0x6E, 0xEA, +0x18, 0x2A, 0x9D, 0x67, 0x5C, 0xA4, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x36, 0x1D, 0x11, 0x10, +0x7D, 0x67, 0x58, 0xA3, 0x0F, 0x5A, 0x58, 0x67, 0x0C, 0x2A, 0x00, 0x18, 0x11, 0x1C, 0x07, 0x2A, +0x7D, 0x67, 0x5C, 0xA3, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x36, 0x1D, 0x02, 0x10, 0x00, 0x18, +0x11, 0x1C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x78, 0xC4, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0xC0, 0xF0, 0x1B, 0x2A, +0x7D, 0x67, 0x5C, 0xA3, 0x06, 0x5A, 0x78, 0x67, 0xE0, 0xF1, 0x11, 0x23, 0x48, 0x33, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0xA1, 0xF4, 0x10, 0x6C, +0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xBB, 0x11, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x58, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, +0x58, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, +0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0x01, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x03, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x7D, 0x11, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, +0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, +0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x40, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF6, 0x40, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x00, 0x65, +0x47, 0x11, 0xA1, 0xF4, 0x10, 0x6A, 0x82, 0x67, 0xFF, 0x6D, 0x77, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, +0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x1D, 0x11, 0x7D, 0x67, 0x5C, 0xA3, 0x06, 0x5A, 0x78, 0x67, 0x00, 0xF1, +0x17, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0x9A, +0x00, 0xEA, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, +0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, +0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, +0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xDA, 0x10, 0xA1, 0xF4, 0x10, 0x6C, +0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xAB, 0x10, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, +0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, +0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xBA, 0x1A, 0x76, 0x10, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x4C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, +0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x4C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x03, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x38, 0x10, +0xA1, 0xF4, 0x10, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF6, 0x54, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, +0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x7C, 0x9A, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0x10, 0x00, 0x65, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x20, 0xF0, 0x60, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x43, 0x2A, 0x01, 0xF0, 0x08, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF0, 0x10, 0x6A, 0x82, 0x67, +0x0E, 0x6D, 0x08, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF0, 0x14, 0x6A, 0x82, 0x67, 0x03, 0x6D, +0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x44, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x32, 0x1C, 0x01, 0xF0, 0x08, 0x6C, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF6, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, +0x48, 0xA3, 0x56, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, +0x78, 0x67, 0x02, 0x23, 0x2D, 0x22, 0x37, 0x10, 0x04, 0x6B, 0x4E, 0xEB, 0x10, 0x23, 0x06, 0x6B, +0x6E, 0xEA, 0x31, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x11, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, +0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x24, 0x10, 0x7D, 0x67, +0x40, 0xA3, 0x07, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x17, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x4F, 0xE3, +0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x0B, 0x10, +0x7D, 0x67, 0x40, 0xA3, 0x08, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x42, 0x83, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x9F, 0xF7, 0x1D, 0x52, 0x58, 0x67, +0x05, 0x2A, 0x7D, 0x67, 0x40, 0x83, 0x14, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x0D, 0x10, +0x7D, 0x67, 0x40, 0x83, 0x00, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x64, 0x6A, 0x06, 0x10, 0x7D, 0x67, +0x40, 0xA3, 0x67, 0x42, 0x5D, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, +0x20, 0x6B, 0x6E, 0xF6, 0x0D, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x40, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x4C, 0x9A, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, 0x01, 0x6A, 0x1D, 0x10, 0x7D, 0x67, 0x48, 0xAB, +0xE0, 0xF3, 0x09, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x50, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x20, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, +0x00, 0x6A, 0x09, 0x10, 0x32, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, +0x7D, 0x67, 0x48, 0xCB, 0xC1, 0x17, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, +0x7D, 0x67, 0x42, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, +0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x0E, 0xF7, 0x0D, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF6, 0x54, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, +0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x42, 0xA3, 0x1A, 0x10, +0x7D, 0x67, 0x40, 0xAB, 0x64, 0x5A, 0x58, 0x67, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, +0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x40, 0x6B, 0x8D, 0xEB, +0x60, 0xDA, 0x7D, 0x67, 0x42, 0xA3, 0x06, 0x10, 0x7D, 0x67, 0x40, 0xAB, 0x01, 0x4A, 0x7D, 0x67, +0x40, 0xCB, 0xD4, 0x17, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, +0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x8E, 0xF7, 0x09, 0x4B, 0x60, 0xDA, 0x2D, 0x10, 0x7D, 0x67, +0x48, 0xAB, 0x82, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, +0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x10, 0x6B, 0x8D, 0xEB, +0x60, 0xDA, 0x2B, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, +0x00, 0x18, 0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF6, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x10, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF6, 0x5C, 0x9A, 0x80, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x8C, 0xEA, 0x01, 0x22, +0x01, 0x6A, 0x6E, 0xEA, 0xC4, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, +0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x8E, 0xF7, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, +0x4F, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xF3, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x4F, 0xF0, 0x05, 0x4B, +0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0xC0, 0xF4, +0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, +0x18, 0x4B, 0xC0, 0xF4, 0x70, 0xAB, 0x60, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x48, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, +0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x00, 0x18, 0xE2, 0x1D, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x60, 0x9B, 0x80, 0xA3, +0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x6C, +0x00, 0x18, 0x8D, 0x14, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0x11, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x68, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF6, 0x48, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, +0x00, 0x6C, 0x00, 0x18, 0xE2, 0x1D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, +0x85, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xF0, 0x72, 0xC2, 0x20, 0xE8, 0xFE, 0x63, 0x1C, 0x65, +0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xC8, 0xCD, 0xBD, 0x67, 0x94, 0xC5, +0xDD, 0x67, 0x78, 0xC6, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x50, 0x9A, +0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, +0x45, 0xCC, 0xBD, 0x67, 0x68, 0xAD, 0xDD, 0x67, 0x45, 0xAE, 0x49, 0xE3, 0x7D, 0x67, 0x48, 0xCB, +0x9D, 0x67, 0x48, 0xAC, 0x03, 0xD2, 0x03, 0x92, 0x5C, 0x32, 0x03, 0xD2, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF6, 0x54, 0x9A, 0xBD, 0x67, 0x68, 0xAD, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0xAA, 0xDD, 0x67, 0x44, 0xCE, 0x03, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x7D, 0x67, 0x54, 0xA3, +0x08, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x10, 0xF0, 0x00, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0xBD, 0x67, +0x44, 0xCD, 0xDD, 0x67, 0x64, 0xAE, 0x47, 0xF7, 0x00, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, +0x44, 0xCB, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x9D, 0x67, +0x64, 0xAC, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x40, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xC5, 0xDD, 0x67, +0x40, 0xA6, 0x07, 0x22, 0x01, 0x93, 0x03, 0xF7, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, +0x0C, 0x10, 0x01, 0x93, 0x1F, 0xF7, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, +0x5C, 0xA3, 0x40, 0x32, 0x01, 0x93, 0x6D, 0xEA, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, 0x01, 0xD2, 0x9D, 0x67, 0x58, 0xA4, 0x80, 0xF4, 0x40, 0x33, +0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x48, 0x9A, 0x6D, 0xEA, 0x01, 0xD2, +0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x01, 0x93, 0x60, 0xDA, +0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x03, 0x94, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, +0xF7, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x03, 0x92, 0x02, 0x63, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xE1, 0xF7, 0x1F, 0x6B, 0xA0, 0xF4, 0x74, 0xCA, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x76, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xA0, 0xF4, 0x99, 0xA2, 0x04, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, 0x8D, 0xEB, +0xA0, 0xF4, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, +0x7A, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, +0x20, 0xE8, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x50, 0x9A, +0x49, 0xE3, 0xA2, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x78, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x54, 0x9A, 0x59, 0xEB, 0x10, 0xEC, 0x8B, 0xE3, 0x46, 0x32, +0x49, 0xE4, 0x56, 0x34, 0x44, 0x67, 0x58, 0x32, 0x8B, 0xE2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, +0x48, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x40, 0xC5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xA0, 0xF4, 0x58, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA0, 0xF4, 0x78, 0xC2, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x00, 0x6A, 0x06, 0xD2, +0x00, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x58, 0x9A, 0x60, 0xAA, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x49, 0xCC, +0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x5C, 0x9A, 0x40, 0xA2, +0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF7, 0x40, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x40, 0x34, 0x80, 0x34, +0x83, 0x34, 0x83, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xEE, 0xF1, 0x1F, 0x6C, 0x8C, 0xEA, +0x10, 0xF0, 0x00, 0x6C, 0x8B, 0xEC, 0x8D, 0xEA, 0x40, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, +0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x40, 0xCB, 0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA0, 0xF4, 0x54, 0xAA, 0xE1, 0xF7, 0x1F, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, 0x8B, 0x10, 0x01, 0x6C, +0x00, 0x18, 0x8D, 0x14, 0x9D, 0x67, 0x4B, 0xAC, 0x01, 0x4A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF7, 0x44, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x02, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x4B, 0xAC, 0xC0, 0xF7, 0x10, 0x5A, +0x58, 0x67, 0xD3, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x74, 0xAA, +0x9D, 0x67, 0x49, 0xAC, 0x4B, 0xE3, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0x82, 0x67, +0x01, 0x6D, 0x18, 0x6E, 0x07, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x06, 0xD2, 0x06, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF7, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x54, 0x6B, +0x6E, 0xEA, 0x04, 0x2A, 0x06, 0x92, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1E, 0x06, 0x93, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x56, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x03, 0x6B, 0x8C, 0xEB, 0xA0, 0xF4, 0xB9, 0xA2, 0x04, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0xA0, 0xF4, 0x79, 0xC2, 0x9D, 0x67, 0x74, 0xA4, 0x6F, 0x6A, +0x6C, 0xEA, 0x82, 0x67, 0x19, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, +0x50, 0x9A, 0x20, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, +0x5A, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA0, 0xF4, 0x7A, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, +0xA0, 0xF4, 0x7C, 0xC2, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x00, 0x18, 0xEA, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x56, 0xAA, +0x0E, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x56, 0xAA, 0xFF, 0x6B, +0x5D, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x06, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF7, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF7, 0x58, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4A, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x5C, 0xA2, 0x43, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA0, 0xF4, 0x79, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, +0x4E, 0xEB, 0x15, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x23, 0x23, 0x32, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, +0x6C, 0xEC, 0x02, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x21, 0x10, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, 0x80, 0xA3, +0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, +0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, 0x7D, 0x67, +0x50, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x02, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x7D, 0x67, +0x51, 0xCB, 0x05, 0x02, 0x82, 0x67, 0x00, 0x18, 0x54, 0x15, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, +0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x08, 0x92, 0x01, 0x4A, +0x40, 0xA2, 0x40, 0x32, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x6D, 0xEA, 0x40, 0x32, +0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0xE1, 0xF7, +0x1F, 0x6B, 0x6E, 0xEA, 0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, +0x68, 0xAC, 0xA0, 0xF4, 0x74, 0xCA, 0x08, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x44, 0x32, 0x48, 0x33, +0x6D, 0xE2, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xA0, 0xF4, 0x76, 0xCA, 0x00, 0x18, 0x5B, 0x1F, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x9D, 0x67, 0x68, 0xAC, 0xA0, 0xF4, 0x74, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x76, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x54, 0x9A, +0x00, 0x6B, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x02, 0xD2, 0x00, 0x6A, 0x01, 0xD2, 0x00, 0x6A, 0x9D, 0x67, +0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x44, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x02, 0x93, +0x80, 0xF1, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, +0x48, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x4C, 0x9A, +0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6C, +0x8E, 0xEA, 0x0B, 0x2A, 0x02, 0x93, 0x80, 0x6A, 0x6D, 0xEA, 0x02, 0xD2, 0x06, 0x10, 0x02, 0x93, +0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x02, 0xD2, 0x00, 0x65, 0x50, 0x6A, 0x7D, 0x67, 0x40, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x44, 0x9A, 0x02, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF7, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x50, 0x9A, +0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x54, 0x9A, 0x9D, 0x67, +0x60, 0xA4, 0x60, 0xC2, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x00, 0x6A, +0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, +0x51, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x9D, 0x67, 0x51, 0xA4, 0x03, 0x6D, 0xAE, 0xEA, +0x04, 0x2A, 0x09, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x03, 0x10, 0x0A, 0x6A, 0x9D, 0x67, 0x52, 0xC4, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x78, 0x9A, 0xBD, 0x67, 0x91, 0x85, 0xFF, 0x6A, 0x8C, 0xEA, +0x0F, 0x6C, 0x8C, 0xEA, 0xBD, 0x67, 0x92, 0xA5, 0x90, 0x34, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, +0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x40, 0xC3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD3, 0x1F, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF7, 0x5C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x70, 0xA5, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x24, 0x5A, +0x58, 0x67, 0x07, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, +0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x5C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, +0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x20, 0xF0, 0x64, 0xA2, 0xBD, 0x67, +0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xFE, 0x1F, 0x7D, 0x67, 0x54, 0xA3, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, +0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x48, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x45, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x41, 0xCB, +0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x54, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x44, 0x67, +0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, +0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x42, 0x32, +0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x1F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x4A, 0x32, 0x00, 0xD2, 0x02, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x4B, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x4E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, +0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, +0x4F, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, +0x42, 0x32, 0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0xE0, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x7D, 0x67, +0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x5E, 0x32, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0xA2, +0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF7, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x48, 0x9A, 0x40, 0xA2, 0x7D, 0x67, +0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x4C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, +0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x51, 0xA4, 0x6E, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x50, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x4E, 0xEB, 0x12, 0x23, +0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0x1E, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x10, 0x23, +0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x22, 0x17, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, +0x83, 0x3B, 0x11, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x4A, 0x20, 0x0B, 0x10, +0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x67, 0x20, 0x05, 0x10, 0x7D, 0x67, 0x50, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x99, 0x20, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, +0x9D, 0x67, 0x71, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0xC0, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF7, 0x48, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x01, 0xD5, 0x46, 0x67, 0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, +0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x08, 0x22, 0x01, 0x92, 0x40, 0xAA, 0xFF, 0xF5, 0x1F, 0x6B, +0x6C, 0xEA, 0x01, 0x93, 0x40, 0xCB, 0x0A, 0x10, 0x01, 0x92, 0x60, 0xAA, 0x00, 0xF2, 0x00, 0x6A, +0x4D, 0xEB, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x01, 0x92, 0x60, 0xCA, 0x7D, 0x67, 0x40, 0xA3, +0x01, 0x6C, 0x8E, 0xEA, 0x06, 0x2A, 0x01, 0x92, 0xCC, 0xF4, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, +0x0F, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x06, 0x2A, 0x01, 0x92, 0xC1, 0xF4, +0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x04, 0x10, 0x01, 0x92, 0x48, 0xF2, 0x00, 0x6B, 0x60, 0xCA, +0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x5C, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x02, 0x6B, +0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x40, 0x9A, +0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x44, 0x9A, 0x09, 0x6B, +0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x48, 0x9A, 0x7A, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, +0xA1, 0xF0, 0x14, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, +0x62, 0x67, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0xA1, 0xF0, 0x14, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, 0x6C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, +0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x81, 0xF4, 0x10, 0x6C, +0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF0, 0x10, 0x6C, +0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF2, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF4, 0x00, 0x6B, +0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, +0x6D, 0xEA, 0x04, 0xD2, 0x01, 0xF4, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF6, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, 0x04, 0xD2, 0x01, 0xF6, +0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0x03, 0xF0, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, +0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, 0x04, 0xD2, 0x03, 0xF0, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, +0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF2, 0x00, 0x6B, 0x01, 0x6A, +0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, +0x04, 0xD2, 0x03, 0xF2, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x00, 0x18, 0x9B, 0x1D, 0x01, 0xF4, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x01, 0xF4, +0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0x01, 0xF6, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, +0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x01, 0xF6, 0x00, 0x6C, 0x01, 0x6B, +0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF0, 0x00, 0x6B, +0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x03, 0xF0, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF2, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x04, 0xD2, 0x03, 0xF2, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF4, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF6, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF0, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF2, 0x10, 0x6B, 0x01, 0x6A, +0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF0, 0x14, 0x6B, +0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x40, 0x6A, +0x6D, 0xEA, 0x04, 0xD2, 0xA1, 0xF0, 0x14, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x6C, 0x9A, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF7, 0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFE, 0x6C, 0x8C, 0xEA, +0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x40, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF7, 0x7C, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x5C, 0x9A, 0x80, 0xA2, +0xFF, 0x6A, 0x8C, 0xEA, 0xFD, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, +0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, 0x74, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, +0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0x00, 0xD4, 0x00, 0x92, 0x05, 0x6B, 0x62, 0xDA, 0x00, 0x94, 0x00, 0x6A, 0x00, 0x6B, 0x40, 0xDC, +0x61, 0xDC, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x00, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x03, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, +0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, +0x01, 0x63, 0x20, 0xE8, 0xDC, 0x63, 0x47, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, +0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x07, 0x04, 0x62, 0x67, 0xA1, 0xF2, 0x04, 0x4B, 0x54, 0x6A, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x1C, 0x04, 0x62, 0x67, +0xE1, 0xF2, 0x18, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, +0x20, 0x6A, 0x31, 0x04, 0x62, 0x67, 0x41, 0xF3, 0x0C, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, +0x00, 0x18, 0x30, 0x04, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x87, 0x10, 0x7D, 0x67, 0x58, 0xA3, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, +0x05, 0xD2, 0x05, 0x92, 0x49, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x61, 0xC2, 0x05, 0x92, +0x00, 0x6B, 0x63, 0xC2, 0x05, 0x92, 0x09, 0x6B, 0x64, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x0D, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x04, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x6E, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8E, 0xA2, +0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, +0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6E, 0xC2, 0x05, 0x92, +0x9D, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x41, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x92, 0x91, 0xA2, +0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x05, 0x92, +0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8B, 0xA2, 0x08, 0x6B, +0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x70, 0xC2, 0x05, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, +0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x76, 0xC2, +0x05, 0x92, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x68, 0xC2, 0x05, 0x92, +0x9D, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x49, 0x6B, 0x67, 0xC2, +0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, +0x58, 0x67, 0x7F, 0xF7, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0xA3, 0xF2, 0x7E, 0xC2, 0x00, 0x18, 0xBA, 0x28, 0x00, 0x18, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, +0x21, 0xF4, 0x44, 0x9A, 0x33, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC5, 0xF6, +0x14, 0x4B, 0x07, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, +0x20, 0x6A, 0x62, 0x67, 0x25, 0xF7, 0x08, 0x4B, 0x31, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, +0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x65, 0xF7, 0x1C, 0x4B, 0x1C, 0x02, +0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x47, 0x97, 0x24, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, 0x06, 0x04, 0x00, 0x18, +0x54, 0x15, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x09, 0xD5, +0x0A, 0xD6, 0x0B, 0xD7, 0x0A, 0x92, 0x01, 0x4A, 0x2D, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x08, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x07, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, +0x40, 0x9A, 0x05, 0xD2, 0x0A, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0A, 0x92, +0x4F, 0xEB, 0x05, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0B, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, +0x6D, 0xEA, 0x0B, 0xD2, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x09, 0x93, +0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x0B, 0x93, 0x60, 0xDA, 0x08, 0x10, +0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x0B, 0x93, 0x60, 0xDA, +0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, +0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, +0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0x10, +0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, +0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, +0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, +0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x24, 0x10, 0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, +0x50, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, +0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x48, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x58, 0xC4, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0xD7, 0x22, 0x00, 0x18, 0x41, 0x22, +0x00, 0x18, 0xF4, 0x3A, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0x08, 0x22, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xF9, 0x63, 0x0E, 0xD4, 0x0F, 0xD5, 0x10, 0xD6, 0x04, 0x6A, 0x04, 0xD2, +0x00, 0x6A, 0x03, 0xD2, 0x10, 0x92, 0x02, 0xD2, 0x0E, 0x92, 0x06, 0xD2, 0x07, 0x11, 0x0F, 0x92, +0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x0F, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, +0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0xF7, 0x10, 0x08, 0x02, 0x05, 0xD2, 0x03, 0x92, 0x13, 0x22, +0x05, 0x92, 0x30, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x9D, 0x67, 0x67, 0xA4, +0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, +0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x62, 0x6B, 0x6E, 0xEA, +0x40, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, +0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x02, 0x92, 0x40, 0x82, 0x9D, 0x67, +0x46, 0xC4, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, +0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x04, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, +0x66, 0xA2, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, +0x0C, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, +0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, +0x0F, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x77, 0x6B, 0x6E, 0xEA, 0x41, 0x2A, 0x0F, 0x92, +0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, +0x58, 0x6B, 0x6E, 0xEA, 0x35, 0x2A, 0x02, 0x92, 0x40, 0xAA, 0x9D, 0x67, 0x42, 0xCC, 0x0F, 0x92, +0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, +0x9D, 0x67, 0x47, 0xC4, 0x0C, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, 0x62, 0xAA, 0x04, 0x92, +0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, +0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, +0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, +0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x0F, 0xD2, 0x3E, 0x10, +0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x0F, 0x92, 0x01, 0x4A, +0x40, 0x82, 0x58, 0x6C, 0x8E, 0xEA, 0x32, 0x2A, 0x02, 0x92, 0x40, 0x9A, 0x00, 0xD2, 0x0F, 0x92, +0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, +0x9D, 0x67, 0x47, 0xC4, 0x1C, 0x6A, 0x04, 0xD2, 0x1A, 0x10, 0x00, 0x93, 0x04, 0x92, 0x66, 0xEA, +0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x60, 0x82, +0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, +0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, +0x00, 0x52, 0x58, 0x67, 0xE2, 0x22, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, 0x08, 0x02, 0x07, 0xD2, +0x0A, 0x10, 0x07, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, +0x07, 0x92, 0x01, 0x4A, 0x07, 0xD2, 0x07, 0x93, 0x05, 0x92, 0x43, 0xEB, 0x58, 0x67, 0xF1, 0x2A, +0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, 0x0F, 0x92, 0x40, 0x82, +0xFF, 0xF6, 0x15, 0x2A, 0x0E, 0x92, 0x03, 0x22, 0x06, 0x92, 0x00, 0x6B, 0x60, 0xC2, 0x06, 0x93, +0x0E, 0x92, 0x4B, 0xE3, 0x07, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x07, 0xD5, 0x08, 0xD6, +0x09, 0xD7, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, 0x40, 0xA2, +0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, +0x41, 0xA2, 0x12, 0x2A, 0x06, 0x93, 0x06, 0x02, 0x04, 0x4A, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, +0x08, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x25, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, +0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x46, 0xC3, 0x02, 0x92, 0x02, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x45, 0xC4, 0x7D, 0x67, +0x46, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, +0x49, 0xE3, 0x00, 0xD2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x7C, 0x33, 0xAE, 0xA2, +0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, +0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xAE, 0xA2, +0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x9D, 0x67, 0x45, 0xA4, 0x80, 0xF0, +0x0B, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x1F, 0x6B, 0x6C, 0xEA, 0x00, 0x93, 0x44, 0xC3, +0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, +0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, +0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAE, 0xA2, 0x04, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, +0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAE, 0xA2, 0x0D, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, +0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAF, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x6F, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x30, 0x6A, 0x6C, 0xEA, 0x53, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, +0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x70, 0x33, 0xAE, 0xA2, 0x31, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, +0x8D, 0xEB, 0x6E, 0xC2, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x18, 0x10, 0x9D, 0x67, 0x46, 0xA4, +0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x44, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, +0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x03, 0x4B, 0x02, 0x94, 0x6D, 0xE4, 0x60, 0xA3, +0x60, 0xC2, 0x7D, 0x67, 0x44, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0x7D, 0x67, 0x44, 0xA3, +0x04, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x50, 0xC4, 0x18, 0x10, 0x7D, 0x67, 0x51, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, +0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, +0x70, 0xA4, 0x03, 0x4B, 0x08, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x50, 0xA3, +0x01, 0x4A, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0xE3, 0x2A, +0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x16, 0x33, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, +0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x00, 0x6A, 0x9D, 0x67, +0x54, 0xC4, 0x01, 0x6A, 0xBD, 0x67, 0x53, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x50, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x57, 0xC5, 0x22, 0x10, 0x7D, 0x67, 0x57, 0xA3, +0x0C, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x22, 0x22, 0x9D, 0x67, 0x54, 0xA4, 0x01, 0x4A, 0xBD, 0x67, +0x54, 0xC5, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, +0x0B, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x00, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x53, 0xA5, +0x01, 0x4A, 0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x57, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x57, 0xC5, +0x7D, 0x67, 0x57, 0xA3, 0x37, 0x5A, 0x58, 0x67, 0xD9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x0F, 0x5A, 0x58, 0x67, 0x10, 0x22, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7F, 0xC2, 0x07, 0x10, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7F, 0xC2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x50, 0x32, 0x7D, 0x67, 0x50, 0xC3, +0x00, 0x6A, 0x9D, 0x67, 0x57, 0xC4, 0x8E, 0x10, 0xBD, 0x67, 0x77, 0xA5, 0x43, 0x67, 0x48, 0x32, +0x48, 0x34, 0x4B, 0xE4, 0x6B, 0xE2, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x73, 0xA4, 0xBD, 0x67, +0x57, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x0F, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0xBD, 0x67, 0x51, 0xA5, 0x4D, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, +0xFF, 0x4A, 0x6E, 0xEA, 0x3A, 0x2A, 0x7D, 0x67, 0x53, 0xA3, 0x01, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x6F, 0xE2, 0xFF, 0x6A, +0x4C, 0xEB, 0x9D, 0x67, 0x54, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x52, 0xC5, 0x00, 0x6A, 0x7D, 0x67, +0x56, 0xC3, 0x13, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, 0xBD, 0x67, +0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x6A, 0xC2, +0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x76, 0xA5, 0x9D, 0x67, +0x52, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x61, 0x42, 0xFF, 0xF7, +0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x53, 0xCC, 0x1F, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x56, 0xC5, +0x13, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, 0xBD, 0x67, 0x75, 0xA5, +0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x6A, 0xC2, 0x7D, 0x67, +0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x0B, 0x5A, 0x58, 0x67, +0xE8, 0x2A, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x58, 0xC4, 0x06, 0x94, +0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0xBD, 0x67, 0x57, 0xA5, 0x01, 0x4A, +0x7D, 0x67, 0x57, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, 0x43, 0xEB, 0x58, 0x67, +0x7F, 0xF7, 0x0A, 0x2A, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, +0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x54, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x0F, 0x6A, +0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x56, 0xC4, 0x7D, 0x67, +0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x20, 0xF0, 0x45, 0xA2, 0x7D, 0x67, +0x58, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x9D, 0x67, 0x59, 0xC4, 0x04, 0x92, 0x20, 0xF0, +0x47, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, +0xB8, 0x22, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xF7, 0x63, 0x11, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x40, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF7, 0x70, 0x9A, 0x09, 0xD3, 0x62, 0x67, +0xC0, 0xF7, 0x10, 0x4B, 0x61, 0x9B, 0x0A, 0xD3, 0xC0, 0xF7, 0x10, 0x4A, 0x48, 0xA2, 0x9D, 0x67, +0x20, 0xF0, 0x4C, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF7, 0x7C, 0x9A, 0x0C, 0xD3, 0x62, 0x67, +0xC0, 0xF7, 0x1C, 0x4B, 0x61, 0x9B, 0x0D, 0xD3, 0xC0, 0xF7, 0x1C, 0x4A, 0x48, 0xA2, 0xBD, 0x67, +0x20, 0xF0, 0x58, 0xC5, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, +0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, +0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, +0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, +0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x9D, 0x67, 0x56, 0xC4, +0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, +0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0xA3, 0xF1, 0x7C, 0xA3, 0x04, 0x04, 0x49, 0xE4, +0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, +0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, +0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, +0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0xC7, 0x10, 0x7D, 0x67, 0x40, 0xF0, +0x48, 0xA3, 0x08, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, +0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, +0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, +0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, +0x54, 0xC3, 0x08, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, +0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, +0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, +0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, +0x03, 0xF2, 0x70, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, +0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, +0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, +0xA7, 0x2A, 0x63, 0x10, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x09, 0x6C, 0x8E, 0xEA, 0x5D, 0x2A, +0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, +0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, +0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, +0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, 0x9D, 0x67, 0x56, 0xC4, +0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, +0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, +0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, +0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x63, 0xF2, 0x64, 0xA3, 0x04, 0x04, 0x49, 0xE4, +0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, +0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, +0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, +0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x11, 0x97, 0x09, 0x63, 0x00, 0xEF, +0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, +0x0A, 0x92, 0x05, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x06, 0x22, 0x7D, 0x67, +0x59, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF2, 0x24, 0x89, 0x10, 0x0A, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x5A, 0xC3, 0x0A, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x58, 0xC3, 0x0A, 0x92, 0x04, 0x4A, +0x40, 0xA2, 0x50, 0x32, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, 0x0A, 0x92, 0x03, 0x4A, +0x40, 0xA2, 0x6D, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x7D, 0x67, 0x4B, 0xCB, +0x7D, 0x67, 0x59, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF6, +0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xA3, 0xF1, +0x7C, 0xC2, 0x54, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x08, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0xE0, 0xF6, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x5D, 0x67, 0x98, 0xA2, +0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE4, 0x03, 0xF2, 0x70, 0xC2, 0x3A, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x09, 0x6B, 0x6E, 0xEA, +0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, +0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x63, 0xF2, 0x64, 0xC2, 0x20, 0x10, 0x7D, 0x67, 0x59, 0xA3, +0x0A, 0x6B, 0x6E, 0xEA, 0x1B, 0x2A, 0x07, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x54, 0xC3, 0x28, 0xF3, +0x01, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x50, 0x9A, 0x04, 0xD2, +0x5D, 0x67, 0xB4, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF7, +0x1C, 0x4C, 0x04, 0x92, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x09, 0x97, 0x05, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x55, 0xC3, 0x7D, 0x67, 0x55, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, 0x54, 0xC3, +0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x04, 0x92, 0x7A, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, +0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x74, 0x33, +0xBD, 0xA2, 0x21, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, +0x8C, 0xEB, 0xBD, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, +0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x47, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, +0x8C, 0xEB, 0x64, 0x33, 0xBD, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, +0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, +0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xBD, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x7D, 0xC2, 0x04, 0x92, 0x5D, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x16, 0x22, 0x7D, 0x67, 0x55, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x3E, 0x3B, 0x5D, 0x67, 0x95, 0xA2, 0x04, 0x92, 0x5A, 0xA2, 0x62, 0x67, +0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, 0xAC, 0xEA, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xDE, 0x2F, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x08, 0x92, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7B, 0xC2, 0x08, 0x92, +0x01, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7C, 0xC2, +0x7D, 0x67, 0x50, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x78, 0xC2, 0x08, 0x92, 0x03, 0x4A, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x79, 0xC2, 0x08, 0x92, +0x04, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7A, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x58, 0xA2, 0xA2, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5A, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x40, 0xF7, 0x08, 0x4C, +0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x34, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x6B, +0x6E, 0xEA, 0x2F, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA3, 0xF2, 0x78, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x01, 0x6B, 0x6B, 0xEB, 0xA3, 0xF2, 0x7A, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xA3, 0xF2, 0x58, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, +0x59, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x60, 0xF7, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xA3, 0xF2, 0x7E, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7D, 0xC2, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x52, 0xC3, 0x08, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0x08, 0x92, 0x02, 0x4A, +0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, +0xC3, 0xF2, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x72, 0xA4, +0xC3, 0xF2, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x71, 0xA4, +0xC3, 0xF2, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x70, 0xA4, +0xC3, 0xF2, 0x62, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x02, 0x22, 0x00, 0x18, 0xCB, 0x2B, 0x30, 0xF0, +0x20, 0x6A, 0x80, 0xF7, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x0C, 0x92, 0x40, 0xA2, 0x7D, 0x67, +0x53, 0xC3, 0x0C, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, 0x0C, 0x92, 0x02, 0x4A, +0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x0B, 0x10, 0x7D, 0x67, +0x50, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x00, 0x6B, 0x66, 0xC2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, +0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0xF0, 0x2A, 0x5D, 0x67, +0x71, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x53, 0xA3, +0x81, 0x5A, 0x58, 0x67, 0x43, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x3E, 0x2A, +0x01, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, +0x70, 0x9A, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA5, 0xF4, 0x50, 0x9A, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, 0x50, 0x9A, 0x42, 0x33, 0x62, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xA5, 0xF4, 0x50, 0x9A, 0x00, 0xF6, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, +0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA5, 0xF4, 0x70, 0xDA, 0xDF, 0x11, 0x5D, 0x67, 0x71, 0xA2, +0x02, 0x6A, 0x6C, 0xEA, 0xC0, 0xF0, 0x16, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x7D, 0x67, +0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, +0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, +0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, +0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, +0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, +0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, +0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, +0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x5B, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, +0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, +0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, +0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x04, 0x10, 0x16, 0x6A, +0x4B, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, 0x7D, 0x67, +0x51, 0xCB, 0x03, 0x11, 0x7D, 0x67, 0x51, 0xA3, 0xE0, 0xF0, 0x19, 0x2A, 0x7D, 0x67, 0x53, 0xA3, +0x81, 0x5A, 0x58, 0x67, 0x6F, 0x22, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x5D, 0x67, +0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, +0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xE0, 0xF7, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x5B, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, +0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x7D, 0x67, 0x52, 0xA3, +0x81, 0x5A, 0x58, 0x67, 0x71, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, +0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, +0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x52, 0xA3, 0x54, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, +0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, +0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, 0x5C, 0xC3, +0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x06, 0x10, 0x04, 0x6A, +0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, 0x82, 0x67, 0x00, 0x18, +0x54, 0x15, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, +0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0xC0, 0x4A, 0x0A, 0x5A, 0x78, 0x67, 0x2F, 0x23, +0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, +0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xCC, 0x23, 0x22, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, +0xED, 0x25, 0x1D, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x38, 0x24, 0x18, 0x10, 0x07, 0x92, +0x82, 0x67, 0x00, 0x18, 0x9C, 0x25, 0x13, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x3C, 0x26, +0x0E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x89, 0x26, 0x09, 0x10, 0x07, 0x92, 0x82, 0x67, +0x00, 0x18, 0xA9, 0x26, 0x04, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xAC, 0x1F, 0x05, 0x97, +0x03, 0x63, 0x00, 0xEF, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x20, 0x5A, +0x58, 0x67, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, +0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, +0x40, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x20, 0x5A, 0x58, 0x67, +0x08, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, +0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, +0x40, 0xA4, 0x60, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x40, 0x5A, 0x58, 0x67, +0x08, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, +0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0xFF, 0x6A, +0x6C, 0xEA, 0x0F, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, +0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, 0xF0, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x40, 0x9A, 0x6C, 0xEA, +0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, +0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, +0x4C, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF3, 0x50, 0x9A, 0x6C, 0xEA, 0x13, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, +0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0xE0, 0xF3, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0xE1, 0xF7, 0x10, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, +0x54, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x6C, 0xEA, 0x16, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x5C, 0x9A, 0x6C, 0xEA, +0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x0C, 0xF0, +0x18, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x40, 0x9A, 0x6C, 0xEA, 0x18, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, +0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, +0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, +0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x4C, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, +0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, +0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, +0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, +0x00, 0x4A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, +0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, +0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x9D, 0x67, +0x54, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, +0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, +0x7D, 0x67, 0x54, 0xA3, 0xE0, 0xF5, 0x07, 0x22, 0x80, 0xF4, 0x0C, 0x6A, 0x9D, 0x67, 0x49, 0xCC, +0x80, 0xF4, 0x10, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x80, 0xF4, 0x14, 0x6A, 0x9D, 0x67, 0x47, 0xCC, +0x80, 0xF4, 0x18, 0x6A, 0x7D, 0x67, 0x46, 0xCB, 0x9D, 0x67, 0x57, 0xA4, 0x10, 0x22, 0x80, 0xF4, +0x1C, 0x6A, 0x7D, 0x67, 0x49, 0xCB, 0xA0, 0xF4, 0x00, 0x6A, 0x9D, 0x67, 0x48, 0xCC, 0xA0, 0xF4, +0x04, 0x6A, 0x7D, 0x67, 0x47, 0xCB, 0xA0, 0xF4, 0x08, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x7D, 0x67, +0x56, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, +0x49, 0xE3, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x46, 0xF2, 0x08, 0x4A, 0x01, 0xD2, 0x9D, 0x67, +0x55, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0xA0, 0xF3, 0x0E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x03, 0x23, +0x0C, 0x22, 0xA0, 0xF5, 0x09, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0xC0, 0xF1, 0x01, 0x23, 0x03, 0x6B, +0x6E, 0xEA, 0x80, 0xF4, 0x03, 0x22, 0x80, 0xF5, 0x1F, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, +0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, +0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, +0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, +0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, +0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x6E, 0xA3, 0x7E, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0D, 0x10, 0x5D, 0x67, 0x69, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, +0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, +0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, +0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, +0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, +0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, +0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, +0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x6F, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x10, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x6F, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x9D, 0x67, +0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, +0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, +0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF3, 0x7C, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, +0x12, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, +0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF3, 0x7C, 0x9B, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, +0x60, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xF7, 0x13, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, +0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x60, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xE4, 0x13, +0x5D, 0x67, 0x69, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, +0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x5D, 0x67, +0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, +0x6A, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, +0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x6E, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, +0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, +0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, +0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, +0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, +0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, +0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, 0x0A, 0x10, +0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x66, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, +0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, +0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, +0x60, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, +0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, +0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, +0x61, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, +0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, +0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, +0x62, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, +0x0B, 0x10, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, +0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, +0x0B, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, +0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0D, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, +0x60, 0xC2, 0x0C, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, +0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, +0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x47, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, +0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, +0x40, 0xF0, 0x08, 0x4B, 0x61, 0xA3, 0x60, 0xC2, 0x0F, 0x12, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, +0x61, 0xA3, 0x60, 0xC2, 0x01, 0x12, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x15, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, +0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, +0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, +0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, +0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, +0x20, 0x6B, 0x01, 0xF4, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x14, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, +0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x68, 0x9B, +0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, +0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, +0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, +0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, +0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, +0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, +0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, +0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, +0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, +0x6C, 0xAB, 0x60, 0xDA, 0x29, 0x11, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, 0x1E, 0x11, 0x5D, 0x67, 0x69, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, +0x60, 0x9B, 0x60, 0xDA, 0x5D, 0x67, 0x68, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x13, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, +0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, +0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, +0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x67, 0xAA, +0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, +0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, +0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, 0x12, 0x10, +0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, +0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, +0x44, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, +0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, +0x0F, 0x2A, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, +0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, +0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, +0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, +0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, +0x7D, 0x67, 0x46, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, +0x66, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, +0x01, 0x94, 0x6D, 0xE4, 0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, +0x6D, 0xE4, 0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, +0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, +0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, +0x81, 0xF4, 0x60, 0xA3, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, +0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, +0x60, 0xA3, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x03, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, 0x42, 0xA2, 0x7D, 0x67, 0x54, 0xC3, +0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, +0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, +0x41, 0xA2, 0x02, 0x6B, 0x4E, 0xEB, 0x6B, 0x23, 0x03, 0x52, 0x78, 0x67, 0x04, 0x23, 0x01, 0x6B, +0x6E, 0xEA, 0x0A, 0x22, 0x77, 0x11, 0x03, 0x6B, 0x4E, 0xEB, 0xE0, 0xF0, 0x12, 0x23, 0x04, 0x6B, +0x6E, 0xEA, 0x40, 0xF1, 0x13, 0x22, 0x6E, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, +0x7D, 0x67, 0x58, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, +0x5B, 0xC3, 0x04, 0x92, 0x43, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, +0x6E, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, +0x45, 0xA2, 0x7D, 0x67, 0x5F, 0xC3, 0x04, 0x92, 0x46, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x04, 0x92, 0x4E, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, +0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x4F, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x53, 0xA2, +0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, +0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x13, 0x11, 0x0C, 0x6A, +0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, +0x04, 0x92, 0x44, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, +0x04, 0x92, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x5E, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, +0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, +0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x54, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, +0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, +0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, +0x81, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0E, 0x6A, +0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x56, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x20, 0xF0, +0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, +0x04, 0x92, 0x20, 0xF0, 0x42, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x43, 0xA2, +0x7D, 0x67, 0x5F, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x44, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x7D, 0x67, 0x54, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, +0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, +0x54, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x6C, 0xAA, +0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, +0x4C, 0xAA, 0x62, 0x67, 0xF0, 0x6A, 0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, +0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x1C, 0x10, 0x03, 0x6A, 0x7D, 0x67, +0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0F, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF0, 0x48, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, +0x08, 0x4A, 0x41, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, +0x00, 0x18, 0xB8, 0x22, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, +0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x25, 0x22, +0x7D, 0x67, 0x4C, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xC4, 0x5D, 0x67, 0x60, 0xA2, 0x08, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x60, 0xA4, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, +0x40, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, +0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, +0xD8, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0xD8, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x9C, 0xC5, 0xDD, 0x67, +0x40, 0xF0, 0x60, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, +0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x06, 0xD2, 0x00, 0x6A, 0xBD, 0x67, +0x20, 0xF0, 0x43, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x20, 0xF0, +0x49, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x78, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, +0x47, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x45, 0xC3, 0x07, 0x92, 0x60, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0xC4, +0x07, 0x92, 0x41, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x7C, 0xA6, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, +0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xC5, 0xDD, 0x67, 0x20, 0xF0, +0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, +0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x27, 0x2A, 0xDD, 0x67, 0x40, 0xF0, +0x44, 0xA6, 0x02, 0x6B, 0x6E, 0xEA, 0x21, 0x2A, 0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, +0x10, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x47, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x0B, 0x10, +0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x45, 0x6A, +0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, +0x44, 0xA5, 0x6D, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, +0x49, 0xE4, 0x40, 0xAA, 0x49, 0xE3, 0x47, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x07, 0x92, +0x6C, 0xCA, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x10, 0x22, +0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x63, 0xEA, 0x58, 0x67, +0x16, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0x82, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0x84, 0x6D, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x20, 0xF0, 0x5C, 0xC5, 0x0F, 0x10, 0xDD, 0x67, +0x20, 0xF0, 0x68, 0xA6, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, +0x7D, 0x67, 0x20, 0xF0, 0x41, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x78, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB4, 0x2C, +0x7D, 0x67, 0x40, 0xF0, 0x40, 0xA3, 0x1A, 0x2A, 0x07, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x6F, 0xC2, 0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, +0x20, 0xF0, 0x78, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0x00, 0x6C, 0x04, 0xD4, 0x00, 0x6C, +0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x30, 0x56, 0x10, 0x5D, 0x67, 0x20, 0xF0, +0x65, 0xA2, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x4F, 0xA2, +0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, +0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x07, 0x92, 0x01, 0x6B, 0x8C, 0xEB, +0x78, 0x33, 0xAF, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x07, 0x92, +0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x40, 0x6A, +0x6D, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x00, 0xF1, 0x04, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x07, 0x92, 0x73, 0xC2, 0x07, 0x92, +0x7A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, +0x49, 0xE4, 0x40, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x22, 0x07, 0x92, 0x53, 0xA2, 0x64, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x92, 0x73, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x4C, 0x33, +0xFF, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, +0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0x85, 0x6D, 0xEA, +0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x7D, 0x67, +0x20, 0xF0, 0x58, 0xA3, 0x03, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x44, 0x9A, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x48, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, +0xE0, 0xF0, 0x02, 0x2A, 0x7D, 0x67, 0x40, 0xF0, 0x40, 0xA3, 0xC0, 0xF0, 0x1D, 0x2A, 0x9D, 0x67, +0x20, 0xF0, 0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x19, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, +0x0C, 0x5A, 0x58, 0x67, 0x13, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x6C, 0x42, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF0, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF0, +0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBE, 0x10, 0x9D, 0x67, 0x20, 0xF0, +0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x12, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF0, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF0, +0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xA6, 0x10, 0x07, 0x92, 0x4E, 0xA2, +0x30, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x4C, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, +0x2C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x36, 0x5A, 0x58, 0x67, +0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF0, +0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x86, 0x10, 0x9D, 0x67, 0x20, 0xF0, +0x5C, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x40, 0x5A, +0x58, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xCA, 0x4A, 0x30, 0xF0, 0x20, 0x6B, +0x81, 0xF0, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x65, 0x6C, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x63, 0x2A, 0x7D, 0x67, 0x20, 0xF0, +0x5C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x5F, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xC0, 0x4A, +0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF0, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, +0x53, 0x10, 0x07, 0x92, 0x4E, 0xA2, 0x30, 0x6B, 0x6C, 0xEA, 0x4E, 0x2A, 0x9D, 0x67, 0x20, 0xF0, +0x5C, 0xA4, 0x0C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x16, 0x5A, +0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, +0xA1, 0xF0, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x35, 0x10, 0x9D, 0x67, +0x20, 0xF0, 0x5C, 0xA4, 0x16, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, +0x20, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xEA, 0x4A, 0x30, 0xF0, +0x20, 0x6B, 0xA1, 0xF0, 0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x1C, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x16, 0x2A, 0x7D, 0x67, 0x20, 0xF0, +0x5C, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xE0, 0x4A, +0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, +0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0xBD, 0x67, 0x20, 0xF0, +0x7C, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x20, 0xF0, 0x66, 0xA4, 0x60, 0xC2, +0xBD, 0x67, 0x20, 0xF0, 0x58, 0xA5, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, +0x4C, 0x9A, 0x49, 0xE3, 0xDD, 0x67, 0x20, 0xF0, 0x65, 0xA6, 0x60, 0xC2, 0x00, 0x65, 0x01, 0x10, +0x00, 0x65, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, +0x68, 0xCC, 0x7D, 0x67, 0x4A, 0xCB, 0x01, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x00, 0x6A, 0x7D, 0x67, +0x40, 0xCB, 0x9D, 0x67, 0x68, 0xAC, 0x9D, 0x67, 0x4A, 0xAC, 0x6E, 0xEA, 0x04, 0x2A, 0x64, 0x6A, +0x7D, 0x67, 0x46, 0xCB, 0x87, 0x10, 0x9D, 0x67, 0x48, 0xAC, 0x07, 0x22, 0x5D, 0x67, 0x68, 0xAA, +0x9D, 0x67, 0x4A, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x46, 0xCB, +0x79, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x04, 0x6A, +0x7D, 0x67, 0x40, 0xCB, 0x1C, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x04, 0xF0, 0x00, 0x5A, 0x58, 0x67, +0x04, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x12, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x08, 0xF0, +0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x08, 0x10, 0x9D, 0x67, +0x4A, 0x8C, 0x00, 0x52, 0x58, 0x67, 0x03, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, +0x6A, 0xAC, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x02, 0xD2, 0x5D, 0x67, +0x68, 0xAA, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0xD2, 0x00, 0x6A, +0x7D, 0x67, 0x4E, 0xC3, 0x33, 0x10, 0x02, 0x92, 0x46, 0x32, 0x02, 0xD2, 0x01, 0x93, 0x02, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x26, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x81, 0xF4, 0x00, 0x6B, 0x67, 0xEA, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x46, 0xAC, 0x49, 0xE3, 0x7D, 0x67, 0x46, 0xCB, +0x01, 0x93, 0x02, 0x92, 0x4B, 0xE3, 0x01, 0xD2, 0x02, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, +0x01, 0x92, 0x02, 0x5A, 0x58, 0x67, 0x03, 0x2A, 0x02, 0x6A, 0x02, 0xD2, 0x0A, 0x10, 0x02, 0x92, +0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x01, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x0E, 0x22, 0x01, 0x92, +0x0B, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x4E, 0xC4, 0x7D, 0x67, 0x4E, 0xA3, +0x0C, 0x5A, 0x58, 0x67, 0xC8, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x46, 0xAB, 0x5A, 0x32, +0x9D, 0x67, 0x46, 0xCC, 0x5D, 0x67, 0x66, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x63, 0x20, 0xE8, +0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x09, 0xD5, 0x0A, 0xD6, 0x47, 0x67, 0x9D, 0x67, 0x20, 0xF0, +0x60, 0xC4, 0xBD, 0x67, 0x56, 0xCD, 0x0A, 0x92, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, +0x01, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0x1D, 0x10, 0xBD, 0x67, 0x52, 0xA5, 0x7D, 0x67, 0x51, 0xC3, +0x0E, 0x10, 0x9D, 0x67, 0x51, 0xA4, 0x48, 0x32, 0x09, 0x93, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0x93, +0x49, 0xE3, 0x05, 0xD2, 0xBD, 0x67, 0x51, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, +0x51, 0xA4, 0x05, 0x5A, 0x58, 0x67, 0xED, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x92, 0x04, 0x2A, +0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x23, 0x10, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x0A, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x9D, 0x67, 0x56, 0xAC, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x05, 0x94, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0xBD, 0x67, 0x56, 0xAD, 0x53, 0xE4, 0xFF, 0xF7, 0x1F, 0x6A, +0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x12, 0x2E, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, +0x50, 0xA4, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, +0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x09, 0x22, 0x7D, 0x67, 0x48, 0xA3, +0xE0, 0x4A, 0x9D, 0x67, 0x48, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x40, 0xC5, 0x03, 0x10, 0x01, 0x6A, +0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x48, 0x32, 0x03, 0x93, 0x49, 0xE3, 0x60, 0x9A, +0xBD, 0x67, 0x48, 0xA5, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x02, 0x22, +0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, +0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, +0x48, 0xA3, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x50, 0xA5, 0x05, 0x22, 0x7D, 0x67, 0x44, 0xA3, +0xE0, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x44, 0xA5, 0x20, 0x5A, 0x58, 0x67, 0x11, 0x2A, +0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, +0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0xE0, 0x4A, 0xBD, 0x67, 0x44, 0xC5, +0x0B, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0x01, 0x6B, 0xA3, 0x67, +0xA4, 0xEA, 0x45, 0x67, 0x62, 0x67, 0x00, 0x92, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x48, 0xA3, +0x01, 0x10, 0xFF, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x1C, 0x65, 0x85, 0x67, +0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0x40, 0xF0, 0xC0, 0xC5, 0xBD, 0x67, 0x40, 0xF0, +0x84, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x4C, 0xC3, 0x9D, 0x67, +0x40, 0xF0, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, +0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x5D, 0xC5, 0x03, 0x6A, 0xDD, 0x67, +0x55, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x60, 0xA4, 0x7F, 0x6A, +0x6C, 0xEA, 0xBD, 0x67, 0x56, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x39, 0x2A, 0x7D, 0x67, +0x56, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xA0, 0xF1, 0x0C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x60, 0x10, +0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, +0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF2, 0x14, 0x4C, 0x5D, 0x67, 0x7A, 0xA2, +0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x4A, 0x10, 0x7D, 0x67, 0x5A, 0xA3, +0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xA0, 0xF1, 0x18, 0x4C, +0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x38, 0x10, +0xDD, 0x67, 0x56, 0xA6, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x40, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, +0x27, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, +0x4C, 0xA6, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xC0, 0xF2, 0x04, 0x4C, 0x5D, 0x67, +0x7A, 0xA2, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x11, 0x10, 0x7D, 0x67, +0x5A, 0xA3, 0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x60, 0xF2, +0x08, 0x4C, 0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, +0xDD, 0x67, 0x54, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x0B, 0x92, 0x40, 0xA2, 0x9D, 0x67, +0x5B, 0xC4, 0xBD, 0x67, 0x9B, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xA6, 0xBD, 0x67, 0x40, 0xF0, +0x4C, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xAB, 0x2E, 0xDD, 0x67, 0x5C, 0xC6, 0x04, 0x92, +0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x7D, 0x67, 0x5C, 0xA3, 0xFF, 0x6C, +0x8E, 0xEA, 0x02, 0x2A, 0xFF, 0x6A, 0x54, 0x11, 0xBD, 0x67, 0x5C, 0xA5, 0x51, 0x11, 0x00, 0x6A, +0xDD, 0x67, 0x59, 0xC6, 0x0D, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, +0x6B, 0xEB, 0x20, 0xF0, 0x60, 0xC2, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x59, 0xC5, +0xDD, 0x67, 0x59, 0xA6, 0x03, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, +0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x55, 0x10, 0xBD, 0x67, 0x59, 0xA5, 0x0B, 0x93, 0x49, 0xE3, +0x40, 0xA2, 0xDD, 0x67, 0x5B, 0xC6, 0x7D, 0x67, 0x5B, 0xA3, 0x2C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, +0xBD, 0x67, 0x40, 0xF0, 0x4C, 0xA5, 0x03, 0x2A, 0x0C, 0x6A, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, +0x9B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x68, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0xAB, 0x2E, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, +0xBD, 0x67, 0x59, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x18, 0x2A, 0x9D, 0x67, +0x5B, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x0C, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x04, 0x2A, +0x47, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x24, 0x10, 0x45, 0x6A, 0x9D, 0x67, 0x5C, 0xC4, 0x20, 0x10, +0xBD, 0x67, 0x7D, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x49, 0xE3, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, +0x5C, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x0D, 0x22, 0xDD, 0x67, 0x58, 0xA6, 0x04, 0x03, 0x49, 0xE3, +0x9D, 0x67, 0x7C, 0xA4, 0x20, 0xF0, 0x60, 0xC2, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, +0x58, 0xC6, 0x5D, 0x67, 0x79, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xA4, 0x2A, +0x7D, 0x67, 0x58, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, +0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x9D, 0x67, 0x5D, 0xA4, 0x06, 0x5A, +0x58, 0x67, 0x02, 0x2A, 0xFF, 0x6A, 0xBC, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x10, 0x6A, 0x9D, 0x67, 0x5F, 0xC4, 0x10, 0x6A, 0xBD, 0x67, 0x5E, 0xC5, 0x04, 0x92, 0x51, 0xA2, +0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x57, 0xC6, +0x00, 0x6A, 0x09, 0xD2, 0x04, 0x92, 0x5D, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x33, 0x22, 0x7D, 0x67, +0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x0C, 0x4A, 0x0A, 0xD2, +0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x14, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, +0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x1E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x09, 0xD2, +0x09, 0x92, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, +0x6C, 0xEA, 0x10, 0x22, 0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x5C, 0xC6, 0x7D, 0x67, +0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xC4, 0xBD, 0x67, 0x5C, 0xA5, 0xDD, 0x67, +0x20, 0xF0, 0x50, 0xC6, 0x04, 0x92, 0x5D, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x2C, 0x22, 0x7D, 0x67, +0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x1C, 0x4A, 0x0A, 0xD2, +0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF5, 0x04, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, +0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x17, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x01, 0x6B, +0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, 0x6C, 0xEA, 0x0B, 0x22, +0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x50, 0xC6, 0x01, 0x6A, 0x4B, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x51, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, +0x11, 0x22, 0xDD, 0x67, 0x20, 0xF0, 0x52, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0B, 0x22, 0x9D, 0x67, +0x20, 0xF0, 0x71, 0xA4, 0x04, 0x92, 0x65, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x72, 0xA5, 0x04, 0x92, +0x66, 0xC2, 0x23, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x51, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0C, 0x22, +0x9D, 0x67, 0x20, 0xF0, 0x52, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x06, 0x2A, 0xDD, 0x67, 0x20, 0xF0, +0x71, 0xA6, 0x04, 0x92, 0x66, 0xC2, 0x11, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0xFF, 0x6C, +0x8E, 0xEA, 0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x52, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x05, 0x22, +0x5D, 0x67, 0x20, 0xF0, 0x72, 0xA2, 0x04, 0x92, 0x66, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, +0x0F, 0x97, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, +0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, +0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x04, 0x92, +0x60, 0xA2, 0x04, 0x92, 0x42, 0xA2, 0x4B, 0xE3, 0xBD, 0x67, 0x57, 0xC5, 0x04, 0x92, 0x61, 0xA2, +0x04, 0x92, 0x42, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, +0x38, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x1A, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x57, 0xA3, +0x9D, 0x67, 0x54, 0xC4, 0x0F, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x15, 0x5A, 0x58, 0x67, +0x05, 0x2A, 0x7D, 0x67, 0x56, 0xA3, 0x9D, 0x67, 0x54, 0xC4, 0x04, 0x10, 0x04, 0x92, 0x41, 0xA2, +0xBD, 0x67, 0x54, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x74, 0xA5, 0xBD, 0x67, +0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x5D, 0x67, +0x20, 0xF0, 0xA0, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xA4, 0x9D, 0x67, 0x54, 0xA4, 0x30, 0xF0, +0x20, 0x6C, 0xC1, 0xF0, 0x10, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, +0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x44, 0xC3, +0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x03, 0x6C, 0x8E, 0xEA, 0x38, 0x2A, 0x7D, 0x67, +0x4C, 0xA3, 0x48, 0x5A, 0x58, 0x67, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, +0x18, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x7B, 0x22, 0x7D, 0x67, 0x4C, 0xA3, +0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, +0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, +0x6F, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x47, 0x6C, 0x8E, 0xEA, 0x65, 0x2A, 0x00, 0x92, 0x4E, 0xA2, +0x0C, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x60, 0x2A, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, +0x6C, 0xEA, 0x5D, 0x22, 0x3B, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x44, 0xC4, 0x59, 0x10, 0x00, 0x92, +0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, +0x3E, 0x5A, 0x58, 0x67, 0x4D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x48, 0x22, +0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x43, 0x22, 0x7D, 0x67, 0x4C, 0xA3, 0x6F, 0x42, +0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, +0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, 0x30, 0x10, +0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x9D, 0x67, +0x4C, 0xA4, 0x34, 0x5A, 0x58, 0x67, 0x24, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x36, 0x5A, 0x58, 0x67, +0x1F, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, 0x7D, 0x67, 0x4C, 0xA3, +0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, +0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, +0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x7D, 0x67, 0x44, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, +0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, +0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x5D, 0x67, 0x6C, 0xA2, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x45, 0xC3, 0x9D, 0x67, 0x6C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x0A, 0x22, 0x7D, 0x67, 0x45, 0xA3, +0x48, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x49, 0x6A, 0x62, 0x10, 0x7D, 0x67, 0x45, 0xA3, 0x5F, 0x10, +0x01, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x46, 0xC4, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, +0x03, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x9D, 0x67, 0x45, 0xA4, 0x45, 0x5A, 0x58, 0x67, 0x4D, 0x2A, +0x7D, 0x67, 0x45, 0xA3, 0x49, 0x5A, 0x58, 0x67, 0x48, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, +0x6C, 0xEA, 0x43, 0x22, 0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, +0x46, 0xC3, 0x3B, 0x10, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6C, 0x8E, 0xEA, +0x17, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x3D, 0x5A, 0x58, 0x67, 0x2F, 0x2A, 0x7D, 0x67, 0x45, 0xA3, +0x3F, 0x5A, 0x58, 0x67, 0x2A, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x25, 0x22, +0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x1D, 0x10, +0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6C, 0x8E, 0xEA, 0x16, 0x2A, 0x7D, 0x67, +0x45, 0xA3, 0x33, 0x5A, 0x58, 0x67, 0x11, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x35, 0x5A, 0x58, 0x67, +0x0C, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x65, 0xA2, +0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x9D, 0x67, 0x46, 0xA4, 0x01, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x86, 0x67, 0x67, 0x67, 0x12, 0x92, +0xF8, 0x67, 0xDD, 0x67, 0x20, 0xF0, 0xF8, 0xC6, 0xDD, 0x67, 0x20, 0xF0, 0xBC, 0xC6, 0xFD, 0x67, +0x40, 0xF0, 0x80, 0xC7, 0x9D, 0x67, 0x40, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, +0xDD, 0x67, 0x40, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5B, 0xA2, 0xFD, 0x67, 0x40, 0xF0, +0x64, 0xA7, 0x6E, 0xEA, 0x38, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x56, 0xC4, +0xBD, 0x67, 0x40, 0xF0, 0x40, 0xA5, 0xDD, 0x67, 0x57, 0xC6, 0xFD, 0x67, 0x20, 0xF0, 0x5C, 0xA7, +0x44, 0x32, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0x84, +0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, +0x58, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0xFD, 0x67, 0x5A, 0xC7, 0x04, 0x92, 0x56, 0xA2, +0x7D, 0x67, 0x5B, 0xC3, 0x0C, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x06, 0x6A, 0xBD, 0x67, 0x51, 0xCD, +0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x04, 0x92, 0xDD, 0x67, +0x40, 0xF0, 0x64, 0xA6, 0x7B, 0xC2, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, +0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x4C, 0xC5, +0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xBD, 0x67, +0x54, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x18, 0x6A, +0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x82, 0x67, +0x00, 0x18, 0x6A, 0x0B, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4E, 0x32, 0x9D, 0x67, 0x58, 0xC4, +0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, +0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, +0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x80, 0xF0, 0x04, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x4C, 0xA3, +0x22, 0x22, 0x04, 0x92, 0x8C, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6C, 0xC2, 0x04, 0x92, +0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, +0x5D, 0x67, 0x74, 0xA2, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, +0xB9, 0x2C, 0x04, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, +0x00, 0x6B, 0x72, 0xC2, 0x41, 0x10, 0x04, 0x92, 0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x18, 0x2A, +0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, +0x0F, 0x6B, 0x8C, 0xEB, 0xB1, 0xA2, 0x10, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x71, 0xC2, +0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x06, 0x52, 0x58, 0x67, +0x12, 0x2A, 0x04, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, +0x04, 0x92, 0x7A, 0xA2, 0x04, 0x92, 0x72, 0xC2, 0x04, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x71, 0xC2, 0x03, 0x10, 0x04, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x20, 0xF0, +0x48, 0xA4, 0x82, 0x67, 0x00, 0x18, 0xD9, 0x32, 0x04, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, +0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x02, 0x6B, 0x8D, 0xEB, 0x70, 0xC2, 0x04, 0x92, 0x72, 0xA2, 0x04, 0x92, 0x90, 0xA2, 0x07, 0x6A, +0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x04, 0x92, 0x72, 0xC2, +0x01, 0x10, 0x00, 0x65, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, +0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0x90, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x74, 0xC6, +0x7D, 0x67, 0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, +0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, +0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x54, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, +0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, +0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, +0x20, 0xF0, 0x40, 0xC5, 0x05, 0x92, 0x40, 0xA2, 0xDD, 0x67, 0x5A, 0xC6, 0x05, 0x92, 0x41, 0xA2, +0x7D, 0x67, 0x5B, 0xC3, 0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xC4, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, +0xDD, 0x67, 0x7D, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, +0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x5D, 0x67, 0x20, 0xF0, 0x62, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, +0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x05, 0x92, +0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, +0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, +0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x7D, 0xA4, 0xBD, 0x67, 0x5A, 0xA5, 0x63, 0xEA, +0x58, 0x67, 0x05, 0x22, 0x7D, 0x67, 0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, +0x20, 0xF0, 0x54, 0xA5, 0x04, 0x2A, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0xAA, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x0A, 0x22, +0xDD, 0x67, 0x5D, 0xA6, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0xFF, 0x4A, +0xBD, 0x67, 0x5C, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, +0x90, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xA5, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0x19, 0x30, 0xDD, 0x67, 0x59, 0xC6, 0x7D, 0x67, 0x59, 0xA3, 0xFF, 0x6C, +0x8E, 0xEA, 0x1A, 0x22, 0xBD, 0x67, 0x59, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, +0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, +0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xC5, 0xDD, 0x67, +0x5C, 0xA6, 0xFF, 0x4A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x04, 0x2A, 0x01, 0x6A, +0xBD, 0x67, 0x58, 0xC5, 0x5E, 0x10, 0xDD, 0x67, 0x7D, 0xA6, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, +0x58, 0x67, 0x0C, 0x2A, 0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x00, 0x6A, +0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0x4B, 0x10, 0x01, 0x6A, 0x7D, 0x67, +0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x5E, 0xC4, 0x3D, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, +0x2D, 0x10, 0xDD, 0x67, 0x9D, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0xBD, 0x67, 0x20, 0xF0, +0x41, 0xA5, 0x01, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xCE, 0x2E, 0xDD, 0x67, 0x20, 0xF0, +0x43, 0xC6, 0x5D, 0x67, 0x7D, 0xA2, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x06, 0x2A, +0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x17, 0x10, 0xBD, 0x67, 0x20, 0xF0, +0x43, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x5D, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, +0x5D, 0xC4, 0xBD, 0x67, 0x5F, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5F, 0xA3, +0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x5E, 0xC4, 0xBD, 0x67, 0x7E, 0xA5, 0xDD, 0x67, 0x5C, 0xA6, 0x43, 0xEB, 0x58, 0x67, +0xBC, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x09, 0x2A, 0x00, 0x6A, +0xBD, 0x67, 0x58, 0xC5, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, +0x05, 0x92, 0xDD, 0x67, 0x20, 0xF0, 0x63, 0xA6, 0x6A, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xA3, +0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, +0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, +0x41, 0xF4, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, +0x60, 0xC2, 0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, 0x8D, 0xEB, +0x6C, 0xC2, 0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA3, 0xA3, 0xDD, 0x67, +0x78, 0xA6, 0xDD, 0x67, 0x20, 0xF0, 0x42, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, +0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, +0x50, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, +0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0x7D, 0x67, +0x20, 0xF0, 0x50, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, +0x7F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5F, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x80, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x5A, 0xC4, +0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, +0xBD, 0x67, 0x59, 0xC5, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x05, 0x92, +0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x6A, 0xC2, 0xBD, 0x67, 0x7B, 0xA5, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, +0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, +0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, +0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, +0xDD, 0x67, 0x7F, 0xA6, 0x9D, 0x67, 0x5A, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x57, 0x22, 0x5D, 0x67, +0x20, 0xF0, 0x70, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0x72, 0x30, 0xBD, 0x67, 0x58, 0xC5, 0xDD, 0x67, 0x58, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, +0x9D, 0x67, 0x58, 0x84, 0x00, 0x52, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x9D, 0x67, +0x20, 0xF0, 0x40, 0xC4, 0x6D, 0x10, 0xBD, 0x67, 0x58, 0xA5, 0xDD, 0x67, 0x5F, 0xC6, 0x00, 0x6A, +0x7D, 0x67, 0x5E, 0xC3, 0x2D, 0x10, 0xBD, 0x67, 0x9F, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x70, 0xA6, +0xBD, 0x67, 0x59, 0xA5, 0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xCE, 0x2E, 0xDD, 0x67, +0x20, 0xF0, 0x40, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0xFF, 0x6C, 0x8E, 0xEA, 0x4F, 0x2A, +0xBD, 0x67, 0x7F, 0xA5, 0xDD, 0x67, 0x5A, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x2A, 0x7D, 0x67, +0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0x00, 0x65, 0x42, 0x10, 0xBD, 0x67, 0x5F, 0xA5, +0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x5E, 0xC4, +0xBD, 0x67, 0x5E, 0xA5, 0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x32, 0x10, 0x5D, 0x67, 0x7F, 0xA2, +0x9D, 0x67, 0x5A, 0xA4, 0x6E, 0xEA, 0x1D, 0x2A, 0x05, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, +0x0C, 0x22, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x2A, 0xDD, 0x67, 0x7A, 0xA6, 0x80, 0x6A, 0x4B, 0xEA, +0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x7F, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, +0x4E, 0x10, 0xBD, 0x67, 0x5A, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xC6, 0x01, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x54, 0xC3, 0x05, 0x92, 0x9D, 0x67, 0x7A, 0xA4, 0x6A, 0xC2, 0x01, 0x10, 0x00, 0x65, +0xBD, 0x67, 0x20, 0xF0, 0x54, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x0A, 0x2A, 0x00, 0x6A, 0x7D, 0x67, +0x5D, 0xC3, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x03, 0x10, +0x01, 0x6A, 0x9D, 0x67, 0x5D, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, 0x58, 0x67, +0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, +0x6C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, 0x8D, 0xEB, 0x6C, 0xC2, +0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA0, 0xA3, 0xDD, 0x67, 0x7D, 0xA6, +0xDD, 0x67, 0x5B, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x00, 0x65, 0x0B, 0x97, +0x06, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x40, 0xA2, 0xBD, 0x67, 0x54, 0xC5, +0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, 0x6F, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x77, 0xA5, 0x7F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0x54, 0xA5, 0x63, 0xEA, 0x58, 0x67, +0x04, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x4A, 0xA2, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x57, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x7D, 0x67, 0x57, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x77, 0xA2, +0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x07, 0x97, +0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x48, 0xA3, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, +0x00, 0xD2, 0x00, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x00, 0x92, 0x8F, 0xA2, +0x7F, 0x6B, 0x8C, 0xEB, 0x6F, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, +0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x44, 0x67, 0x7D, 0x67, +0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, +0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x44, 0xA2, +0x7D, 0x67, 0x20, 0xF0, 0x46, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xA4, 0x0F, 0x5A, 0x78, 0x67, +0x7B, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF1, 0x00, 0x4A, 0x49, 0xE3, 0x40, 0x9A, +0x00, 0xEA, 0x04, 0x92, 0x1B, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, +0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, 0x8D, 0xEB, +0x6B, 0xC2, 0x6C, 0x10, 0x04, 0x92, 0x3D, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, +0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, +0x8D, 0xEB, 0x6B, 0xC2, 0x5B, 0x10, 0x04, 0x92, 0x13, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x04, 0x92, 0x33, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x9D, 0x67, +0x20, 0xF0, 0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x3A, 0x10, 0x04, 0x92, 0x0B, 0x6B, 0x67, 0xC2, 0x03, 0x6A, +0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x6B, 0xC2, 0x2C, 0x10, 0x04, 0x92, 0x47, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, +0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, +0x8D, 0xEB, 0x6B, 0xC2, 0x1B, 0x10, 0x04, 0x92, 0x23, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, +0x03, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x0A, 0x10, 0x03, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xC4, +0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x00, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xC3, 0x5C, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, +0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x5C, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0x5D, 0x67, 0x20, 0xF0, 0xA6, 0xA2, 0x5D, 0x67, 0x20, 0xF0, +0x8B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA4, 0x35, 0x91, 0xE5, 0x88, 0x34, 0xE0, 0xF7, 0x18, 0x4A, +0x49, 0xE4, 0x40, 0x9A, 0x6C, 0xEA, 0x05, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x03, 0x6B, 0x6C, 0xEA, +0x02, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, +0x05, 0x2A, 0x05, 0x93, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, +0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, 0x7D, 0x67, +0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, +0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, +0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0x9E, 0x2A, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, +0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x4A, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, +0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x08, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0xD2, +0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x07, 0x92, 0x07, 0x22, 0x20, 0x6A, 0x7D, 0x67, +0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, +0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x1F, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xC3, 0x2E, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, +0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, +0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x48, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x11, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, +0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x08, 0x92, 0x07, 0x22, 0x00, 0x6A, 0x9D, 0x67, +0x20, 0xF0, 0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x20, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x2E, 0x10, +0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, +0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, +0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x47, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x47, 0xC4, 0x11, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, +0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, +0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x60, 0xC2, 0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, +0x67, 0xA4, 0x61, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, +0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, +0x20, 0xF0, 0x48, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x07, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, +0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x0F, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, +0x20, 0xF0, 0x47, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, +0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x98, 0xA2, 0x5D, 0x67, 0x20, 0xF0, +0x69, 0xA2, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, +0xAC, 0xEA, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x04, 0x92, 0x9D, 0x67, +0x20, 0xF0, 0x64, 0xA4, 0x62, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x48, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x86, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x40, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x76, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x36, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x38, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x66, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x30, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x56, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x24, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x28, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x46, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x36, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x18, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x26, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x16, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x04, 0x5A, 0x58, 0x67, +0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x08, 0x6B, +0x8D, 0xEB, 0x70, 0xC2, 0x06, 0x10, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x70, 0xC2, 0x00, 0x18, 0xBA, 0x28, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, +0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x06, 0xD4, 0x65, 0x67, 0x46, 0x67, 0x9D, 0x67, 0x7C, 0xC4, 0x7D, 0x67, 0x20, 0xF0, +0x40, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC6, 0xF4, +0x08, 0x4B, 0x9D, 0x67, 0x5C, 0xA4, 0x48, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x01, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, +0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x02, 0xD2, 0x00, 0x92, 0x4C, 0xAA, 0x05, 0xD2, +0x00, 0x6A, 0x7D, 0x67, 0x4C, 0xC3, 0x15, 0x10, 0x9D, 0x67, 0x4C, 0xA4, 0x48, 0x32, 0x01, 0x93, +0x49, 0xE3, 0x80, 0x9A, 0x7D, 0x67, 0x4C, 0xA3, 0x02, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, +0x12, 0xEB, 0x05, 0x92, 0x69, 0xE2, 0x05, 0xD2, 0x7D, 0x67, 0x4C, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x4C, 0xC4, 0x7D, 0x67, 0x4C, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE6, 0x2A, 0x02, 0x92, 0x05, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x04, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x05, 0x93, 0x04, 0x92, 0x4B, 0xE3, 0x01, 0x10, 0x00, 0x6A, +0x05, 0xD2, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x6C, 0xCA, 0x05, 0x92, +0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x00, 0xD2, +0x30, 0xF0, 0x20, 0x6A, 0xC5, 0xF7, 0x17, 0x4A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, +0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, +0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, +0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, +0xA4, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, +0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, +0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, +0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xA4, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, +0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, +0x30, 0xF0, 0x20, 0x6A, 0xC5, 0xF7, 0x17, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, +0x00, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xC3, 0xC0, 0xF5, 0x03, 0x10, +0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, +0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0xA5, 0x82, 0x67, +0x00, 0x18, 0x6A, 0x0B, 0xA0, 0xF5, 0x03, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, +0x80, 0xF5, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, +0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x0E, 0xD2, 0x7D, 0x67, +0x40, 0xF0, 0x4B, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, +0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, +0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xF0, 0x49, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x6A, 0xA4, +0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xC5, 0x06, 0x92, 0x40, 0xA2, +0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x06, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xC4, 0x06, 0x92, 0x4F, 0xA2, +0x40, 0x6B, 0x6C, 0xEA, 0x00, 0xF4, 0x16, 0x2A, 0x0E, 0x92, 0x65, 0x5A, 0x58, 0x67, 0x1C, 0x2A, +0x06, 0x92, 0x52, 0xA2, 0x19, 0x22, 0x06, 0x92, 0x52, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x06, 0x92, 0x72, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, +0xB6, 0x23, 0x06, 0x92, 0x52, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF1, 0x08, 0x4B, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xF9, 0x13, 0x06, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x7D, 0x67, +0x40, 0xF0, 0x4B, 0xA3, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0xC6, 0xF4, +0x08, 0x4A, 0x49, 0xE3, 0x13, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0x30, 0x04, +0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x23, 0xF7, 0x50, 0xA2, 0xBD, 0x67, 0x5A, 0xCD, 0x14, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x15, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x16, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x17, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x49, 0xE3, 0x7D, 0x67, 0x58, 0xCB, 0x13, 0x93, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x58, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x59, 0xCD, +0x14, 0x93, 0x15, 0x92, 0x44, 0x32, 0x4D, 0xE3, 0x16, 0x92, 0x44, 0x34, 0x16, 0x92, 0x49, 0xE4, +0x4D, 0xE3, 0x17, 0x92, 0x48, 0x32, 0x49, 0xE3, 0x0B, 0xD2, 0x06, 0x92, 0x5C, 0xA2, 0x05, 0x5A, +0x58, 0x67, 0xE0, 0xF4, 0x00, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, +0x47, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x19, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, +0x40, 0xF0, 0x49, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xA5, 0x09, 0x22, 0x5D, 0x67, 0x20, 0xF0, +0x67, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0x06, 0x92, 0x7A, 0xA2, 0xBD, 0x67, +0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, +0x43, 0xEB, 0x58, 0x67, 0x0E, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF1, 0x5C, 0xA2, 0x6E, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, +0x0A, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0xA3, 0xF1, 0x5C, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x7D, 0x67, 0x40, 0xF0, +0x48, 0xA3, 0x07, 0x22, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x02, 0x4A, 0xBD, 0x67, 0x20, 0xF0, +0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0xFF, 0x6B, 0x4C, 0xEB, 0x1C, 0x5B, 0x78, 0x67, +0x01, 0x2B, 0x1B, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, +0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x73, 0x34, 0x7D, 0x67, +0x20, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, +0x20, 0xF0, 0x48, 0xA4, 0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x11, 0xD2, 0xBD, 0x67, +0x40, 0xF0, 0x8B, 0xA5, 0x7D, 0x67, 0x5A, 0xAB, 0x13, 0x05, 0x0E, 0x93, 0xC3, 0x67, 0xE2, 0x67, +0x00, 0x18, 0x64, 0x2E, 0x9D, 0x67, 0x20, 0xF0, 0x45, 0xC4, 0x06, 0x92, 0x56, 0xA2, 0x46, 0x33, +0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x20, 0xF0, 0x45, 0xA5, 0x46, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, +0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x76, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, +0x03, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x54, 0x9A, 0x06, 0x93, +0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x5A, 0xAB, 0x03, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, +0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0xED, 0x12, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x20, 0x6A, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x14, 0x4A, 0x82, 0x67, +0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, +0x40, 0xF0, 0x4A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x40, 0xA2, 0xBD, 0x67, +0x5C, 0xC5, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, +0x5C, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0xBE, 0x12, 0x0E, 0x92, +0x19, 0x5A, 0x58, 0x67, 0x1F, 0x22, 0x0E, 0x92, 0x1D, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x52, 0x58, 0x67, 0x15, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x78, 0x33, 0xAB, 0xA2, 0x3F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, +0x6B, 0xC2, 0x05, 0x10, 0x06, 0x92, 0x8B, 0xA2, 0x3F, 0x6B, 0x8C, 0xEB, 0x6B, 0xC2, 0x06, 0x92, +0x4B, 0xA2, 0xC0, 0x6B, 0x6C, 0xEA, 0x80, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x10, 0x2A, 0x30, 0xF0, +0x20, 0x6A, 0x41, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x9D, 0x67, 0x40, 0xF0, +0x4B, 0xA4, 0x03, 0x5A, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x40, 0x9A, +0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, +0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x17, 0x93, 0x16, 0x92, 0x4D, 0xE3, 0x15, 0x92, 0x4D, 0xE3, +0x14, 0x92, 0x4D, 0xE3, 0x0E, 0x92, 0x4A, 0x32, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x17, 0x92, +0x33, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x44, 0x9A, 0x0E, 0x94, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x48, 0x9A, 0x17, 0x94, 0xFF, 0x6B, 0x6C, 0xEC, 0x16, 0x95, +0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x15, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, +0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x14, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, +0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, +0x00, 0x18, 0x5B, 0x31, 0x00, 0x65, 0x31, 0x12, 0x9D, 0x67, 0x5A, 0xAC, 0x10, 0x22, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF1, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x40, 0xF0, +0x4B, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0x1E, 0x12, 0x13, 0x93, +0x0E, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x44, 0xC3, 0x06, 0x92, 0x6B, 0xA2, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x52, +0x58, 0x67, 0x51, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x43, 0xEB, +0x58, 0x67, 0x16, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, 0x04, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF1, 0x14, 0x4A, +0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x33, 0x10, +0x06, 0x92, 0x5A, 0xA2, 0x32, 0x5A, 0x58, 0x67, 0x15, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, +0x06, 0x92, 0x47, 0xA2, 0xFE, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF1, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, +0x44, 0xC3, 0x19, 0x10, 0x06, 0x92, 0x5A, 0xA2, 0x28, 0x5A, 0x58, 0x67, 0x14, 0x22, 0x5D, 0x67, +0x40, 0xF0, 0x69, 0xA2, 0x06, 0x92, 0x47, 0xA2, 0xFC, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0B, 0x2A, +0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, +0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, +0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF1, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x30, 0xF0, +0x20, 0x6A, 0xC1, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x9E, 0x11, 0x06, 0x92, +0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x45, 0xA2, +0xBD, 0x67, 0x40, 0xF0, 0x4A, 0xC5, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, +0xAF, 0xA2, 0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x5D, 0x67, 0x40, 0xF0, +0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, +0x01, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x68, 0x11, 0x06, 0x92, 0x4F, 0xA2, 0x18, 0x6B, +0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x46, 0xA2, 0x9D, 0x67, 0x40, 0xF0, +0x4A, 0xC4, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, +0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, 0x19, 0x6C, +0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0xBD, 0x67, 0x40, 0xF0, 0x8B, 0xA5, 0x5D, 0x67, +0x40, 0xF0, 0x6A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, 0x01, 0x6E, 0xE2, 0x67, +0x00, 0x18, 0xB9, 0x2C, 0x32, 0x11, 0x06, 0x92, 0x4C, 0xAA, 0x0F, 0xD2, 0x00, 0x6A, 0x7D, 0x67, +0x5D, 0xC3, 0x17, 0x10, 0x9D, 0x67, 0x5D, 0xA4, 0x48, 0x32, 0x04, 0x03, 0x49, 0xE3, 0x8F, 0x9A, +0xBD, 0x67, 0x5D, 0xA5, 0x11, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, 0x12, 0xEA, 0x10, 0xD2, +0x0F, 0x93, 0x10, 0x92, 0x49, 0xE3, 0x0F, 0xD2, 0x7D, 0x67, 0x5D, 0xA3, 0x01, 0x4A, 0x9D, 0x67, +0x5D, 0xC4, 0xBD, 0x67, 0x5D, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x11, 0x92, 0x05, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x0E, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x08, 0xD2, 0x0F, 0x93, 0x08, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x05, 0x22, 0x0F, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x0F, 0xD2, 0x02, 0x10, +0x00, 0x6A, 0x0F, 0xD2, 0x0F, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x6C, 0xCA, +0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x10, 0x6A, 0x6C, 0xEA, 0x7B, 0x22, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x0F, 0x2A, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, +0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0xD6, 0x10, 0x0E, 0x92, +0x65, 0x5A, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x06, 0x92, 0x76, 0xA2, 0x5D, 0x67, 0x40, 0xF0, +0x89, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x63, 0xF2, 0x44, 0xA2, +0x63, 0xEA, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, +0x00, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, +0x6B, 0xC2, 0xB3, 0x10, 0x06, 0x92, 0x76, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x03, 0xF2, 0x50, 0xA2, 0x43, 0xEB, 0x58, 0x67, +0xA0, 0xF0, 0x03, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x07, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAB, 0xA2, +0x39, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6B, 0xC2, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, +0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x52, 0x58, 0x67, 0x7D, 0x2A, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x06, 0x92, +0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x6F, 0x10, 0x9D, 0x67, 0x40, 0xF0, +0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, +0x62, 0x67, 0x0F, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, +0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF1, 0x18, 0x4A, +0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x51, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0x0F, 0x92, +0x63, 0xEA, 0x58, 0x67, 0x05, 0x2A, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x32, 0x2A, +0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x6E, 0x00, 0x18, 0x5B, 0x31, +0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF1, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x06, 0x92, +0x56, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0xB6, 0x23, 0x0F, 0x92, 0x4E, 0x33, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, 0x4E, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, +0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0xE1, 0xF1, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0xB6, 0x23, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF2, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, +0xB6, 0x23, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0xBA, 0x28, 0x30, 0xF0, +0x20, 0x6A, 0x01, 0xF2, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x40, 0xF0, +0x4B, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, 0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, +0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, +0x62, 0x67, 0xBD, 0x67, 0x5A, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, +0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, +0xBD, 0x67, 0x5A, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, +0xC2, 0xF5, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xCA, 0x0E, 0x10, +0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x9D, 0x67, 0x40, 0xF0, +0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x59, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, +0x62, 0xEA, 0x58, 0x67, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, +0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x60, 0xAA, 0xBD, 0x67, 0x59, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, +0x60, 0xCA, 0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, +0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, 0x70, 0x9A, 0x9D, 0x67, 0x58, 0xAC, +0x4F, 0xEA, 0x63, 0xEA, 0x58, 0x67, 0x10, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0xA5, 0xF4, 0x70, 0x9A, 0x9D, 0x67, 0x58, 0xAC, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0xA5, 0xF4, 0x70, 0xDA, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x01, 0x6B, 0x6B, 0xEB, 0xA5, 0xF4, 0x70, 0xDA, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, +0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, +0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0B, 0x92, 0x4B, 0xE4, 0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, +0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, +0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0x0B, 0x95, +0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, +0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x62, 0xCA, +0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, +0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x62, 0xCA, 0x9D, 0x67, +0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0E, 0x92, 0x4B, 0xE4, +0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, +0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x62, 0xAA, 0x0E, 0x95, 0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, +0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE4, 0x62, 0xCA, 0x18, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, +0x6B, 0xEB, 0x62, 0xCA, 0x09, 0x10, 0x06, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x10, 0x00, 0x65, +0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, +0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0x85, 0x00, 0x52, 0x58, 0x67, +0x3F, 0xF2, 0x16, 0x22, 0x19, 0x97, 0x0D, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, +0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x15, 0x10, +0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x9D, 0x67, 0x55, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, +0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, +0x7D, 0x67, 0x55, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x55, 0xA3, 0x04, 0x5A, +0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x56, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x21, 0xF1, 0x1C, 0x6C, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6B, +0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x28, 0x13, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x02, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x16, 0x13, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x04, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0x04, 0x13, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x08, 0x6B, 0x6E, 0xEA, 0xE0, 0xF2, +0x1D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xF1, 0x12, 0x9D, 0x67, 0x54, 0xA4, 0x02, 0x6B, +0x6E, 0xEA, 0x20, 0xF1, 0x12, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, +0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x03, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, +0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0xA5, 0x12, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x05, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, +0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, +0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, +0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x76, 0x12, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x09, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, +0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, +0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x47, 0x12, 0x9D, 0x67, +0x20, 0xF0, 0x40, 0xA4, 0x06, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x18, 0x12, 0x9D, 0x67, 0x20, 0xF0, +0x40, 0xA4, 0x0A, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xE9, 0x11, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, +0x0C, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x02, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xB9, 0x11, 0x9D, 0x67, 0x54, 0xA4, 0x03, 0x6B, +0x6E, 0xEA, 0xA0, 0xF1, 0x13, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, +0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, +0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x41, 0xF1, 0x00, 0x6C, 0x30, 0xF0, +0x20, 0x6B, 0x81, 0xF4, 0x60, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x07, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, +0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, +0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x2B, 0x11, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0B, 0x6C, 0x8E, 0xEA, +0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xC7, 0x10, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x0D, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, +0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, +0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, +0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, +0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x63, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0E, 0x6C, 0x8E, 0xEA, +0x5D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, +0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, +0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, +0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, +0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, +0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, +0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, +0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, +0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, +0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, +0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x07, 0x97, 0x04, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, +0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x2D, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, +0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, +0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x14, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, +0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, +0x9D, 0x67, 0x48, 0xA4, 0x1C, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x24, 0x5A, +0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x07, 0x6A, 0x9D, 0x67, 0x40, 0xC4, +0x29, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, +0x36, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, +0x48, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, +0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x40, 0x5A, +0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, +0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5C, 0xA2, +0x03, 0x6C, 0x8E, 0xEA, 0x4E, 0x2A, 0x7D, 0x67, 0x42, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, +0x7D, 0x67, 0x48, 0xA3, 0x9D, 0x67, 0x41, 0xC4, 0x6F, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, +0x8E, 0xEA, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, +0xF4, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, +0x41, 0xC3, 0x5A, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xD2, 0x4B, 0x30, 0xF0, 0x20, 0x6A, +0x20, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x4D, 0x10, 0x9D, 0x67, +0x42, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x48, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, 0x0D, 0x2A, 0x7D, 0x67, +0x48, 0xA3, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x14, 0x4A, 0x49, 0xE3, +0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, 0x38, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x68, 0x42, 0xDC, 0x4B, +0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, +0x2B, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x48, 0xA3, +0x9D, 0x67, 0x41, 0xC4, 0x21, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x1C, 0x2A, +0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, +0x20, 0x6A, 0x00, 0xF3, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x0C, 0x10, +0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xDC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x04, 0x4A, +0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x01, 0x63, 0x20, 0xE8, +0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD0, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, +0x5D, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0xBD, 0x67, 0x5E, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, +0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x5E, 0xA3, 0x56, 0x2A, +0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x4A, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, +0x06, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0x30, 0x22, +0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0x2B, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, +0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, +0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x61, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x0B, 0x2A, 0x7D, 0x67, +0x20, 0xF0, 0x40, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, +0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x7D, 0x67, +0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0xB0, 0x22, 0x02, 0x11, 0x7D, 0x67, 0x5E, 0xA3, +0xE0, 0xF0, 0x1E, 0x22, 0xBD, 0x67, 0x5E, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0xE0, 0xF0, 0x18, 0x22, +0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0xEC, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, +0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, +0x06, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0xC0, 0xF0, +0x11, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0xC0, 0xF0, 0x0B, 0x2A, 0xBD, 0x67, +0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x5D, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x62, 0xA5, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x23, 0xF7, 0x50, 0xA2, 0x7D, 0x67, +0x5C, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, +0x20, 0x6A, 0xC6, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x09, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, +0x00, 0x18, 0x30, 0x04, 0x7D, 0x67, 0x5E, 0xA3, 0x0F, 0x42, 0xBD, 0x67, 0x20, 0xF0, 0x82, 0xA5, +0x5D, 0x67, 0x7D, 0xA2, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x05, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, +0x64, 0x2E, 0x64, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x09, 0xE2, 0x20, 0xF0, +0x65, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x29, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, +0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, +0x09, 0x95, 0x0A, 0x93, 0x0B, 0x92, 0x0C, 0x97, 0x0D, 0x96, 0x30, 0xF0, 0x20, 0x6C, 0x41, 0xF2, +0x04, 0x4C, 0x04, 0xD7, 0x05, 0xD6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, +0x5E, 0xA3, 0xFF, 0x4A, 0x06, 0x93, 0x49, 0xE3, 0x20, 0xF0, 0x45, 0xA2, 0x30, 0xF0, 0x20, 0x6B, +0x61, 0xF2, 0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x20, 0xF0, +0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, 0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, +0x51, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x43, 0xEB, +0x58, 0x67, 0x0D, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, +0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x10, 0x10, 0x06, 0x92, +0x20, 0xF0, 0x66, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, +0x01, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, 0x7D, 0x67, +0x20, 0xF0, 0x42, 0xA3, 0x27, 0x2A, 0xBD, 0x67, 0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xCF, 0x37, 0x7D, 0x67, +0x5F, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF2, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, +0xB6, 0x23, 0xBD, 0x67, 0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0xA3, 0xF2, 0x58, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF2, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, +0x42, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0x1F, 0xF7, 0x0D, 0x22, +0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x5A, 0x58, 0x67, 0x34, 0x22, 0x5D, 0x67, 0x7E, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x30, 0xF0, 0x20, 0x6B, +0x81, 0xF2, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x7E, 0xA5, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x82, 0x67, +0x00, 0x18, 0xCF, 0x37, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xA3, 0xF2, +0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5D, 0xA2, 0x61, 0x42, +0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7D, 0xC2, +0x1A, 0x10, 0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, +0x81, 0xF2, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, +0x00, 0x6B, 0xA3, 0xF2, 0x7D, 0xC2, 0x0F, 0x97, 0x0E, 0x90, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, +0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x49, 0xA2, 0x61, 0x42, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x49, 0xA2, 0x02, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0x02, 0xF5, +0x69, 0xC2, 0x00, 0x18, 0xDF, 0x34, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, +0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x41, 0xC3, 0x80, 0x10, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, +0x18, 0x10, 0x5D, 0x67, 0x61, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, +0x48, 0x32, 0x69, 0xE2, 0xA9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, +0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x23, 0xF7, 0x70, 0xC2, +0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA5, 0xF1, 0x70, 0xC2, 0x5D, 0x67, 0x61, 0xA2, +0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x25, 0xF2, 0x70, 0xC2, +0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, +0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, +0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, +0x7D, 0x67, 0x41, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x41, 0x83, 0x00, 0x52, +0x58, 0x67, 0x7F, 0xF7, 0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, +0xA5, 0xF4, 0x70, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, +0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, +0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, +0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x20, 0xE8, +0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, +0x5D, 0x67, 0x68, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, +0x69, 0xE2, 0xA9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, +0x7D, 0x67, 0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x23, 0xF7, 0x70, 0xC2, 0x5D, 0x67, +0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, +0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, +0x40, 0xC3, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x00, 0x6B, 0xA5, 0xF1, 0x70, 0xC2, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x25, 0xF2, 0x70, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x40, 0xF1, 0x1F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, +0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x50, 0x9A, 0x49, 0xE3, +0x40, 0xA2, 0xDD, 0x67, 0x56, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x3F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, +0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, +0x6C, 0xEA, 0x56, 0x32, 0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x56, 0xA3, 0x54, 0x32, 0x62, 0x67, +0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, +0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x51, 0xA5, 0x49, 0x6E, 0xCE, 0xEA, +0x04, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0x9D, 0x67, 0x50, 0xC4, +0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x7A, 0x22, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, +0x4C, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x02, 0xF5, 0x18, 0x4B, 0x69, 0xE2, 0x60, 0xF5, 0x57, 0xA2, +0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x67, 0x22, 0x9D, 0x67, +0x55, 0xA4, 0x37, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, +0x6D, 0xE2, 0xA5, 0xF1, 0x70, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, +0x02, 0xF5, 0x18, 0x4C, 0x89, 0xE2, 0xA5, 0xF1, 0x70, 0xC2, 0xDD, 0x67, 0x76, 0xA6, 0x30, 0xF0, +0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA5, 0xF1, 0x70, 0xA2, 0x9D, 0x67, 0x56, 0xA4, +0x30, 0xF0, 0x20, 0x6C, 0x4C, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x02, 0xF5, 0x18, 0x4C, 0x89, 0xE2, +0x60, 0xF5, 0x5B, 0xA2, 0x6E, 0xEA, 0xC0, 0xF0, 0x02, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x82, 0x67, +0x01, 0x6D, 0x00, 0x18, 0xEB, 0x30, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x18, 0x77, 0x3B, +0xB9, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE2, +0x25, 0xF2, 0x70, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF5, +0x18, 0x4C, 0x89, 0xE2, 0x25, 0xF2, 0x70, 0xC2, 0x9D, 0x67, 0x76, 0xA4, 0x30, 0xF0, 0x20, 0x6A, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x25, 0xF2, 0x50, 0xA2, 0xBD, 0x67, 0x70, 0xA5, 0x6E, 0xEA, +0x80, 0xF0, 0x17, 0x2A, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xEB, 0x30, +0x7D, 0x67, 0x56, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x77, 0x3B, 0x8C, 0x10, 0x9D, 0x67, 0x55, 0xA4, +0xFF, 0x6B, 0x4C, 0xEB, 0x05, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x04, 0x6A, 0x7D, 0x67, 0x55, 0xC3, +0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, +0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, +0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, +0xA1, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, +0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0xD5, 0xA5, 0x5D, 0x67, 0x96, 0xA2, +0xBD, 0x67, 0xF5, 0xA5, 0x30, 0xF0, 0x20, 0x6D, 0x44, 0x67, 0x48, 0x32, 0x89, 0xE2, 0xE9, 0xE2, +0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x34, 0x45, 0x67, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x80, 0x9A, +0xBD, 0x67, 0x54, 0xA5, 0x51, 0xE4, 0x30, 0xF0, 0x20, 0x6D, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, +0xC9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x45, 0x67, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, +0x80, 0xDA, 0xDD, 0x67, 0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, +0x18, 0x4A, 0x49, 0xE3, 0x23, 0xF7, 0x70, 0xA2, 0xBD, 0x67, 0x53, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, +0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x23, 0xF7, 0x70, 0xC2, +0xDD, 0x67, 0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, +0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0xDD, 0x67, 0xB4, 0xA6, 0xDD, 0x67, +0x53, 0xA6, 0x49, 0xE5, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4C, 0x88, 0x34, +0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, +0x01, 0x10, 0x00, 0x65, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x01, 0x14, 0x00, 0x00, +0xEC, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +u32 array_length_mp_8814a_fw_nic = 66904; + + +#endif // end of DM_ODM_SUPPORT_TYPE & (ODM_AP) + + +#endif // end of HWIMG_SUPPORT + diff --git a/hal/rtl8814a/rtl8814a_cmd.c b/hal/rtl8814a/rtl8814a_cmd.c new file mode 100644 index 0000000..6aa1fda --- /dev/null +++ b/hal/rtl8814a/rtl8814a_cmd.c @@ -0,0 +1,1515 @@ +/****************************************************************************** + * + * 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 _RTL8814A_CMD_C_ + +//#include +#include + +#define CONFIG_H2C_EF + +#define RTL8814_MAX_H2C_BOX_NUMS 4 +#define RTL8814_MAX_CMD_LEN 7 +#define RTL8814_MESSAGE_BOX_SIZE 4 +#define RTL8814_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; + + /* RTW_INFO(" _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; + else + rtw_msleep_os(1); + } while ((!read_down) && (retry_cnts--)); + + return read_down; + +} + + +/***************************************** +* H2C Msg format : +* 0x1DF - 0x1D0 +*| 31 - 8 | 7-5 4 - 0 | +*| h2c_msg |Class_ID CMD_ID | +* +* Extend 0x1FF - 0x1F0 +*|31 - 0 | +*|ext_msg| +******************************************/ +s32 FillH2CCmd_8814(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) +{ + u8 h2c_box_num; + u32 msgbox_addr; + u32 msgbox_ex_addr=0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 cmd_idx,ext_cmd_len; + u32 h2c_cmd = 0; + u32 h2c_cmd_ex = 0; + s32 ret = _FAIL; + + + padapter = GET_PRIMARY_ADAPTER(padapter); + pHalData = GET_HAL_DATA(padapter); + + + if (pHalData->bFWReady == _FALSE) { + /* RTW_INFO("fill_h2c_cmd_8812(): return H2C cmd because fw is not ready\n"); */ + return ret; + } + + _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); + + + if (!pCmdBuffer) + goto exit; + if (CmdLen > RTL8814_MAX_CMD_LEN) + goto exit; + if (rtw_is_surprise_removed(padapter)) + 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)) { + RTW_INFO(" fw read cmd failed...\n"); + goto exit; + } + + *(u8 *)(&h2c_cmd) = ElementID; + + if(CmdLen<=3) + { + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); + } + else{ + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer,3); + ext_cmd_len = CmdLen-3; + _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3,ext_cmd_len ); + + //Write Ext command + msgbox_ex_addr = REG_HMEBOX_EXT0_8814A + (h2c_box_num *RTL8814_EX_MESSAGE_BOX_SIZE); + #ifdef CONFIG_H2C_EF + for(cmd_idx=0;cmd_idxh2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + //,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); + + pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL8814_MAX_H2C_BOX_NUMS; + + }while(0); + + ret = _SUCCESS; + +exit: + + _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); + + return ret; +} + +u8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param) +{ + u8 res=_SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); + + FillH2CCmd_8814(padapter, H2C_RSSI_SETTING, 4, param); + + return res; +} + +void rtl8814_fw_update_beacon_cmd(_adapter *padapter) +{ + u8 param[2] = {0}; + u16 txpktbuf_bndy; + + SET_8814A_H2CCMD_BCNHWSEQ_EN(param, 1); + SET_8814A_H2CCMD_BCNHWSEQ_BCN_NUMBER(param, 0); + SET_8814A_H2CCMD_BCNHWSEQ_HWSEQ(param, 1); + SET_8814A_H2CCMD_BCNHWSEQ_EXHWSEQ(param, 0); + SET_8814A_H2CCMD_BCNHWSEQ_PAGE(param, 0); + if (GET_HAL_DATA(padapter)->firmware_version < 23) + /* FW v21, v22 use H2C_BCNHWSEQ = 0xC2 */ + FillH2CCmd_8814(padapter, 0xC2, 2, param); + else + FillH2CCmd_8814(padapter, H2C_BCNHWSEQ, 2, param); + + /*RTW_INFO("%s, %d, correct beacon HW sequence, FirmwareVersion=%d, H2C_BCNHWSEQ=%d\n", __func__, __LINE__, GET_HAL_DATA(padapter)->firmware_version, H2C_BCNHWSEQ);*/ + +} + +static u8 Get_VHT_ENI( + u32 IOTAction, + u32 WirelessMode, + u32 ratr_bitmap + ) +{ + u8 Ret = 0; + + if(WirelessMode == WIRELESS_11_24AC) + { + if(ratr_bitmap & 0xfff00000) // Mix , 2SS + Ret = 3; + else // Mix, 1SS + Ret = 2; + } + else if(WirelessMode == WIRELESS_11_5AC) + { + Ret = 1; // VHT + } + + return (Ret << 4); +} + +BOOLEAN +Get_RA_ShortGI_8814( + PADAPTER Adapter, + struct sta_info *psta, + u8 shortGIrate, + u32 ratr_bitmap +) +{ + BOOLEAN bShortGI; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + bShortGI = shortGIrate; + +#ifdef CONFIG_80211AC_VHT + if( bShortGI && + is_supported_vht(psta->wireless_mode) && + (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) && + TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX) + ) + { + if(ratr_bitmap & 0xC0000000) + bShortGI = _FALSE; + } +#endif //CONFIG_80211AC_VHT + + return bShortGI; +} + + +void +Set_RA_LDPC_8814( + struct sta_info *psta, + BOOLEAN bLDPC + ) +{ + if(psta == NULL) + return; +#ifdef CONFIG_80211AC_VHT + if(psta->wireless_mode == WIRELESS_11_5AC) + { + if(bLDPC && TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) + SET_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); + else + CLEAR_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); + } + else if(is_supported_ht(psta->wireless_mode) || is_supported_vht(psta->wireless_mode)) + { + if(bLDPC && TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) + SET_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); + else + CLEAR_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); + } + + update_ldpc_stbc_cap(psta); +#endif //CONFIG_80211AC_VHT + + //RTW_INFO("MacId %d bLDPC %d\n", psta->mac_id, bLDPC); +} + + +u8 +Get_RA_LDPC_8814( + struct sta_info *psta +) +{ + u8 bLDPC = 0; + + if (psta != NULL) { + if(psta->cmn.mac_id == 1) { + bLDPC = 0; + } else { +#ifdef CONFIG_80211AC_VHT + if(is_supported_vht(psta->wireless_mode)) + { + if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) + bLDPC = 1; + else + bLDPC = 0; + } + else if(is_supported_ht(psta->wireless_mode)) + { + if(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) + bLDPC =1; + else + bLDPC =0; + } + else +#endif + bLDPC = 0; + } + } + + return (bLDPC << 2); +} + + +void rtl8814_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode) +{ + u8 u1H2CSetPwrMode[H2C_PWRMODE_LEN]={0}; + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + u8 Mode = 0, RLBM = 0, PowerState = 0, LPSAwakeIntvl = 2, pwrModeByte5 = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 allQueueUAPSD = 0; + + + RTW_INFO("%s: Mode=%d SmartPS=%d\n", __FUNCTION__, PSMode, pwrpriv->smart_ps); + + switch (PSMode) { + case PS_MODE_ACTIVE: + Mode = 0; + break; + case PS_MODE_MIN: + Mode = 1; + break; + case PS_MODE_MAX: + RLBM = 1; + Mode = 1; + break; + case PS_MODE_DTIM: + RLBM = 2; + Mode = 1; + break; + case PS_MODE_UAPSD_WMM: + Mode = 2; + break; + default: + Mode = 0; + break; + } + + if (Mode > PS_MODE_ACTIVE) + { +#ifdef CONFIG_BT_COEXIST + if ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) && (_TRUE == pHalData->EEPROMBluetoothCoexist)) + { + PowerState = rtw_btcoex_RpwmVal(padapter); + pwrModeByte5 = rtw_btcoex_LpsVal(padapter); + } + else +#endif // CONFIG_BT_COEXIST + { + PowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00) + pwrModeByte5 = 0x40; + } + +#ifdef CONFIG_EXT_CLK + Mode |= BIT(7);//supporting 26M XTAL CLK_Request feature. +#endif //CONFIG_EXT_CLK + } + else + { + PowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00) + pwrModeByte5 = 0x40; + } + + // 0: Active, 1: LPS, 2: WMMPS + SET_8814A_H2CCMD_PWRMODE_PARM_MODE(u1H2CSetPwrMode, Mode); + + // 0:Min, 1:Max , 2:User define + SET_8814A_H2CCMD_PWRMODE_PARM_RLBM(u1H2CSetPwrMode, RLBM); + + /* (LPS) smart_ps: 0: PS_Poll, 1: PS_Poll , 2: NullData */ + /* (WMM)smart_ps: 0:PS_Poll, 1:NullData */ + SET_8814A_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CSetPwrMode, pwrpriv->smart_ps); + + // AwakeInterval: Unit is beacon interval, this field is only valid in PS_DTIM mode + SET_8814A_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CSetPwrMode, LPSAwakeIntvl); + + /* (WMM only)bAllQueueUAPSD */ + SET_8814A_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CSetPwrMode, allQueueUAPSD); + + /* AllON(0x0C), RFON(0x04), RFOFF(0x00) */ + SET_8814A_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, PowerState); + + //SET_8814A_H2CCMD_PWRMODE_PARM_BYTE5(u1H2CSetPwrMode, pwrModeByte5); + +#ifdef CONFIG_BT_COEXIST + if (_TRUE == pHalData->EEPROMBluetoothCoexist) + rtw_btcoex_RecordPwrMode(padapter, u1H2CSetPwrMode, sizeof(u1H2CSetPwrMode)); +#endif /* CONFIG_BT_COEXIST */ + //RTW_INFO("u1H2CSetPwrMode="MAC_FMT"\n", MAC_ARG(u1H2CSetPwrMode)); + FillH2CCmd_8814(padapter, H2C_SET_PWR_MODE, sizeof(u1H2CSetPwrMode), u1H2CSetPwrMode); + +} + +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}; + + + //RTW_INFO("%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, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + /* pmlmeext->mgnt_seq++; */ + set_frame_sub_type(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) + { + //RTW_INFO("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) + { + RTW_INFO("beacon frame too large\n"); + return; + } + + *pLength = pktlen; + + //RTW_INFO("%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); + + /* RTW_INFO("%s\n", __FUNCTION__); */ + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + /* Frame control. */ + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetPwrMgt(fctrl); + set_frame_sub_type(pframe, WIFI_PSPOLL); + + /* AID. */ + set_duration(pframe, (pmlmeinfo->aid | 0xc000)); + + /* BSSID. */ + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + /* TA. */ + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), 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); + + + //RTW_INFO("%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, adapter_mac_addr(padapter), 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, adapter_mac_addr(padapter), ETH_ALEN); + break; + case Ndis802_11IBSS: + default: + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), 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; + + set_frame_sub_type(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 { + set_frame_sub_type(pframe, WIFI_DATA_NULL); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + } + + *pLength = pktlen; +} + +void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) +{ + struct rtw_ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u8 *mac, *bssid; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + + //RTW_INFO("%s\n", __FUNCTION__); + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + mac = adapter_mac_addr(padapter); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + set_frame_sub_type(fctrl, WIFI_PROBERSP); + + pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += pktlen; + + if(cur_network->IELength>MAX_IE_SZ) + return; + + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pktlen += cur_network->IELength; + + *pLength = pktlen; +} + +#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; + /* RTW_INFO("%s:%d\n", __FUNCTION__, bForcePowerSave); */ + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &pwlanhdr->frame_ctl; + *(fctrl) = 0; + + /* ------------------------------------------------------------------------- */ + /* MAC Header. */ + /* ------------------------------------------------------------------------- */ + SetFrameType(fctrl, WIFI_DATA); + /* set_frame_sub_type(fctrl, 0); */ + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + set_duration(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 */ + +/* + * Description: Get the reserved page number in Tx packet buffer. + * Retrun value: the page number. + * 2012.08.09, by tynli. + * */ +u8 +GetTxBufferRsvdPageNum8814(_adapter *Adapter, bool bWoWLANBoundary) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 RsvdPageNum=0; + u16 TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8814A; // default reseved 1 page for the IC type which is undefined. + + if(bWoWLANBoundary) + { + rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN, (u8 *)&TxPageBndy); + } + else + { + rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy); + } + + RsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8814A -TxPageBndy + 1; + + return RsvdPageNum; +} + + +void rtl8814_set_FwJoinBssReport_cmd(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); + BOOLEAN bSendBeacon=_FALSE; + BOOLEAN bcn_valid = _FALSE; + u8 DLBcnCount=0; + u32 poll = 0; + u8 RegFwHwTxQCtrl; + + RTW_INFO("%s mstatus(%x)\n", __FUNCTION__,mstatus); + + if(mstatus == 1) + { + // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. + // Suggested by filen. Added by tynli. + rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); + // Do not set TSF again here or vWiFi beacon DMA INT will not work. + //correct_TSF(padapter, pmlmeext); + // Hw sequende enable by dedault. 2010.06.23. by tynli. + //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); + //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); + + //Set REG_CR bit 8. DMA beacon by SW. + rtw_write8(padapter, REG_CR+1, rtw_read8(padapter, REG_CR + 1) | BIT0); + + /*RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(padapter, REG_CR));*/ + + // Disable Hw protection for a time which revserd for Hw sending beacon. + // Fix download reserved page packet fail that access collision with the protection time. + // 2010.05.11. Added by tynli. + //SetBcnCtrlReg(padapter, 0, BIT3); + //SetBcnCtrlReg(padapter, BIT4, 0); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); + RegFwHwTxQCtrl = rtw_read8(padapter, REG_FWHW_TXQ_CTRL + 2); + + if(RegFwHwTxQCtrl&BIT6) + { + RTW_INFO("HalDownloadRSVDPage(): There is an Adapter is sending beacon.\n"); + bSendBeacon = _TRUE; + } + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + RegFwHwTxQCtrl &= (~BIT6); + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, RegFwHwTxQCtrl); + + + // Clear beacon valid check bit. + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); + DLBcnCount = 0; + poll = 0; + do + { + // download rsvd page. + rtw_hal_set_fw_rsvd_page(padapter, _FALSE); + 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 && !RTW_CANNOT_RUN(padapter)); + + } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter)); + + //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage88ES(): 1 Download RSVD page failed!\n")); + if (RTW_CANNOT_RUN(padapter)) + ; + else if(!bcn_valid) + RTW_INFO(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; + RTW_INFO(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n", + ADPT_ARG(padapter), DLBcnCount, poll); + } + // + // We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower) + // becuase we need to free the Tx BCN Desc which is used by the first reserved page packet. + // At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return + // the beacon TCB in the following code. 2011.11.23. by tynli. + // + //if(bcn_valid && padapter->bEnterPnpSleep) + if(0) + { + if(bSendBeacon) + { + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); + DLBcnCount = 0; + poll = 0; + do + { + //SetFwRsvdPagePkt_8812(padapter, _TRUE); + rtw_hal_set_fw_rsvd_page(padapter, _TRUE); + 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 && !RTW_CANNOT_RUN(padapter)); + } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter)); + + //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage(): 2 Download RSVD page failed!\n")); + if (RTW_CANNOT_RUN(padapter)) + ; + else if(!bcn_valid) + RTW_INFO("%s: 2 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); + else + RTW_INFO("%s: 2 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); + } + } + + // Enable Bcn + //SetBcnCtrlReg(padapter, BIT3, 0); + //SetBcnCtrlReg(padapter, 0, BIT4); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); + + + // To make sure that if there exists an adapter which would like to send beacon. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause + // the beacon cannot be sent by HW. + // 2010.06.23. Added by tynli. + if(bSendBeacon) + { + RegFwHwTxQCtrl |= BIT6; + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, RegFwHwTxQCtrl); + + } + + // + // Update RSVD page location H2C to Fw. + // + if(bcn_valid) + { + rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); + RTW_INFO("Set RSVD page location to Fw.\n"); + //FillH2CCmd88E(Adapter, H2C_88E_RSVDPAGE, H2C_RSVDPAGE_LOC_LENGTH, pMgntInfo->u1RsvdPageLoc); + } + + // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. + //if(!padapter->bEnterPnpSleep) + { +#ifndef RTL8814AE_SW_BCN + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + rtw_write8(padapter, REG_CR+1, rtw_read8(padapter, REG_CR + 1)&~(BIT0)); + /*RTW_INFO("%s-%d: disable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(padapter, REG_CR));*/ +#endif + } + } +} + +#ifdef CONFIG_P2P_PS +void rtl8814_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 ); + u8 *p2p_ps_offload = (u8 *)&pHalData->p2p_ps_offload; + u8 i; + +#if 1 + switch(p2p_ps_state) + { + case P2P_PS_DISABLE: + RTW_INFO("P2P_PS_DISABLE \n"); + _rtw_memset(p2p_ps_offload, 0, 1); + break; + case P2P_PS_ENABLE: + RTW_INFO("P2P_PS_ENABLE \n"); + // update CTWindow value. + if( pwdinfo->ctwindow > 0 ) + { + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(p2p_ps_offload, 1); + rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); + } + + // hw only support 2 set of NoA + for( i=0 ; inoa_num ; i++) + { + // To control the register setting for which NOA + rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); + if(i == 0) { + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(p2p_ps_offload, 1); + } else { + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(p2p_ps_offload, 1); + } + + // config P2P NoA Descriptor Register + //RTW_INFO("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); + rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); + + //RTW_INFO("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); + rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); + + //RTW_INFO("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); + rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); + + //RTW_INFO("%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: reg 0x5F0 + rtw_write8(padapter, REG_P2P_RST_8814A, BIT(0)); //rst p2p 0 circuit NOA 0 + + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ENABLE(p2p_ps_offload, 1); + + if(pwdinfo->role == P2P_ROLE_GO) + { + // 1: Owner, 0: Client + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 1); + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(p2p_ps_offload, 0); + } + else + { + // 1: Owner, 0: Client + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 0); + } + + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); + } + break; + case P2P_PS_SCAN: + RTW_INFO("P2P_PS_SCAN \n"); + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 1); + break; + case P2P_PS_SCAN_DONE: + RTW_INFO("P2P_PS_SCAN_DONE \n"); + SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); + pwdinfo->p2p_ps_state = P2P_PS_ENABLE; + break; + default: + break; + } + + RTW_INFO("P2P_PS_OFFLOAD : %x\n", p2p_ps_offload[0]); + FillH2CCmd_8814(padapter, H2C_P2P_PS_OFFLOAD, 1, p2p_ps_offload); +#endif + +} +#endif //CONFIG_P2P + +#ifdef CONFIG_TSF_RESET_OFFLOAD +/* + ask FW to Reset sync register at Beacon early interrupt +*/ +u8 rtl8814_reset_tsf(_adapter *padapter, u8 reset_port ) +{ + u8 buf[2]; + u8 res=_SUCCESS; + + s32 ret; + + if (IFACE_PORT0==reset_port) { + buf[0] = 0x1; buf[1] = 0; + } else{ + buf[0] = 0x0; buf[1] = 0x1; + } + + ret = FillH2CCmd_8814(padapter, H2C_RESET_TSF, 2, buf); + + return res; +} + +int reset_tsf(PADAPTER Adapter, u8 reset_port ) +{ + u8 reset_cnt_before = 0, reset_cnt_after = 0, loop_cnt = 0; + u32 reg_reset_tsf_cnt = (IFACE_PORT0==reset_port) ? + REG_FW_RESET_TSF_CNT_0:REG_FW_RESET_TSF_CNT_1; + u32 reg_bcncrtl = (IFACE_PORT0==reset_port) ? + REG_BCN_CTRL_1:REG_BCN_CTRL; + + rtw_scan_abort(Adapter->pbuddy_adapter); /* site survey will cause reset_tsf fail */ + reset_cnt_after = reset_cnt_before = rtw_read8(Adapter,reg_reset_tsf_cnt); + rtl8814_reset_tsf(Adapter, reset_port); + + while ((reset_cnt_after == reset_cnt_before ) && (loop_cnt < 10)) { + rtw_msleep_os(100); + loop_cnt++; + reset_cnt_after = rtw_read8(Adapter, reg_reset_tsf_cnt); + } + + return(loop_cnt >= 10) ? _FAIL : _TRUE; +} + + +#endif // CONFIG_TSF_RESET_OFFLOAD + +static void rtl8814_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) +{ + u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0}; + + RTW_INFO("8812au/8821/8811 RsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\n", + rsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll, + rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull, + rsvdpageloc->LocBTQosNull); + + SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp); + SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll); + SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData); + SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull); + SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull); + + RTW_INFO_DUMP("u1H2CRsvdPageParm:", u1H2CRsvdPageParm, H2C_RSVDPAGE_LOC_LEN); + FillH2CCmd_8814(padapter, H2C_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm); +} + +#ifdef CONFIG_WOWLAN +static void rtl8814_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}; + + RTW_INFO("8192EAOACRsvdPageLoc: 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); + +#ifdef CONFIG_PNO_SUPPORT + RTW_INFO("NLO_INFO=%d\n", rsvdpageloc->LocPNOInfo); +#endif + 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 + } else { +#ifdef CONFIG_PNO_SUPPORT + if(!pwrpriv->pno_in_resume) { + SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocPNOInfo); + } +#endif + } + + RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CAoacRsvdPageParm:", u1H2CAoacRsvdPageParm, H2C_AOAC_RSVDPAGE_LOC_LEN); + FillH2CCmd_8814(padapter, H2C_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm); + +#ifdef CONFIG_PNO_SUPPORT + if (!check_fwstate(pmlmepriv, WIFI_AP_STATE) && + !check_fwstate(pmlmepriv, _FW_LINKED) && + pwrpriv->pno_in_resume == _FALSE) { + + res = rtw_read8(padapter, 0x1b8); + while(res == 0 && count < 25) { + RTW_INFO("[%d] FW loc_NLOInfo: %d\n", count, res); + res = rtw_read8(padapter, 0x1b8); + count++; + rtw_msleep_os(2); + } + } +#endif // CONFIG_PNO_SUPPORT +#endif // CONFIG_WOWLAN +} +#endif + + +int rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct submit_ctx *iqk_sctx = &pHalData->iqk_sctx; + + iqk_sctx->submit_time = rtw_get_current_time(); + iqk_sctx->timeout_ms = timeout_ms; + iqk_sctx->status = RTW_SCTX_SUBMITTED; + + return rtw_sctx_wait(iqk_sctx, __func__); +} + +void rtl8814_iqk_done(_adapter* padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct submit_ctx *iqk_sctx = &pHalData->iqk_sctx; + + rtw_sctx_done(&iqk_sctx); +} + +static VOID +C2HTxBeamformingHandler_8814( + IN PADAPTER Adapter, + IN u8* CmdBuf, + IN u8 CmdLen +) +{ +#ifdef CONFIG_BEAMFORMING +#if (BEAMFORMING_SUPPORT == 1) + u8 status = CmdBuf[0] & BIT0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_struct * pDM_Odm = &pHalData->odmpriv; + /*Beamforming_CheckSoundingSuccess(Adapter, status);*/ + phydm_beamforming_end_sw(pDM_Odm, status); +#endif/*(BEAMFORMING_SUPPORT == 1)*/ +#endif /*CONFIG_BEAMFORMING*/ +} + +static VOID +C2HTxFeedbackHandler_8814( + IN PADAPTER Adapter, + IN u8 *CmdBuf, + IN u8 CmdLen +) +{ +#ifdef CONFIG_XMIT_ACK + if (GET_8814A_C2H_TX_RPT_RETRY_OVER(CmdBuf) | GET_8814A_C2H_TX_RPT_LIFE_TIME_OVER(CmdBuf)) { + rtw_ack_tx_done(&Adapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL); + } else { + rtw_ack_tx_done(&Adapter->xmitpriv, RTW_SCTX_DONE_SUCCESS); + } +#endif +} + +s32 c2h_handler_8814a(_adapter *adapter, u8 id, u8 seq, u8 plen, u8 *payload) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //struct dm_struct * pDM_Odm = &pHalData->odmpriv; + s32 ret = _SUCCESS; + + switch (id) { + case C2H_DBG: + RTW_INFO("[C2H], C2H_DBG!!\n"); + break; + + case C2H_TXBF: + RTW_INFO("[C2H], C2H_TXBF!!\n"); + C2HTxBeamformingHandler_8814(adapter, payload, plen); + break; + + case C2H_CCX_TX_RPT: + C2HTxFeedbackHandler_8814(adapter, payload, plen); + break; + default: + ret = _FAIL; + break; + } + + return ret; +} + +#ifdef CONFIG_BT_COEXIST + +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 = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bssid[ETH_ALEN]; + + /* RTW_INFO("%s:%d\n", __FUNCTION__, bForcePowerSave); */ + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + if (NULL == StaAddr) { + _rtw_memcpy(bssid, adapter_mac_addr(padapter), 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, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); + + set_duration(pwlanhdr, 0); + SetSeqNum(pwlanhdr, 0); + + if (bQoS == _TRUE) { + struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; + + set_frame_sub_type(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 { + set_frame_sub_type(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; + struct pwrctrl_priv *pwrctl; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u32 BeaconLength = 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 = PAGE_SIZE_TX_8814; + u32 TotalPacketLen, MaxRsvdPageBufSize = 0; + RSVDPAGE_LOC RsvdPageLoc; + + pHalData = GET_HAL_DATA(padapter); + + pxmitpriv = &padapter->xmitpriv; + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &pmlmeext->mlmext_info; + pwrctl = adapter_to_pwrctl(padapter); + + //RsvdPageNum = BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B; + + RsvdPageNum = BCNQ_PAGE_NUM_8814; + MaxRsvdPageBufSize = RsvdPageNum*PageSize; + + pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv); + if (pcmdframe == NULL) { + RTW_INFO("%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(TxDescLen + BeaconLength, PageSize); + + /* 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 third page *;RESERV 2 PAGES for TxBF NDPA */ + if (BufIndex < (MaxRsvdPageBufSize - PageSize)) { + BufIndex = TxDescOffset + (MaxRsvdPageBufSize - PageSize); + TotalPageNum = BCNQ_PAGE_NUM_8814-1; + + } + + /* 3 (6) BT Qos null data */ + RsvdPageLoc.LocBTQosNull = TotalPageNum; + ConstructBtNullFunctionData( + padapter, + &ReservedPagePacket[BufIndex], + &BTQosNullLength, + NULL, + _TRUE, 0, 0, _FALSE); + rtl8814a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE, _FALSE); + + //RTW_INFO("%s(): HW_VAR_SET_TX_CMD: BT QOS NULL DATA %p %d\n", + // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (BTQosNullLength+TxDescLen)); + + CurtPktPageNum = (u8)PageNum(TxDescLen + BTQosNullLength,PageSize); + + TotalPageNum += CurtPktPageNum; + + TotalPacketLen = BufIndex + BTQosNullLength; + if(TotalPacketLen > MaxRsvdPageBufSize) + { + RTW_INFO("%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 = QSLT_BEACON; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset; +#ifdef CONFIG_PCI_HCI + dump_mgntframe(padapter, pcmdframe); +#else + dump_mgntframe_and_wait(padapter, pcmdframe, 100); +#endif + } + + RTW_INFO("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum); + if(check_fwstate(pmlmepriv, _FW_LINKED)) { + rtl8814_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc); + #ifdef CONFIG_WOWLAN + rtl8814_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc); + #endif + } + + return; + +error: + + rtw_free_xmitframe(pxmitpriv, pcmdframe); +} + + +void rtl8812a_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter) +{ + 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 bRecover = _FALSE; + BOOLEAN bcn_valid = _FALSE; + u8 DLBcnCount=0; + u32 poll = 0; + u8 val8; + u8 v8; + + RTW_INFO("+" FUNC_ADPT_FMT ": iface_type=%d", + FUNC_ADPT_ARG(padapter), get_iface_type(padapter)); + + // 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 &= ~BIT(3); + val8 |= BIT(4); + 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 + { + 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, (u8*)(&bcn_valid)); + poll++; + } while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter)); + + } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter)); + + if (RTW_CANNOT_RUN(padapter)) + ; + else if(!bcn_valid) + RTW_INFO(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; + RTW_INFO(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 |= BIT(3); + val8 &= ~BIT(4); + 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. +#ifndef RTL8814AE_SW_BCN + v8 = rtw_read8(padapter, REG_CR+1); + v8 &= ~BIT(0); // ~ENSWBCN + rtw_write8(padapter, REG_CR+1, v8); +#endif + +} + +#endif // CONFIG_BT_COEXIST + diff --git a/hal/rtl8814a/rtl8814a_dm.c b/hal/rtl8814a/rtl8814a_dm.c new file mode 100644 index 0000000..e90a135 --- /dev/null +++ b/hal/rtl8814a/rtl8814a_dm.c @@ -0,0 +1,420 @@ +/****************************************************************************** + * + * 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 + * + * + ******************************************************************************/ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ +#define _RTL8814A_DM_C_ + +//============================================================ +// include files +//============================================================ +//#include +#include + +//============================================================ +// Global var +//============================================================ + + +static VOID +dm_CheckProtection( + IN PADAPTER Adapter + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte CurRate, RateThreshold; + + if(pMgntInfo->pHTInfo->bCurBW40MHz) + RateThreshold = MGN_MCS1; + else + RateThreshold = MGN_MCS3; + + if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) + { + pMgntInfo->bDmDisableProtect = TRUE; + DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } + else + { + pMgntInfo->bDmDisableProtect = FALSE; + DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } +#endif +} + +#ifdef CONFIG_SUPPORT_HW_WPS_PBC +static void dm_CheckPbcGPIO(_adapter *padapter) +{ + u8 tmp1byte; + u8 bPbcPressed = _FALSE; + + if(!padapter->registrypriv.hw_wps_pbc) + return; + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + + tmp1byte = rtw_read8(padapter, REG_GPIO_EXT_CTRL_8814A); + //DBG_871X("CheckPbcGPIO - %x\n", tmp1byte); + + if (tmp1byte == 0xff) + return ; + else if (tmp1byte & BIT3) + { + // Here we only set bPbcPressed to TRUE. After trigger PBC, the variable will be set to FALSE + DBG_871X("CheckPbcGPIO - PBC is pressed\n"); + bPbcPressed = _TRUE; + } + +#endif + + if (_TRUE == bPbcPressed) { + /* Here we only set bPbcPressed to true */ + /* After trigger PBC, the variable will be set to false */ + RTW_INFO("CheckPbcGPIO - PBC is pressed\n"); + + rtw_request_wps_pbc_event(padapter); + } +} +#endif /* #ifdef CONFIG_SUPPORT_HW_WPS_PBC */ + +#ifdef CONFIG_PCI_HCI +/* + * Description: + * Perform interrupt migration dynamically to reduce CPU utilization. + * + * Assumption: + * 1. Do not enable migration under WIFI test. + * + * Created by Roger, 2010.03.05. + * */ +VOID +dm_InterruptMigration( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bCurrentIntMt, bCurrentACIntDisable; + BOOLEAN IntMtToSet = _FALSE; + BOOLEAN ACIntToSet = _FALSE; + + + /* Retrieve current interrupt migration and Tx four ACs IMR settings first. */ + bCurrentIntMt = pHalData->bInterruptMigration; + bCurrentACIntDisable = pHalData->bDisableTxInt; + + /* */ + /* Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics */ + /* when interrupt migration is set before. 2010.03.05. */ + /* */ + if (!Adapter->registrypriv.wifi_spec && + (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) { + IntMtToSet = _TRUE; + + /* To check whether we should disable Tx interrupt or not. */ + if (pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic) + ACIntToSet = _TRUE; + } + + /* Update current settings. */ + if (bCurrentIntMt != IntMtToSet) { + RTW_INFO("%s(): Update interrrupt migration(%d)\n", __FUNCTION__, IntMtToSet); + if (IntMtToSet) { + /* */ + /* Set interrrupt migration timer and corresponging Tx/Rx counter. */ + /* timer 25ns*0xfa0=100us for 0xf packets. */ + /* 2010.03.05. */ + /* */ + rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);/* 0x306:Rx, 0x307:Tx */ + pHalData->bInterruptMigration = IntMtToSet; + } else { + /* Reset all interrupt migration settings. */ + rtw_write32(Adapter, REG_INT_MIG, 0); + pHalData->bInterruptMigration = IntMtToSet; + } + } + +#if 0 + if (bCurrentACIntDisable != ACIntToSet) { + RTW_INFO("%s(): Update AC interrrupt(%d)\n", __FUNCTION__, ACIntToSet); + if (ACIntToSet) { /* Disable four ACs interrupts. */ + /* */ + /* Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. */ + /* When extremely highly Rx OK occurs, we will disable Tx interrupts. */ + /* 2010.03.05. */ + /* */ + UpdateInterruptMask8192CE(Adapter, 0, RT_AC_INT_MASKS); + pHalData->bDisableTxInt = ACIntToSet; + } else { /* Enable four ACs interrupts. */ + UpdateInterruptMask8192CE(Adapter, RT_AC_INT_MASKS, 0); + pHalData->bDisableTxInt = ACIntToSet; + } + } +#endif + +} + +#endif + +/* + * Initialize GPIO setting registers + * */ +static void +dm_InitGPIOSetting( + IN PADAPTER Adapter +) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u8 tmp1byte; + + tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); + tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); + + rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); +} + +/* ************************************************************ + * functions + * ************************************************************ */ +static void Init_ODM_ComInfo_8814(PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_struct *pDM_Odm = &(pHalData->odmpriv); + u8 cut_ver, fab_ver; + + Init_ODM_ComInfo(Adapter); + + odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A); + + fab_ver = ODM_TSMC; + if(IS_A_CUT(pHalData->version_id)) + cut_ver = ODM_CUT_A; + else if(IS_B_CUT(pHalData->version_id)) + cut_ver = ODM_CUT_B; + else if(IS_C_CUT(pHalData->version_id)) + cut_ver = ODM_CUT_C; + else if(IS_D_CUT(pHalData->version_id)) + cut_ver = ODM_CUT_D; + else if(IS_E_CUT(pHalData->version_id)) + cut_ver = ODM_CUT_E; + else + cut_ver = ODM_CUT_A; + + odm_cmn_info_init(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver); + odm_cmn_info_init(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); + + odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType); + + //odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKFWOFFLOAD, pHalData->RegIQKFWOffload); + + +} + +void +rtl8814_InitHalDm( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_struct * pDM_Odm = &(pHalData->odmpriv); + u8 i; + +#ifdef CONFIG_USB_HCI + dm_InitGPIOSetting(Adapter); +#endif //CONFIG_USB_HCI + + odm_dm_init(pDM_Odm); + + //Adapter->fix_rate = 0xFF; + +} + + +VOID +rtl8814_HalDmWatchDog( + IN PADAPTER Adapter + ) +{ + BOOLEAN bFwCurrentInPSMode = _FALSE; + BOOLEAN bFwPSAwake = _TRUE; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_struct *pDM_Odm = &(pHalData->odmpriv); + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(Adapter); + u8 in_lps = _FALSE; + + if (!rtw_is_hw_init_completed(Adapter)) + goto skip_dm; + +#ifdef CONFIG_LPS + bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode; + rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, &bFwPSAwake); +#endif + +#ifdef CONFIG_P2P_PS + /* Fw is under p2p powersaving mode, driver should stop dynamic mechanism. */ + /* modifed by thomas. 2011.06.11. */ + if (Adapter->wdinfo.p2p_ps_mode) + bFwPSAwake = _FALSE; +#endif /* CONFIG_P2P_PS */ + + if ((rtw_is_hw_init_completed(Adapter)) + && ((!bFwCurrentInPSMode) && bFwPSAwake)) { + + rtw_hal_check_rxfifo_full(Adapter); + /* */ + /* Dynamically switch RTS/CTS protection. */ + /* */ + /* dm_CheckProtection(Adapter); */ + +#ifdef CONFIG_PCI_HCI + /* 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. */ + /* Tx Migration settings. */ + /* dm_InterruptMigration(Adapter); */ + + /* if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) */ + /* PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); */ +#endif + + } + +#ifdef CONFIG_DISABLE_ODM + goto skip_dm; +#endif +#ifdef CONFIG_LPS + if (pwrpriv->bLeisurePs && bFwCurrentInPSMode && pwrpriv->pwr_mode != PS_MODE_ACTIVE) + in_lps = _TRUE; +#endif + rtw_phydm_watchdog(Adapter, in_lps); + +skip_dm: + +#ifdef CONFIG_SUPPORT_HW_WPS_PBC + /* Check GPIO to determine current Pbc status. */ + dm_CheckPbcGPIO(Adapter); +#endif + + return; +} + +void rtl8814_init_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_struct *podmpriv = &pHalData->odmpriv; + + /* _rtw_spinlock_init(&(pHalData->odm_stainfo_lock)); */ + +#ifndef CONFIG_IQK_PA_OFF /* FW has no IQK PA OFF option yet, don't offload */ + #ifdef CONFIG_BT_COEXIST + /* firmware size issue, btcoex fw doesn't support IQK offload */ + if (pHalData->EEPROMBluetoothCoexist == _FALSE) + #endif + { + pHalData->RegIQKFWOffload = 1; + rtw_sctx_init(&pHalData->iqk_sctx, 0); + } +#endif + + Init_ODM_ComInfo_8814(Adapter); + odm_init_all_timers(podmpriv ); + //PHYDM_InitDebugSetting(podmpriv); + + pHalData->CurrentTxPwrIdx = 18; + +} + +void rtl8814_deinit_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_struct *podmpriv = &pHalData->odmpriv; + /* _rtw_spinlock_free(&pHalData->odm_stainfo_lock); */ + odm_cancel_all_timers(podmpriv); +} + + +#ifdef CONFIG_ANTENNA_DIVERSITY +// Add new function to reset the state of antenna diversity before link. +// +// Compare RSSI for deciding antenna +void AntDivCompare8814(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) +{ + //PADAPTER Adapter = pDM_Odm->Adapter ; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + if(0 != pHalData->AntDivCfg ) + { + //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), + // src->Rssi,query_rx_pwr_percentage(src->Rssi)); + //select optimum_antenna for before linked =>For antenna diversity + if(dst->Rssi >= src->Rssi )//keep org parameter + { + src->Rssi = dst->Rssi; + src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; + } + } +} + +// Add new function to reset the state of antenna diversity before link. +u8 AntDivBeforeLink8814(PADAPTER Adapter ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_struct * pDM_Odm =&pHalData->odmpriv; + SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + // Condition that does not need to use antenna diversity. + if(pHalData->AntDivCfg==0) + { + //DBG_8192C("odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); + return _FALSE; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + return _FALSE; + } + + + if(pDM_SWAT_Table->SWAS_NoLink_State == 0){ + //switch channel + pDM_SWAT_Table->SWAS_NoLink_State = 1; + pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT; + + //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); + rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); + //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"); + return _TRUE; + } + else + { + pDM_SWAT_Table->SWAS_NoLink_State = 0; + return _FALSE; + } + +} +#endif //CONFIG_ANTENNA_DIVERSITY + diff --git a/hal/rtl8814a/rtl8814a_hal_init.c b/hal/rtl8814a/rtl8814a_hal_init.c new file mode 100644 index 0000000..b93ed31 --- /dev/null +++ b/hal/rtl8814a/rtl8814a_hal_init.c @@ -0,0 +1,6769 @@ +/****************************************************************************** + * + * 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 _RTL8814A_HAL_INIT_C_ + +//#include +#include +#include "phydm_antdiv.h" + +#define REG_BCN_INTERVAL 0x0554 + +extern u32 array_length_mp_8814a_fw_ap; +extern u8 array_mp_8814a_fw_ap[]; +extern u32 array_length_mp_8814a_fw_nic; +extern u8 array_mp_8814a_fw_nic[]; + +enum { + VOLTAGE_V25 = 0x03, + LDOE25_SHIFT = 28 , +}; + +//------------------------------------------------------------------------- +// +// LLT R/W/Init function +// +//------------------------------------------------------------------------- +VOID +Hal_InitEfuseVars_8814A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); + pu2Byte ptr; + + #define INIT_EFUSE(var,value) ptr = (pu2Byte)&var; *ptr = value + + RTW_INFO("====> %s \n", __func__); + //2 Common + INIT_EFUSE(pEfuseHal->WordUnit , EFUSE_MAX_WORD_UNIT); + RTW_INFO("====>pEfuseHal->WordUnit %d \n", pEfuseHal->WordUnit); + INIT_EFUSE(pEfuseHal->BankSize , 512); + INIT_EFUSE(pEfuseHal->OOBProtectBytes, EFUSE_OOB_PROTECT_BYTES); + RTW_INFO("====>pEfuseHal->OOBProtectBytes %d \n", pEfuseHal->OOBProtectBytes); + INIT_EFUSE(pEfuseHal->ProtectBytes , EFUSE_PROTECT_BYTES_BANK_8814A); + RTW_INFO("====>pEfuseHal->ProtectBytes %d \n", pEfuseHal->ProtectBytes); + INIT_EFUSE(pEfuseHal->BankAvailBytes , (pEfuseHal->BankSize - pEfuseHal->OOBProtectBytes)); + INIT_EFUSE(pEfuseHal->TotalBankNum , EFUSE_MAX_BANK_8814A); + INIT_EFUSE(pEfuseHal->HeaderRetry , 0); + INIT_EFUSE(pEfuseHal->DataRetry , 0); + + //2 Wi-Fi + INIT_EFUSE(pEfuseHal->MaxSecNum_WiFi , EFUSE_MAX_SECTION_8814A); + RTW_INFO("====>pEfuseHal->MaxSecNum_WiFi %d \n", pEfuseHal->MaxSecNum_WiFi); + INIT_EFUSE(pEfuseHal->PhysicalLen_WiFi , EFUSE_REAL_CONTENT_LEN_8814A); + RTW_INFO("====>pEfuseHal->PhysicalLen_WiFi %d \n", pEfuseHal->PhysicalLen_WiFi); + INIT_EFUSE(pEfuseHal->LogicalLen_WiFi , EFUSE_MAP_LEN_8814A); + RTW_INFO("====>pEfuseHal->LogicalLen_WiFi %d \n", pEfuseHal->LogicalLen_WiFi); + INIT_EFUSE(pEfuseHal->BankNum_WiFi , pEfuseHal->PhysicalLen_WiFi/pEfuseHal->BankSize); + INIT_EFUSE(pEfuseHal->TotalAvailBytes_WiFi, (pEfuseHal->PhysicalLen_WiFi - (pEfuseHal->TotalBankNum * pEfuseHal->OOBProtectBytes))); + + //2 BT + INIT_EFUSE(pEfuseHal->MaxSecNum_BT , 0); + INIT_EFUSE(pEfuseHal->PhysicalLen_BT , 0); + INIT_EFUSE(pEfuseHal->LogicalLen_BT , 0); + INIT_EFUSE(pEfuseHal->BankNum_BT , 0); + INIT_EFUSE(pEfuseHal->TotalAvailBytes_BT, 0); + + RTW_INFO("%s <====\n", __func__); +} + + +s32 InitLLTTable8814A( + IN PADAPTER Adapter + ) +{ + // Auto-init LLT table ( Set REG:0x208[BIT0] ) + //Write 1 to enable HW init LLT, driver need polling to 0 meaning init success + u8 tmp1byte=0, testcnt=0; + s32 Status = _SUCCESS; + + tmp1byte = rtw_read8(Adapter, REG_AUTO_LLT_8814A); + rtw_write8(Adapter, REG_AUTO_LLT_8814A, tmp1byte|BIT0); + while(tmp1byte & BIT0) + { + tmp1byte = rtw_read8(Adapter, REG_AUTO_LLT_8814A); + rtw_mdelay_os(100); + testcnt++; + if(testcnt > 100) + { + Status = _FAIL; + break; + } + } + return Status; +} + +#ifdef CONFIG_WOWLAN +void hal_DetectWoWMode(PADAPTER pAdapter) +{ + adapter_to_pwrctl(pAdapter)->bSupportRemoteWakeup = _TRUE; +} +#endif + + +VOID +_FWDownloadEnable_8814A( + IN PADAPTER Adapter, + IN BOOLEAN enable + ) +{ + u8 tmp; + u16 u2Tmp = 0; + + if(enable) + { + // MCU firmware download enable. + u2Tmp = rtw_read16(Adapter, REG_8051FW_CTRL_8814A); + u2Tmp &= 0x3000; + u2Tmp &= (~BIT12); + u2Tmp |= BIT13; + u2Tmp |= BIT0; + rtw_write16(Adapter, REG_8051FW_CTRL_8814A, u2Tmp); + + // Clear Rom DL enable + // tmp = rtw_read8(Adapter, REG_8051FW_CTRL_8814A+2); //modify by gw 20130826(advice by hw) + // rtw_write8(Adapter, REG_8051FW_CTRL_8814A+2, tmp&0xf7);//clear bit3 + } + else + { + // MCU firmware download enable. + tmp = rtw_read8(Adapter, REG_8051FW_CTRL_8814A); + rtw_write8(Adapter, REG_8051FW_CTRL_8814A, tmp&0xfe); + } +} + +#define MAX_REG_BOLCK_SIZE 196 + +VOID +_BlockWrite_8814A( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 buffSize + ) +{ + u32 blockSize_p1 = 4; // (Default) Phase #1 : PCI muse use 4-byte write to download FW + u32 blockSize_p2 = 8; // Phase #2 : Use 8-byte, if Phase#1 use big size to write FW. + u32 blockSize_p3 = 1; // Phase #3 : Use 1-byte, the remnant of FW image. + u32 blockCount_p1 = 0, blockCount_p2 = 0, blockCount_p3 = 0; + u32 remainSize_p1 = 0, remainSize_p2 = 0; + u8* bufferPtr = (u8*)buffer; + u32 i=0, offset=0; + +#ifdef CONFIG_USB_HCI + blockSize_p1 = MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW + // Small block size will increase USB init speed. But prevent FW download fail + // use 4-Byte instead of 196-Byte to write FW. +#endif + + //3 Phase #1 + blockCount_p1 = buffSize / blockSize_p1; + remainSize_p1 = buffSize % blockSize_p1; + + for(i = 0 ; i < blockCount_p1 ; i++){ + #if (DEV_BUS_TYPE == RT_USB_INTERFACE) + rtw_writeN(Adapter, (FW_START_ADDRESS + i * blockSize_p1), blockSize_p1,(bufferPtr + i * blockSize_p1)); + #else + rtw_write32(Adapter, (FW_START_ADDRESS + i * blockSize_p1), *((pu4Byte)(bufferPtr + i * blockSize_p1))); + #endif + } + + //3 Phase #2 + if(remainSize_p1){ + offset = blockCount_p1 * blockSize_p1; + + blockCount_p2=remainSize_p1/blockSize_p2; + remainSize_p2=remainSize_p1%blockSize_p2; + + #if (DEV_BUS_TYPE == RT_USB_INTERFACE) + for(i = 0 ; i < blockCount_p2 ; i++){ + rtw_writeN(Adapter, (FW_START_ADDRESS + offset+i*blockSize_p2), blockSize_p2,(bufferPtr + offset+i*blockSize_p2)); + } + #endif + } + + //3 Phase #3 + if(remainSize_p2) + { + offset=(blockCount_p1 * blockSize_p1)+(blockCount_p2*blockSize_p2); + + blockCount_p3 = remainSize_p2 /blockSize_p3; + + for(i = 0 ; i < blockCount_p3 ; i++){ + rtw_write8(Adapter, (FW_START_ADDRESS + offset + i), *(bufferPtr +offset+ i)); + } + } +} + +VOID +_PageWrite_8814A( + IN PADAPTER Adapter, + IN u32 page, + IN PVOID buffer, + IN u32 size + ) +{ + u8 value8; + u8 u8Page = (u8) (page & 0x07) ; + + value8 = (rtw_read8(Adapter, REG_8051FW_CTRL_8814A+2)& 0xF8 ) | u8Page ; + rtw_write8(Adapter,REG_8051FW_CTRL_8814A+2,value8); + + _BlockWrite_8814A(Adapter,buffer,size); +} + +VOID +_FillDummy_8814A( + u8* pFwBuf, + pu4Byte pFwLen + ) +{ + u32 FwLen = *pFwLen; + u8 remain = (u8)(FwLen%4); + remain = (remain==0)?0:(4-remain); + + while(remain>0) + { + pFwBuf[FwLen] = 0; + FwLen++; + remain--; + } + + *pFwLen = FwLen; +} + +VOID +_WriteFW_8814A( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 size + ) +{ + u32 pageNums,remainSize ; + u32 page,offset; + u8* bufferPtr = (u8*)buffer; + +#ifdef CONFIG_PCI_HCI + // 20100120 Joseph: Add for 88CE normal chip. + // Fill in zero to make firmware image to dword alignment. + _FillDummy_8814A(bufferPtr, &size); +#endif //CONFIG_PCI_HCI + + pageNums = size / MAX_PAGE_SIZE ; + + //RT_ASSERT((pageNums <= 8), ("Page numbers should not greater then 8 \n")); + + remainSize = size % MAX_PAGE_SIZE; + + for(page = 0; page < pageNums; page++){ + offset = page *MAX_PAGE_SIZE; + _PageWrite_8814A(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE); + rtw_udelay_os(2); + } + if(remainSize){ + offset = pageNums *MAX_PAGE_SIZE; + page = pageNums; + _PageWrite_8814A(Adapter,page, (bufferPtr+offset),remainSize); + } +} + +VOID +_3081Disable8814A( + IN PADAPTER Adapter + ) +{ + u8 u1bTmp; + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8814A+1); + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A+1, u1bTmp&(~BIT2)); + + +} + +VOID +_3081Enable8814A( + IN PADAPTER Adapter + ) +{ + u8 u1bTmp; + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8814A+1); + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A+1, u1bTmp|BIT2); +} + + +//add by ylb 20130814 for 3081 download FW +static +BOOLEAN +IDDMADownLoadFW_3081( + IN PADAPTER Adapter, + IN u32 source, + IN u32 dest, + IN u32 length, + IN BOOLEAN fs, + IN BOOLEAN ls + ) + { + u32 ch0ctrl = (DDMA_CHKSUM_EN|DDMA_CH_OWN); + u32 cnt; + u1Byte tmp; + //check if ddma ch0 is idle + cnt=20; + while(rtw_read32(Adapter, REG_DDMA_CH0CTRL)&DDMA_CH_OWN) + { + rtw_udelay_os(1000); + cnt--; + if(cnt==0) + { + RTW_INFO("IDDMADownLoadFW_3081, line%d: CNT fail\n", __LINE__); + return _FALSE; + } + } + ch0ctrl |= length & DDMA_LEN_MASK; + + //check if chksum continuous + if(fs == _FALSE){ + ch0ctrl |= DDMA_CH_CHKSUM_CNT; + } + rtw_write32(Adapter,REG_DDMA_CH0SA, source); + rtw_write32(Adapter,REG_DDMA_CH0DA, dest); + rtw_write32(Adapter,REG_DDMA_CH0CTRL, ch0ctrl); + + cnt=20; + while(rtw_read32(Adapter, REG_DDMA_CH0CTRL)&DDMA_CH_OWN) + { + rtw_udelay_os(1000); + cnt--; + if(cnt==0) + { + RTW_INFO("IDDMADownLoadFW_3081, line%d: CNT fail\n", __LINE__); + return _FALSE; + } + } + + //check checksum + if(ls == _TRUE) + { + tmp = rtw_read8(Adapter,REG_8051FW_CTRL_8814A); + if(0==(rtw_read32(Adapter,REG_DDMA_CH0CTRL)&DDMA_CHKSUM_FAIL)) + {//chksum ok + RTW_INFO("Check sum OK\n"); + //imem + if(dest < OCPBASE_DMEM_3081) + { + tmp |= IMEM_DL_RDY; + rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp|IMEM_CHKSUM_OK); + RTW_INFO("imem check sum tmp %d\n",tmp); + } + //dmem + else + { + tmp |= DMEM_DL_RDY; + rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp|DMEM_CHKSUM_OK); + RTW_INFO("dmem check sum tmp %d\n",tmp); + } + } + else + {//chksum fail + RTW_INFO("Check sum fail\n"); + ch0ctrl=rtw_read32(Adapter,REG_DDMA_CH0CTRL); + rtw_write32(Adapter, REG_DDMA_CH0CTRL,ch0ctrl|DDMA_RST_CHKSUM_STS); + + //imem + if(dest < OCPBASE_DMEM_3081) + { + tmp &= (~IMEM_DL_RDY); + rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp&~IMEM_CHKSUM_OK); + } + //dmem + else + { + tmp &= (~DMEM_DL_RDY); + rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp&~DMEM_CHKSUM_OK); + } + return _FALSE; + } + } + return _TRUE; +} + + +//add by ylb 20130814 for 3081 download FW +static +BOOLEAN +WaitDownLoadRSVDPageOK_3081( + IN PADAPTER Adapter + ) +{ + u8 BcnValidReg=0,TxBcReg=0; + u8 count=0, DLBcnCount=0; + BOOLEAN bRetValue = _FALSE; + +#if defined(CONFIG_PCI_HCI) + //Polling Beacon Queue to send Beacon + TxBcReg = rtw_read8(Adapter, REG_MGQ_TXBD_NUM_8814A+3); + count=0; + while(( count <20) && (TxBcReg & BIT4)) + { + count++; + rtw_udelay_os(10); + TxBcReg = rtw_read8(Adapter, REG_MGQ_TXBD_NUM_8814A+3); + } + + rtw_write8(Adapter, REG_MGQ_TXBD_NUM_8814A+3, TxBcReg|BIT4); +#endif //#if defined(CONFIG_PCI_HCI) + // check rsvd page download OK. + BcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1); + count=0; + while(!(BcnValidReg & BIT7) && count <20) + { + count++; + rtw_udelay_os(50); + BcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1); + } + + //Set 1 to Clear BIT7 by SW + if(BcnValidReg & BIT7) + { + rtw_write8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7)); + bRetValue = _TRUE; + } + else + { + RTW_INFO("WaitDownLoadRSVDPageOK_3081(): Download RSVD page failed!\n"); + bRetValue = _FALSE; + } + + return bRetValue; +} + + +VOID +SetDownLoadFwRsvdPagePkt_8814A( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 len + ) +{ + PHAL_DATA_TYPE pHalData; + struct xmit_frame *pcmdframe; + struct xmit_priv *pxmitpriv; + struct pkt_attrib *pattrib; + //The desc lengh in Tx packet buffer of 8814A is 40 bytes. + u16 BufIndex=0, TxDescOffset = TXDESC_OFFSET; + u32 TotalPacketLen = len; + BOOLEAN bDLOK = FALSE; + u8 *ReservedPagePacket; + + pHalData = GET_HAL_DATA(Adapter); + pxmitpriv = &Adapter->xmitpriv; + +#ifdef CONFIG_BCN_ICF + pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv); +#else + pcmdframe = alloc_mgtxmitframe(pxmitpriv); +#endif + if (pcmdframe == NULL) { + return; + } + + ReservedPagePacket = pcmdframe->buf_addr; + + BufIndex = TxDescOffset; + + TotalPacketLen = len + BufIndex; + + _rtw_memcpy(&ReservedPagePacket[BufIndex], buffer, len); + //RTW_INFO("SetFwRsvdPagePkt_8814A(): HW_VAR_SET_TX_CMD: BCN, %p, %d\n", &ReservedPagePacket[BufIndex], len); + + //RTW_INFO("SetFwRsvdPagePkt(): TotalPacketLen=%d \n", TotalPacketLen); + + // update attribute + pattrib = &pcmdframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + pattrib->qsel = QSLT_BEACON; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset; + + dump_mgntframe(Adapter, pcmdframe); + + //ReturnGenTempBuffer(pAdapter, pGenBufReservedPagePacket); +} + +/* ************************************************************************************ + * + * 20100209 Joseph: + * This function is used only for 92C to set REG_BCN_CTRL(0x550) register. + * We just reserve the value of the register in variable pHalData->RegBcnCtrlVal and then operate + * the value of the register via atomic operation. + * This prevents from race condition when setting this register. + * The value of pHalData->RegBcnCtrlVal is initialized in HwConfigureRTL8192CE() function. + * */ +static void SetBcnCtrlReg( + PADAPTER padapter, + u8 SetBits, + u8 ClearBits) +{ + PHAL_DATA_TYPE pHalData; + u8 RegBcnCtrlVal = 0; + + pHalData = GET_HAL_DATA(padapter); + RegBcnCtrlVal = rtw_read8(padapter, REG_BCN_CTRL); + + RegBcnCtrlVal |= SetBits; + RegBcnCtrlVal &= ~ClearBits; + +#if 0 + /* #ifdef CONFIG_SDIO_HCI */ + if (pHalData->sdio_himr & (SDIO_HIMR_TXBCNOK_MSK | SDIO_HIMR_TXBCNERR_MSK)) + RegBcnCtrlVal |= EN_TXBCN_RPT; +#endif + rtw_write8(padapter, REG_BCN_CTRL, RegBcnCtrlVal); +} + +VOID +HalROMDownloadFWRSVDPage8814A( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 Len +) +{ + u8 u1bTmp=0, tmpReg422=0; + u8 BcnValidReg=0,TxBcReg=0; + BOOLEAN bSendBeacon=_FALSE, bDownLoadRSVDPageOK = _FALSE; + u8* pbuffer = buffer; + + BOOLEAN fs = _TRUE, ls = _FALSE; + u8 FWHeaderSize = 64, PageSize = 128 ; + u16 RsvdPageNum = 0; + u32 dmem_pkt_size = 0, iram_pkt_size = 0 ,MaxRsvdPageBufSize = 0; + u32 last_block_size = 0, filesize_ram_block = 0, pkt_offset = 0; + u32 txpktbuf_bndy = 0; + u32 BeaconHeaderInTxPacketBuf = 0, MEMOffsetInTxPacketBuf = 0; + + //Set REG_CR bit 8. DMA beacon by SW. + u1bTmp = rtw_read8(Adapter, REG_CR_8814A+1); + rtw_write8(Adapter, REG_CR_8814A+1, (u1bTmp|BIT0)); + /*RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR));*/ + + // Disable Hw protection for a time which revserd for Hw sending beacon. + // Fix download reserved page packet fail that access collision with the protection time. + // 2010.05.11. Added by tynli. + SetBcnCtrlReg(Adapter, 0, BIT3); + SetBcnCtrlReg(Adapter, BIT4, 0); + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + tmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2); + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2, tmpReg422&(~BIT6)); + + if(tmpReg422&BIT6) + { + RTW_INFO("HalROMDownloadFWRSVDPage8814A(): There is an Adapter is sending beacon.\n"); + bSendBeacon = _TRUE; + } + + //Set The head page of packet of Bcnq + rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u16*)&txpktbuf_bndy); + rtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A, txpktbuf_bndy); + + /* RTW_INFO("HalROMDownloadFWRSVDPage8814A: txpktbuf_bndy=%d\n", txpktbuf_bndy); */ + + // Clear beacon valid check bit. + BcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1); + rtw_write8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7)); + + // Return Beacon TCB. + //ReturnBeaconQueueTcb_8814A(Adapter); + + dmem_pkt_size = (u32)GET_FIRMWARE_HDR_TOTAL_DMEM_SZ_3081(pbuffer); + iram_pkt_size = (u32)GET_FIRMWARE_HDR_IRAM_SZ_3081(pbuffer); + dmem_pkt_size += (u32)FW_CHKSUM_DUMMY_SZ; + iram_pkt_size += (u32)FW_CHKSUM_DUMMY_SZ; + + if(dmem_pkt_size + iram_pkt_size + FWHeaderSize != Len) + { + RTW_INFO("ERROR: Fw Hdr size do not match the real fw size!!\n"); + RTW_INFO("dmem_pkt_size = %d, iram_pkt_size = %d,FWHeaderSize = %d, Len = %d!!\n",dmem_pkt_size,iram_pkt_size,FWHeaderSize,Len); + return; + } + RTW_INFO("dmem_pkt_size = %d, iram_pkt_size = %d,FWHeaderSize = %d, Len = %d!!\n",dmem_pkt_size,iram_pkt_size,FWHeaderSize,Len); + + // download rsvd page. + //RsvdPageNum = GetTxBufferRsvdPageNum8814A(Adapter, _FALSE); +#ifdef CONFIG_BCN_IC + /* TODO: check tx buffer and DMA size */ + MaxRsvdPageBufSize = MAX_CMDBUF_SZ-TXDESC_OFFSET; +#else + MaxRsvdPageBufSize = MAX_XMIT_EXTBUF_SZ-TXDESC_OFFSET;//RsvdPageNum*PageSize - 40 -16 /*modified for usb*/;//TX_INFO_SIZE_8814AE; +#endif + RTW_INFO("MaxRsvdPageBufSize %d, Total len %d\n",MaxRsvdPageBufSize,Len); + + BeaconHeaderInTxPacketBuf = txpktbuf_bndy * PageSize; + MEMOffsetInTxPacketBuf = OCPBASE_TXBUF_3081 + BeaconHeaderInTxPacketBuf + 40;//TX_INFO_SIZE_8814AE; + //download DMEM + while(dmem_pkt_size > 0) + { + if(dmem_pkt_size > MaxRsvdPageBufSize) + { + filesize_ram_block = MaxRsvdPageBufSize; + ls = _FALSE; + + last_block_size = dmem_pkt_size -MaxRsvdPageBufSize; + if(last_block_size < MaxRsvdPageBufSize) + { + if(((last_block_size + 40) & 0x3F) == 0) // Multiples of 64 + filesize_ram_block -=4; + } + } + else + { + filesize_ram_block = dmem_pkt_size; + ls = _TRUE; + } + fs = (pkt_offset == 0 ? _TRUE: _FALSE); + // Return Beacon TCB. + //ReturnBeaconQueueTcb_8814A(Adapter); + //RTW_INFO("%d packet offset %d dmem_pkt_size %d\n", __LINE__,pkt_offset, dmem_pkt_size); + SetDownLoadFwRsvdPagePkt_8814A(Adapter, pbuffer+FWHeaderSize+pkt_offset, filesize_ram_block); + bDownLoadRSVDPageOK = WaitDownLoadRSVDPageOK_3081(Adapter); + if(!bDownLoadRSVDPageOK) + { + RTW_INFO("ERROR: DMEM bDownLoadRSVDPageOK is false!!\n"); + return; + } + + IDDMADownLoadFW_3081(Adapter,MEMOffsetInTxPacketBuf,OCPBASE_DMEM_3081+pkt_offset,filesize_ram_block,fs,ls); + dmem_pkt_size -= filesize_ram_block; + pkt_offset += filesize_ram_block; + } + + //download IRAM + pkt_offset = 0; + while(iram_pkt_size > 0) + { + if(iram_pkt_size > MaxRsvdPageBufSize) + { + filesize_ram_block = MaxRsvdPageBufSize; + ls = _FALSE; + + last_block_size = iram_pkt_size -MaxRsvdPageBufSize; + if(last_block_size < MaxRsvdPageBufSize) + { + if(((last_block_size + 40) & 0x3F) == 0) // Multiples of 64 + filesize_ram_block -=4; + } + } + else + { + filesize_ram_block = iram_pkt_size; + ls = _TRUE; + } + + fs = (pkt_offset == 0 ? _TRUE: _FALSE); + // Return Beacon TCB. + //ReturnBeaconQueueTcb_8814A(Adapter); + //RTW_INFO("%d packet offset %d iram_pkt_size %d\n", __LINE__,pkt_offset, iram_pkt_size); + SetDownLoadFwRsvdPagePkt_8814A(Adapter, pbuffer+Len-iram_pkt_size, filesize_ram_block); + + bDownLoadRSVDPageOK = WaitDownLoadRSVDPageOK_3081(Adapter); + if(!bDownLoadRSVDPageOK) + { + RTW_INFO("ERROR: IRAM bDownLoadRSVDPageOK is false!!\n"); + return; + } + + IDDMADownLoadFW_3081(Adapter,MEMOffsetInTxPacketBuf,OCPBASE_IMEM_3081+pkt_offset,filesize_ram_block,fs,ls); + + iram_pkt_size -= filesize_ram_block; + pkt_offset += filesize_ram_block; + } + + // Enable Bcn + SetBcnCtrlReg(Adapter, BIT3, 0); + SetBcnCtrlReg(Adapter, 0, BIT4); + + // 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(bSendBeacon) + { + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2, tmpReg422); + } + + // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. + //if(!Adapter->bEnterPnpSleep) + { + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + u1bTmp = rtw_read8(Adapter, REG_CR_8814A+1); + rtw_write8(Adapter, REG_CR_8814A+1, (u1bTmp&(~BIT0))); + } + + u1bTmp=rtw_read8(Adapter, REG_8051FW_CTRL_8814A); //add by gw for flags to show the fw download ok 20130826 + if( u1bTmp&DMEM_CHKSUM_OK) + { + if(u1bTmp&IMEM_CHKSUM_OK) + { + u1Byte tem; + tem=rtw_read8(Adapter, REG_8051FW_CTRL_8814A+1); + rtw_write8(Adapter, REG_8051FW_CTRL_8814A+1,(tem|BIT6)); + } + } +} + +s32 +_FWFreeToGo8814A( + IN PADAPTER Adapter + ) +{ + u32 counter = 0; + u32 value32; + + // polling CheckSum report + do{ + rtw_mdelay_os(50); + value32 = rtw_read32(Adapter, REG_8051FW_CTRL_8814A); + + } while ((counter++ < 100) && (!(value32 & CPU_DL_READY))); + + if (counter >= 100) { + RTW_ERR("_FWFreeToGo8814A:: FW init fail ! REG_8051FW_CTRL_8814A:0x%08x .\n", value32); + return _FAIL; + } + RTW_INFO("_FWFreeToGo8814A:: FW init ok ! REG_8051FW_CTRL_8814A:0x%08x .\n", value32); + + + return _SUCCESS; +} + + +#ifdef CONFIG_FILE_FWIMG +extern char *rtw_fw_file_path; +u8 FwBuffer8814[FW_SIZE]; +#ifdef CONFIG_MP_INCLUDED +extern char *rtw_fw_mp_bt_file_path; +#endif // CONFIG_MP_INCLUDED +u8 FwBuffer[FW_SIZE]; +#endif //CONFIG_FILE_FWIMG + +s32 +FirmwareDownload8814A( + IN PADAPTER Adapter, + IN BOOLEAN bUsedWoWLANFw +) +{ + s32 rtStatus = _SUCCESS; + u8 write_fw = 0; + u32 fwdl_start_time; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u8 *pFwImageFileName; + u8 *pucMappedFile = NULL; + PRT_FIRMWARE_8814 pFirmware = NULL; + u8 *pFwHdr = NULL; + u8 *pFirmwareBuf; + u32 FirmwareLen; + + + pFirmware = (PRT_FIRMWARE_8814)rtw_zmalloc(sizeof(RT_FIRMWARE_8814)); + if(!pFirmware) + { + rtStatus = _FAIL; + goto exit; + } + + #ifdef CONFIG_FILE_FWIMG + if(rtw_is_file_readable(rtw_fw_file_path) == _TRUE) + { + RTW_INFO("%s accquire FW from file:%s\n", __FUNCTION__, rtw_fw_file_path); + pFirmware->eFWSource = FW_SOURCE_IMG_FILE; + } + else + #endif //CONFIG_FILE_FWIMG + { + RTW_INFO("%s fw source from Header\n", __FUNCTION__); + pFirmware->eFWSource = FW_SOURCE_HEADER_FILE; + } + + switch(pFirmware->eFWSource) + { + case FW_SOURCE_IMG_FILE: + #ifdef CONFIG_FILE_FWIMG + rtStatus = rtw_retrieve_from_file(rtw_fw_file_path, FwBuffer8814, FW_SIZE); + pFirmware->ulFwLength = rtStatus>=0?rtStatus:0; + pFirmware->szFwBuffer = FwBuffer8814; + #endif //CONFIG_FILE_FWIMG + break; + case FW_SOURCE_HEADER_FILE: + #ifdef CONFIG_WOWLAN + if (bUsedWoWLANFw) { + pFirmware->szFwBuffer = array_mp_8814a_fw_wowlan; + pFirmware->ulFwLength = array_length_mp_8814a_fw_wowlan; + RTW_INFO("%s fw:%s, size: %d\n", __FUNCTION__, "WoWLAN", pFirmware->ulFwLength); + } else + #endif /* CONFIG_WOWLAN */ + #ifdef CONFIG_BT_COEXIST + if (pHalData->EEPROMBluetoothCoexist == _TRUE) { + pFirmware->szFwBuffer = array_mp_8814a_fw_nic_bt; + pFirmware->ulFwLength = array_length_mp_8814a_fw_nic_bt; + RTW_INFO("%s fw:%s, size: %d\n", __FUNCTION__, "NIC-BTCOEX", pFirmware->ulFwLength); + } else + #endif /* CONFIG_BT_COEXIST */ + { + //ODM_CmnInfoInit(pDM_OutSrc, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A); + pFirmware->szFwBuffer = array_mp_8814a_fw_nic; + pFirmware->ulFwLength = array_length_mp_8814a_fw_nic; + RTW_INFO("%s fw:%s, size: %d\n", __FUNCTION__, "NIC", pFirmware->ulFwLength); + } + break; + } + + if (pFirmware->ulFwLength > FW_SIZE) { + rtStatus = _FAIL; + RTW_ERR("Firmware size:%u exceed %u\n", pFirmware->ulFwLength, FW_SIZE); + goto exit; + } + + pFirmwareBuf = pFirmware->szFwBuffer; + FirmwareLen = pFirmware->ulFwLength; + pFwHdr = (u8 *)pFirmware->szFwBuffer; + + pHalData->firmware_version = (u16)GET_FIRMWARE_HDR_VERSION_3081(pFwHdr); + pHalData->firmware_sub_version = (u16)GET_FIRMWARE_HDR_SUB_VER_3081(pFwHdr); + pHalData->FirmwareSignature = (u16)GET_FIRMWARE_HDR_SIGNATURE_3081(pFwHdr); + + RTW_INFO ("%s: fw_ver=%d fw_subver=%d sig=0x%x\n", + __FUNCTION__, pHalData->firmware_version, pHalData->firmware_sub_version, pHalData->FirmwareSignature); + fwdl_start_time = rtw_get_current_time(); + + _FWDownloadEnable_8814A(Adapter, _TRUE); + + _3081Disable8814A(Adapter);//add by gw 2013026 for disable mcu core + + HalROMDownloadFWRSVDPage8814A(Adapter,pFirmwareBuf,FirmwareLen); + + _3081Enable8814A(Adapter);//add by gw 2013026 for Enable mcu core + + _FWDownloadEnable_8814A(Adapter, _FALSE); + + rtStatus = _FWFreeToGo8814A(Adapter); + if (_SUCCESS != rtStatus) + goto fwdl_stat; + +fwdl_stat: + RTW_INFO("FWDL %s. write_fw:%u, %dms\n" + , (rtStatus == _SUCCESS)?"success":"fail" + , write_fw + , rtw_get_passing_time_ms(fwdl_start_time) + ); + +exit: + if (pFirmware) + rtw_mfree((u8*)pFirmware, sizeof(RT_FIRMWARE_8814)); + +#ifdef CONFIG_WOWLAN + if (adapter_to_pwrctl(Adapter)->wowlan_mode) + InitializeFirmwareVars8814(Adapter); + else + RTW_ERR("%s: wowland_mode:%d wowlan_wake_reason:%d\n", + __func__, adapter_to_pwrctl(Adapter)->wowlan_mode, + adapter_to_pwrctl(Adapter)->wowlan_wake_reason); +#endif + + return rtStatus; +} + + + +void InitializeFirmwareVars8814(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); + + // Init Fw LPS related. + pwrpriv->bFwCurrentInPSMode = _FALSE; + + /* Init H2C cmd.*/ + rtw_write8(padapter, REG_HMETFR_8814A, 0x0f); + + // Init H2C counter. by tynli. 2009.12.09. + pHalData->LastHMEBoxNum = 0; +} + +/* +// +// Description: Determine the contents of H2C BT_FW_PATCH Command sent to FW. +// 2013.01.23 by tynli +// Porting from 8723B. 2013.04.01 +// +VOID +SetFwBTFwPatchCmd( + IN PADAPTER Adapter, + IN u16 FwSize + ) +{ + u8 u1BTFwPatchParm[6]={0}; + + RTW_INFO("SetFwBTFwPatchCmd_8821(): FwSize = %d\n", FwSize); + + //SET_8812_H2CCMD_BT_FW_PATCH_ENABLE(u1BTFwPatchParm, 1); + SET_H2CCMD_BT_FW_PATCH_SIZE(u1BTFwPatchParm, FwSize); + SET_H2CCMD_BT_FW_PATCH_ADDR0(u1BTFwPatchParm, 0); + SET_H2CCMD_BT_FW_PATCH_ADDR1(u1BTFwPatchParm, 0xa0); + SET_H2CCMD_BT_FW_PATCH_ADDR2(u1BTFwPatchParm, 0x10); + SET_H2CCMD_BT_FW_PATCH_ADDR3(u1BTFwPatchParm, 0x80); + + FillH2CCmd_8812(Adapter, H2C_BT_FW_PATCH, 6 , u1BTFwPatchParm); +} + + +int _CheckWLANFwPatchBTFwReady_8821A( PADAPTER Adapter ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 count=0; + u8 u1bTmp; + int ret = _FAIL; + +#if (DEV_BUS_TYPE == RT_SDIO_INTERFACE) + u32 txpktbuf_bndy; +#endif + + //--------------------------------------------------------- + // Check if BT FW patch procedure is ready. + //--------------------------------------------------------- + do{ + u1bTmp = rtw_read8(Adapter, REG_FW_DRV_MSG_8812); + if((u1bTmp&BIT6) || (u1bTmp&BIT7)) + { + ret = _SUCCESS; + break; + } + count++; + RT_TRACE(_module_mp_, _drv_info_,("0x81=%x, wait for 50 ms (%d) times.\n", + u1bTmp, count)); + rtw_msleep_os(50); // 50ms + }while(!((u1bTmp&BIT6) || (u1bTmp&BIT7)) && count < 50); + + RT_TRACE(_module_mp_, _drv_notice_,("_CheckWLANFwPatchBTFwReady():" + " Polling ready bit 0x88[6:7] for %d times.\n", count)); + + if(count >= 50) + { + RTW_INFO("_CheckWLANFwPatchBTFwReady():" + " Polling ready bit 0x88[6:7] FAIL!!\n"); + } + + //--------------------------------------------------------- + // Reset beacon setting to the initial value. + //--------------------------------------------------------- +#if (DEV_BUS_TYPE == RT_SDIO_INTERFACE) +#if 0 + if(!Adapter->MgntInfo.bWiFiConfg) + { + txpktbuf_bndy = TX_PAGE_BOUNDARY_8821; + } + else +#endif + {// for WMM + txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8821; + } + + ret = InitLLTTable8812A(Adapter, txpktbuf_bndy); + if(_SUCCESS != ret){ + RTW_INFO("_CheckWLANFwPatchBTFwReady_8821A(): Failed to init LLT!\n"); + } + + // Init Tx boundary. + rtw_write8(Adapter, REG_TDECTRL+1, (u8)txpktbuf_bndy); +#endif + + SetBcnCtrlReg(Adapter, BIT3, 0); + SetBcnCtrlReg(Adapter, 0, BIT4); + + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); + pHalData->RegFwHwTxQCtrl |= BIT6; + + u1bTmp = rtw_read8(Adapter, REG_CR+1); + rtw_write8(Adapter, REG_CR+1, (u1bTmp&(~BIT0))); + + return ret; +} + + +int _WriteBTFWtoTxPktBuf8812( + PADAPTER Adapter, + PVOID buffer, + u32 FwBufLen, + u8 times + ) +{ + int rtStatus = _SUCCESS; + //u32 value32; + //u8 numHQ, numLQ, numPubQ;//, txpktbuf_bndy; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u8 BcnValidReg; + u8 count=0, DLBcnCount=0; + u8* FwbufferPtr = (u8*)buffer; + //PRT_TCB pTcb, ptempTcb; + //PRT_TX_LOCAL_BUFFER pBuf; + BOOLEAN bRecover=_FALSE; + u8* ReservedPagePacket = NULL; + u8* pGenBufReservedPagePacket = NULL; + u32 TotalPktLen,txpktbuf_bndy; + //u8 tmpReg422; + //u8 u1bTmp; + u8 *pframe; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + u8 txdesc_offset = TXDESC_OFFSET; + u8 val8; + +#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) + TotalPktLen = FwBufLen; +#else + TotalPktLen = FwBufLen+pHalData->HWDescHeadLength; +#endif + if((TotalPktLen+TXDESC_OFFSET) > MAX_CMDBUF_SZ) + { + RTW_INFO(" WARNING %s => Total packet len = %d over 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; + + ReservedPagePacket = (u8 *)pGenBufReservedPagePacket; + + _rtw_memset(ReservedPagePacket, 0, TotalPktLen); + +#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) + _rtw_memcpy(ReservedPagePacket, FwbufferPtr, FwBufLen); + +#else + PlatformMoveMemory(ReservedPagePacket+Adapter->HWDescHeadLength , FwbufferPtr, FwBufLen); +#endif + + //--------------------------------------------------------- + // 1. Pause BCN + //--------------------------------------------------------- + //Set REG_CR bit 8. DMA beacon by SW. +#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE) + u1bTmp = rtw_read8(Adapter, REG_CR+1); + rtw_write8(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); + //rtw_write8(Adapter, REG_CR+1, pHalData->RegCR_1); +#endif + + // 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(Adapter, REG_BCN_CTRL); + val8 &= ~BIT(3); + val8 |= BIT(4); + rtw_write8(Adapter, REG_BCN_CTRL, val8); + +#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE) + tmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); + if( tmpReg422&BIT6) + bRecover = _TRUE; + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422&(~BIT6)); +#else + // 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; + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT(6)))); + pHalData->RegFwHwTxQCtrl &= (~ BIT(6)); +#endif + + //--------------------------------------------------------- + // 2. Adjust LLT table to an even boundary. + //--------------------------------------------------------- +#if 0//(DEV_BUS_TYPE == RT_SDIO_INTERFACE) + txpktbuf_bndy = 10; // rsvd page start address should be an even value. + rtStatus = InitLLTTable8723BS(Adapter, txpktbuf_bndy); + if(_SUCCESS != rtStatus){ + RTW_INFO("_CheckWLANFwPatchBTFwReady_8723B(): Failed to init LLT!\n"); + return _FAIL; + } + + // Init Tx boundary. + rtw_write8(Adapter, REG_DWBCN0_CTRL_8723B+1, (u8)txpktbuf_bndy); +#endif + + + //--------------------------------------------------------- + // 3. Write Fw to Tx packet buffer by reseverd page. + //--------------------------------------------------------- + do + { + // download rsvd page. + // Clear beacon valid check bit. + BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); + rtw_write8(Adapter, REG_TDECTRL+2, BcnValidReg&(~BIT(0))); + + //BT patch is big, we should set 0x209 < 0x40 suggested from Gimmy + RT_TRACE(_module_mp_, _drv_info_,("0x209:%x\n", + rtw_read8(Adapter, REG_TDECTRL+1)));//209 < 0x40 + + rtw_write8(Adapter, REG_TDECTRL+1, (0x90-0x20*(times-1))); + RTW_INFO("0x209:0x%x\n", rtw_read8(Adapter, REG_TDECTRL+1)); + RT_TRACE(_module_mp_, _drv_info_,("0x209:%x\n", + rtw_read8(Adapter, REG_TDECTRL+1))); + +#if 0 + // Acquice TX spin lock before GetFwBuf and send the packet to prevent system deadlock. + // Advertised by Roger. Added by tynli. 2010.02.22. + PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); + if(MgntGetFWBuffer(Adapter, &pTcb, &pBuf)) + { + PlatformMoveMemory(pBuf->Buffer.VirtualAddress, ReservedPagePacket, TotalPktLen); + CmdSendPacket(Adapter, pTcb, pBuf, TotalPktLen, DESC_PACKET_TYPE_NORMAL, _FALSE); + } + else + dbgdump("SetFwRsvdPagePkt(): MgntGetFWBuffer FAIL!!!!!!!!.\n"); + PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); +#else + //--------------------------------------------------------- + //tx reserved_page_packet + //---------------------------------------------------------- + if ((pmgntframe = rtw_alloc_cmdxmitframe(pxmitpriv)) == NULL) { + rtStatus = _FAIL; + goto exit; + } + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + + pattrib->qsel = QSLT_BEACON; + pattrib->pktlen = pattrib->last_txcmdsz = FwBufLen ; + + //_rtw_memset(pmgntframe->buf_addr, 0, TotalPktLen+txdesc_size); + //pmgntframe->buf_addr = ReservedPagePacket ; + + _rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen); + RTW_INFO("[%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 + // check rsvd page download OK. + BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); + while(!(BcnValidReg & BIT(0)) && count <200) + { + count++; + //PlatformSleepUs(10); + rtw_msleep_os(1); + BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); + RT_TRACE(_module_mp_, _drv_notice_,("Poll 0x20A = %x\n", BcnValidReg)); + } + DLBcnCount++; + //RTW_INFO("##0x208:%08x,0x210=%08x\n",rtw_read32(Adapter, REG_TDECTRL),rtw_read32(Adapter, 0x210)); + + rtw_write8(Adapter, REG_TDECTRL+2,BcnValidReg); + + }while((!(BcnValidReg&BIT(0))) && DLBcnCount<5); + + +#endif + if(DLBcnCount >=5){ + RTW_INFO(" check rsvd page download OK DLBcnCount =%d \n",DLBcnCount); + rtStatus = _FAIL; + goto exit; + } + + if(!(BcnValidReg&BIT(0))) + { + RTW_INFO("_WriteFWtoTxPktBuf(): 1 Download RSVD page failed!\n"); + rtStatus = _FAIL; + goto exit; + } + + //--------------------------------------------------------- + // 4. Set Tx boundary to the initial value + //--------------------------------------------------------- + + + //--------------------------------------------------------- + // 5. Reset beacon setting to the initial value. + // After _CheckWLANFwPatchBTFwReady(). + //--------------------------------------------------------- + +exit: + + if(pGenBufReservedPagePacket) + { + RTW_INFO("_WriteBTFWtoTxPktBuf8723B => rtw_mfree pGenBufReservedPagePacket!\n"); + rtw_mfree((u8*)pGenBufReservedPagePacket, TotalPktLen); + } + return rtStatus; +} + +int ReservedPage_Compare(PADAPTER Adapter,PRT_MP_FIRMWARE pFirmware,u32 BTPatchSize) +{ + u8 temp,ret,lastBTsz; + u32 u1bTmp=0,address_start=0,count=0,i=0; + u8 *myBTFwBuffer = NULL; + + myBTFwBuffer = rtw_zmalloc(BTPatchSize); + if (myBTFwBuffer == NULL) + { + RTW_INFO("%s can't be executed due to the failed malloc.\n", __FUNCTION__); + Adapter->mppriv.bTxBufCkFail=_TRUE; + return _FALSE; + } + + temp=rtw_read8(Adapter,0x209); + + address_start=(temp*128)/8; + + rtw_write32(Adapter,0x140,0x00000000); + rtw_write32(Adapter,0x144,0x00000000); + rtw_write32(Adapter,0x148,0x00000000); + + rtw_write8(Adapter,0x106,0x69); + + + for(i=0;i<(BTPatchSize/8);i++) + { + rtw_write32(Adapter,0x140,address_start+5+i) ; + + //polling until reg 0x140[23]=1; + do{ + u1bTmp = rtw_read32(Adapter, 0x140); + if(u1bTmp&BIT(23)) + { + ret = _SUCCESS; + break; + } + count++; + RTW_INFO("0x140=%x, wait for 10 ms (%d) times.\n",u1bTmp, count); + rtw_msleep_os(10); // 10ms + }while(!(u1bTmp&BIT(23)) && count < 50); + + myBTFwBuffer[i*8+0]=rtw_read8(Adapter, 0x144); + myBTFwBuffer[i*8+1]=rtw_read8(Adapter, 0x145); + myBTFwBuffer[i*8+2]=rtw_read8(Adapter, 0x146); + myBTFwBuffer[i*8+3]=rtw_read8(Adapter, 0x147); + myBTFwBuffer[i*8+4]=rtw_read8(Adapter, 0x148); + myBTFwBuffer[i*8+5]=rtw_read8(Adapter, 0x149); + myBTFwBuffer[i*8+6]=rtw_read8(Adapter, 0x14a); + myBTFwBuffer[i*8+7]=rtw_read8(Adapter, 0x14b); + } + + rtw_write32(Adapter,0x140,address_start+5+BTPatchSize/8) ; + + lastBTsz=BTPatchSize%8; + + //polling until reg 0x140[23]=1; + u1bTmp=0; + count=0; + do{ + u1bTmp = rtw_read32(Adapter, 0x140); + if(u1bTmp&BIT(23)) + { + ret = _SUCCESS; + break; + } + count++; + RTW_INFO("0x140=%x, wait for 10 ms (%d) times.\n",u1bTmp, count); + rtw_msleep_os(10); // 10ms + }while(!(u1bTmp&BIT(23)) && count < 50); + + for(i=0;iszFwBuffer[i]) + { + RTW_INFO(" In direct myBTFwBuffer[%d]=%x , pFirmware->szFwBuffer=%x\n",i, myBTFwBuffer[i],pFirmware->szFwBuffer[i]); + Adapter->mppriv.bTxBufCkFail=_TRUE; + break; + } + } + + if (myBTFwBuffer != NULL) + { + rtw_mfree(myBTFwBuffer, BTPatchSize); + } + + return _TRUE; +} + +#ifdef CONFIG_RTL8821A +s32 FirmwareDownloadBT(PADAPTER padapter, PRT_MP_FIRMWARE pFirmware) +{ + s32 rtStatus; + u8 *pBTFirmwareBuf; + u32 BTFirmwareLen; + u8 download_time; + s8 i; + + + rtStatus = _SUCCESS; + pBTFirmwareBuf = NULL; + BTFirmwareLen = 0; + + // + // Patch BT Fw. Download BT RAM code to Tx packet buffer. + // + if (padapter->bBTFWReady) { + RTW_INFO("%s: BT Firmware is ready!!\n", __FUNCTION__); + return _FAIL; + } + +#ifdef CONFIG_FILE_FWIMG + if (rtw_is_file_readable(rtw_fw_mp_bt_file_path) == _TRUE) + { + RTW_INFO("%s: accquire MP BT FW from file:%s\n", __FUNCTION__, rtw_fw_mp_bt_file_path); + + rtStatus = rtw_retrieve_from_file(rtw_fw_mp_bt_file_path, FwBuffer, 0x8000); + BTFirmwareLen = rtStatus>=0?rtStatus:0; + pBTFirmwareBuf = FwBuffer; + } + else +#endif // CONFIG_FILE_FWIMG + { +#ifdef CONFIG_EMBEDDED_FWIMG + RTW_INFO("%s: Download MP BT FW from header\n", __FUNCTION__); + + pBTFirmwareBuf = (u8*)Rtl8821A_BT_MP_Patch_FW; + BTFirmwareLen = Rtl8812BFwBTImgArrayLength; + pFirmware->szFwBuffer = pBTFirmwareBuf; + pFirmware->ulFwLength = BTFirmwareLen; +#endif // CONFIG_EMBEDDED_FWIMG + } + + RTW_INFO("%s: MP BT Firmware size=%d\n", __FUNCTION__, BTFirmwareLen); + + // for h2c cam here should be set to true + padapter->bFWReady = _TRUE; + + download_time = (BTFirmwareLen + 4095) / 4096; + RTW_INFO("%s: download_time is %d\n", __FUNCTION__, download_time); + + // Download BT patch Fw. + for (i = (download_time-1); i >= 0; i--) + { + if (i == (download_time - 1)) + { + rtStatus = _WriteBTFWtoTxPktBuf8812(padapter, pBTFirmwareBuf+(4096*i), (BTFirmwareLen-(4096*i)), 1); + RTW_INFO("%s: start %d, len %d, time 1\n", __FUNCTION__, 4096*i, BTFirmwareLen-(4096*i)); + } + else + { + rtStatus = _WriteBTFWtoTxPktBuf8812(padapter, pBTFirmwareBuf+(4096*i), 4096, (download_time-i)); + RTW_INFO("%s: start %d, len 4096, time %d\n", __FUNCTION__, 4096*i, download_time-i); + } + + if (rtStatus != _SUCCESS) + { + RTW_INFO("%s: BT Firmware download to Tx packet buffer fail!\n", __FUNCTION__); + padapter->bBTFWReady = _FALSE; + return rtStatus; + } + } + + ReservedPage_Compare(padapter,pFirmware,BTFirmwareLen); + + padapter->bBTFWReady = _TRUE; + SetFwBTFwPatchCmd_8821(padapter, (u16)BTFirmwareLen); + rtStatus = _CheckWLANFwPatchBTFwReady_8821A(padapter); + + RTW_INFO("<===%s: return %s!\n", __FUNCTION__, rtStatus==_SUCCESS?"SUCCESS":"FAIL"); + return rtStatus; +} +#endif //CONFIG_RTL8821A*/ + +#ifdef CONFIG_WOWLAN +//=========================================== +// +// Description: Prepare some information to Fw for WoWLAN. +// (1) Download wowlan Fw. +// (2) Download RSVD page packets. +// (3) Enable AP offload if needed. +// +// 2011.04.12 by tynli. +// +VOID +SetFwRelatedForWoWLAN8812( + IN PADAPTER padapter, + IN u8 bHostIsGoingtoSleep +) +{ + int status=_FAIL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 bRecover = _FALSE; + // + // 1. Before WoWLAN we need to re-download WoWLAN Fw. + // + status = FirmwareDownload8812(padapter, bHostIsGoingtoSleep); + if(status != _SUCCESS) { + RTW_INFO("SetFwRelatedForWoWLAN8812(): Re-Download Firmware failed!!\n"); + return; + } else { + RTW_INFO("SetFwRelatedForWoWLAN8812(): Re-Download Firmware Success !!\n"); + } + // + // 2. Re-Init the variables about Fw related setting. + // + InitializeFirmwareVars8812(padapter); +} +#endif //CONFIG_WOWLAN + +//=========================================================== +// Efuse related code +//=========================================================== +BOOLEAN +hal_GetChnlGroup8814A( + IN u8 Channel, + OUT u8* pGroup + ) +{ + BOOLEAN bIn24G=_TRUE; + + if(Channel <= 14) + { + bIn24G=_TRUE; + + if (1 <= Channel && Channel <= 2 ) *pGroup = 0; + else if (3 <= Channel && Channel <= 5 ) *pGroup = 1; + else if (6 <= Channel && Channel <= 8 ) *pGroup = 2; + else if (9 <= Channel && Channel <= 11) *pGroup = 3; + else if (12 <= Channel && Channel <= 14) *pGroup = 4; + else + { + RT_DISP(FPHY, PHY_TXPWR_EFUSE, ("==>hal_GetChnlGroupJaguar in 2.4 G, but Channel %d in Group not found \n", Channel)); + } + } + else + { + bIn24G=_FALSE; + + if (36 <= Channel && Channel <= 42) *pGroup = 0; // 36 38 40 + else if (44 <= Channel && Channel <= 48) *pGroup = 1; // 44 46 48 + else if (50 <= Channel && Channel <= 58) *pGroup = 2; // 52 54 56 + else if (60 <= Channel && Channel <= 64) *pGroup = 3; // 60 62 64 + else if (100 <= Channel && Channel <= 106) *pGroup = 4; // 100 102 104 + else if (108 <= Channel && Channel <= 114) *pGroup = 5; // 108 110 112 + else if (116 <= Channel && Channel <= 122) *pGroup = 6; // 116 118 120 + else if (124 <= Channel && Channel <= 130) *pGroup = 7; // 124 126 128 + else if (132 <= Channel && Channel <= 138) *pGroup = 8; // 132 134 136 + else if (140 <= Channel && Channel <= 144) *pGroup = 9; // 140 142 144 + else if (149 <= Channel && Channel <= 155) *pGroup = 10; // 149 151 153 + else if (157 <= Channel && Channel <= 161) *pGroup = 11; // 157 159 161 + else if (165 <= Channel && Channel <= 171) *pGroup = 12; // 165 167 169 + else if (173 <= Channel && Channel <= 177) *pGroup = 13; // 173 175 177 + else + { + RT_DISP(FPHY, PHY_TXPWR_EFUSE, ("==>hal_GetChnlGroupJaguar in 5G, but Channel %d in Group not found \n",Channel)); + } + + } + + return bIn24G; +} + +#if 0 +static void +hal_ReadPowerValueFromPROM8814A( + IN PADAPTER Adapter, + IN PTxPowerInfo24G pwrInfo24G, + IN PTxPowerInfo5G pwrInfo5G, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 rfPath, eeAddr=EEPROM_TX_PWR_INX_8814, group,TxCount=0; + + _rtw_memset(pwrInfo24G, 0, sizeof(TxPowerInfo24G)); + _rtw_memset(pwrInfo5G, 0, sizeof(TxPowerInfo5G)); + + /* RTW_INFO("hal_ReadPowerValueFromPROM8814A(): PROMContent[0x%x]=0x%x\n", (eeAddr+1), PROMContent[eeAddr+1]); */ + if(0xFF == PROMContent[eeAddr+1]) //YJ,add,120316 + AutoLoadFail = _TRUE; + + if(AutoLoadFail) + { + RTW_INFO("hal_ReadPowerValueFromPROM8814A(): Use Default value!\n"); + for(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) + { + // 2.4G default value + for(group = 0 ; group < MAX_CHNL_GROUP_24G; group++) + { + pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; + pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; + } + for(TxCount=0;TxCountBW20_Diff[rfPath][0] = EEPROM_DEFAULT_24G_HT20_DIFF; + pwrInfo24G->OFDM_Diff[rfPath][0] = EEPROM_DEFAULT_24G_OFDM_DIFF; + } + else + { + pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + pwrInfo24G->BW40_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + pwrInfo24G->CCK_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + } + } + + // 5G default value + for(group = 0 ; group < MAX_CHNL_GROUP_5G; group++) + { + pwrInfo5G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_5G_INDEX; + } + + for(TxCount=0;TxCountOFDM_Diff[rfPath][0] = EEPROM_DEFAULT_5G_OFDM_DIFF; + pwrInfo5G->BW20_Diff[rfPath][0] = EEPROM_DEFAULT_5G_HT20_DIFF; + pwrInfo5G->BW80_Diff[rfPath][0] = EEPROM_DEFAULT_DIFF; + pwrInfo5G->BW160_Diff[rfPath][0] = EEPROM_DEFAULT_DIFF; + } + else + { + pwrInfo5G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + pwrInfo5G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + pwrInfo5G->BW40_Diff[rfPath][TxCount]= EEPROM_DEFAULT_DIFF; + pwrInfo5G->BW80_Diff[rfPath][TxCount]= EEPROM_DEFAULT_DIFF; + pwrInfo5G->BW160_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; + + } + } + + } + + //pHalData->bNOPG = _TRUE; + return; + } + + for(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) + { + // 2.4G default value + for(group = 0 ; group < MAX_CHNL_GROUP_24G; group++) + { + pwrInfo24G->IndexCCK_Base[rfPath][group] = PROMContent[eeAddr++]; + if(pwrInfo24G->IndexCCK_Base[rfPath][group] == 0xFF) + { + pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; + } + /* RTW_INFO("8814-2G RF-%d-G-%d CCK-Addr-%x BASE=%x\n", + rfPath, group, eeAddr-1, pwrInfo24G->IndexCCK_Base[rfPath][group]); */ + } + for(group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++) + { + pwrInfo24G->IndexBW40_Base[rfPath][group] = PROMContent[eeAddr++]; + if(pwrInfo24G->IndexBW40_Base[rfPath][group] == 0xFF) + pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; + /* RTW_INFO("8814-2G RF-%d-G-%d BW40-Addr-%x BASE=%x\n", + rfPath, group, eeAddr-1, pwrInfo24G->IndexBW40_Base[rfPath][group]); */ + } + for(TxCount=0;TxCountBW40_Diff[rfPath][TxCount] = 0; + + { + pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-2G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */ + + { + pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-2G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo24G->OFDM_Diff[rfPath][TxCount]); */ + + pwrInfo24G->CCK_Diff[rfPath][TxCount] = 0; + eeAddr++; + } + else + { + + { + pwrInfo24G->BW40_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if(pwrInfo24G->BW40_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo24G->BW40_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-2G RF-%d-SS-%d BW40-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo24G->BW40_Diff[rfPath][TxCount]); */ + + + { + pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-2G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */ + + eeAddr++; + + + { + pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-2G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */ + + + { + pwrInfo24G->CCK_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if(pwrInfo24G->CCK_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo24G->CCK_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-2G RF-%d-SS-%d CCK-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo24G->CCK_Diff[rfPath][TxCount]); */ + + eeAddr++; + } + } + + //5G default value + for(group = 0 ; group < MAX_CHNL_GROUP_5G; group++) + { + pwrInfo5G->IndexBW40_Base[rfPath][group] = PROMContent[eeAddr++]; + if(pwrInfo5G->IndexBW40_Base[rfPath][group] == 0xFF) + pwrInfo5G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_DIFF; + + /* RTW_INFO("8814-5G RF-%d-G-%d BW40-Addr-%x BASE=%x\n", + rfPath, TxCount, eeAddr-1, pwrInfo5G->IndexBW40_Base[rfPath][group]); */ + } + + for(TxCount=0;TxCountBW40_Diff[rfPath][TxCount]= 0; + + + { + pwrInfo5G->BW20_Diff[rfPath][0] = (PROMContent[eeAddr]&0xf0)>>4; + if(pwrInfo5G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->BW20_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-5G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->BW20_Diff[rfPath][TxCount]); */ + + + { + pwrInfo5G->OFDM_Diff[rfPath][0] = (PROMContent[eeAddr]&0x0f); + if(pwrInfo5G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->OFDM_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][TxCount]); */ + + eeAddr++; + } + else + { + + { + pwrInfo5G->BW40_Diff[rfPath][TxCount]= (PROMContent[eeAddr]&0xf0)>>4; + if(pwrInfo5G->BW40_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->BW40_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-5G RF-%d-SS-%d BW40-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->BW40_Diff[rfPath][TxCount]); */ + + + { + pwrInfo5G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); + if(pwrInfo5G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->BW20_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-5G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->BW20_Diff[rfPath][TxCount]); */ + + eeAddr++; + } + } + + + { + pwrInfo5G->OFDM_Diff[rfPath][1] = (PROMContent[eeAddr]&0xf0)>>4; + pwrInfo5G->OFDM_Diff[rfPath][2] = (PROMContent[eeAddr]&0x0f); + } + /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", + rfPath, 2, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][2]); */ + eeAddr++; + + + pwrInfo5G->OFDM_Diff[rfPath][3] = (PROMContent[eeAddr]&0x0f); + + /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", + rfPath, 3, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][3]); */ + eeAddr++; + + for(TxCount=1;TxCountOFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->OFDM_Diff[rfPath][TxCount] |= 0xF0; + + /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][TxCount]); */ + } + + for(TxCount=0;TxCountBW80_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; + if(pwrInfo5G->BW80_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->BW80_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-5G RF-%d-SS-%d BW80-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->BW80_Diff[rfPath][TxCount]); */ + + + { + pwrInfo5G->BW160_Diff[rfPath][TxCount]= (PROMContent[eeAddr]&0x0f); + if(pwrInfo5G->BW160_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo5G->BW160_Diff[rfPath][TxCount] |= 0xF0; + } + /* RTW_INFO("8814-5G RF-%d-SS-%d BW160-Addr-%x DIFF=%d\n", + rfPath, TxCount, eeAddr, pwrInfo5G->BW160_Diff[rfPath][TxCount]); */ + eeAddr++; + } + } + +} +#endif + +VOID +HALBT_InitHalVars( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#ifdef CONFIG_BT_COEXIST +#if (MP_DRIVER == 1) + pHalData->bt_coexist.bBtExist = 0; +#else + pHalData->bt_coexist.bBtExist = pHalData->EEPROMBluetoothCoexist; +#endif + pHalData->bt_coexist.btTotalAntNum = pHalData->EEPROMBluetoothAntNum; + pHalData->bt_coexist.btChipType = pHalData->EEPROMBluetoothType; +#endif //CONFIG_BT_COEXIST +} + + +VOID +BT_InitHalVars( + IN PADAPTER Adapter + ) +{ + u8 antNum=2, chipType; + BOOLEAN bBtExist=_FALSE; + + // HALBT_InitHalVars() must be called first + HALBT_InitHalVars(Adapter); +#if 0 + // called after HALBT_InitHalVars() + bBtExist = HALBT_GetBtExist(Adapter); + EXhalbtcoutsrc_SetBtExist(bBtExist); + chipType = HALBT_GetBtChipType(Adapter); + EXhalbtcoutsrc_SetChipType(chipType); + antNum = HALBT_GetPgAntNum(Adapter); + EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum); +#endif +} + + +VOID +hal_EfuseParseBTCoexistInfo8814A( + IN PADAPTER Adapter, + IN u8* hwinfo, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 tempval=0x0; + + if(!AutoLoadFail) + { + tempval = hwinfo[EEPROM_RF_BOARD_OPTION_8814]; + if( ((tempval & 0xe0)>>5) == 0x1)// [7:5] + pHalData->EEPROMBluetoothCoexist = 1; + else + pHalData->EEPROMBluetoothCoexist = 0; + pHalData->EEPROMBluetoothType = BT_RTL8814A; + + tempval = hwinfo[EEPROM_RF_BT_SETTING_8814]; + pHalData->EEPROMBluetoothAntNum = Ant_x1; + } + else + { + pHalData->EEPROMBluetoothCoexist = 0; + pHalData->EEPROMBluetoothType = BT_RTL8814A; + pHalData->EEPROMBluetoothAntNum = Ant_x1; + } + + BT_InitHalVars(Adapter); +} + +VOID +hal_ReadPROMVersion8814A( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(AutoloadFail){ + pHalData->EEPROMVersion = EEPROM_Default_Version; + } + else{ + pHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION_8814]; + if(pHalData->EEPROMVersion == 0xFF) + pHalData->EEPROMVersion = EEPROM_Default_Version; + } +} +#if 0 +void +hal_ReadTxPowerInfo8814A( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + TxPowerInfo24G pwrInfo24G; + TxPowerInfo5G pwrInfo5G; + u8 rfPath, ch, group, TxCount; + + hal_ReadPowerValueFromPROM8814A(Adapter, &pwrInfo24G,&pwrInfo5G, PROMContent, AutoLoadFail); + + //if(!AutoLoadFail) + // pHalData->bTXPowerDataReadFromEEPORM = _TRUE; + + for(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) + { + for (ch = 0 ; ch < CENTER_CH_2G_NUM ; ch++) { + hal_GetChnlGroup8814A(ch+1, &group); + + if(ch == 14-1) + { + pHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][5]; + pHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group]; + } + else + { + pHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][group]; + pHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group]; + } + //RTW_INFO("======= Path %d, ChannelIndex %d, Group %d=======\n",rfPath,ch, group); + //RTW_INFO("Index24G_CCK_Base[%d][%d] = 0x%x\n",rfPath,ch ,pHalData->Index24G_CCK_Base[rfPath][ch]); + //RTW_INFO("Index24G_BW40_Base[%d][%d] = 0x%x\n",rfPath,ch,pHalData->Index24G_BW40_Base[rfPath][ch]); + } + + for (ch = 0 ; ch < CENTER_CH_5G_ALL_NUM; ch++) { + hal_GetChnlGroup8814A(center_ch_5g_all[ch], &group); + + pHalData->Index5G_BW40_Base[rfPath][ch] = pwrInfo5G.IndexBW40_Base[rfPath][group]; + //RTW_INFO("======= Path %d, ChannelIndex %d, Group %d=======\n",rfPath,ch, group); + //RTW_INFO("Index5G_BW40_Base[%d][%d] = 0x%x\n",rfPath,ch,pHalData->Index5G_BW40_Base[rfPath][ch]); + } + for (ch = 0 ; ch < CENTER_CH_5G_80M_NUM; ch++) { + u8 upper, lower; + + hal_GetChnlGroup8814A(center_ch_5g_80m[ch], &group); + upper = pwrInfo5G.IndexBW40_Base[rfPath][group]; + lower = pwrInfo5G.IndexBW40_Base[rfPath][group+1]; + + pHalData->Index5G_BW80_Base[rfPath][ch] = (upper + lower) / 2; + + //RTW_INFO("======= Path %d, ChannelIndex %d, Group %d=======\n",rfPath,ch, group); + //RTW_INFO("Index5G_BW80_Base[%d][%d] = 0x%x\n",rfPath,ch,pHalData->Index5G_BW80_Base[rfPath][ch]); + } + + for(TxCount=0;TxCountCCK_24G_Diff[rfPath][TxCount]=pwrInfo24G.CCK_Diff[rfPath][TxCount]; + pHalData->OFDM_24G_Diff[rfPath][TxCount]=pwrInfo24G.OFDM_Diff[rfPath][TxCount]; + pHalData->BW20_24G_Diff[rfPath][TxCount]=pwrInfo24G.BW20_Diff[rfPath][TxCount]; + pHalData->BW40_24G_Diff[rfPath][TxCount]=pwrInfo24G.BW40_Diff[rfPath][TxCount]; + + pHalData->OFDM_5G_Diff[rfPath][TxCount]=pwrInfo5G.OFDM_Diff[rfPath][TxCount]; + pHalData->BW20_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW20_Diff[rfPath][TxCount]; + pHalData->BW40_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW40_Diff[rfPath][TxCount]; + pHalData->BW80_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW80_Diff[rfPath][TxCount]; +//#if DBG +#if 0 + RTW_INFO("--------------------------------------- 2.4G ---------------------------------------\n"); + RTW_INFO("CCK_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->CCK_24G_Diff[rfPath][TxCount]); + RTW_INFO("OFDM_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->OFDM_24G_Diff[rfPath][TxCount]); + RTW_INFO("BW20_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW20_24G_Diff[rfPath][TxCount]); + RTW_INFO("BW40_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW40_24G_Diff[rfPath][TxCount]); + RTW_INFO("---------------------------------------- 5G ----------------------------------------\n"); + RTW_INFO("OFDM_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->OFDM_5G_Diff[rfPath][TxCount]); + RTW_INFO("BW20_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW20_5G_Diff[rfPath][TxCount]); + RTW_INFO("BW40_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW40_5G_Diff[rfPath][TxCount]); + RTW_INFO("BW80_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW80_5G_Diff[rfPath][TxCount]); +#endif + } + } + + + // 2010/10/19 MH Add Regulator recognize for CU. + if(!AutoLoadFail) + { + struct registry_priv *registry_par = &Adapter->registrypriv; + + pHalData->EEPROMRegulatory = (PROMContent[EEPROM_RF_BOARD_OPTION_8814]&0x7); //bit0~2 + if(PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF) + pHalData->EEPROMRegulatory = (EEPROM_DEFAULT_BOARD_OPTION&0x7); //bit0~2 + } + else + { + pHalData->EEPROMRegulatory = 0; + + } + RTW_INFO("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); + +} +#else +void +hal_ReadTxPowerInfo8814A( + IN PADAPTER Adapter, + IN u8 *PROMContent, + IN BOOLEAN AutoLoadFail +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + TxPowerInfo24G pwrInfo24G; + TxPowerInfo5G pwrInfo5G; + + hal_load_txpwr_info(Adapter, &pwrInfo24G, &pwrInfo5G, PROMContent); + + /* 2010/10/19 MH Add Regulator recognize for CU. */ + if (!AutoLoadFail) { + struct registry_priv *registry_par = &Adapter->registrypriv; + + + if (PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF) + pHalData->EEPROMRegulatory = (EEPROM_DEFAULT_BOARD_OPTION & 0x7); /* bit0~2 */ + else + pHalData->EEPROMRegulatory = (PROMContent[EEPROM_RF_BOARD_OPTION_8814] & 0x7); /* bit0~2 */ + + } else + pHalData->EEPROMRegulatory = 0; + RTW_INFO("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); + +} +#endif + +VOID +hal_ReadBoardType8814A( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(!AutoloadFail) + { + pHalData->InterfaceSel = (PROMContent[EEPROM_RF_BOARD_OPTION_8814]&0xE0)>>5; + if(PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF) + pHalData->InterfaceSel = (EEPROM_DEFAULT_BOARD_OPTION&0xE0)>>5; + } + else + { + pHalData->InterfaceSel = 0; + } + RTW_INFO("Board Type: 0x%2x\n", pHalData->InterfaceSel); +} + +VOID +hal_Read_TRX_antenna_8814A( + IN PADAPTER Adapter, + IN u8 *PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 trx_antenna = RF_2T4R; + + if (!AutoloadFail) { + u8 trx_antenna_option = PROMContent[EEPROM_TRX_ANTENNA_OPTION_8814]; + + if (trx_antenna_option == 0xff) { + trx_antenna = RF_4T4R; + RTW_INFO("EEPROM RF set 4T4R\n"); + } else if (trx_antenna_option == 0xee) { + trx_antenna = RF_3T3R; + RTW_INFO("EEPROM RF set 3T3R\n"); + } else if (trx_antenna_option == 0x66) { + trx_antenna = RF_2T2R; + RTW_INFO("EEPROM RF set 2T2R\n"); + } else if (trx_antenna_option == 0x6f) { + trx_antenna = RF_2T4R; + RTW_INFO("EEPROM RF set 2T4R\n"); + } else { + trx_antenna = RF_2T4R; + RTW_INFO("unknown EEPROM RF set, default to 2T4R\n"); + } + } else { + trx_antenna = RF_2T4R; + RTW_INFO("AutoloadFail, default to 2T4R\n"); + } + + /* if driver doesn't set rf_config, use the value of EEPROM */ + if (Adapter->registrypriv.rf_config == RF_TYPE_MAX) { + + if (trx_antenna == RF_4T4R +#ifdef CONFIG_USB_HCI + && IS_SUPER_SPEED_USB(Adapter) +#endif /* CONFIG_USB_HCI */ + ) + Adapter->registrypriv.rf_config = RF_3T3R; + else if (trx_antenna == RF_2T4R) + Adapter->registrypriv.rf_config = RF_2T4R; + else { + Adapter->registrypriv.rf_config = RF_2T4R; + RTW_INFO("default rf type: %d\n", Adapter->registrypriv.rf_config); + } + } else { +#ifdef CONFIG_USB_HCI + if (!IS_SUPER_SPEED_USB(Adapter)) + Adapter->registrypriv.rf_config = RF_2T4R; +#endif /* CONFIG_USB_HCI */ + } + + RTW_INFO("Final rf_config: %d\n", Adapter->registrypriv.rf_config); +} + + +VOID +hal_ReadThermalMeter_8814A( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + pHalData->eeprom_thermal_meter = 0xff; + + if(!AutoloadFail) + pHalData->eeprom_thermal_meter = PROMContent[EEPROM_THERMAL_METER_8814]; + +#if 0 /* ToDo: check with RF */ + else + pHalData->eeprom_thermal_meter = EEPROM_Default_ThermalMeter_8814A; + + if ((pHalData->eeprom_thermal_meter == 0xff) || (_TRUE == AutoloadFail)) { + pHalData->odmpriv.rf_calibrate_info.bAPKThermalMeterIgnore = _TRUE; + pHalData->eeprom_thermal_meter = EEPROM_Default_ThermalMeter_8814A; + } +#endif + + //pHalData->ThermalMeter[0] = pHalData->eeprom_thermal_meter; + RTW_INFO("ThermalMeter = 0x%x\n", pHalData->eeprom_thermal_meter); +} + + +void hal_ReadRemoteWakeup_8814A( + PADAPTER padapter, + IN u8* hwinfo, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); + u8 tmpvalue; + + if(AutoLoadFail){ + pwrctl->bHWPowerdown = _FALSE; + pwrctl->bSupportRemoteWakeup = _FALSE; + } + else + { + // decide hw if support remote wakeup function + // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume +/* todo: wowlan should check the efuse again +#ifdef CONFIG_USB_HCI + if(IS_HARDWARE_TYPE_8821U(padapter)) + pwrctl->bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0_8811AU] & BIT1)?_TRUE :_FALSE; + else + pwrctl->bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0] & BIT1)?_TRUE :_FALSE; +#endif //CONFIG_USB_HCI +*/ + RTW_INFO("%s...bSupportRemoteWakeup(%x)\n",__FUNCTION__, pwrctl->bSupportRemoteWakeup); + } +} + +VOID +hal_ReadChannelPlan8814A( + IN PADAPTER padapter, + IN u8* hwinfo, + IN BOOLEAN AutoLoadFail + ) +{ + struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); + hal_com_config_channel_plan( + padapter + , hwinfo ? &hwinfo[EEPROM_COUNTRY_CODE_8814] : NULL + , hwinfo ? hwinfo[EEPROM_ChannelPlan_8814] : 0xFF + , padapter->registrypriv.alpha2 + , padapter->registrypriv.channel_plan + , RTW_CHPLAN_REALTEK_DEFINE + , AutoLoadFail + ); +/* + padapter->mlmepriv.ChannelPlan = hal_com_config_channel_plan( + padapter + , hwinfo?hwinfo[EEPROM_ChannelPlan_8814]:0xFF + , padapter->registrypriv.channel_plan + , RTW_CHPLAN_REALTEK_DEFINE + , AutoLoadFail + ); +*/ + RTW_INFO("rfctl->ChannelPlan = 0x%02x\n", rfctl->ChannelPlan); +} + +void hal_GetRxGainOffset_8814A( + PADAPTER Adapter, + pu1Byte PROMContent, + BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + + pHalData->RxGainOffset[0] = 0; + pHalData->RxGainOffset[1] = 0; + pHalData->RxGainOffset[2] = 0; + pHalData->RxGainOffset[3] = 0; + + if ((pregistrypriv->reg_rxgain_offset_2g != 0 && pregistrypriv->reg_rxgain_offset_5gl != 0) && + (pregistrypriv->reg_rxgain_offset_5gm != 0 && pregistrypriv->reg_rxgain_offset_5gh != 0)) { + pHalData->RxGainOffset[0] = pregistrypriv->reg_rxgain_offset_2g; + pHalData->RxGainOffset[1] = pregistrypriv->reg_rxgain_offset_5gl; + pHalData->RxGainOffset[2] = pregistrypriv->reg_rxgain_offset_5gm; + pHalData->RxGainOffset[3] = pregistrypriv->reg_rxgain_offset_5gh; + RTW_INFO("%s():Use registrypriv 0x%x 0x%x 0x%x 0x%x !!\n", __func__, pregistrypriv->reg_rxgain_offset_2g, pregistrypriv->reg_rxgain_offset_5gl, pregistrypriv->reg_rxgain_offset_5gm, pregistrypriv->reg_rxgain_offset_5gh); + + } else { + RTW_INFO("%s(): AutoloadFail = %d!!\n", __func__, AutoloadFail); + pHalData->RxGainOffset[0] = PROMContent[EEPROM_IG_OFFSET_4_CD_2G_8814A]; + pHalData->RxGainOffset[0] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_2G_8814A]) << 8; + pHalData->RxGainOffset[1] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GL_8814A]; + pHalData->RxGainOffset[1] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GL_8814A]) << 8; + pHalData->RxGainOffset[2] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GM_8814A]; + pHalData->RxGainOffset[2] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GM_8814A]) << 8; + pHalData->RxGainOffset[3] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GH_8814A]; + pHalData->RxGainOffset[3] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GH_8814A]) << 8; + } + RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_2G = 0x%x!!\n", pHalData->RxGainOffset[0]); + RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GL = 0x%x!!\n", pHalData->RxGainOffset[1]); + RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GM = 0x%x!!\n", pHalData->RxGainOffset[2]); + RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GH = 0x%x!!\n", pHalData->RxGainOffset[3]); +} + + +void Hal_EfuseParseKFreeData_8814A( + IN PADAPTER Adapter, + IN u8 *PROMContent, + IN BOOLEAN AutoloadFail) +{ +#ifdef CONFIG_RF_GAIN_OFFSET + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct kfree_data_t *kfree_data = &pHalData->kfree_data; + u8 kfreePhydata[KFREE_GAIN_DATA_LENGTH_8814A]; + u32 i = 0, j = 2, chidx = 0, efuseaddr = 0; + u8 rfpath = 0; + + if (GET_PG_KFREE_ON_8814A(PROMContent) && PROMContent[0xc8] != 0xff) + kfree_data->flag |= KFREE_FLAG_ON; + if (GET_PG_KFREE_THERMAL_K_ON_8814A(PROMContent) && PROMContent[0xc8] != 0xff) + kfree_data->flag |= KFREE_FLAG_THERMAL_K_ON; + + if (Adapter->registrypriv.RegRfKFreeEnable == 1) { + kfree_data->flag |= KFREE_FLAG_ON; + kfree_data->flag |= KFREE_FLAG_THERMAL_K_ON; + } + + _rtw_memset(kfree_data->bb_gain, 0xff, BB_GAIN_NUM * RF_PATH_MAX); + + if (kfree_data->flag & KFREE_FLAG_ON) { + + for (i = 0; i < KFREE_GAIN_DATA_LENGTH_8814A; i++) { + efuseaddr = PPG_BB_GAIN_2G_TXBA_OFFSET_8814A - i; + + if (efuseaddr <= PPG_BB_GAIN_2G_TXBA_OFFSET_8814A) { + kfreePhydata[i] = EFUSE_Read1Byte(Adapter, efuseaddr); + RTW_INFO("%s,kfreePhydata[%d] = %x\n", __func__, i, kfreePhydata[i]); + } + } + kfree_data->bb_gain[0][RF_PATH_A] + = (kfreePhydata[0] & PPG_BB_GAIN_2G_TX_OFFSET_MASK); + kfree_data->bb_gain[0][RF_PATH_B] + = (kfreePhydata[0] & PPG_BB_GAIN_2G_TXB_OFFSET_MASK) >> 4; + kfree_data->bb_gain[0][RF_PATH_C] + = (kfreePhydata[1] & PPG_BB_GAIN_2G_TX_OFFSET_MASK); + kfree_data->bb_gain[0][RF_PATH_D] + = (kfreePhydata[1] & PPG_BB_GAIN_2G_TXB_OFFSET_MASK) >> 4; + + for (chidx = 1; chidx <= BB_GAIN_5GHB; chidx++) { + for (rfpath = RF_PATH_A; rfpath < RF_PATH_MAX; rfpath++) + kfree_data->bb_gain[chidx][rfpath] = kfreePhydata[j + rfpath] & PPG_BB_GAIN_5G_TX_OFFSET_MASK; + + j = j + RF_PATH_MAX; + } + } + + if (kfree_data->flag & KFREE_FLAG_THERMAL_K_ON) + pHalData->eeprom_thermal_meter += kfree_data->thermal; + + RTW_INFO("registrypriv.RegRfKFreeEnable = %d\n", Adapter->registrypriv.RegRfKFreeEnable); + + RTW_INFO("kfree flag:%u\n", kfree_data->flag); + if (Adapter->registrypriv.RegRfKFreeEnable == 1 || kfree_data->flag & KFREE_FLAG_ON) { + for (chidx = 0 ; chidx <= BB_GAIN_5GHB; chidx++) { + for (rfpath = RF_PATH_A; rfpath < RF_PATH_MAX; rfpath++) + RTW_INFO("bb_gain[%d][%d]= %x\n", chidx, rfpath, kfree_data->bb_gain[chidx][rfpath]); + } + } + +#endif /*CONFIG_RF_GAIN_OFFSET */ +} + + +VOID +hal_EfuseParseXtal_8814A( + IN PADAPTER pAdapter, + IN u8* hwinfo, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if(!AutoLoadFail) + { + pHalData->crystal_cap = hwinfo[EEPROM_XTAL_8814]; + if(pHalData->crystal_cap == 0xFF) + pHalData->crystal_cap = EEPROM_Default_CrystalCap_8814; /* what value should 8814 set? */ + } + else + { + pHalData->crystal_cap = EEPROM_Default_CrystalCap_8814; + } + RTW_INFO("crystal_cap: 0x%2x\n", pHalData->crystal_cap); +} + +VOID +hal_ReadAntennaDiversity8814A( + IN PADAPTER pAdapter, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + pHalData->TRxAntDivType = NO_ANTDIV; + pHalData->AntDivCfg = 0; + + RTW_INFO("SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n", + pHalData->AntDivCfg, pHalData->TRxAntDivType); +} + +VOID +hal_ReadPAType_8814A( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail, + OUT u8* pPAType, + OUT u8* pLNAType + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 LNAType_AB, LNAType_CD; + + if( ! AutoloadFail ) + { + u8 rfe_type = PROMContent[EEPROM_RFE_OPTION_8814]; + + if (GetRegAmplifierType2G(Adapter) == 0) // AUTO + { + *pPAType = EF1Byte( *(u8*)&PROMContent[EEPROM_PA_TYPE_8814] ); + + LNAType_AB = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_AB_2G_8814] ); + LNAType_CD = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_CD_2G_8814] ); + + if (*pPAType == 0xFF && rfe_type == 0xFF) + pHalData->ExternalPA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; + else + pHalData->ExternalPA_2G = (*pPAType & BIT4) ? 1 : 0; + + if (LNAType_AB == 0xFF) + pHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; + else + pHalData->ExternalLNA_2G = (LNAType_AB & BIT3) ? 1 : 0; + + *pLNAType = (LNAType_AB & BIT3) << 1 | (LNAType_AB & BIT7) >> 2 | + (LNAType_CD & BIT3) << 3 | (LNAType_CD & BIT7); + } + else + { + pHalData->ExternalPA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; + pHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; + } + + if (GetRegAmplifierType5G(Adapter) == 0) // AUTO + { + LNAType_AB = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_AB_5G_8814] ); + LNAType_CD = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_CD_5G_8814] ); + + if (*pPAType == 0xFF && rfe_type == 0xFF) + pHalData->external_pa_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; + else + pHalData->external_pa_5g = (*pPAType & BIT0) ? 1 : 0; + + if (LNAType_AB == 0xFF) + pHalData->external_lna_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; + else + pHalData->external_lna_5g = (LNAType_AB & BIT3) ? 1 : 0; + + (*pLNAType) |= ((LNAType_AB & BIT3) >> 3 | (LNAType_AB & BIT7) >> 6 | + (LNAType_CD & BIT3) >> 1 | (LNAType_CD & BIT7) >> 4); + } + else + { + pHalData->external_pa_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA_5G) ? 1 : 0; + pHalData->external_lna_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA_5G) ? 1 : 0; + } + } + else + { + pHalData->ExternalPA_2G = EEPROM_Default_PAType; + pHalData->external_pa_5g = 0xFF; + pHalData->ExternalLNA_2G = EEPROM_Default_LNAType; + pHalData->external_lna_5g = 0xFF; + + if (GetRegAmplifierType2G(Adapter) == 0) + { + pHalData->ExternalPA_2G = 0; + pHalData->ExternalLNA_2G = 0; + } + else + { + pHalData->ExternalPA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; + pHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; + } + if (GetRegAmplifierType5G(Adapter) == 0) + { + pHalData->external_pa_5g = 0; + pHalData->external_lna_5g = 0; + } + else + { + pHalData->external_pa_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA_5G) ? 1 : 0; + pHalData->external_lna_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA_5G) ? 1 : 0; + } + } + RTW_INFO("PAType is 0x%x, LNAType is 0x%x\n", *pPAType, *pLNAType); + RTW_INFO("pHalData->ExternalPA_2G = %d, pHalData->external_pa_5g = %d\n", pHalData->ExternalPA_2G, pHalData->external_pa_5g); + RTW_INFO("pHalData->ExternalLNA_2G = %d, pHalData->external_lna_5g = %d\n", pHalData->ExternalLNA_2G, pHalData->external_lna_5g); +} + +VOID hal_ReadAmplifierType_8814A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + switch(pHalData->rfe_type) + { + case 1: /* 8814AU */ + pHalData->external_pa_5g = pHalData->external_lna_5g = _TRUE; + pHalData->TypeAPA = pHalData->TypeALNA = 0;/* APA and ALNA is 0 */ + break; + case 2: /* socket board 8814AR and 8194AR */ + pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; + pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; + pHalData->TypeAPA = pHalData->TypeALNA = 0x55;/* APA and ALNA is 1 */ + pHalData->TypeGPA = pHalData->TypeGLNA = 0x55;/* GPA and GLNA is 1 */ + break; + case 3: /* high power on-board 8814AR and 8194AR */ + pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; + pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; + pHalData->TypeAPA = pHalData->TypeALNA = 0xaa;/* APA and ALNA is 2 */ + pHalData->TypeGPA = pHalData->TypeGLNA = 0xaa;/* GPA and GLNA is 2 */ + break; + case 4: /* on-board 8814AR and 8194AR */ + pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; + pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; + pHalData->TypeAPA = 0x55;/* APA is 1 */ + pHalData->TypeALNA = 0xff; /* ALNA is 3 */ + pHalData->TypeGPA = pHalData->TypeGLNA = 0x55;/* GPA and GLNA is 1 */ + break; + case 5: + pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; + pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; + pHalData->TypeAPA = 0xaa; /* APA2 */ + pHalData->TypeALNA = 0x5500; /* ALNA4 */ + pHalData->TypeGPA = pHalData->TypeGLNA = 0xaa; /* GPA2,GLNA2 */ + break; + case 6: + pHalData->external_lna_5g = _TRUE; + pHalData->TypeALNA = 0; /* ALNA0 */ + break; + case 0: + default: /* 8814AE */ + break; + } + + RTW_INFO("pHalData->ExternalPA_2G = %d, pHalData->external_pa_5g = %d\n", pHalData->ExternalPA_2G, pHalData->external_pa_5g); + RTW_INFO("pHalData->ExternalLNA_2G = %d, pHalData->external_lna_5g = %d\n", pHalData->ExternalLNA_2G, pHalData->external_lna_5g); + RTW_INFO("pHalData->TypeGPA = 0x%X, pHalData->TypeAPA = 0x%X\n", pHalData->TypeGPA, pHalData->TypeAPA); + RTW_INFO("pHalData->TypeGLNA = 0x%X, pHalData->TypeALNA = 0x%X\n", pHalData->TypeGLNA, pHalData->TypeALNA); +} + + +VOID +hal_ReadRFEType_8814A( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(!AutoloadFail) + { + if ((GetRegRFEType(Adapter) != 64) || 0xFF == PROMContent[EEPROM_RFE_OPTION_8814] || PROMContent[EEPROM_RFE_OPTION_8814] & BIT7) { + if(GetRegRFEType(Adapter) != 64) + pHalData->rfe_type = GetRegRFEType(Adapter); + else if(IS_HARDWARE_TYPE_8814AE(Adapter)) + pHalData->rfe_type = 0; + else if(IS_HARDWARE_TYPE_8814AU(Adapter)) + pHalData->rfe_type = 1; + hal_ReadAmplifierType_8814A(Adapter); + + } else { + /* bit7==0 means RFE type defined by 0xCA[6:0] */ + pHalData->rfe_type = PROMContent[EEPROM_RFE_OPTION_8814] & 0x7F; + hal_ReadAmplifierType_8814A(Adapter); + } + } + else + { + if(GetRegRFEType(Adapter) != 64) + pHalData->rfe_type = GetRegRFEType(Adapter); + else if(IS_HARDWARE_TYPE_8814AE(Adapter)) + pHalData->rfe_type = 0; + else if(IS_HARDWARE_TYPE_8814AU(Adapter)) + pHalData->rfe_type = 1; + + hal_ReadAmplifierType_8814A(Adapter); + } + RTW_INFO("RFE Type: 0x%2x\n", pHalData->rfe_type); +} + +static VOID +hal_EfusePowerSwitch8814A( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + u8 tempval; + u16 tmpV16; + u8 EFUSE_ACCESS_ON_8814A = 0x69; + u8 EFUSE_ACCESS_OFF_8814A = 0x00; + + if (PwrState == _TRUE) + { + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON_8814A); + + // Reset: 0x0000h[28], default valid + tmpV16 = PlatformEFIORead2Byte(pAdapter,REG_SYS_FUNC_EN); + if( !(tmpV16 & FEN_ELDR) ){ + tmpV16 |= FEN_ELDR ; + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); + } + + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid + tmpV16 = PlatformEFIORead2Byte(pAdapter,REG_SYS_CLKR); + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ) + { + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); + } + + if(bWrite == _TRUE) + { + // Enable LDO 2.5V before read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + tempval &= 0x0F; + tempval |= (VOLTAGE_V25 << 4); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); + } + } + else + { + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF_8814A); + + if(bWrite == _TRUE){ + // Disable LDO 2.5V after read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); + } + } +} + +static VOID +rtl8814_EfusePowerSwitch( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + hal_EfusePowerSwitch8814A(pAdapter, bWrite, PwrState); +} + +static VOID +hal_EfuseReadEFuse8814A( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 *efuseTbl = NULL; + u16 eFuse_Addr = 0; + u8 offset=0, wden=0; + u16 i, j; + u16 **eFuseWord = NULL; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + u8 offset_2_0=0; + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; + + // + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. + // + if((_offset + _size_byte)>EFUSE_MAP_LEN_8814A) + {// total E-Fuse table is 512bytes + RTW_INFO("Hal_EfuseReadEFuse8814A(): Invalid offset(%#x) with read bytes(%#x)!!\n", _offset, _size_byte); + goto exit; + } + + efuseTbl = (u8*)rtw_zmalloc(EFUSE_MAP_LEN_8814A); + if(efuseTbl == NULL) + { + RTW_INFO("%s: alloc efuseTbl fail!\n", __FUNCTION__); + goto exit; + } + + eFuseWord= (u16 **)rtw_malloc2d(EFUSE_MAX_SECTION_8814A, EFUSE_MAX_WORD_UNIT_8814A, 2); + if(eFuseWord == NULL) + { + RTW_INFO("%s: alloc eFuseWord fail!\n", __FUNCTION__); + goto exit; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_MAX_SECTION_8814A; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT_8814A; j++) + eFuseWord[i][j] = 0xFFFF; + + // + // 1. Read the first byte to check if efuse is empty!!! + // + // + efuse_OneByteRead(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); + + if(efuseHeader != 0xFF) + { + efuse_utilized++; + } + else + { + RTW_INFO("EFUSE is empty\n"); + efuse_utilized = 0; + goto exit; + } + /* RT_DISP(FEEPROM, EFUSE_READ_ALL, ("Hal_EfuseReadEFuse8814A(): efuse_utilized: %d\n", efuse_utilized)); */ + + // + // 2. Read real efuse content. Filter PG header and every section data. + // + while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr)) + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse_Addr-%d efuse_data=%x\n", eFuse_Addr-1, *rtemp8)); + + // Check PG header for section num. + if(EXT_HEADER(efuseHeader)) //extended header + { + offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader); + //RT_DISP(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%X\n", offset_2_0)); + + efuse_OneByteRead(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); + + //RT_DISP(FEEPROM, EFUSE_READ_ALL, ("efuse[%X]=%X\n", eFuse_Addr-1, efuseExtHdr)); + + if(efuseExtHdr != 0xff) + { + efuse_utilized++; + if(ALL_WORDS_DISABLED(efuseExtHdr)) + { + efuse_OneByteRead(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); + if(efuseHeader != 0xff) + { + efuse_utilized++; + } + break; + } + else + { + offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0; + wden = (efuseExtHdr & 0x0F); + } + } + else + { + RTW_INFO("Error condition, extended = 0xff\n"); + // We should handle this condition. + break; + } + } + else + { + offset = ((efuseHeader >> 4) & 0x0f); + wden = (efuseHeader & 0x0f); + } + + if(offset < EFUSE_MAX_SECTION_8814A) + { + // Get word enable value from PG header + //RT_DISP(FEEPROM, EFUSE_READ_ALL, ("Offset-%X Worden=%X\n", offset, wden)); + + for(i=0; i> 8) & 0xff); + } + } + + /* RT_DISP(FEEPROM, EFUSE_READ_ALL, ("Hal_EfuseReadEFuse8814A(): efuse_utilized: %d\n", efuse_utilized)); */ + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u1Byte)((eFuse_Addr*100)/EFUSE_REAL_CONTENT_LEN_8814A); + rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&eFuse_Addr); + +exit: + if(efuseTbl) + rtw_mfree(efuseTbl, EFUSE_MAP_LEN_8814A); + + if(eFuseWord) + rtw_mfree2d((void *)eFuseWord, EFUSE_MAX_SECTION_8814A, EFUSE_MAX_WORD_UNIT_8814A, sizeof(u16)); +} + +static VOID +rtl8814_ReadEFuse( + PADAPTER Adapter, + u8 efuseType, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + hal_EfuseReadEFuse8814A(Adapter, _offset, _size_byte, pbuf, bPseudoTest); +} + +//Do not support BT +VOID +hal_EFUSEGetEfuseDefinition8814A( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u8 type, + OUT PVOID pOut + ) +{ + switch(type) + { + case TYPE_EFUSE_MAX_SECTION: + { + u8* pMax_section; + pMax_section = (u8*)pOut; + *pMax_section = EFUSE_MAX_SECTION_8814A; + } + break; + case TYPE_EFUSE_REAL_CONTENT_LEN: + { + u16* pu2Tmp; + pu2Tmp = (u16*)pOut; + *pu2Tmp = EFUSE_REAL_CONTENT_LEN_8814A; + } + break; + case TYPE_EFUSE_CONTENT_LEN_BANK: + { + u16* pu2Tmp; + pu2Tmp = (u16*)pOut; + *pu2Tmp = EFUSE_REAL_CONTENT_LEN_8814A; + } + break; + case TYPE_AVAILABLE_EFUSE_BYTES_BANK: + { + u16* pu2Tmp; + pu2Tmp = (u16*)pOut; + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_OOB_PROTECT_BYTES); + } + break; + case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL: + { + u16* pu2Tmp; + pu2Tmp = (u16*)pOut; + *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_OOB_PROTECT_BYTES); + } + break; + case TYPE_EFUSE_MAP_LEN: + { + u16* pu2Tmp; + pu2Tmp = (u16*)pOut; + *pu2Tmp = (u16)EFUSE_MAP_LEN_8814A; + } + break; + case TYPE_EFUSE_PROTECT_BYTES_BANK: + { + u8* pu1Tmp; + pu1Tmp = (u8*)pOut; + *pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES); + } + break; + default: + { + u8* pu1Tmp; + pu1Tmp = (u8*)pOut; + *pu1Tmp = 0; + } + break; + } +} + +static VOID +rtl8814_EFUSE_GetEfuseDefinition( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u8 type, + OUT void *pOut, + IN BOOLEAN bPseudoTest + ) +{ + hal_EFUSEGetEfuseDefinition8814A(pAdapter, efuseType, type, pOut); +} + +static u8 +hal_EfuseWordEnableDataWrite8814A( IN PADAPTER pAdapter, + IN u16 efuse_addr, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u16 readbackAddr = 0; + u16 start_addr = efuse_addr; + u8 badworden = 0x0F; + u8 readbackData[PGPKT_DATA_SIZE]; + + _rtw_memset((PVOID)readbackData, 0xff, PGPKT_DATA_SIZE); + + RTW_INFO("word_en = %x efuse_addr=%x\n", word_en, efuse_addr); + + if ( ! (word_en&BIT0)) + { + readbackAddr = start_addr; + efuse_OneByteWrite(pAdapter,start_addr++, data[0], bPseudoTest); + efuse_OneByteWrite(pAdapter,start_addr++, data[1], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor + + efuse_OneByteRead(pAdapter,readbackAddr, &readbackData[0], bPseudoTest); + efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[1], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor + + if((data[0]!=readbackData[0])||(data[1]!=readbackData[1])){ + badworden &= (~BIT0); + } + } + if ( ! (word_en&BIT1)) + { + readbackAddr = start_addr; + efuse_OneByteWrite(pAdapter,start_addr++, data[2], bPseudoTest); + efuse_OneByteWrite(pAdapter,start_addr++, data[3], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor + + efuse_OneByteRead(pAdapter,readbackAddr , &readbackData[2], bPseudoTest); + efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[3], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor + + if((data[2]!=readbackData[2])||(data[3]!=readbackData[3])){ + badworden &=( ~BIT1); + } + } + if ( ! (word_en&BIT2)) + { + readbackAddr = start_addr; + efuse_OneByteWrite(pAdapter,start_addr++, data[4], bPseudoTest); + efuse_OneByteWrite(pAdapter,start_addr++, data[5], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor + + efuse_OneByteRead(pAdapter,readbackAddr, &readbackData[4], bPseudoTest); + efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[5], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor + + if((data[4]!=readbackData[4])||(data[5]!=readbackData[5])){ + badworden &=( ~BIT2); + } + } + if ( ! (word_en&BIT3)) + { + readbackAddr = start_addr; + efuse_OneByteWrite(pAdapter,start_addr++, data[6], bPseudoTest); + efuse_OneByteWrite(pAdapter,start_addr++, data[7], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor + + efuse_OneByteRead(pAdapter,readbackAddr, &readbackData[6], bPseudoTest); + efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[7], bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor + + if((data[6]!=readbackData[6])||(data[7]!=readbackData[7])){ + badworden &=( ~BIT3); + } + } + return badworden; +} + +static u8 +rtl8814_Efuse_WordEnableDataWrite( IN PADAPTER pAdapter, + IN u16 efuse_addr, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ret=0; + + ret = hal_EfuseWordEnableDataWrite8814A(pAdapter, efuse_addr, word_en, data, bPseudoTest); + + return ret; +} + + +static u16 hal_EfuseGetCurrentSize_8814A( PADAPTER pAdapter, BOOLEAN bPseudoTest) +{ + int bContinual = _TRUE; + + u16 efuse_addr = 0; + u8 hoffset=0, hworden=0; + u8 efuse_data, word_cnts=0; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); + + RTW_INFO("=======> %s() \n", __func__); + + if(bPseudoTest) + { + efuse_addr = (u16)(fakeEfuseUsedBytes); + } + else + { + rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); + } + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723A(), start_efuse_addr = %d\n", efuse_addr)); + + while ( bContinual && + efuse_OneByteRead(pAdapter, efuse_addr , &efuse_data, bPseudoTest) && + (efuse_addr < EFUSE_REAL_CONTENT_LEN_8814A)) + { + if (efuse_data != 0xFF) + { + if ((efuse_data&0x1F) == 0x0F) //extended header + { + hoffset = efuse_data; + efuse_addr++; + efuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest); + if((efuse_data & 0x0F) == 0x0F) + { + efuse_addr++; + continue; + } else { + hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + } else { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + if(bPseudoTest) + { + fakeEfuseUsedBytes = efuse_addr; + pEfuseHal->fakeEfuseUsedBytes = efuse_addr; + RTW_INFO ("%s(), return %d \n", __func__, pEfuseHal->fakeEfuseUsedBytes ); + } + else + { + pEfuseHal->EfuseUsedBytes = efuse_addr; + pEfuseHal->EfuseUsedPercentage = (u1Byte)((pEfuseHal->EfuseUsedBytes*100)/pEfuseHal->PhysicalLen_WiFi); + rtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); + rtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_USAGE, (u8 *)&(pEfuseHal->EfuseUsedPercentage)); + RTW_INFO("%s(), return %d\n", __func__, efuse_addr); + } + + return efuse_addr; + +} + +static u16 +rtl8814_EfuseGetCurrentSize( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + ret = hal_EfuseGetCurrentSize_8814A(pAdapter, bPseudoTest); + + return ret; +} + + +static int +hal_EfusePgPacketRead_8814A( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); + u8 ReadState = PG_STATE_HEADER; + + int bContinual = _TRUE; + int bDataEmpty = _TRUE ; + + u8 efuse_data,word_cnts=0; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 tmpidx=0; + u8 tmpdata[8]; + u8 tmp_header = 0; + + if(data==NULL) return _FALSE; + if(offset>=EFUSE_MAX_SECTION_JAGUAR) return _FALSE; + + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // Skip dummy parts to prevent unexpected data read from Efuse. + // By pass right now. 2009.02.19. + // + while(bContinual && (efuse_addr < pEfuseHal->PhysicalLen_WiFi) ) + { + //------- Header Read ------------- + if(ReadState & PG_STATE_HEADER) + { + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)) + { + if(ALL_WORDS_DISABLED(efuse_data)) + { + tmp_header = efuse_data; + efuse_addr++; + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); + if((efuse_data & 0x0F) != 0x0F) + { + hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + else + { + efuse_addr++; + break; + } + + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + bDataEmpty = _TRUE ; + + if(hoffset==offset){ + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){ + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){ + tmpdata[tmpidx] = efuse_data; + if(efuse_data!=0xff){ + bDataEmpty = _FALSE; + } + } + } + if(bDataEmpty==_FALSE){ + ReadState = PG_STATE_DATA; + }else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + } + else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + else{ + bContinual = _FALSE ; + } + } + //------- Data section Read ------------- + else if(ReadState & PG_STATE_DATA) + { + efuse_WordEnableDataRead(hworden,tmpdata,data); + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) + return _FALSE; + else + return _TRUE; +} + +static int +rtl8814_Efuse_PgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + ret = hal_EfusePgPacketRead_8814A(pAdapter, offset, data, bPseudoTest); + + return ret; +} + +static BOOLEAN efuse_PgPacketCheck( + PADAPTER pAdapter, + u8 efuseType, + BOOLEAN bPseudoTest +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if (Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_PROTECT_BYTES_BANK_8814A)) + { + RTW_INFO("%s()error: %x >= %x\n", __func__, Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest), (EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_PROTECT_BYTES_BANK_8814A)); + return _FALSE; + } + + return _TRUE; +} + +static VOID +efuse_PgPacketConstruct( + IN u8 offset, + IN u8 word_en, + IN u8* pData, + IN OUT PPGPKT_STRUCT pTargetPkt + ) +{ + _rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8); + pTargetPkt->offset = offset; + pTargetPkt->word_en= word_en; + efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); + pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); + + RTW_INFO("efuse_PgPacketConstruct(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts); +} + + +u16 +efuse_PgPacketExceptionHandle( + IN PADAPTER pAdapter, + IN u16 ErrOffset + ) +{ + RTW_INFO("===> efuse_PgPacketExceptionHandle(), ErrOffset = 0x%X\n", ErrOffset); + + // ErrOffset is the offset of bad (extension) header. + //if (IS_HARDWARE_TYPE_8812AU(pAdapter)) + //ErrOffset = Hal_EfusePgPacketExceptionHandle_8812A(pAdapter, ErrOffset); + + RTW_INFO("<=== efuse_PgPacketExceptionHandle(), recovered! Jump to Offset = 0x%X\n", ErrOffset); + + return ErrOffset; +} + + +static BOOLEAN +hal_EfuseCheckIfDatafollowed( + IN PADAPTER pAdapter, + IN u8 word_cnts, + IN u16 startAddr, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet=FALSE; + u8 i, efuse_data; + + for(i=0; i<(word_cnts*2) ; i++) + { + if(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)) + bRet = TRUE; + } + + return bRet; +} + +static BOOLEAN +hal_EfuseWordEnMatched( + IN PPGPKT_STRUCT pTargetPkt, + IN PPGPKT_STRUCT pCurPkt, + IN u8* pWden +) +{ + u8 match_word_en = 0x0F; // default all words are disabled + + // check if the same words are enabled both target and current PG packet + if( ((pTargetPkt->word_en & BIT0) == 0) && + ((pCurPkt->word_en & BIT0) == 0) ) + { + match_word_en &= ~BIT0; // enable word 0 + } + if( ((pTargetPkt->word_en & BIT1) == 0) && + ((pCurPkt->word_en & BIT1) == 0) ) + { + match_word_en &= ~BIT1; // enable word 1 + } + if( ((pTargetPkt->word_en & BIT2) == 0) && + ((pCurPkt->word_en & BIT2) == 0) ) + { + match_word_en &= ~BIT2; // enable word 2 + } + if( ((pTargetPkt->word_en & BIT3) == 0) && + ((pCurPkt->word_en & BIT3) == 0) ) + { + match_word_en &= ~BIT3; // enable word 3 + } + + *pWden = match_word_en; + + if(match_word_en != 0xf) + return TRUE; + else + return FALSE; +} + + +static BOOLEAN +efuse_PgPacketPartialWrite( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN OUT u16* pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PEFUSE_HAL pEfuseHal=&(pHalData->EfuseHal); + BOOLEAN bRet=_FALSE; + u8 i, efuse_data=0, cur_header=0; + u8 matched_wden=0, badworden=0; + u16 startAddr=0; + PGPKT_STRUCT curPkt; + u16 max_sec_num = (efuseType == EFUSE_WIFI) ? pEfuseHal->MaxSecNum_WiFi : pEfuseHal->MaxSecNum_BT; + u16 efuse_max = pEfuseHal->BankSize; + u16 efuse_max_available_len = + (efuseType == EFUSE_WIFI) ? pEfuseHal->TotalAvailBytes_WiFi : pEfuseHal->TotalAvailBytes_BT; + + if (bPseudoTest) { + pEfuseHal->fakeEfuseBank = (efuseType == EFUSE_WIFI) ? 0 : pEfuseHal->fakeEfuseBank; + Efuse_GetCurrentSize(pAdapter, efuseType, _TRUE); + } + + //EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &efuse_max_available_len, bPseudoTest); + //EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_CONTENT_LEN_BANK, &efuse_max, bPseudoTest); + + if(efuseType == EFUSE_WIFI) + { + if(bPseudoTest) + { +#ifdef HAL_EFUSE_MEMORY + startAddr = (u16)pEfuseHal->fakeEfuseUsedBytes; +#else + startAddr = (u16)fakeEfuseUsedBytes; +#endif + + } + else + { + rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8*)&startAddr); + } + } + else + { + if(bPseudoTest) + { +#ifdef HAL_EFUSE_MEMORY + startAddr = (u16)pEfuseHal->fakeBTEfuseUsedBytes; +#else + startAddr = (u16)fakeBTEfuseUsedBytes; +#endif + + } + else + { + rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BT_BYTES, (u8*)&startAddr); + } + } + + startAddr %= efuse_max; + RTW_INFO("%s: startAddr=%#X\n", __FUNCTION__, startAddr); + RTW_INFO("efuse_PgPacketPartialWrite(), startAddr = 0x%X\n", startAddr); + + while(1) + { + if(startAddr >= efuse_max_available_len) + { + bRet = _FALSE; + RTW_INFO("startAddr(%d) >= efuse_max_available_len(%d)\n", + startAddr, efuse_max_available_len); + break; + } + + if (efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF)) + { + if(EXT_HEADER(efuse_data)) + { + cur_header = efuse_data; + startAddr++; + efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); + if (ALL_WORDS_DISABLED(efuse_data)) + { + u16 recoveredAddr = startAddr; + recoveredAddr = efuse_PgPacketExceptionHandle(pAdapter, startAddr-1); + + if (recoveredAddr == (startAddr-1)) { + RTW_INFO("Error! All words disabled and the recovery failed, (Addr, Data) = (0x%X, 0x%X)\n", + startAddr, efuse_data); + pAdapter->LastError = ERR_INVALID_DATA; + break; + } else { + startAddr = recoveredAddr; + RTW_INFO("Bad extension header but recovered => Keep going.\n"); + continue; + } + } + else + { + curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + curPkt.word_en = efuse_data & 0x0F; + } + } + else + { + if (ALL_WORDS_DISABLED(efuse_data)) { + u16 recoveredAddr = startAddr; + recoveredAddr = efuse_PgPacketExceptionHandle(pAdapter, startAddr); + if (recoveredAddr != startAddr) { + efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); + RTW_INFO("Bad header but recovered => Read header again.\n"); + } + } + + cur_header = efuse_data; + curPkt.offset = (cur_header>>4) & 0x0F; + curPkt.word_en = cur_header & 0x0F; + } + + if (curPkt.offset > max_sec_num) { + pAdapter->LastError = ERR_OUT_OF_RANGE; + pEfuseHal->Status = ERR_OUT_OF_RANGE; + bRet = _FALSE; + break; + } + + curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en); + // if same header is found but no data followed + // write some part of data followed by the header. + if( (curPkt.offset == pTargetPkt->offset) && + (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) && + hal_EfuseWordEnMatched(pTargetPkt, &curPkt, &matched_wden) ) + { + RTW_INFO("Need to partial write data by the previous wrote header\n"); + //RT_ASSERT(_FALSE, ("Error, Need to partial write data by the previous wrote header!!\n")); + // Here to write partial data + badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest); + if(badworden != 0x0F) + { + u32 PgWriteSuccess=0; + // if write fail on some words, write these bad words again + + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + + if(!PgWriteSuccess) + { + bRet = _FALSE; // write fail, return + break; + } + } + // partial write ok, update the target packet for later use + for(i=0; i<4; i++) + { + if((matched_wden & (0x1<word_en |= (0x1<word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); + } + // read from next header + startAddr = startAddr + (curPkt.word_cnts*2) +1; + } + else + { + // not used header, 0xff + *pAddr = startAddr; + RTW_INFO("Started from unused header offset=%d\n", startAddr); + bRet = _TRUE; + break; + } + } + return bRet; +} + + +static BOOLEAN +hal_EfuseFixHeaderProcess( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN PPGPKT_STRUCT pFixPkt, + IN u16* pAddr, + IN BOOLEAN bPseudoTest +) +{ + u8 originaldata[8], badworden=0; + u16 efuse_addr=*pAddr; + u32 PgWriteSuccess=0; + + _rtw_memset((PVOID)originaldata, 0xff, 8); + + if(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) + { //check if data exist + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest); + + if(badworden != 0xf) // write fail + { + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); + if(!PgWriteSuccess) + return _FALSE; + else + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + } + else + { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + } + else + { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + *pAddr = efuse_addr; + return _TRUE; +} + + +BOOLEAN +efuse_PgPacketWrite2ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN OUT u16* pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); + BOOLEAN bRet=_FALSE; + u16 efuse_addr=*pAddr; + u8 pg_header=0, tmp_header=0, pg_header_temp=0; + u8 repeatcnt=0; + u16 efuse_max_available_len = + (efuseType == EFUSE_WIFI) ? pEfuseHal->TotalAvailBytes_WiFi : pEfuseHal->TotalAvailBytes_BT; + + RTW_INFO("Wirte 2byte header\n"); + + + while(efuse_addr < efuse_max_available_len) + { + pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; + RTW_INFO("pg_header = 0x%x\n", pg_header); + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF || pg_header != tmp_header) + { + if(repeatcnt++ > pEfuseHal->DataRetry) + { + RTW_INFO("Repeat over limit for pg_header!!\n"); + return _FALSE; + } + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + } + + //to write ext_header + if(tmp_header == pg_header) + { + efuse_addr++; + pg_header_temp = pg_header; + pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF || pg_header != tmp_header) + { + if(repeatcnt++ > pEfuseHal->DataRetry) + { + RTW_INFO("Repeat over limit for ext_header!!\n"); + return _FALSE; + } + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + } + + if((tmp_header & 0x0F) == 0x0F) //word_en PG fail + { + if(repeatcnt++ > pEfuseHal->DataRetry) + { + RTW_INFO("Repeat over limit for word_en!!\n"); + return _FALSE; + } + else + { + efuse_addr++; + continue; + } + } + else if(pg_header != tmp_header) //offset PG fail + { + PGPKT_STRUCT fixPkt; + //RT_ASSERT(_FALSE, ("Error, efuse_PgPacketWrite2ByteHeader(), offset PG fail, need to cover the existed data!!\n")); + RTW_INFO("Error condition for offset PG fail, need to cover the existed data\n"); + fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) + return _FALSE; + } + else + { + bRet = _TRUE; + break; + } + } + else if ((tmp_header & 0x1F) == 0x0F) //wrong extended header + { + efuse_addr+=2; + continue; + } + } + + *pAddr = efuse_addr; + return bRet; +} + + +BOOLEAN +efuse_PgPacketWrite1ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN OUT u16* pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PEFUSE_HAL pEfuseHal=&(pHalData->EfuseHal); + BOOLEAN bRet=_FALSE; + u8 pg_header=0, tmp_header=0; + u16 efuse_addr=*pAddr; + u8 repeatcnt=0; + + RTW_INFO("Wirte 1byte header\n"); + pg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en; + + if (IS_HARDWARE_TYPE_8723BE(pAdapter)) + efuse_OneByteWrite(pAdapter, 0x1FF, 00, _FALSE); // increase current + + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor + + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) + phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor + + + while(tmp_header == 0xFF || pg_header != tmp_header) + { + if(repeatcnt++ > pEfuseHal->HeaderRetry) + { + RTW_INFO("retry %d times fail!!\n", repeatcnt); + return _FALSE; + } + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); + RTW_INFO("===> efuse_PgPacketWrite1ByteHeader: Keep %d-th retrying, tmp_header = 0x%X\n", repeatcnt, tmp_header); + } + + if(pg_header == tmp_header) + { + bRet = _TRUE; + } + else + { + PGPKT_STRUCT fixPkt; + //RT_ASSERT(_FALSE, ("Error, efuse_PgPacketWrite1ByteHeader(), offset PG fail, need to cover the existed data!!\n")); + RTW_INFO(" pg_header(0x%X) != tmp_header(0x%X)\n", pg_header, tmp_header); + RTW_INFO("Error condition for fixed PG packet, need to cover the existed data: (Addr, Data) = (0x%X, 0x%X)\n", + efuse_addr, tmp_header); + fixPkt.offset = (tmp_header>>4) & 0x0F; + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) + return _FALSE; + } + + *pAddr = efuse_addr; + return bRet; +} + + + +static BOOLEAN +efuse_PgPacketWriteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN OUT u16* pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + + if(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) + { + bRet = efuse_PgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + } + else + { + bRet = efuse_PgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + } + + return bRet; +} + +BOOLEAN +efuse_PgPacketWriteData( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16* pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + u16 efuse_addr=*pAddr; + u8 badworden=0; + u32 PgWriteSuccess=0; + + badworden = 0x0f; + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); + if(badworden == 0x0F) + { + RTW_INFO("efuse_PgPacketWriteData ok!!\n"); + return _TRUE; + } + else + { // Reorganize other pg packet + //RT_ASSERT(_FALSE, ("Error, efuse_PgPacketWriteData(), wirte data fail!!\n")); + RTW_INFO("efuse_PgPacketWriteData Fail!!\n"); + + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + if(!PgWriteSuccess) + return _FALSE; + else + return _TRUE; + } + + return bRet; +} + + +int +hal_EfusePgPacketWrite_8814A(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest) +{ + u8 efuseType = EFUSE_WIFI; + PGPKT_STRUCT targetPkt; + u16 startAddr = 0; + + RTW_INFO("===> efuse_PgPacketWrite[%s], offset: 0x%X\n", (efuseType == EFUSE_WIFI) ? "WIFI" : "BT", offset); + + //4 [1] Check if the remaining space is available to write. + if(!efuse_PgPacketCheck(pAdapter, efuseType, bPseudoTest)) + { + pAdapter->LastError = ERR_WRITE_PROTECT; + RTW_INFO("efuse_PgPacketCheck(), fail!!\n"); + return _FALSE; + } + + //4 [2] Construct a packet to write: (Data, Offset, and WordEnable) + efuse_PgPacketConstruct(offset, word_en, pData, &targetPkt); + + + //4 [3] Fix headers without data or fix bad headers, and then return the address where to get started. + if(!efuse_PgPacketPartialWrite(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + { + pAdapter->LastError = ERR_INVALID_DATA; + RTW_INFO("efuse_PgPacketPartialWrite(), fail!!\n"); + return _FALSE; + } + + //4 [4] Write the (extension) header. + if(!efuse_PgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + { + pAdapter->LastError = ERR_IO_FAILURE; + RTW_INFO("efuse_PgPacketWriteHeader(), fail!!\n"); + return _FALSE; + } + + //4 [5] Write the data. + if(!efuse_PgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + { + pAdapter->LastError = ERR_IO_FAILURE; + RTW_INFO("efuse_PgPacketWriteData(), fail!!\n"); + return _FALSE; + } + + RTW_INFO("<=== efuse_PgPacketWrite\n"); + return _TRUE; +} + +static int +rtl8814_Efuse_PgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + ret = hal_EfusePgPacketWrite_8814A(pAdapter, offset, word_en, data, bPseudoTest); + + return ret; +} + +void InitRDGSetting8814A(PADAPTER padapter) +{ + rtw_write8(padapter, REG_RD_CTRL, 0xFF); + rtw_write16(padapter, REG_RD_NAV_NXT, 0x200); + rtw_write8(padapter, REG_RD_RESP_PKT_TH, 0x05); +} + +void ReadRFType8814A(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + +#if DISABLE_BB_RF + pHalData->rf_chip = RF_PSEUDO_11N; +#else + pHalData->rf_chip = RF_6052; +#endif + + //if (pHalData->rf_type == RF_1T1R){ + // pHalData->bRFPathRxEnable[0] = _TRUE; + //} + //else { // Default unknow type is 2T2r + // pHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE; + //} + + if (IsSupported24G(padapter->registrypriv.wireless_mode) && + is_supported_5g(padapter->registrypriv.wireless_mode)) + pHalData->BandSet = BAND_ON_BOTH; + else if (is_supported_5g(padapter->registrypriv.wireless_mode)) + pHalData->BandSet = BAND_ON_5G; + else + pHalData->BandSet = BAND_ON_2_4G; + + //if(padapter->bInHctTest) + // pHalData->BandSet = BAND_ON_2_4G; +} + +void rtl8814_start_thread(PADAPTER padapter) +{ +} + +void rtl8814_stop_thread(PADAPTER padapter) +{ +} + +void hal_notch_filter_8814(_adapter *adapter, bool enable) +{ + if (enable) { + RTW_INFO("Enable notch filter\n"); + //rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) | BIT1); + } else { + RTW_INFO("Disable notch filter\n"); + //rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) & ~BIT1); + } +} + +u8 +GetEEPROMSize8814A( + IN PADAPTER Adapter + ) +{ + u8 size = 0; + u32 curRCR; + + curRCR = rtw_read16(Adapter, REG_SYS_EEPROM_CTRL); + size = (curRCR & EEPROMSEL) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse. + + RTW_INFO("EEPROM type is %s\n", size==4 ? "E-FUSE" : "93C46"); + //return size; + return 4; // <20120713, Kordan> The default value of HW is 6 ?!! +} + +/* +void CheckAutoloadState8812A(PADAPTER padapter) +{ + + u8 val8; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + + + // check system boot selection + val8 = rtw_read8(padapter, REG_9346CR); + pHalData->EepromOrEfuse = (val8 & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; + pHalData->bautoload_fail_flag = (val8 & EEPROM_EN) ? _FALSE : _TRUE; + + RTW_INFO("%s: 9346CR(%#x)=0x%02x, Boot from %s, Autoload %s!\n", + __FUNCTION__, REG_9346CR, val8, + (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"), + (pHalData->bautoload_fail_flag ? "Fail" : "OK")); +} +*/ + +void InitPGData8814A(PADAPTER padapter) +{ + u32 i; + u16 val16; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + + if (_FALSE == pHalData->bautoload_fail_flag) + { + // autoload OK. + if (is_boot_from_eeprom(padapter)) + { + // Read all Content from EEPROM or EFUSE. + //for (i = 0; i < HWSET_MAX_SIZE_JAGUAR; i += 2) + { + //val16 = EF2Byte(ReadEEprom(pAdapter, (u16) (i>>1))); + //*((u16*)(&PROMContent[i])) = val16; + } + } + else + { + // Read EFUSE real map to shadow. + EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); + } + } + else + { + // update to default value 0xFF + if (!is_boot_from_eeprom(padapter)) + EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); + } + +#ifdef CONFIG_EFUSE_CONFIG_FILE + if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) { + if (Hal_readPGDataFromConfigFile(padapter) != _SUCCESS) + RTW_ERR("invalid phy efuse and read from file fail, will use driver default!!\n"); + } +#endif +} + +static void read_chip_version_8814a(PADAPTER Adapter) +{ + u32 value32; + PHAL_DATA_TYPE pHalData; + u8 vdr; + + pHalData = GET_HAL_DATA(Adapter); + + value32 = rtw_read32(Adapter, REG_SYS_CFG); + RTW_INFO("%s SYS_CFG(0x%X)=0x%08x \n", __FUNCTION__, REG_SYS_CFG, value32); + + pHalData->version_id.ICType = CHIP_8814A; + + pHalData->version_id.ChipType = ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP); + + pHalData->version_id.RFType = RF_TYPE_3T3R; + + if(Adapter->registrypriv.special_rf_path == 1) + pHalData->version_id.RFType = RF_TYPE_1T1R; //RF_1T1R; + + vdr = (value32 & EXT_VENDOR_ID) >> EXT_VENDOR_ID_SHIFT; + if(vdr == 0x00) + pHalData->version_id.VendorType = CHIP_VENDOR_TSMC; + else if(vdr == 0x01) + pHalData->version_id.VendorType = CHIP_VENDOR_SMIC; + else if(vdr == 0x02) + pHalData->version_id.VendorType = CHIP_VENDOR_UMC; + + pHalData->version_id.CUTVersion = (value32 & CHIP_VER_RTL_MASK)>>CHIP_VER_RTL_SHIFT; // IC version (CUT) + + pHalData->MultiFunc = RT_MULTI_FUNC_NONE; + + rtw_hal_config_rftype(Adapter); + +#if 1 + dump_chip_info(pHalData->version_id); +#endif + +} + +VOID +hal_PatchwithJaguar_8814( + IN PADAPTER Adapter, + IN RT_MEDIA_STATUS MediaStatus + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if( (MediaStatus == RT_MEDIA_CONNECT) && + (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP )) + { + rtw_write8(Adapter, rVhtlen_Use_Lsig_Jaguar, 0x1); + rtw_write8(Adapter, REG_TCR+3, BIT2); + } + else + { + rtw_write8(Adapter, rVhtlen_Use_Lsig_Jaguar, 0x3F); + rtw_write8(Adapter, REG_TCR+3, BIT0|BIT1|BIT2); + } + + + /*if( (MediaStatus == RT_MEDIA_CONNECT) && + ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP) || + (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP))) + { + pHalData->Reg837 |= BIT2; + rtw_write8(Adapter, rBWIndication_Jaguar+3, pHalData->Reg837); + } + else + { + pHalData->Reg837 &= (~BIT2); + rtw_write8(Adapter, rBWIndication_Jaguar+3, pHalData->Reg837); + }*/ +} + +void init_hal_spec_8814a(_adapter *adapter) +{ + struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); + + hal_spec->ic_name = "rtl8814a"; + hal_spec->macid_num = MACID_NUM_8814A; + hal_spec->sec_cam_ent_num = SEC_CAM_ENT_NUM_8814A; + hal_spec->sec_cap = SEC_CAP_CHK_BMC; + hal_spec->rfpath_num_2g = 3; + hal_spec->rfpath_num_5g = 3; + hal_spec->max_tx_cnt = 4; + hal_spec->txgi_max = 63; + hal_spec->txgi_pdbm = 2; + hal_spec->tx_nss_num = 4; + hal_spec->rx_nss_num = 4; + hal_spec->band_cap = BAND_CAP_8814A; + hal_spec->bw_cap = BW_CAP_8814A; + hal_spec->port_num = 2; + hal_spec->proto_cap = PROTO_CAP_11B | PROTO_CAP_11G | PROTO_CAP_11N | PROTO_CAP_11AC; + + hal_spec->wl_func = 0 + | WL_FUNC_P2P + | WL_FUNC_MIRACAST + | WL_FUNC_TDLS + ; + + hal_spec->pg_txpwr_saddr = 0x10; + hal_spec->pg_txgi_diff_factor = 1; + rtw_macid_ctl_init_sleep_reg(adapter_to_macidctl(adapter) + , REG_MACID_SLEEP + , REG_MACID_SLEEP_1 + , REG_MACID_SLEEP_2 + , REG_MACID_SLEEP_3); + +} + +void InitDefaultValue8814A(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData; + struct pwrctrl_priv *pwrctrlpriv; + u8 i; + + pHalData = GET_HAL_DATA(padapter); + pwrctrlpriv = adapter_to_pwrctl(padapter); + + // init default value + pHalData->fw_ractrl = _FALSE; + if (!pwrctrlpriv->bkeepfwalive) + pHalData->LastHMEBoxNum = 0; + + init_hal_spec_8814a(padapter); + + // init dm default value + pHalData->bChnlBWInitialized = _FALSE; + pHalData->bIQKInitialized = _FALSE; + + pHalData->EfuseHal.fakeEfuseBank = 0; + pHalData->EfuseHal.fakeEfuseUsedBytes = 0; + _rtw_memset(pHalData->EfuseHal.fakeEfuseContent, 0xFF, EFUSE_MAX_HW_SIZE); + _rtw_memset(pHalData->EfuseHal.fakeEfuseInitMap, 0xFF, EFUSE_MAX_MAP_LEN); + _rtw_memset(pHalData->EfuseHal.fakeEfuseModifiedMap, 0xFF, EFUSE_MAX_MAP_LEN); +} + +VOID +_InitBeaconParameters_8814A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 val16; + u8 val8; + + val8 = DIS_TSF_UDT; + val16 = val8 | (val8 << 8); // port0 and port1 +#ifdef CONFIG_BT_COEXIST + if (pHalData->EEPROMBluetoothCoexist == 1) + { + // Enable prot0 beacon function for PSTDMA + val16 |= EN_BCN_FUNCTION; + } +#endif + rtw_write16(Adapter, REG_BCN_CTRL, val16); + //rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); + + // TODO: Remove these magic number + rtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms + rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME_8814);// 5ms + rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME_8814); // 2ms + + // Suggested by designer timchen. Change beacon AIFS to the largest number + // beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 + rtw_write16(Adapter, REG_BCNTCFG, 0x660F); + + //pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); + //pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); + //pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); + //pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2); + //pHalData->RegCR_1 = rtw_read8(Adapter, REG_CR+1); +} + +static VOID +_BeaconFunctionEnable( + IN PADAPTER Adapter, + IN BOOLEAN Enable, + IN BOOLEAN Linked + ) +{ + rtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1)); + //SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00); + //RT_TRACE(COMP_BEACON, DBG_LOUD, ("_BeaconFunctionEnable 0x550 0x%x\n", rtw_read8(Adapter, 0x550))); + + rtw_write8(Adapter, REG_RD_CTRL+1, 0x6F); +} + +void SetBeaconRelatedRegisters8814A(PADAPTER padapter) +{ + u32 value32; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u32 bcn_ctrl_reg = REG_BCN_CTRL; + //reset TSF, enable update TSF, correcting TSF On Beacon + + //REG_BCN_INTERVAL + //REG_BCNDMATIM + //REG_ATIMWND + //REG_TBTT_PROHIBIT + //REG_DRVERLYINT + //REG_BCN_MAX_ERR + //REG_BCNTCFG //(0x510) + //REG_DUAL_TSF_RST + //REG_BCN_CTRL //(0x550) + + //BCN interval +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->iface_type == IFACE_PORT1){ + bcn_ctrl_reg = REG_BCN_CTRL_1; + } +#endif + rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); + rtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms + + _InitBeaconParameters_8814A(padapter); + + rtw_write8(padapter, REG_SLOT, 0x09); + + value32 =rtw_read32(padapter, REG_TCR); + value32 &= ~TSFRST; + rtw_write32(padapter, REG_TCR, value32); + + value32 |= TSFRST; + rtw_write32(padapter, REG_TCR, value32); + + // NOTE: Fix test chip's bug (about contention windows's randomness) + rtw_write8(padapter, REG_RXTSF_OFFSET_CCK, 0x50); + rtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50); + + _BeaconFunctionEnable(padapter, _TRUE, _TRUE); + + ResumeTxBeacon(padapter); + + //rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6)); + + //rtw_write8(padapter, 0x541, 0xff); + + //rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0)); + + rtw_write8(padapter, bcn_ctrl_reg, rtw_read8(padapter, bcn_ctrl_reg)|BIT(1)); + +} + +#ifdef CONFIG_BEAMFORMING +#if (BEAMFORMING_SUPPORT == 0) +VOID +SetBeamformingCLK_8812( + IN PADAPTER Adapter + ) +{ + struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(Adapter); + u16 u2btmp; + u8 Count = 0, u1btmp; + + RTW_INFO(" ==>%s\n", __FUNCTION__); + + if ( (check_fwstate(&Adapter->mlmepriv, _FW_UNDER_SURVEY)==_TRUE) +#ifdef CONFIG_CONCURRENT_MODE + || (check_buddy_fwstate(Adapter, _FW_UNDER_SURVEY) == _TRUE) +#endif + ) + { + RTW_INFO(" <==%s return by Scan\n", __FUNCTION__); + return; + } + + // Stop Usb TxDMA + rtw_write_port_cancel(Adapter); + +#ifdef CONFIG_PCI_HCI + // Stop PCIe TxDMA + rtw_write8(Adapter, REG_PCIE_CTRL_REG+1, 0xFE); +#endif + + // Wait TXFF empty + for(Count = 0; Count < 100; Count++) + { + u2btmp = rtw_read16(Adapter, REG_TXPKT_EMPTY); + u2btmp = u2btmp & 0xfff; + if(u2btmp != 0xfff) + { + rtw_mdelay_os(10); + continue; + } + else + break; + } + + RTW_INFO(" Tx Empty count %d \n", Count); + + // TX pause + rtw_write8(Adapter, REG_TXPAUSE, 0xFF); + + // Wait TX State Machine OK + for(Count = 0; Count < 100; Count++) + { + if (rtw_read32(Adapter, REG_SCH_TXCMD_8812A) != 0) + continue; + else + break; + } + + RTW_INFO(" Tx Status count %d\n", Count); + + // Stop RX DMA path + u1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A); + rtw_write8(Adapter, REG_RXDMA_CONTROL_8812A, u1btmp | BIT2); + + for(Count = 0; Count < 100; Count++) + { + u1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A); + if(u1btmp & BIT1) + break; + else + rtw_mdelay_os(10); + } + + RTW_INFO(" Rx Empty count %d \n", Count); + + // Disable clock + rtw_write8(Adapter, REG_SYS_CLKR+1, 0xf0); + // Disable 320M + rtw_write8(Adapter, REG_AFE_PLL_CTRL+3, 0x8); + // Enable 320M + rtw_write8(Adapter, REG_AFE_PLL_CTRL+3, 0xa); + // Enable clock + rtw_write8(Adapter, REG_SYS_CLKR+1, 0xfc); + + // Release Tx pause + rtw_write8(Adapter, REG_TXPAUSE, 0); + + // Enable RX DMA path + u1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A); + rtw_write8(Adapter, REG_RXDMA_CONTROL_8812A, u1btmp & (~BIT2)); + + // Start Usb TxDMA + RTW_ENABLE_FUNC(Adapter, DF_TX_BIT); + RTW_INFO("%s \n", __FUNCTION__); + + RTW_INFO("<==%s\n", __FUNCTION__); +} + +VOID +SetBeamformRfMode_8812( + IN PADAPTER Adapter, + IN struct beamforming_info *pBeamInfo + ) +{ + BOOLEAN bSelfBeamformer = _FALSE; + BOOLEAN bSelfBeamformee = _FALSE; + BEAMFORMING_CAP BeamformCap = BEAMFORMING_CAP_NONE; + + BeamformCap = beamforming_get_beamform_cap(pBeamInfo); + + if(BeamformCap == pBeamInfo->beamforming_cap) + return; + else + pBeamInfo->beamforming_cap = BeamformCap; + + if(GET_RF_TYPE(Adapter) == RF_1T1R) + return; + + bSelfBeamformer = BeamformCap & BEAMFORMER_CAP; + bSelfBeamformee = BeamformCap & BEAMFORMEE_CAP; + + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000,0x1); // RF Mode table write enable + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000,0x1); // RF Mode table write enable + + if(bSelfBeamformer) + { + // Paath_A + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000,0x3); // Select RX mode + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff,0xE26BF); // Enable TXIQGEN in RX mode + // Path_B + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff,0xE26BF); // Enable TXIQGEN in RX mode + } + else + { + // Paath_A + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff,0xC26BF); // Disable TXIQGEN in RX mode + // Path_B + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff,0xC26BF); // Disable TXIQGEN in RX mode + } + + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000,0x0); // RF Mode table write disable + PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000,0x0); // RF Mode table write disable + + if(bSelfBeamformer) + PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskByte1, 0x33); + else + PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskByte1, 0x11); +} + + + +VOID +SetBeamformEnter_8812( + IN PADAPTER Adapter, + IN u8 Idx + ) +{ + u8 i = 0; + u32 CSI_Param; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct beamforming_entry BeamformEntry = pBeamInfo->beamforming_entry[Idx]; + u16 STAid = 0; + + SetBeamformRfMode_8812(Adapter, pBeamInfo); + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) + STAid = BeamformEntry.mac_id; + else + STAid = BeamformEntry.p_aid; + + // Sounding protocol control + rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xCB); + + // MAC addresss/Partial AID of Beamformer + if(Idx == 0) + { + for(i = 0; i < 6 ; i++) + rtw_write8(Adapter, (REG_BFMER0_INFO_8812A+i), BeamformEntry.mac_addr[i]); + /* CSI report use legacy ofdm so don't need to fill P_AID.*/ + /*rtw_write16(Adapter, REG_BFMER0_INFO_8812A+6, BeamformEntry.P_AID);*/ + } + else + { + for(i = 0; i < 6 ; i++) + rtw_write8(Adapter, (REG_BFMER1_INFO_8812A+i), BeamformEntry.mac_addr[i]); + /* CSI report use legacy ofdm so don't need to fill P_AID.*/ + /*rtw_write16(Adapter, REG_BFMER1_INFO_8812A+6, BeamformEntry.P_AID);*/ + } + + // CSI report parameters of Beamformee + if( (BeamformEntry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) || + (BeamformEntry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) ) + { + if(pHalData->rf_type == RF_2T2R) + CSI_Param = 0x01090109; + else + CSI_Param = 0x01080108; + } + else + { + if(pHalData->rf_type == RF_2T2R) + CSI_Param = 0x03090309; + else + CSI_Param = 0x03080308; + } + + if(pHalData->rf_type == RF_2T2R) + rtw_write32(Adapter, 0x9B4, 0x00000000); // Nc =2 + else + rtw_write32(Adapter, 0x9B4, 0x01081008); // Nc =1 + + rtw_write32(Adapter, REG_CSI_RPT_PARAM_BW20_8812A, CSI_Param); + rtw_write32(Adapter, REG_CSI_RPT_PARAM_BW40_8812A, CSI_Param); + rtw_write32(Adapter, REG_CSI_RPT_PARAM_BW80_8812A, CSI_Param); + + // P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt + if(Idx == 0) + { + rtw_write16(Adapter, REG_TXBF_CTRL_8812A, STAid); + rtw_write8(Adapter, REG_TXBF_CTRL_8812A+3, rtw_read8(Adapter, REG_TXBF_CTRL_8812A+3)|BIT4|BIT6|BIT7); + } + else + { + rtw_write16(Adapter, REG_TXBF_CTRL_8812A+2, STAid | BIT12 | BIT14 | BIT15); + } + + // CSI report parameters of Beamformee + if(Idx == 0) + { + // Get BIT24 & BIT25 + u8 tmp = rtw_read8(Adapter, REG_BFMEE_SEL_8812A+3) & 0x3; + + rtw_write8(Adapter, REG_BFMEE_SEL_8812A+3, tmp | 0x60); + rtw_write16(Adapter, REG_BFMEE_SEL_8812A, STAid | BIT9); + } + else + { + // Set BIT25 + rtw_write16(Adapter, REG_BFMEE_SEL_8812A+2, STAid | (0xE2 << 8)); + } + + // Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us, MP chip) + rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A+3, 0x50); + + beamforming_notify(Adapter); +} + + +VOID +SetBeamformLeave_8812( + IN PADAPTER Adapter, + IN u8 Idx + ) +{ + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); + + SetBeamformRfMode_8812(Adapter, pBeamInfo); + + /* Clear P_AID of Beamformee + * Clear MAC addresss of Beamformer + * Clear Associated Bfmee Sel + */ + if(pBeamInfo->beamforming_cap == BEAMFORMING_CAP_NONE) + rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xC8); + + if(Idx == 0) + { + rtw_write16(Adapter, REG_TXBF_CTRL_8812A, 0); + + rtw_write32(Adapter, REG_BFMER0_INFO_8812A, 0); + rtw_write16(Adapter, REG_BFMER0_INFO_8812A+4, 0); + + rtw_write16(Adapter, REG_BFMEE_SEL_8812A, 0); + } + else + { + rtw_write16(Adapter, REG_TXBF_CTRL_8812A+2, rtw_read16(Adapter, REG_TXBF_CTRL_8812A+2) & 0xF000); + + rtw_write32(Adapter, REG_BFMER1_INFO_8812A, 0); + rtw_write16(Adapter, REG_BFMER1_INFO_8812A+4, 0); + + rtw_write16(Adapter, REG_BFMEE_SEL_8812A+2, rtw_read16(Adapter, REG_BFMEE_SEL_8812A+2) & 0x60); + } +} + + +VOID +SetBeamformStatus_8812( + IN PADAPTER Adapter, + IN u8 Idx + ) +{ + u16 BeamCtrlVal; + u32 BeamCtrlReg; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + struct beamforming_entry BeamformEntry = pBeamInfo->beamforming_entry[Idx]; + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) + BeamCtrlVal = BeamformEntry.mac_id; + else + BeamCtrlVal = BeamformEntry.p_aid; + + if(Idx == 0) + BeamCtrlReg = REG_TXBF_CTRL_8812A; + else + { + BeamCtrlReg = REG_TXBF_CTRL_8812A+2; + BeamCtrlVal |= BIT12 | BIT14|BIT15; + } + + if(BeamformEntry.beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + if(BeamformEntry.sound_bw == CHANNEL_WIDTH_20) + BeamCtrlVal |= BIT9; + else if(BeamformEntry.sound_bw == CHANNEL_WIDTH_40) + BeamCtrlVal |= BIT10; + else if(BeamformEntry.sound_bw == CHANNEL_WIDTH_80) + BeamCtrlVal |= BIT11; + } + else + { + BeamCtrlVal &= ~(BIT9|BIT10|BIT11); + } + + rtw_write16(Adapter, BeamCtrlReg, BeamCtrlVal); + + RTW_INFO("%s Idx %d BeamCtrlReg %x BeamCtrlVal %x\n", __FUNCTION__, Idx, BeamCtrlReg, BeamCtrlVal); +} + + +VOID +SetBeamformFwTxBFCmd_8812( + IN PADAPTER Adapter + ) +{ + u8 Idx, Period0 = 0, Period1 = 0; + u8 PageNum0 = 0xFF, PageNum1 = 0xFF; + u8 u1TxBFParm[3]={0}; + + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); + + for(Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++) + { + if(pBeamInfo->beamforming_entry[Idx].beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSED) + { + if(Idx == 0) + { + if(pBeamInfo->beamforming_entry[Idx].bSound) + PageNum0 = 0xFE; + else + PageNum0 = 0xFF; //stop sounding + Period0 = (u8)(pBeamInfo->beamforming_entry[Idx].sound_period); + } + else if(Idx == 1) + { + if(pBeamInfo->beamforming_entry[Idx].bSound) + PageNum1 = 0xFE; + else + PageNum1 = 0xFF; //stop sounding + Period1 = (u8)(pBeamInfo->beamforming_entry[Idx].sound_period); + } + } + } + + u1TxBFParm[0] = PageNum0; + u1TxBFParm[1] = PageNum1; + u1TxBFParm[2] = (Period1 << 4) | Period0; + FillH2CCmd_8812(Adapter, H2C_8812_TxBF, 3, u1TxBFParm); + + RTW_INFO("%s PageNum0 = %d Period0 = %d\n", __FUNCTION__, PageNum0, Period0); + RTW_INFO("PageNum1 = %d Period1 %d\n", PageNum1, Period1); +} + + +VOID +SetBeamformDownloadNDPA_8812( + IN PADAPTER Adapter, + IN u8 Idx + ) +{ + u8 u1bTmp=0, tmpReg422=0, Head_Page; + u8 BcnValidReg=0, count=0, DLBcnCount=0; + BOOLEAN bSendBeacon=_FALSE; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8812; // default reseved 1 page for the IC type which is undefined. + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); + struct beamforming_entry *pBeamEntry = pBeamInfo->beamforming_entry+Idx; + + //pHalData->bFwDwRsvdPageInProgress = _TRUE; + + if(Idx == 0) + Head_Page = 0xFE; + else + Head_Page = 0xFE; + + rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u16 *)&TxPageBndy); + + //Set REG_CR bit 8. DMA beacon by SW. + u1bTmp = rtw_read8(Adapter, REG_CR+1); + rtw_write8(Adapter, REG_CR+1, (u1bTmp|BIT0)); + + pHalData->RegCR_1 |= BIT0; + rtw_write8(Adapter, REG_CR+1, pHalData->RegCR_1); + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + tmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422&(~BIT6)); + + if(tmpReg422&BIT6) + { + RTW_INFO("SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\n"); + bSendBeacon = _TRUE; + } + + // TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA + rtw_write8(Adapter,REG_TDECTRL+1, Head_Page); + + do + { + // Clear beacon valid check bit. + BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); + rtw_write8(Adapter, REG_TDECTRL+2, (BcnValidReg|BIT0)); + + // download NDPA rsvd page. + if(pBeamEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) + beamforming_send_vht_ndpa_packet(Adapter,pBeamEntry->mac_addr,pBeamEntry->aid,pBeamEntry->sound_bw, BCN_QUEUE_INX); + else + beamforming_send_ht_ndpa_packet(Adapter,pBeamEntry->mac_addr,pBeamEntry->sound_bw, BCN_QUEUE_INX); + + // check rsvd page download OK. + BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); + count=0; + while(!(BcnValidReg & BIT0) && count <20) + { + count++; + rtw_udelay_os(10); + BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); + } + DLBcnCount++; + }while(!(BcnValidReg&BIT0) && DLBcnCount<5); + + if(!(BcnValidReg&BIT0)) + RTW_INFO("%s Download RSVD page failed!\n", __FUNCTION__); + + // TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA + rtw_write8(Adapter,REG_TDECTRL+1, TxPageBndy); + + // 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(bSendBeacon) + { + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422); + } + + // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + u1bTmp = rtw_read8(Adapter, REG_CR+1); + rtw_write8(Adapter, REG_CR+1, (u1bTmp&(~BIT0))); + + pBeamEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSED; + + //pHalData->bFwDwRsvdPageInProgress = _FALSE; +} + +VOID +SetBeamformFwTxBF_8812( + IN PADAPTER Adapter, + IN u8 Idx + ) +{ + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); + struct beamforming_entry *pBeamEntry = pBeamInfo->beamforming_entry+Idx; + + if(pBeamEntry->beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSING) + SetBeamformDownloadNDPA_8812(Adapter, Idx); + + SetBeamformFwTxBFCmd_8812(Adapter); +} + + +VOID +SetBeamformPatch_8812( + IN PADAPTER Adapter, + IN u8 Operation + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); + + if(pBeamInfo->beamforming_cap == BEAMFORMING_CAP_NONE) + return; + + /*if(Operation == SCAN_OPT_BACKUP_BAND0) + { + rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xC8); + } + else if(Operation == SCAN_OPT_RESTORE) + { + rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xCB); + }*/ +} + +#endif /*#if (BEAMFORMING_SUPPORT == 0) for driver's TxBF*/ +#endif /*CONFIG_BEAMFORMING*/ + +static void hw_var_set_monitor(PADAPTER Adapter, u8 variable, u8 *val) +{ + u32 value_rcr, rcr_bits; + u16 value_rxfltmap2; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + if (*((u8 *)val) == _HW_STATE_MONITOR_) { + + /* Leave IPS */ + rtw_pm_set_ips(Adapter, IPS_NONE); + LeaveAllPowerSaveMode(Adapter); + + /* Receive all type */ + rcr_bits = RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_APWRMGT | RCR_ADF | RCR_ACF | RCR_AMF | RCR_APP_PHYST_RXFF; + + /* Append FCS */ + rcr_bits |= RCR_APPFCS; + + #if 0 + /* + CRC and ICV packet will drop in recvbuf2recvframe() + We no turn on it. + */ + rcr_bits |= (RCR_ACRC32 | RCR_AICV); + #endif + + /* Receive all data frames */ + value_rxfltmap2 = 0xFFFF; + + value_rcr = rcr_bits; + rtw_write32(Adapter, REG_RCR, value_rcr); + + rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2); + + #if 0 + /* tx pause */ + rtw_write8(padapter, REG_TXPAUSE, 0xFF); + #endif + } else { + /* do nothing */ + } + +} + +static void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val) +{ + u8 val8; + u8 mode = *((u8 *)val); + u32 value_rcr; + static u8 isMonitor = _FALSE; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if (isMonitor == _TRUE) { + /* reset RCR */ + rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); + isMonitor = _FALSE; + } + + if (mode == _HW_STATE_MONITOR_) { + isMonitor = _TRUE; + /* set net_type */ + Set_MSR(Adapter, _HW_STATE_NOLINK_); + + hw_var_set_monitor(Adapter, variable, val); + return; + } + +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->iface_type == IFACE_PORT1) + { + // disable Port1 TSF update + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|DIS_TSF_UDT); + + // set net_type + val8 = rtw_read8(Adapter, MSR)&0x03; + val8 |= (mode<<2); + rtw_write8(Adapter, MSR, val8); + + RTW_INFO("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode); + + if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) + { + if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE)) + { + StopTxBeacon(Adapter); +#ifdef CONFIG_PCI_HCI + UpdateInterruptMask8814AE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0); +#else //CONFIG_PCI_HCI + #ifdef CONFIG_INTERRUPT_BASED_TXBCN + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + rtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms + UpdateInterruptMask8814AU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_8812); + #endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + UpdateInterruptMask8814AU(Adapter,_TRUE ,0, (IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812)); + #endif// CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + + #endif //CONFIG_INTERRUPT_BASED_TXBCN +#endif //CONFIG_PCI_HCI + } + + rtw_write8(Adapter,REG_BCN_CTRL_1, 0x11);//disable atim wnd and disable beacon function + //rtw_write8(Adapter,REG_BCN_CTRL_1, 0x18); + } + else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) + { +#ifdef RTL8814AE_SW_BCN + /*Beacon is polled to TXBUF*/ + rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); + RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); +#endif + ResumeTxBeacon(Adapter); + rtw_write8(Adapter,REG_BCN_CTRL_1, 0x1a); + } + else if(mode == _HW_STATE_AP_) + { +#ifdef CONFIG_PCI_HCI + UpdateInterruptMask8814AE(Adapter, RT_BCN_INT_MASKS, 0, 0, 0); +#else + #ifdef CONFIG_INTERRUPT_BASED_TXBCN + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + UpdateInterruptMask8814AU(Adapter,_TRUE ,IMR_BCNDMAINT0_8812, 0); + #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + UpdateInterruptMask8814AU(Adapter,_TRUE ,(IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812), 0); + #endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + + #endif //CONFIG_INTERRUPT_BASED_TXBCN +#endif + + ResumeTxBeacon(Adapter); + + rtw_write8(Adapter, REG_BCN_CTRL_1, 0x12); + +#ifdef RTL8814AE_SW_BCN + rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); + RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); +#endif + //Set RCR + //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 + //rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 + //rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet + value_rcr = rtw_read32(Adapter, REG_RCR); + value_rcr &= ~(RCR_CBSSID_DATA);//Clear CBSSID_DATA + rtw_write32(Adapter, REG_RCR, value_rcr); + + //enable to rx data frame + rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); + + //Beacon Control related register for first time + rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms + + //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); + rtw_write8(Adapter, REG_ATIMWND_1, 0x0a); // 10ms for port1 + rtw_write16(Adapter, REG_BCNTCFG, 0x00); + rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04); + rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms) + + //reset TSF2 + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)); + + //enable BCN1 Function for if2 + //don't enable update TSF1 for if2 (due to TSF update when beacon/probe rsp are received) + rtw_write8(Adapter, REG_BCN_CTRL_1, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB)); + +#ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE)) + rtw_write8(Adapter, REG_BCN_CTRL, + rtw_read8(Adapter, REG_BCN_CTRL) & ~EN_BCN_FUNCTION); +#endif + //BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked + //rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(5)); + //rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(3)); + + //dis BCN0 ATIM WND if if1 is station + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|DIS_ATIM); + +#ifdef CONFIG_TSF_RESET_OFFLOAD + // Reset TSF for STA+AP concurrent mode + if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) { + if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE) + RTW_INFO("ERROR! %s()-%d: Reset port1 TSF fail\n", + __FUNCTION__, __LINE__); + } +#endif // CONFIG_TSF_RESET_OFFLOAD + } + } + else //else for port0 +#endif // CONFIG_CONCURRENT_MODE + { + // disable Port0 TSF update + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|DIS_TSF_UDT); + + // set net_type + val8 = rtw_read8(Adapter, MSR)&0x0c; + val8 |= mode; + rtw_write8(Adapter, MSR, val8); + + RTW_INFO("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode); + + if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) + { +#ifdef CONFIG_CONCURRENT_MODE + if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE)) +#endif // CONFIG_CONCURRENT_MODE + { + StopTxBeacon(Adapter); +#ifdef CONFIG_PCI_HCI + UpdateInterruptMask8814AE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0); +#else + #ifdef CONFIG_INTERRUPT_BASED_TXBCN + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + rtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms + UpdateInterruptMask8814AU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_8812); + #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + UpdateInterruptMask8814AU(Adapter,_TRUE ,0, (IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812)); + #endif //CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + + #endif //CONFIG_INTERRUPT_BASED_TXBCN +#endif + } + + rtw_write8(Adapter,REG_BCN_CTRL, 0x19);//disable atim wnd + //rtw_write8(Adapter,REG_BCN_CTRL, 0x18); + } + else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) + { +#ifdef RTL8814AE_SW_BCN + rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); + RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); +#endif + ResumeTxBeacon(Adapter); + rtw_write8(Adapter,REG_BCN_CTRL, 0x1a); + } + else if(mode == _HW_STATE_AP_) + { +#ifdef CONFIG_PCI_HCI + UpdateInterruptMask8814AE(Adapter, RT_BCN_INT_MASKS, 0, 0, 0); +#else + #ifdef CONFIG_INTERRUPT_BASED_TXBCN + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + UpdateInterruptMask8814AU(Adapter,_TRUE ,IMR_BCNDMAINT0_8812, 0); + #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + + #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + UpdateInterruptMask8814AU(Adapter,_TRUE ,(IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812), 0); + #endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + + #endif //CONFIG_INTERRUPT_BASED_TXBCN +#endif + + ResumeTxBeacon(Adapter); + + rtw_write8(Adapter, REG_BCN_CTRL, 0x12); + /*Beacon is polled to TXBUF*/ +#ifdef RTL8814AE_SW_BCN + rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); + RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); +#endif + + //Set RCR + //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 + //rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 + //rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet + value_rcr = rtw_read32(Adapter, REG_RCR); + value_rcr &= ~(RCR_CBSSID_DATA);//Clear CBSSID_DATA + rtw_write32(Adapter, REG_RCR, value_rcr); + + //enable to rx data frame + rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); + + //Beacon Control related register for first time + rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms + + //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); + rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms + rtw_write16(Adapter, REG_BCNTCFG, 0x00); + rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04); + rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms) + + //reset TSF + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); + + //enable BCN0 Function for if1 + //don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) + rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB)); + +#ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE)) + rtw_write8(Adapter, REG_BCN_CTRL_1, + rtw_read8(Adapter, REG_BCN_CTRL_1) & ~EN_BCN_FUNCTION); +#endif + + //dis BCN1 ATIM WND if if2 is station + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|DIS_ATIM); +#ifdef CONFIG_TSF_RESET_OFFLOAD + // Reset TSF for STA+AP concurrent mode + if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) { + if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE) + RTW_INFO("ERROR! %s()-%d: Reset port0 TSF fail\n", + __FUNCTION__, __LINE__); + } +#endif // CONFIG_TSF_RESET_OFFLOAD + } + } +} + +static void hw_var_set_macaddr(PADAPTER Adapter, u8 variable, u8* val) +{ + u8 idx = 0; + u32 reg_macid; + +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->iface_type == IFACE_PORT1) + { + reg_macid = REG_MACID1; + } + else +#endif + { + reg_macid = REG_MACID; + } + + for(idx = 0 ; idx < 6; idx++) + { + rtw_write8(GET_PRIMARY_ADAPTER(Adapter), (reg_macid+idx), val[idx]); + } + +} + +static void hw_var_set_bssid(PADAPTER Adapter, u8 variable, u8* val) +{ + u8 idx = 0; + u32 reg_bssid; + +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->iface_type == IFACE_PORT1) + { + reg_bssid = REG_BSSID1; + } + else +#endif //CONFIG_CONCURRENT_MODE + { + reg_bssid = REG_BSSID; + } + + for(idx = 0 ; idx < 6; idx++) + { + rtw_write8(Adapter, (reg_bssid+idx), val[idx]); + } + +} + +static void hw_var_set_bcn_func(PADAPTER Adapter, u8 variable, u8* val) +{ + u32 bcn_ctrl_reg; + u8 val8; +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->iface_type == IFACE_PORT1) + { + bcn_ctrl_reg = REG_BCN_CTRL_1; + } + else +#endif + { + bcn_ctrl_reg = REG_BCN_CTRL; + } + + if(*((u8 *)val)) + { + rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); + } + else + { + + u8 val8; + val8 = rtw_read8(Adapter, bcn_ctrl_reg); + val8 &= ~(EN_BCN_FUNCTION | EN_TXBCN_RPT); + +#ifdef CONFIG_BT_COEXIST + if (GET_HAL_DATA(Adapter)->EEPROMBluetoothCoexist == 1) + { + // Always enable port0 beacon function for PSTDMA + if (REG_BCN_CTRL == bcn_ctrl_reg) + val8 |= EN_BCN_FUNCTION; + } +#endif //CONFIG_BT_COEXIST + + rtw_write8(Adapter, bcn_ctrl_reg, val8); + } + + +} + +static void hw_var_set_correct_tsf(PADAPTER Adapter, u8 variable, u8* val) +{ +#if 0 //check 8814 still need sw sync tsf?? +#ifdef CONFIG_CONCURRENT_MODE + u64 tsf; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us + tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6))); + StopTxBeacon(Adapter); + } + + if(Adapter->iface_type == IFACE_PORT1) + { + //disable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3))); + + rtw_write32(Adapter, REG_TSFTR1, tsf); + rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32); + + + //enable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3)); + + // Update buddy port's TSF if it is SoftAP for beacon TX issue! + if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE + && check_buddy_fwstate(Adapter, WIFI_AP_STATE) + ) { + //disable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); + + rtw_write32(Adapter, REG_TSFTR, tsf); + rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); + + //enable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); +#ifdef CONFIG_TSF_RESET_OFFLOAD + // Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue! + if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE) + RTW_INFO("ERROR! %s()-%d: Reset port0 TSF fail\n", + __FUNCTION__, __LINE__); + +#endif // CONFIG_TSF_RESET_OFFLOAD + } + + + } + else + { + //disable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); + + rtw_write32(Adapter, REG_TSFTR, tsf); + rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); + + //enable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); + + // Update buddy port's TSF if it is SoftAP for beacon TX issue! + if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE + && check_buddy_fwstate(Adapter, WIFI_AP_STATE) + ) { + //disable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3))); + + rtw_write32(Adapter, REG_TSFTR1, tsf); + rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32); + + //enable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3)); +#ifdef CONFIG_TSF_RESET_OFFLOAD + // Update buddy port's TSF if it is SoftAP for beacon TX issue! + if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE) + RTW_INFO("ERROR! %s()-%d: Reset port1 TSF fail\n", + __FUNCTION__, __LINE__); +#endif // CONFIG_TSF_RESET_OFFLOAD + } + + } + + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause &= (~STOP_BCNQ); + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6)))); + ResumeTxBeacon(Adapter); + } +#endif //CONFIG_CONCURRENT_MODE +#endif //0 +} + +static void hw_var_set_mlme_disconnect(PADAPTER Adapter, u8 variable, u8* val) +{ +#ifdef CONFIG_CONCURRENT_MODE + + if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_)) + rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); + + + if(Adapter->iface_type == IFACE_PORT1) + { + //reset TSF1 + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)); + + //disable update TSF1 + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4)); + + // disable Port1's beacon function + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3))); + } + else + { + //reset TSF + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); + + //disable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); + } +#endif //CONFIG_CONCURRENT_MODE +} + +static void hw_var_set_mlme_sitesurvey(PADAPTER Adapter, u8 variable, u8* val) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter); + u32 value_rcr, rcr_clear_bit, reg_bcn_ctl; + u16 value_rxfltmap2; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv=&(Adapter->mlmepriv); + u8 ap_num = 0; + +#ifdef DBG_IFACE_STATUS + DBG_IFACE_STATUS_DUMP(Adapter); +#endif + +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->iface_type == IFACE_PORT1) + reg_bcn_ctl = REG_BCN_CTRL_1; + else +#endif //CONFIG_CONCURRENT_MODE + reg_bcn_ctl = REG_BCN_CTRL; + +#ifdef CONFIG_FIND_BEST_CHANNEL + + rcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA); + + /* Receive all data frames */ + value_rxfltmap2 = 0xFFFF; + +#else /* CONFIG_FIND_BEST_CHANNEL */ + + rcr_clear_bit = RCR_CBSSID_BCN; + + //config RCR to receive different BSSID & not to receive data frame + value_rxfltmap2 = 0; + +#endif /* CONFIG_FIND_BEST_CHANNEL */ + + if( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) +#ifdef CONFIG_CONCURRENT_MODE + || (check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE) +#endif + ) + { + rcr_clear_bit = RCR_CBSSID_BCN; + } +#ifdef CONFIG_TDLS + // TDLS will clear RCR_CBSSID_DATA bit for connection. + else if (Adapter->tdlsinfo.link_established == _TRUE) + { + rcr_clear_bit = RCR_CBSSID_BCN; + } +#endif // CONFIG_TDLS + + value_rcr = rtw_read32(Adapter, REG_RCR); + + if(*((u8 *)val))//under sitesurvey + { + value_rcr &= ~(rcr_clear_bit); + rtw_write32(Adapter, REG_RCR, value_rcr); + + rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2); + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) { + //disable update TSF + rtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)|DIS_TSF_UDT); + } + + // Save orignal RRSR setting. + pHalData->RegRRSR = rtw_read16(Adapter, REG_RRSR); + + if (ap_num) + StopTxBeacon(Adapter); + } + else//sitesurvey done + { + if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) +#ifdef CONFIG_CONCURRENT_MODE + || check_buddy_fwstate(Adapter, (_FW_LINKED|WIFI_AP_STATE)) +#endif + ) + { + //enable to rx data frame + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); + } + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) { + //enable update TSF + rtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)&(~(DIS_TSF_UDT))); + } + + value_rcr |= rcr_clear_bit; + rtw_write32(Adapter, REG_RCR, value_rcr); + + // Restore orignal RRSR setting. + rtw_write16(Adapter, REG_RRSR, pHalData->RegRRSR); + + if (ap_num) { + int i; + _adapter *iface; + + ResumeTxBeacon(Adapter); + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if (!iface) + continue; + + if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE + && check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE + ) { + iface->mlmepriv.update_bcn = _TRUE; + #ifndef CONFIG_INTERRUPT_BASED_TXBCN + #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) + tx_beacon_hdl(iface, NULL); + #endif + #endif + } + } + } + } +} + +static void hw_var_set_mlme_join(PADAPTER Adapter, u8 variable, u8* val) +{ +#ifdef CONFIG_CONCURRENT_MODE + u8 RetryLimit = 0x30; + u8 type = *((u8 *)val); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + + if(type == 0) // prepare to join + { + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) && + check_buddy_fwstate(Adapter, _FW_LINKED)) + { + StopTxBeacon(Adapter); + } + + //enable to rx data frame.Accept all data frame + //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); + + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE)) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; + } + else // Ad-hoc Mode + { + RetryLimit = 0x7; + } + } + else if(type == 1) //joinbss_event call back when join res < 0 + { + if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_)) + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) && + check_buddy_fwstate(Adapter, _FW_LINKED)) + { + ResumeTxBeacon(Adapter); + + //reset TSF 1/2 after ResumeTxBeacon + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0)); + + } + } + else if(type == 2) //sta add event call back + { + + //enable update TSF + if(Adapter->iface_type == IFACE_PORT1) + rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4))); + else + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) + { + //fixed beacon issue for 8191su........... + rtw_write8(Adapter,0x542 ,0x02); + RetryLimit = 0x7; + } + + + if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) && + check_buddy_fwstate(Adapter, _FW_LINKED)) + { + ResumeTxBeacon(Adapter); + + //reset TSF 1/2 after ResumeTxBeacon + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0)); + } + + } + + rtw_write16(Adapter, REG_RETRY_LIMIT, BIT_SRL(RetryLimit) | BIT_LRL(RetryLimit)); + +#endif //CONFIG_CONCURRENT_MODE +} + +static void rtw_store_all_sta_hwseq(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + u8 index; + u16 hw_seq[NUM_STA]; + u32 shcut_addr = 0; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + + /* save each HW sequence of mac id from report fifo */ + for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) { + if (rtw_macid_is_used(macid_ctl, index)) { + rtw_write16(padapter, 0x140, 0x662 | ((index & BIT5)>>5)); + shcut_addr = 0x8000; + shcut_addr = (shcut_addr | ((index&0x1f)<<7) | (10<<2)) + 1; + hw_seq[index] = rtw_read16(padapter, shcut_addr); + /* RTW_INFO("mac_id:%d is used, hw_seq[index]=%d\n", index, hw_seq[index]); */ + } + } + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + for (index = 0; index < NUM_STA; index++) { + psta = NULL; + + phead = &(pstapriv->sta_hash[index]); + 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); + + psta->hwseq = hw_seq[psta->cmn.mac_id]; + /* RTW_INFO(" psta->cmn.mac_id=%d, psta->hwseq=%d\n" , psta->cmn.mac_id, psta->hwseq); */ + } + + } + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + +} + +static void rtw_restore_all_sta_hwseq(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + u8 index; + u16 hw_seq[NUM_STA]; + u32 shcut_addr = 0; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + for (index = 0; index < NUM_STA; index++) { + psta = NULL; + + phead = &(pstapriv->sta_hash[index]); + 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); + + hw_seq[psta->cmn.mac_id] = psta->hwseq; + /* RTW_INFO(" psta->cmn.mac_id=%d, psta->hwseq=%d\n", psta->cmn.mac_id, psta->hwseq); */ + } + + } + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + /* restore each HW sequence of mac id to report fifo */ + for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) { + if (rtw_macid_is_used(macid_ctl, index)) { + rtw_write16(padapter, 0x140, 0x662 | ((index & BIT5)>>5)); + shcut_addr = 0x8000; + shcut_addr = (shcut_addr | ((index&0x1f)<<7) | (10<<2)) + 1; + rtw_write16(padapter, shcut_addr, hw_seq[index]); + /* RTW_INFO("mac_id:%d is used, hw_seq[index]=%d\n", index, hw_seq[index]); */ + } + } + +} + +u8 SetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval) +{ + PHAL_DATA_TYPE pHalData; + struct dm_struct* podmpriv; + u8 ret = _SUCCESS; + u8 val8; + u16 val16; + u32 val32; + + pHalData = GET_HAL_DATA(padapter); + podmpriv = &pHalData->odmpriv; + + switch (variable) + { + case HW_VAR_MEDIA_STATUS: + val8 = rtw_read8(padapter, MSR) & 0x0c; + val8 |= *pval; + rtw_write8(padapter, MSR, val8); + break; + + case HW_VAR_SET_OPMODE: + hw_var_set_opmode(padapter, variable, pval); + break; + + case HW_VAR_MAC_ADDR: + hw_var_set_macaddr(padapter, variable, pval); + break; + + case HW_VAR_BSSID: + hw_var_set_bssid(padapter, variable, pval); + break; + + case HW_VAR_BASIC_RATE: + { + 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_CCK_RATES; + u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_CCK_RATES); + u16 rrsr_5g_force_mask = (RRSR_6M); + u16 rrsr_5g_allow_mask = (RRSR_OFDM_RATES); + + HalSetBrateCfg(padapter, pval, &BrateCfg); + input_b = BrateCfg; + + /* apply force and allow mask */ + if(pHalData->current_band_type == BAND_ON_2_4G) + { + BrateCfg |= rrsr_2g_force_mask; + BrateCfg &= rrsr_2g_allow_mask; + } + else // 5G + { + BrateCfg |= rrsr_5g_force_mask; + BrateCfg &= rrsr_5g_allow_mask; + } + masked = BrateCfg; + + /* 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; + + RTW_INFO("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: + rtw_write8(padapter, REG_TXPAUSE, *pval); + break; + + case HW_VAR_BCN_FUNC: + hw_var_set_bcn_func(padapter, variable, pval); + break; + + case HW_VAR_CORRECT_TSF: +#ifdef CONFIG_CONCURRENT_MODE + hw_var_set_correct_tsf(padapter, variable, pval); +#else //CONFIG_CONCURRENT_MODE + { + u64 tsf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us + tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) + //rtw_write8(padapter, REG_TXPAUSE, (rtw_read8(padapter, REG_TXPAUSE)|BIT(6))); + StopTxBeacon(padapter); + } + + //disable related TSF function + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); + //select port0 tsf + rtw_write8(padapter, REG_BCN_INTERVAL+3, rtw_read8(padapter, REG_BCN_INTERVAL+3)&0x8f); + rtw_write32(padapter, REG_TSFTR, tsf); + rtw_write32(padapter, REG_TSFTR+4, tsf>>32); + + //enable related TSF function + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); + + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause &= (~STOP_BCNQ); + //rtw_write8(padapter, REG_TXPAUSE, (rtw_read8(padapter, REG_TXPAUSE)&(~BIT(6)))); + ResumeTxBeacon(padapter); + } + } +#endif //CONFIG_CONCURRENT_MODE + break; + + case HW_VAR_MLME_DISCONNECT: +#ifdef CONFIG_CONCURRENT_MODE + hw_var_set_mlme_disconnect(padapter, variable, pval); +#else + { + // Set RCR to not to receive data frame when NO LINK state +// val32 = rtw_read32(padapter, REG_RCR); +// val32 &= ~RCR_ADF; +// rtw_write32(padapter, REG_RCR, val32); + + // reject all data frames + rtw_write16(padapter, REG_RXFLTMAP2, 0x00); + + // reset TSF + val8 = BIT(0) | BIT(1); + rtw_write8(padapter, REG_DUAL_TSF_RST, val8); + + // disable update TSF + val8 = rtw_read8(padapter, REG_BCN_CTRL); + val8 |= BIT(4); + rtw_write8(padapter, REG_BCN_CTRL, val8); + } +#endif + break; + + case HW_VAR_MLME_SITESURVEY: + hw_var_set_mlme_sitesurvey(padapter, variable, pval); + +#ifdef CONFIG_BT_COEXIST + if (_TRUE == pHalData->EEPROMBluetoothCoexist) + rtw_btcoex_ScanNotify(padapter, *pval?_TRUE:_FALSE); +#endif + break; + + case HW_VAR_MLME_JOIN: +#ifdef CONFIG_CONCURRENT_MODE + hw_var_set_mlme_join(padapter, variable, pval); +#else // !CONFIG_CONCURRENT_MODE + { + u8 RetryLimit = RL_VAL_AP; + u8 type = *(u8*)pval; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + if (type == 0) // prepare to join + { + //enable to rx data frame.Accept all data frame + rtw_write16(padapter, REG_RXFLTMAP2, 0xFFFF); + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; + } + else // Ad-hoc Mode + { + RetryLimit = RL_VAL_AP; + } + } + else if (type == 1) //joinbss_event call back when join res < 0 + { + rtw_write16(padapter, REG_RXFLTMAP2, 0x00); + } + else if (type == 2) //sta add event call back + { + //enable update TSF + val8 = rtw_read8(padapter, REG_BCN_CTRL); + val8 &= ~BIT(4); + rtw_write8(padapter, REG_BCN_CTRL, val8); + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) + { + RetryLimit = RL_VAL_AP; + } + } + + val16 = BIT_SRL(RetryLimit) | BIT_LRL(RetryLimit); + rtw_write16(padapter, REG_RETRY_LIMIT, val16); + } +#endif // !CONFIG_CONCURRENT_MODE + +#ifdef CONFIG_BT_COEXIST + if (_TRUE == pHalData->EEPROMBluetoothCoexist) + { + switch (*pval) + { + case 0: + // prepare to join + rtw_btcoex_ConnectNotify(padapter, _TRUE); + break; + case 1: + // joinbss_event callback when join res < 0 + rtw_btcoex_ConnectNotify(padapter, _FALSE); + break; + case 2: + // sta add event callback + // rtw_btcoex_MediaStatusNotify(padapter, RT_MEDIA_CONNECT); + break; + } + } +#endif + break; + + + case HW_VAR_BEACON_INTERVAL: + rtw_write16(padapter, REG_BCN_INTERVAL, *(u16*)pval); +#ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + { + struct mlme_ext_priv *pmlmeext; + struct mlme_ext_info *pmlmeinfo; + u16 bcn_interval; + + pmlmeext = &padapter->mlmeextpriv; + pmlmeinfo = &pmlmeext->mlmext_info; + bcn_interval = *((u16*)pval); + + if ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + RTW_INFO("%s==> bcn_interval:%d, eraly_int:%d\n", __FUNCTION__, bcn_interval, bcn_interval>>1); + rtw_write8(padapter, REG_DRVERLYINT, bcn_interval>>1);// 50ms for sdio + } + } +#endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + break; + + case HW_VAR_SLOT_TIME: + rtw_write8(padapter, REG_SLOT, *pval); + break; + + case HW_VAR_RESP_SIFS: + // SIFS_Timer = 0x0a0a0808; + // RESP_SIFS for CCK + rtw_write8(padapter, REG_RESP_SIFS_CCK, pval[0]); // SIFS_T2T_CCK (0x08) + rtw_write8(padapter, REG_RESP_SIFS_CCK+1, pval[1]); //SIFS_R2T_CCK(0x08) + // RESP_SIFS for OFDM + rtw_write8(padapter, REG_RESP_SIFS_OFDM, pval[2]); //SIFS_T2T_OFDM (0x0a) + rtw_write8(padapter, REG_RESP_SIFS_OFDM+1, pval[3]); //SIFS_R2T_OFDM(0x0a) + break; + + case HW_VAR_ACK_PREAMBLE: + { + u8 bShortPreamble = *pval; + + // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) + val8 = (pHalData->nCur40MhzPrimeSC) << 5; + if (bShortPreamble) + val8 |= 0x80; + rtw_write8(padapter, REG_RRSR+2, val8); + } + break; + + case HW_VAR_CAM_EMPTY_ENTRY: + { + u8 ucIndex = *pval; + u8 i; + u32 ulCommand = 0; + u32 ulContent = 0; + u32 ulEncAlgo = CAM_AES; + + for (i=0; iac_param_be = *(u32*)pval; + rtw_write32(padapter, REG_EDCA_BE_PARAM, *(u32*)pval); + break; + + case HW_VAR_AC_PARAM_BK: + rtw_write32(padapter, REG_EDCA_BK_PARAM, *(u32*)pval); + break; + + case HW_VAR_ACM_CTRL: + { + u8 acm_ctrl; + u8 AcmCtrl; + + acm_ctrl = *(u8*)pval; + AcmCtrl = rtw_read8(padapter, REG_ACMHWCTRL); + + if (acm_ctrl > 1) + AcmCtrl = AcmCtrl | 0x1; + + if (acm_ctrl & BIT(3)) + AcmCtrl |= AcmHw_VoqEn; + else + AcmCtrl &= (~AcmHw_VoqEn); + + if (acm_ctrl & BIT(2)) + AcmCtrl |= AcmHw_ViqEn; + else + AcmCtrl &= (~AcmHw_ViqEn); + + if (acm_ctrl & BIT(1)) + AcmCtrl |= AcmHw_BeqEn; + else + AcmCtrl &= (~AcmHw_BeqEn); + + RTW_INFO("[HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl); + rtw_write8(padapter, REG_ACMHWCTRL, AcmCtrl ); + } + break; + case HW_VAR_AMPDU_FACTOR: + { + u32 AMPDULen = *(u8*)pval; + + RTW_INFO("SetHwReg8814AU(): HW_VAR_AMPDU_FACTOR %x\n" ,AMPDULen); + + if(AMPDULen < VHT_AGG_SIZE_256K) + AMPDULen = (0x2000 << (*((u8*)pval))) -1; + else + AMPDULen = 0x3ffff; + rtw_write32(padapter, REG_AMPDU_MAX_LENGTH_8814A, AMPDULen); + //RTW_INFO("SetHwReg8814AU(): HW_VAR_AMPDU_FACTOR %x\n" ,AMPDULen); + } + break; + case HW_VAR_H2C_FW_PWRMODE: + { + u8 psmode = *pval; + rtl8814_set_FwPwrMode_cmd(padapter, psmode); + } + break; + + case HW_VAR_H2C_FW_JOINBSSRPT: + rtl8814_set_FwJoinBssReport_cmd(padapter, *pval); + break; + +#ifdef CONFIG_P2P_PS + case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: + rtl8814_set_p2p_ps_offload_cmd(padapter, *pval); + break; +#endif // CONFIG_P2P_PS + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + case HW_VAR_ANTENNA_DIVERSITY_LINK: + //SwAntDivRestAfterLink8192C(padapter); + ODM_SwAntDivRestAfterLink(podmpriv); + break; + + case HW_VAR_ANTENNA_DIVERSITY_SELECT: + { + u8 Optimum_antenna = *pval; + u8 Ant; + + //switch antenna to Optimum_antenna + //RTW_INFO("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); + if (pHalData->CurAntenna != Optimum_antenna) + { + Ant = (Optimum_antenna==2) ? MAIN_ANT : AUX_ANT; + ODM_UpdateRxIdleAnt(podmpriv, Ant); + + pHalData->CurAntenna = Optimum_antenna; + //RTW_INFO("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); + } + } + break; +#endif //CONFIG_SW_ANTENNA_DIVERSITY + + case HW_VAR_EFUSE_USAGE: + pHalData->EfuseUsedPercentage = *pval; + break; + + case HW_VAR_EFUSE_BYTES: + pHalData->EfuseUsedBytes = *(u16*)pval; + break; +#if 0 + case HW_VAR_EFUSE_BT_USAGE: +#ifdef HAL_EFUSE_MEMORY + pHalData->EfuseHal.BTEfuseUsedPercentage = *pval; +#endif //HAL_EFUSE_MEMORY + break; + + case HW_VAR_EFUSE_BT_BYTES: +#ifdef HAL_EFUSE_MEMORY + pHalData->EfuseHal.BTEfuseUsedBytes = *(u16*)pval; +#else //HAL_EFUSE_MEMORY + BTEfuseUsedBytes = *(u16*)pval; +#endif //HAL_EFUSE_MEMORY + break; +#endif //0 + case HW_VAR_FIFO_CLEARN_UP: + { + struct pwrctrl_priv *pwrpriv; + u8 trycnt = 100; + + pwrpriv = adapter_to_pwrctl(padapter); + + // pause tx + rtw_write8(padapter, REG_TXPAUSE, 0xff); + + // keep sn + rtw_store_all_sta_hwseq(padapter); + + if (pwrpriv->bkeepfwalive != _TRUE) + { + // RX DMA stop + val32 = rtw_read32(padapter, REG_RXPKT_NUM); + val32 |= RW_RELEASE_EN; + rtw_write32(padapter, REG_RXPKT_NUM, val32); + do { + val32 = rtw_read32(padapter, REG_RXPKT_NUM); + val32 &= RXDMA_IDLE; + if (val32) + break; + } while (--trycnt); + if (trycnt == 0) + { + RTW_INFO("[HW_VAR_FIFO_CLEARN_UP] Stop RX DMA failed......\n"); + } + + //RQPN Load 0 + rtw_write16(padapter, REG_RQPN_NPQ, 0x0); + rtw_write32(padapter, REG_RQPN, 0x80000000); + rtw_mdelay_os(10); + } + } + break; + + case HW_VAR_RESTORE_HW_SEQ: + rtw_restore_all_sta_hwseq(padapter); + break; + + case HW_VAR_CHECK_TXBUF: + { + u8 retry_limit; + u32 reg_230 = 0, reg_234 = 0, reg_238 = 0, reg_23c = 0, reg_240 = 0; + u32 init_reg_230 = 0, init_reg_234 = 0, init_reg_238 = 0, init_reg_23c = 0, init_reg_240 = 0; + systime start = rtw_get_current_time(); + u32 pass_ms; + int i = 0; + + retry_limit = 0x01; + + val16 = BIT_SRL(retry_limit) | BIT_LRL(retry_limit); + rtw_write16(padapter, REG_RETRY_LIMIT, val16); + + while (rtw_get_passing_time_ms(start) < 2000 + && !RTW_CANNOT_RUN(padapter) + ) { + reg_230 = rtw_read32(padapter, REG_FIFOPAGE_INFO_1_8814A); + reg_234 = rtw_read32(padapter, REG_FIFOPAGE_INFO_2_8814A); + reg_238 = rtw_read32(padapter, REG_FIFOPAGE_INFO_3_8814A); + reg_23c = rtw_read32(padapter, REG_FIFOPAGE_INFO_4_8814A); + reg_240 = rtw_read32(padapter, REG_FIFOPAGE_INFO_5_8814A); + + if (i == 0) { + init_reg_230 = reg_230; + init_reg_234 = reg_234; + init_reg_238 = reg_238; + init_reg_23c = reg_23c; + init_reg_240 = reg_240; + } + + i++; + if ((((reg_230 & 0x0c) != ((reg_230>>16) & 0x0c)) || ((reg_234 & 0x0c) != ((reg_234>>16) & 0x0c)) + || ((reg_238 & 0x0c) != ((reg_238>>16) & 0x0c)) || ((reg_23c & 0x0c) != ((reg_23c>>16) & 0x0c)) + || ((reg_240 & 0x0c) != ((reg_240>>16) & 0x0c)))) { + /* RTW_INFO("%s: (HW_VAR_CHECK_TXBUF)TXBUF NOT empty - 0x230=0x%08x, 0x234=0x%08x 0x238=0x%08x," + " 0x23c=0x%08x, 0x240=0x%08x (%d)\n" + , __FUNCTION__, reg_230, reg_234, reg_238, reg_23c, reg_240, i); */ + rtw_msleep_os(10); + } else { + break; + } + } + + pass_ms = rtw_get_passing_time_ms(start); + + if (RTW_CANNOT_RUN(padapter)) { + RTW_INFO("bDriverStopped or bSurpriseRemoved\n"); + } else if (pass_ms >= 2000 || (((reg_230 & 0x0c) != ((reg_230>>16) & 0x0c)) || ((reg_234 & 0x0c) != ((reg_234>>16) & 0x0c)) + || ((reg_238 & 0x0c) != ((reg_238>>16) & 0x0c)) || ((reg_23c & 0x0c) != ((reg_23c>>16) & 0x0c)) + || ((reg_240 & 0x0c) != ((reg_240>>16) & 0x0c)))) { + RTW_ERR("%s:(HW_VAR_CHECK_TXBUF)NOT empty(%d) in %d ms\n", __func__, i, pass_ms); + RTW_ERR("%s:(HW_VAR_CHECK_TXBUF) 0x230=0x%08x, 0x234=0x%08x 0x238=0x%08x, 0x23c=0x%08x, 0x240=0x%08x (0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n", __func__, reg_230, reg_234, reg_238, reg_23c, reg_240 + , init_reg_230, init_reg_234, init_reg_238, init_reg_23c, init_reg_240); + //rtw_warn_on(1); + } else { + RTW_INFO("%s:(HW_VAR_CHECK_TXBUF)TXBUF Empty(%d) in %d ms\n", __FUNCTION__, i, pass_ms); + } + + retry_limit = RL_VAL_STA; + val16 = BIT_SRL(retry_limit) | BIT_LRL(retry_limit); + rtw_write16(padapter, REG_RETRY_LIMIT, val16); + } + + break; + + case HW_VAR_APFM_ON_MAC: + pHalData->bMacPwrCtrlOn = *pval; + RTW_INFO("%s: bMacPwrCtrlOn=%d\n", __FUNCTION__, pHalData->bMacPwrCtrlOn); + break; + + case HW_VAR_NAV_UPPER: + { + u32 usNavUpper = *((u32*)pval); + + if (usNavUpper > HAL_NAV_UPPER_UNIT * 0xFF) + { + RTW_INFO("%s: [HW_VAR_NAV_UPPER] set value(0x%08X us) is larger than (%d * 0xFF)!\n", + __FUNCTION__, usNavUpper, HAL_NAV_UPPER_UNIT); + break; + } + + // The value of ((usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT) + // is getting the upper integer. + //usNavUpper = (usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT; + rtw_write8(padapter, REG_NAV_UPPER, (u8)usNavUpper); + } + break; + + case HW_VAR_BCN_VALID: +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->iface_type == IFACE_PORT1) + { + /* BCN_VALID, BIT31 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear, Clear by sw */ + val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3); + val8 |= BIT(7); + rtw_write8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3, val8); + } + else +#endif + { + /* BCN_VALID, BIT15 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear, Clear by sw */ + val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1); + val8 |= BIT(7); + rtw_write8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1, val8); + } + break; + + case HW_VAR_DL_BCN_SEL: +#if 0 /* for MBSSID, so far we don't need this */ +#ifdef CONFIG_CONCURRENT_MODE + if (IS_HARDWARE_TYPE_8821(padapter) && padapter->iface_type == IFACE_PORT1) + { + // SW_BCN_SEL - Port1 + val8 = rtw_read8(padapter, REG_AUTO_LLT_8814A); + val8 |= BIT(2); + rtw_write8(padapter, REG_AUTO_LLT_8814A, val8); + } + else +#endif //CONFIG_CONCURRENT_MODE + { + /* SW_BCN_SEL - Port0 , BIT_r_EN_BCN_SW_HEAD_SEL */ + val8 = rtw_read8(padapter, REG_AUTO_LLT_8814A); + val8 &= ~BIT(2); + rtw_write8(padapter, REG_AUTO_LLT_8814A, val8); + } +#endif /* for MBSSID, so far we don't need this */ + break; + + case HW_VAR_WIRELESS_MODE: + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 R2T_SIFS = 0, SIFS_Timer = 0; + u8 wireless_mode = *pval; + + if ((wireless_mode == WIRELESS_11BG) || (wireless_mode == WIRELESS_11G)) + SIFS_Timer = 0xa; + else + SIFS_Timer = 0xe; + + // SIFS for OFDM Data ACK + rtw_write8(padapter, REG_SIFS_CTX+1, SIFS_Timer); + // SIFS for OFDM consecutive tx like CTS data! + rtw_write8(padapter, REG_SIFS_TRX+1, SIFS_Timer); + + rtw_write8(padapter,REG_SPEC_SIFS+1, SIFS_Timer); + rtw_write8(padapter,REG_MAC_SPEC_SIFS+1, SIFS_Timer); + + // 20100719 Joseph: Revise SIFS setting due to Hardware register definition change. + rtw_write8(padapter, REG_RESP_SIFS_OFDM+1, SIFS_Timer); + rtw_write8(padapter, REG_RESP_SIFS_OFDM, SIFS_Timer); + + // + // Adjust R2T SIFS for IOT issue. Add by hpfan 2013.01.25 + // Set R2T SIFS to 0x0a for Atheros IOT. Add by hpfan 2013.02.22 + // + // Mac has 10 us delay so use 0xa value is enough. + R2T_SIFS = 0xa; +#ifdef CONFIG_80211AC_VHT + if (wireless_mode & WIRELESS_11_5AC && + //MgntLinkStatusQuery(Adapter) && + TEST_FLAG(pmlmepriv->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_RX) && + TEST_FLAG(pmlmepriv->vhtpriv.stbc_cap, STBC_VHT_ENABLE_RX)) + { + if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) + R2T_SIFS = 0x8; + else + R2T_SIFS = 0xa; + } +#endif //CONFIG_80211AC_VHT + + rtw_write8(padapter, REG_RESP_SIFS_OFDM+1, R2T_SIFS); + } + break; + + case HW_VAR_DO_IQK: + pHalData->bNeedIQK = _TRUE; + break; + case HW_VAR_DL_RSVD_PAGE: +#ifdef CONFIG_BT_COEXIST + if (pHalData->EEPROMBluetoothCoexist == 1) + { + if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) + { + rtl8814a_download_BTCoex_AP_mode_rsvd_page(padapter); + } + } +#endif // CONFIG_BT_COEXIST + break; +#ifdef CONFIG_BEAMFORMING +#if (BEAMFORMING_SUPPORT == 1) /*add by YuChen for PHYDM-TxBF AutoTest HW Timer*/ + case HW_VAR_HW_REG_TIMER_INIT: + { + HAL_HW_TIMER_TYPE TimerType = (*(PHAL_HW_TIMER_TYPE)pval)>>16; + + rtw_write8(padapter, 0x164, 1); + + if (TimerType == HAL_TIMER_TXBF) + rtw_write32(padapter, 0x15C, (*(pu2Byte)pval)); + else if (TimerType == HAL_TIMER_EARLYMODE) + rtw_write32(padapter, 0x160, 0x05000190); + break; + } + case HW_VAR_HW_REG_TIMER_START: + { + HAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval; + + if (TimerType == HAL_TIMER_TXBF) + rtw_write8(padapter, 0x15F, 0x5); + else if (TimerType == HAL_TIMER_EARLYMODE) + rtw_write8(padapter, 0x163, 0x5); + break; + } + case HW_VAR_HW_REG_TIMER_RESTART: + { + HAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval; + + if (TimerType == HAL_TIMER_TXBF) { + rtw_write8(padapter, 0x15F, 0x0); + rtw_write8(padapter, 0x15F, 0x5); + } else if (TimerType == HAL_TIMER_EARLYMODE) { + rtw_write8(padapter, 0x163, 0x0); + rtw_write8(padapter, 0x163, 0x5); + } + break; + } + case HW_VAR_HW_REG_TIMER_STOP: + { + HAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval; + + if (TimerType == HAL_TIMER_TXBF) + rtw_write8(padapter, 0x15F, 0); + else if (TimerType == HAL_TIMER_EARLYMODE) + rtw_write8(padapter, 0x163, 0x0); + break; + } +#endif/*#if (BEAMFORMING_SUPPORT == 1) - for PHYDM TxBF*/ +#endif/*#ifdef CONFIG_BEAMFORMING*/ + + +#ifdef CONFIG_GPIO_WAKEUP + case HW_SET_GPIO_WL_CTRL: + { + u8 enable = *pval; + u8 value = rtw_read8(padapter, 0x4e); + if (enable && (value & BIT(6))) { + value &= ~BIT(6); + rtw_write8(padapter, 0x4e, value); + } else if (enable == _FALSE){ + value |= BIT(6); + rtw_write8(padapter, 0x4e, value); + } + RTW_INFO("%s: set WL control, 0x4E=0x%02X\n", + __func__, rtw_read8(padapter, 0x4e)); + } + break; +#endif + default: + ret = SetHwReg(padapter, variable, pval); + break; + } + return ret; + +} + +struct qinfo_8814a { + u32 head:8; + u32 pkt_num:7; + u32 tail:8; + u32 ac:2; + u32 macid:7; +}; + +struct bcn_qinfo_8814a { + u16 head:8; + u16 pkt_num:8; +}; + +void dump_qinfo_8814a(void *sel, struct qinfo_8814a *info, const char *tag) +{ + //if (info->pkt_num) + RTW_PRINT_SEL(sel, "%shead:0x%02x, tail:0x%02x, pkt_num:%u, macid:%u, ac:%u\n" + , tag ? tag : "", info->head, info->tail, info->pkt_num, info->macid, info->ac + ); +} + +void dump_bcn_qinfo_8814a(void *sel, struct bcn_qinfo_8814a *info, const char *tag) +{ + //if (info->pkt_num) + RTW_PRINT_SEL(sel, "%shead:0x%02x, pkt_num:%u\n" + , tag ? tag : "", info->head, info->pkt_num + ); +} + +void dump_mac_qinfo_8814a(void *sel, _adapter *adapter) +{ + u32 q0_info; + u32 q1_info; + u32 q2_info; + u32 q3_info; + u32 q4_info; + u32 q5_info; + u32 q6_info; + u32 q7_info; + u32 mg_q_info; + u32 hi_q_info; + u16 bcn_q_info; + + q0_info = rtw_read32(adapter, REG_Q0_INFO); + q1_info = rtw_read32(adapter, REG_Q1_INFO); + q2_info = rtw_read32(adapter, REG_Q2_INFO); + q3_info = rtw_read32(adapter, REG_Q3_INFO); + q4_info = rtw_read32(adapter, REG_Q4_INFO); + q5_info = rtw_read32(adapter, REG_Q5_INFO); + q6_info = rtw_read32(adapter, REG_Q6_INFO); + q7_info = rtw_read32(adapter, REG_Q7_INFO); + mg_q_info = rtw_read32(adapter, REG_MGQ_INFO); + hi_q_info = rtw_read32(adapter, REG_HGQ_INFO); + bcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO); + + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q0_info, "Q0 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q1_info, "Q1 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q2_info, "Q2 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q3_info, "Q3 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q4_info, "Q4 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q5_info, "Q5 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q6_info, "Q6 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q7_info, "Q7 "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&mg_q_info, "MG "); + dump_qinfo_8814a(sel, (struct qinfo_8814a *)&hi_q_info, "HI "); + dump_bcn_qinfo_8814a(sel, (struct bcn_qinfo_8814a *)&bcn_q_info, "BCN "); +} + +void GetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval) +{ + PHAL_DATA_TYPE pHalData; + struct dm_struct* podmpriv; + u8 val8; + u16 val16; + u32 val32; + + pHalData = GET_HAL_DATA(padapter); + podmpriv = &pHalData->odmpriv; + + switch (variable) + { + case HW_VAR_TXPAUSE: + *pval = rtw_read8(padapter, REG_TXPAUSE); + break; + + case HW_VAR_BCN_VALID: +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->iface_type == IFACE_PORT1) + { + /* BCN_VALID, BIT31 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear */ + val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3); + *pval = (BIT(7) & val8) ? _TRUE:_FALSE; + } + else +#endif //CONFIG_CONCURRENT_MODE + { + /* BCN_VALID, BIT15 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear */ + val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1); + *pval = (BIT(7) & val8) ? _TRUE:_FALSE; + } + break; + + case HW_VAR_FWLPS_RF_ON: + //When we halt NIC, we should check if FW LPS is leave. + if(adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off) + { + // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, + // because Fw is unload. + *pval = _TRUE; + } + else + { + u32 valRCR; + valRCR = rtw_read32(padapter, REG_RCR); + valRCR &= 0x00070000; + if(valRCR) + *pval = _FALSE; + else + *pval = _TRUE; + } + + break; + +#ifdef CONFIG_ANTENNA_DIVERSITY + case HW_VAR_CURRENT_ANTENNA: + *pval = pHalData->CurAntenna; + break; +#endif //CONFIG_ANTENNA_DIVERSITY + + case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22. + *(u16*)pval = pHalData->EfuseUsedBytes; + break; + + case HW_VAR_APFM_ON_MAC: + *pval = pHalData->bMacPwrCtrlOn; + break; + + case HW_VAR_CHK_HI_QUEUE_EMPTY: + val16 = rtw_read16(padapter, REG_TXPKT_EMPTY); + *pval = (val16 & BIT(10)) ? _TRUE:_FALSE; + break; + + case HW_VAR_DUMP_MAC_QUEUE_INFO: + dump_mac_qinfo_8814a(pval, padapter); + break; + + default: + GetHwReg(padapter, variable, pval); + break; + } + +} + +/* + * Description: + * Change default setting of specified variable. + */ +u8 SetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) +{ + PHAL_DATA_TYPE pHalData; + u8 bResult; + + + pHalData = GET_HAL_DATA(padapter); + bResult = _SUCCESS; + + switch (variable) + { + case HAL_DEF_EFUSE_BYTES: + pHalData->EfuseUsedBytes = *((u16*)pval); + break; + case HAL_DEF_EFUSE_USAGE: + pHalData->EfuseUsedPercentage = *((u8*)pval); + break; + default: + bResult = SetHalDefVar(padapter, variable, pval); + break; + } + + return bResult; +} + +/* + * Description: + * Query setting of specified variable. + */ +u8 GetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) +{ + PHAL_DATA_TYPE pHalData; + u8 bResult; + + + pHalData = GET_HAL_DATA(padapter); + bResult = _SUCCESS; + + switch (variable) + { + + +#ifdef CONFIG_ANTENNA_DIVERSITY + case HAL_DEF_IS_SUPPORT_ANT_DIV: + *((u8*)pval) = (pHalData->AntDivCfg==0) ? _FALSE : _TRUE; + break; +#endif //CONFIG_ANTENNA_DIVERSITY + +#ifdef CONFIG_ANTENNA_DIVERSITY + case HAL_DEF_CURRENT_ANTENNA: + *((u8*)pval) = pHalData->CurAntenna; + break; +#endif //CONFIG_ANTENNA_DIVERSITY + + case HAL_DEF_DRVINFO_SZ: + *((u32*)pval) = DRVINFO_SZ; + break; + + case HAL_DEF_MAX_RECVBUF_SZ: + *((u32*)pval) = MAX_RECVBUF_SZ; + break; + + case HAL_DEF_RX_PACKET_OFFSET: + *((u32*)pval) = RXDESC_SIZE + DRVINFO_SZ*8; + break; + + case HW_VAR_MAX_RX_AMPDU_FACTOR: + *((u32*)pval) = MAX_AMPDU_FACTOR_64K; + break; + + case HW_VAR_BEST_AMPDU_DENSITY: + *((u32 *)pval) = AMPDU_DENSITY_VALUE_4; + break; + + case HAL_DEF_TX_LDPC: + *(u8*)pval = _TRUE; + break; + + case HAL_DEF_RX_LDPC: + *(u8*)pval = _TRUE; + break; + + case HAL_DEF_TX_STBC: + if (pHalData->rf_type == RF_1T2R || pHalData->rf_type == RF_1T1R) + *(u8 *)pval = 0; + else + *(u8 *)pval = 1; + break; + + case HAL_DEF_RX_STBC: + *(u8*)pval = 4; + break; + + case HAL_DEF_EXPLICIT_BEAMFORMER: + if (pHalData->rf_type != RF_1T2R || pHalData->rf_type != RF_1T1R)/*1T?R not support mer*/ + *((PBOOLEAN)pval) = _TRUE; + else + *((PBOOLEAN)pval) = _FALSE; + break; + case HAL_DEF_EXPLICIT_BEAMFORMEE: + *((PBOOLEAN)pval) = _TRUE; + break; + + case HW_DEF_RA_INFO_DUMP: +#if 0 + { + u8 mac_id = *(u8*)pval; + u32 cmd ; + u32 ra_info1, ra_info2; + u32 rate_mask1, rate_mask2; + u8 curr_tx_rate,curr_tx_sgi,hight_rate,lowest_rate; + + RTW_INFO("============ RA status check Mac_id:%d ===================\n", mac_id); + + cmd = 0x40000100 |mac_id; + rtw_write32(padapter,REG_HMEBOX_E2_E3_8812,cmd); + rtw_msleep_os(10); + ra_info1 = rtw_read32(padapter,REG_RSVD5_8812); + curr_tx_rate = ra_info1&0x7F; + curr_tx_sgi = (ra_info1>>7)&0x01; + RTW_INFO("[ 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_E2_E3_8812,cmd); + rtw_msleep_os(10); + ra_info1 = rtw_read32(padapter, REG_RSVD5_8812); + ra_info2 = rtw_read32(padapter, REG_RSVD6_8812); + rate_mask1 = rtw_read32(padapter,REG_RSVD7_8812); + rate_mask2 = rtw_read32(padapter,REG_RSVD8_8812); + hight_rate = ra_info2&0xFF; + lowest_rate = (ra_info2>>8) & 0xFF; + RTW_INFO("[ 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); + + RTW_INFO("[ 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); + RTW_INFO("rate_mask2=0x%08x, rate_mask1=0x%08x\n", rate_mask2, rate_mask1); + } +#else //0 + RTW_INFO("%s,%d, 8814 need to fix \n", __FUNCTION__,__LINE__); +#endif //0 + break; + + case HAL_DEF_TX_PAGE_SIZE: + *(u32*)pval = PAGE_SIZE_128; + break; + + case HAL_DEF_TX_PAGE_BOUNDARY: + if (!padapter->registrypriv.wifi_spec) + { + *(u16*)pval = TX_PAGE_BOUNDARY_8814A; + } + else + { + *(u16*)pval = WMM_NORMAL_TX_PAGE_BOUNDARY_8814A; + } + break; + + case HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN: + *(u16*)pval = TX_PAGE_BOUNDARY_WOWLAN_8814A; + break; + + case HAL_DEF_EFUSE_BYTES: + *((u16*)(pval)) = pHalData->EfuseUsedBytes; + break; + case HAL_DEF_EFUSE_USAGE: + *((u32*)(pval)) = (pHalData->EfuseUsedPercentage<<16)|(pHalData->EfuseUsedBytes); + break; + case HAL_DEF_RX_DMA_SZ_WOW: + *((u32 *)pval) = RX_DMA_BOUNDARY_8814A + 1; + break; + case HAL_DEF_RX_DMA_SZ: + *((u32 *)pval) = RX_DMA_BOUNDARY_8814A + 1; + break; + case HAL_DEF_RX_PAGE_SIZE: + *((u32 *)pval) = 8; + break; + default: + bResult = GetHalDefVar(padapter, variable, pval); + break; + } + + return bResult; +} + + +#ifdef CONFIG_BT_COEXIST +void rtl8812a_combo_card_WifiOnlyHwInit(PADAPTER pdapter) +{ + u8 u1Tmp; + RTW_INFO("%s !\n", __FUNCTION__); + if(IS_HARDWARE_TYPE_8812(pdapter)) + { + //0x790[5:0]=0x5 + u1Tmp = rtw_read8(pdapter,0x790); + u1Tmp = (u1Tmp & 0xb0) | 0x05 ; + rtw_write8(pdapter,0x790,u1Tmp); + // PTA parameter + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, 0x0); + //pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, 0xffffff); + //pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, 0x55555555); + //pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, 0x55555555); + rtw_write8(pdapter,0x6cc,0x0); + rtw_write32(pdapter,0x6c8,0xffffff); + rtw_write32(pdapter,0x6c4,0x55555555); + rtw_write32(pdapter,0x6c0,0x55555555); + + // coex parameters + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3); + rtw_write8(pdapter,0x778,0x3); + + // enable counter statistics + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); + rtw_write8(pdapter,0x76e,0xc); + + // enable PTA + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20); + rtw_write8(pdapter,0x40, 0x20); + + // bt clock related + //u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4); + //u1Tmp |= BIT7; + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4, u1Tmp); + u1Tmp = rtw_read8(pdapter,0x4); + u1Tmp |= BIT7; + rtw_write8(pdapter,0x4, u1Tmp); + + // bt clock related + //u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7); + //u1Tmp |= BIT1; + //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp); + u1Tmp = rtw_read8(pdapter,0x7); + u1Tmp |= BIT1; + rtw_write8(pdapter,0x7, u1Tmp); + } + + +} +#endif //CONFIG_BT_COEXIST + +void rtl8814_set_hal_ops(struct hal_ops *pHalFunc) +{ + pHalFunc->dm_init = &rtl8814_init_dm_priv; + pHalFunc->dm_deinit = &rtl8814_deinit_dm_priv; + + pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8814A; + + pHalFunc->read_chip_version = read_chip_version_8814a; + +// pHalFunc->set_bwmode_handler = &PHY_SetBWMode8814; +// pHalFunc->set_channel_handler = &PHY_SwChnl8814; + pHalFunc->set_chnl_bw_handler = &PHY_SetSwChnlBWMode8814; + + pHalFunc->set_tx_power_level_handler = &PHY_SetTxPowerLevel8814; + pHalFunc->get_tx_power_level_handler = &PHY_GetTxPowerLevel8814; + pHalFunc->set_tx_power_index_handler = &PHY_SetTxPowerIndex_8814A; + pHalFunc->get_tx_power_index_handler = &PHY_GetTxPowerIndex8814A; + + pHalFunc->hal_dm_watchdog = &rtl8814_HalDmWatchDog; + +// pHalFunc->Add_RateATid = &rtl8814_Add_RateATid; + + pHalFunc->run_thread= &rtl8814_start_thread; + pHalFunc->cancel_thread= &rtl8814_stop_thread; + +#ifdef CONFIG_ANTENNA_DIVERSITY + pHalFunc->AntDivBeforeLinkHandler = &AntDivBeforeLink8812; + pHalFunc->AntDivCompareHandler = &AntDivCompare8812; +#endif //CONFIG_ANTENNA_DIVERSITY + + pHalFunc->read_bbreg = &PHY_QueryBBReg8814A; + pHalFunc->write_bbreg = &PHY_SetBBReg8814A; + pHalFunc->read_rfreg = &PHY_QueryRFReg8814A; + pHalFunc->write_rfreg = &PHY_SetRFReg8814A; + + + // Efuse related function + pHalFunc->EfusePowerSwitch = &rtl8814_EfusePowerSwitch; + pHalFunc->ReadEFuse = &rtl8814_ReadEFuse; + pHalFunc->EFUSEGetEfuseDefinition = &rtl8814_EFUSE_GetEfuseDefinition; + pHalFunc->EfuseGetCurrentSize = &rtl8814_EfuseGetCurrentSize; + pHalFunc->Efuse_PgPacketRead = &rtl8814_Efuse_PgPacketRead; + pHalFunc->Efuse_PgPacketWrite = &rtl8814_Efuse_PgPacketWrite; + pHalFunc->Efuse_WordEnableDataWrite = &rtl8814_Efuse_WordEnableDataWrite; + +#ifdef DBG_CONFIG_ERROR_DETECT + pHalFunc->sreset_init_value = &sreset_init_value; + pHalFunc->sreset_reset_value = &sreset_reset_value; + pHalFunc->silentreset = &sreset_reset; + pHalFunc->sreset_xmit_status_check = &rtl8814_sreset_xmit_status_check; + pHalFunc->sreset_linked_status_check = &rtl8814_sreset_linked_status_check; + pHalFunc->sreset_get_wifi_status = &sreset_get_wifi_status; + pHalFunc->sreset_inprogress= &sreset_inprogress; +#endif //DBG_CONFIG_ERROR_DETECT + + pHalFunc->GetHalODMVarHandler = GetHalODMVar; + pHalFunc->SetHalODMVarHandler = SetHalODMVar; + pHalFunc->hal_notch_filter = &hal_notch_filter_8814; + + pHalFunc->c2h_handler = c2h_handler_8814a; + + pHalFunc->fill_h2c_cmd = &FillH2CCmd_8814; + pHalFunc->fill_fake_txdesc = &rtl8814a_fill_fake_txdesc; +#ifdef CONFIG_WOWLAN + pHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8814; +#endif //CONFIG_WOWLAN + pHalFunc->fw_dl = &FirmwareDownload8814A; + pHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8814; +} + + diff --git a/hal/rtl8814a/rtl8814a_phycfg.c b/hal/rtl8814a/rtl8814a_phycfg.c new file mode 100644 index 0000000..3bed477 --- /dev/null +++ b/hal/rtl8814a/rtl8814a_phycfg.c @@ -0,0 +1,3027 @@ +/****************************************************************************** + * + * 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 _RTL8814A_PHYCFG_C_ + +//#include + +#include +#include "hal_com_h2c.h" + +/*---------------------Define local function prototype-----------------------*/ + +/*----------------------------Function Body----------------------------------*/ +//1 1. BB register R/W API + +u32 +PHY_QueryBBReg8814A( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 ReturnValue = 0, OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + +#if(SIC_ENABLE == 1) + return SIC_QueryBBReg(Adapter, RegAddr, BitMask); +#endif + + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = PHY_CalculateBitShift(BitMask); + ReturnValue = (OriginalValue & BitMask) >> BitShift; + + //RTW_INFO("BBR MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, OriginalValue); + + return (ReturnValue); +} + + +VOID +PHY_SetBBReg8814A( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + u32 OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return; +#endif + +#if(SIC_ENABLE == 1) + SIC_SetBBReg(Adapter, RegAddr, BitMask, Data); + return; +#endif + + if(BitMask!= bMaskDWord) + {//if not "double word" write + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = PHY_CalculateBitShift(BitMask); + Data = ((OriginalValue) & (~BitMask)) |( ((Data << BitShift)) & BitMask); + } + + rtw_write32(Adapter, RegAddr, Data); + + //RTW_INFO("BBW MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, Data); +} + + + +static u32 +phy_RFRead_8814A( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 DataAndAddr = 0; + u32 Readback_Value, Direct_Addr; + + RegAddr &= 0xff; + switch(eRFPath){ + case RF_PATH_A: + Direct_Addr = 0x2800+RegAddr*4; + break; + case RF_PATH_B: + Direct_Addr = 0x2c00+RegAddr*4; + break; + case RF_PATH_C: + Direct_Addr = 0x3800+RegAddr*4; + break; + case RF_PATH_D: + Direct_Addr = 0x3c00+RegAddr*4; + break; + default: //pathA + Direct_Addr = 0x2800+RegAddr*4; + break; + } + + + BitMask &= bRFRegOffsetMask; + + Readback_Value = phy_query_bb_reg(Adapter, Direct_Addr, BitMask); + //RTW_INFO("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, RegAddr, Readback_Value); + + return Readback_Value; +} + + +static VOID +phy_RFWrite_8814A( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u32 Offset, + IN u32 Data + ) +{ + u32 DataAndAddr = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + //RT_DISP(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); + //return; + //} + + Offset &= 0xff; + + // Shadow Update + //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); + + // Put write addr in [27:20] and write data in [19:00] + DataAndAddr = ((Offset<<20) | (Data&0x000fffff)) & 0x0fffffff; + + // Write Operation + phy_set_bb_reg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); + //RTW_INFO("RFW-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr); +} + + +u32 +PHY_QueryRFReg8814A( + IN PADAPTER Adapter, + IN enum rf_path eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 Readback_Value; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + Readback_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, BitMask); + + return (Readback_Value); +} + + +VOID +PHY_SetRFReg8814A( + IN PADAPTER Adapter, + IN enum rf_path eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + +#if (DISABLE_BB_RF == 1) + return; +#endif + + if(BitMask == 0) + return; + + RegAddr &= 0xff; + // RF data is 20 bits only + if (BitMask != bLSSIWrite_data_Jaguar) { + u32 Original_Value, BitShift; + + Original_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, bLSSIWrite_data_Jaguar); + BitShift = PHY_CalculateBitShift(BitMask); + Data = ((Original_Value) & (~BitMask)) | (Data<< BitShift); + } + + phy_RFWrite_8814A(Adapter, eRFPath, RegAddr, Data); + + +} + +// +// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. +// + +s32 PHY_MACConfig8814(PADAPTER Adapter) +{ + int rtStatus = _FAIL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // + // Config MAC + // +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + rtStatus = phy_ConfigMACWithParaFile(Adapter, PHY_FILE_MAC_REG); + if (rtStatus == _FAIL) +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + { +#ifdef CONFIG_EMBEDDED_FWIMG + odm_config_mac_with_header_file(&pHalData->odmpriv); + rtStatus = _SUCCESS; +#endif//CONFIG_EMBEDDED_FWIMG + } + + return rtStatus; +} + + +static VOID +phy_InitBBRFRegisterDefinition( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // RF Interface Sowrtware Control + pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 + pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) + + // RF Interface Output (and Enable) + pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 + pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 + + // RF Interface (Output and) Enable + pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) + pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) + + if(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) + { + pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rA_LSSIWrite_Jaguar; //LSSI Parameter + pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rB_LSSIWrite_Jaguar; + + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 + } + else + { + pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter + pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; + + pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 + pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 + } + + if(IS_HARDWARE_TYPE_8814A(Adapter)) + { + pHalData->PHYRegDef[RF_PATH_C].rf3wireOffset = rC_LSSIWrite_Jaguar2; //LSSI Parameter + pHalData->PHYRegDef[RF_PATH_D].rf3wireOffset = rD_LSSIWrite_Jaguar2; + + pHalData->PHYRegDef[RF_PATH_C].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 + pHalData->PHYRegDef[RF_PATH_D].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 + } + + if(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) + { + // Tranceiver Readback LSSI/HSPI mode + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rA_SIRead_Jaguar; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rB_SIRead_Jaguar; + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = rA_PIRead_Jaguar; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = rB_PIRead_Jaguar; + } + else + { + // Tranceiver Readback LSSI/HSPI mode + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; + pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; + pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; + } + + if(IS_HARDWARE_TYPE_8814A(Adapter)) + { + // Tranceiver Readback LSSI/HSPI mode + pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rC_SIRead_Jaguar2; + pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rD_SIRead_Jaguar2; + pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rC_PIRead_Jaguar2; + pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rD_PIRead_Jaguar2; + } + + //pHalData->bPhyValueInitReady=TRUE; +} + + +int +PHY_BBConfig8814( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TmpU1B=0; + + phy_InitBBRFRegisterDefinition(Adapter); + + // . APLL_EN,,APLL_320_GATEB,APLL_320BIAS, auto config by hw fsm after pfsm_go (0x4 bit 8) set + TmpU1B = PlatformEFIORead1Byte(Adapter, REG_SYS_FUNC_EN_8814A); + + if(IS_HARDWARE_TYPE_8814AU(Adapter)) + TmpU1B |= FEN_USBA; + else if(IS_HARDWARE_TYPE_8814AE(Adapter)) + TmpU1B |= FEN_PCIEA; + + PlatformEFIOWrite1Byte(Adapter, REG_SYS_FUNC_EN, TmpU1B); + + TmpU1B = PlatformEFIORead1Byte(Adapter, 0x1002); + PlatformEFIOWrite1Byte(Adapter, 0x1002, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));//same with 8812 + + //6. 0x1f[7:0] = 0x07 PathA RF Power On + PlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL0_8814A , 0x07);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a + //7. 0x20[7:0] = 0x07 PathB RF Power On + //8. 0x21[7:0] = 0x07 PathC RF Power On + PlatformEFIOWrite2Byte(Adapter, REG_RF_CTRL1_8814A , 0x0707);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a + //9. 0x76[7:0] = 0x07 PathD RF Power On + PlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL3_8814A , 0x7); + + // + // Config BB and AGC + // + rtStatus = phy_BB8814A_Config_ParaFile(Adapter); + + hal_set_crystal_cap(Adapter, pHalData->crystal_cap); + + switch (Adapter->registrypriv.rf_config) { + case RF_1T1R: + case RF_2T4R: + case RF_3T3R: + /*RX CCK disable 2R CCA*/ + phy_set_bb_reg(Adapter, rCCK0_FalseAlarmReport+2, BIT2|BIT6, 0); + /*pathB tx on, path A/C/D tx off*/ + phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4); + /*pathB rx*/ + phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5); + break; + default: + /*RX CCK disable 2R CCA*/ + phy_set_bb_reg(Adapter, rCCK0_FalseAlarmReport+2, BIT2|BIT6, 0); + /*pathB tx on, path A/C/D tx off*/ + phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4); + /*pathB rx*/ + phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5); + RTW_INFO("%s, unknown rf_config: %d\n", __func__, Adapter->registrypriv.rf_config); + break; + } + + return rtStatus; +} + +int phy_BB8814A_Config_ParaFile( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + /* Read PHY_REG.TXT BB INIT!! */ +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL) +#endif + { +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) + rtStatus = _FAIL; +#endif + } + + if (rtStatus != _SUCCESS) { + RTW_INFO("%s(): CONFIG_BB_PHY_REG Fail!!\n", __FUNCTION__); + goto phy_BB_Config_ParaFile_Fail; + } + + /* Read PHY_REG_MP.TXT BB INIT!! */ +#if (MP_DRIVER == 1) + if (Adapter->registrypriv.mp_mode == 1) { +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (phy_ConfigBBWithMpParaFile(Adapter, PHY_FILE_PHY_REG_MP) == _FAIL) +#endif + { +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP)) + rtStatus = _FAIL; +#endif + } + + if (rtStatus != _SUCCESS) { + RTW_INFO("phy_BB8814_Config_ParaFile():Write BB Reg MP Fail!!\n"); + goto phy_BB_Config_ParaFile_Fail; + } + } +#endif /* #if (MP_DRIVER == 1) */ + + /* BB AGC table Initialization */ +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL) +#endif + { +#ifdef CONFIG_EMBEDDED_FWIMG + if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) + rtStatus = _FAIL; +#endif + } + + if (rtStatus != _SUCCESS) + RTW_INFO("%s(): CONFIG_BB_AGC_TAB Fail!!\n", __FUNCTION__); + +phy_BB_Config_ParaFile_Fail: + + return rtStatus; +} + + +VOID +phy_ADC_CLK_8814A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 MAC_REG_520, BB_REG_8FC, BB_REG_808, RXIQC[4]; + u32 Search_index = 0, MAC_Active = 1; + u32 RXIQC_REG[2][4] = {{0xc10, 0xe10, 0x1810, 0x1a10}, {0xc14, 0xe14, 0x1814, 0x1a14}} ; + + if (GET_CVID_CUT_VERSION(pHalData->version_id) != A_CUT_VERSION) + return; + +//1 Step1. MAC TX pause + MAC_REG_520 = phy_query_bb_reg( Adapter, 0x520, bMaskDWord); + BB_REG_8FC = phy_query_bb_reg( Adapter, 0x8fc, bMaskDWord); + BB_REG_808 = phy_query_bb_reg( Adapter, 0x808, bMaskDWord); + phy_set_bb_reg(Adapter, 0x520, bMaskByte2, 0x3f); + +//1 Step 2. Backup RXIQC & RXIQC = 0 + for(Search_index = 0; Search_index<4; Search_index++){ + RXIQC[Search_index] = phy_query_bb_reg( Adapter, RXIQC_REG[0][Search_index], bMaskDWord); + phy_set_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, 0x0); + phy_set_bb_reg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x0); + } + phy_set_bb_reg(Adapter, 0xa14, 0x00000300, 0x3); + Search_index = 0; + +//1 Step 3. Monitor MAC IDLE + phy_set_bb_reg(Adapter, 0x8fc, bMaskDWord, 0x0); + while(MAC_Active){ + MAC_Active = phy_query_bb_reg( Adapter, 0xfa0, bMaskDWord) & (0x803e0008); + Search_index++; + if(Search_index>1000){ + break; + } + } + +//1 Step 4. ADC clk flow + phy_set_bb_reg(Adapter, 0x808, bMaskByte0, 0x11); + phy_set_bb_reg(Adapter, 0x90c, BIT(13), 0x1); + phy_set_bb_reg(Adapter, 0x764, BIT(10)|BIT(9), 0x3); + phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x1); + + // 0xc1c/0xe1c/0x181c/0x1a1c[4] must=1 to ensure table can be written when bbrstb=0 + // 0xc60/0xe60/0x1860/0x1a60[15] always = 1 after this line + // 0xc60/0xe60/0x1860/0x1a60[14] always = 0 bcz its error in A-cut + + // power_off/clk_off @ anapar_state=idle mode + phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x15800002); //0xc60 0x15808002 + phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x01808003); //0xc60 0x01808003 + phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x15800002); //0xe60 0x15808002 + phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x01808003); //0xe60 0x01808003 + phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x15800002); //0x1860 0x15808002 + phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x01808003); //0x1860 0x01808003 + phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x15800002); //0x1a60 0x15808002 + phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x01808003); //0x1a60 0x01808003 + + phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x0); + phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x0); + phy_set_bb_reg(Adapter, 0xc5c, bMaskDWord, 0x0D080058); //0xc5c 0x00080058 // [19] =1 to turn off ADC + phy_set_bb_reg(Adapter, 0xe5c, bMaskDWord, 0x0D080058); //0xe5c 0x00080058 // [19] =1 to turn off ADC + phy_set_bb_reg(Adapter, 0x185c, bMaskDWord, 0x0D080058); //0x185c 0x00080058 // [19] =1 to turn off ADC + phy_set_bb_reg(Adapter, 0x1a5c, bMaskDWord, 0x0D080058); //0x1a5c 0x00080058 // [19] =1 to turn off ADC + + // power_on/clk_off + //phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x1); + phy_set_bb_reg(Adapter, 0xc5c, bMaskDWord, 0x0D000058); //0xc5c 0x0D000058 // [19] =0 to turn on ADC + phy_set_bb_reg(Adapter, 0xe5c, bMaskDWord, 0x0D000058); //0xe5c 0x0D000058 // [19] =0 to turn on ADC + phy_set_bb_reg(Adapter, 0x185c, bMaskDWord, 0x0D000058); //0x185c 0x0D000058 // [19] =0 to turn on ADC + phy_set_bb_reg(Adapter, 0x1a5c, bMaskDWord, 0x0D000058); //0x1a5c 0x0D000058 // [19] =0 to turn on ADC + + // power_on/clk_on @ anapar_state=BT mode + phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05808032); //0xc60 0x05808002 + phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05808032); //0xe60 0x05808002 + phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05808032); //0x1860 0x05808002 + phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05808032); //0x1a60 0x05808002 + phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x1); + phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x1); + + // recover original setting @ anapar_state=BT mode + phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05808032); //0xc60 0x05808036 + phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05808032); //0xe60 0x05808036 + phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05808032); //0x1860 0x05808036 + phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05808032); //0x1a60 0x05808036 + + phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05800002); //0xc60 0x05800002 + phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x07808003); //0xc60 0x07808003 + phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05800002); //0xe60 0x05800002 + phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x07808003); //0xe60 0x07808003 + phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05800002); //0x1860 0x05800002 + phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x07808003); //0x1860 0x07808003 + phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05800002); //0x1a60 0x05800002 + phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x07808003); //0x1a60 0x07808003 + + phy_set_bb_reg(Adapter, 0x764, BIT(10)|BIT(9), 0x0); + phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x0); + phy_set_bb_reg(Adapter, 0x90c, BIT(13), 0x0); + +//1 Step 5. Recover MAC TX & IQC + phy_set_bb_reg(Adapter, 0x520, bMaskDWord, MAC_REG_520); + phy_set_bb_reg(Adapter, 0x8fc, bMaskDWord, BB_REG_8FC); + phy_set_bb_reg(Adapter, 0x808, bMaskDWord, BB_REG_808); + for(Search_index = 0; Search_index<4; Search_index++){ + phy_set_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, RXIQC[Search_index]); + phy_set_bb_reg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x01000000); + } + phy_set_bb_reg(Adapter, 0xa14, 0x00000300, 0x0); +} + +VOID +PHY_ConfigBB_8814A( + IN PADAPTER Adapter + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + RTW_DBG(" ===> PHY_ConfigBB_8814A() \n"); + phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); +} + + + +//2 3.3 RF Config + +s32 +PHY_RFConfig8814A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + //vivi added this, 20100610 + if (rtw_is_surprise_removed(Adapter)) + return _FAIL; + + switch(pHalData->rf_chip) + { + case RF_PSEUDO_11N: + RTW_INFO("%s(): RF_PSEUDO_11N\n",__FUNCTION__); + break; + default: + rtStatus = PHY_RF6052_Config_8814A(Adapter); + break; + } + + return rtStatus; +} + +//1 4. RF State setting API + +/* todo +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + +// +// 2009/11/03 MH add for LPS mode power save sequence. +// 2009/11/03 According to document V10. +// 2009/11/24 According to document V11. by tynli. +// +VOID +phy_SetRTL8814ERfOn( + IN PADAPTER Adapter +) +{ + rtw_write8(Adapter, REG_SPS0_CTRL_8814A, 0x2b); + + // c. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 //enable BB TRX function + // For USB: SYS_FUNC_EN 0x02[7:0] = 0x17 +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE3); +#else + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x17); +#endif + + // RF_ON_EXCEP(d~g): + // d. APSD_CTRL 0x600[7:0] = 0x00 + //rtw_write8(Adapter, REG_APSD_CTRL, 0x00); + + // e. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 //reset BB TRX function again + //f. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 //enable BB TRX function +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE2); + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE3); +#else + // e.For USB: SYS_FUNC_EN 0x02[7:0] = 0x16 + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x16); + // f. For USB: SYS_FUNC_EN 0x02[7:0] = 0x17 + rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x17); +#endif + + // g. TXPAUSE 0x522[7:0] = 0x00 //enable MAC TX queue + rtw_write8(Adapter, REG_TXPAUSE_8814A, 0x00); +} // phy_SetRTL8188EERfSleep + + +BOOLEAN +phy_SetRFPowerState_8814E( + IN PADAPTER Adapter, + IN rt_rf_power_state eRFPowerState + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + BOOLEAN bResult = TRUE; + u8 i, QueueID; + PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo); + + pHalData->SetRFPowerStateInProgress = TRUE; + + switch( eRFPowerState ) + { + // + // SW radio on/IPS site survey call will execute all flow + // HW radio on + // + case eRfOn: + { + #if(MUTUAL_AUTHENTICATION == 1) + if(pHalData->MutualAuthenticationFail) + break; + #endif + if((pHalData->eRFPowerState == eRfOff) && RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC)) + { // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC. + s32 rtstatus; + u32 InitializeCount = 0; + do + { + InitializeCount++; + rtstatus = NicIFEnableNIC( Adapter ); + }while( (rtstatus != _SUCCESS) &&(InitializeCount <10) ); + RT_ASSERT(rtstatus == _SUCCESS,("Nic Initialize Fail\n")); + RT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); + } + else + { // This is the normal case, we just turn on the RF. + phy_SetRTL8814ERfOn(Adapter); + } + + // Turn on RF we are still linked, which might happen when + // we quickly turn off and on HW RF. 2006.05.12, by rcnjko. + if( pMgntInfo->bMediaConnect == TRUE ) + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); + else // Turn off LED if RF is not ON. + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); + } + break; + + // Card Disable/SW radio off/HW radio off/IPS enter call + case eRfOff: + { + // Make sure BusyQueue is empty befor turn off RFE pwoer. + for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) + { + if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID])) + { + QueueID++; + continue; + } + else if(IsLowPowerState(Adapter)) + { + RT_TRACE((COMP_POWER|COMP_RF), DBG_LOUD, + ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n", (i+1), QueueID)); + break; + } + else + { + RT_TRACE((COMP_POWER|COMP_RF), DBG_LOUD, + ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID)); + PlatformStallExecution(10); + i++; + } + + if(i >= MAX_DOZE_WAITING_TIMES_9x) + { + RT_TRACE((COMP_POWER|COMP_RF), DBG_WARNING, ("\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID)); + break; + } + } + + if(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC) + { // Disable all components. + NicIFDisableNIC(Adapter); + + if(IS_HARDWARE_TYPE_8814AE(Adapter)) + NicIFEnableInterrupt(Adapter); + RT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); + } + else + { // Normal case. + //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015 + if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS ) + Adapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); + else // Turn off LED if RF is not ON. + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); + } + } + break; + + default: + case eRfSleep:// Not used LPS is running on FW + bResult = FALSE; + RT_ASSERT(FALSE, ("phy_SetRFPowerState_8814E(): unknow state to set: 0x%X!!!\n", eRFPowerState)); + break; + } + + if(bResult) + { + // Update current RF state variable. + pHalData->eRFPowerState = eRFPowerState; + } + + pHalData->SetRFPowerStateInProgress = FALSE; + + return bResult; +} + +#elif (DEV_BUS_TYPE == RT_USB_INTERFACE) + +BOOLEAN +phy_SetRFPowerState_8814U( + IN PADAPTER Adapter, + IN rt_rf_power_state eRFPowerState + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + BOOLEAN bResult = TRUE; + u8 i, QueueID; + PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(Adapter); + + if(pHalData->SetRFPowerStateInProgress == TRUE) + return FALSE; + + pHalData->SetRFPowerStateInProgress = TRUE; + RTW_DBG("======> phy_SetRFPowerState_8814U .\n"); + + switch( eRFPowerState ) + { + case eRfOn: + if((pHalData->eRFPowerState == eRfOff) && + RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC)) + { // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC. + RT_TRACE(COMP_RF, DBG_LOUD, ("======> phy_SetRFPowerState_8814U-eRfOn .\n")); + + if(!Adapter->bInHctTest) + { + // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence + // So disable the different RF on/off sequence for hidden AP. + NicIFEnableNIC(Adapter); + RT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); + } + } + break; + + // + // In current solution, RFSleep=RFOff in order to save power under 802.11 power save. + // By Bruce, 2008-01-16. + // + case eRfSleep: + { + // ToDo: + } + break; + + case eRfOff: + // HW setting had been configured. + // Both of these RF configures are the same, configuring twice may cause HW abnormal. + if(pHalData->eRFPowerState == eRfSleep || pHalData->eRFPowerState== eRfOff) + break; + rtw_write8(Adapter, 0xf015, 0x40); //page added for usb3 bus + // Make sure BusyQueue is empty befor turn off RFE pwoer. + for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) + { + if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID])) + { + QueueID++; + continue; + } + else + { + RT_TRACE(COMP_POWER, DBG_LOUD, ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID)); + PlatformSleepUs(10); + i++; + } + + if(i >= MAX_DOZE_WAITING_TIMES_9x) + { + RT_TRACE(COMP_POWER, DBG_LOUD, ("\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID)); + break; + } + } + + // + //RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon. + // Added by + // + //================================================================== + // CU will call card disable flow to set RF off, such that we call halt directly + // and set the PS_LEVEL to HALT_NIC or we might call halt twice in N6usbHalt in some cases. + // 2010.03.05. Added by tynli. + if(pMgntInfo->RfOffReason & RF_CHANGE_BY_IPS || + pMgntInfo->RfOffReason & RF_CHANGE_BY_HW || + pMgntInfo->RfOffReason & RF_CHANGE_BY_SW) + { //for HW/Sw radio off and IPS flow + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> CardDisableWithoutHWSM -eRfOff.\n")); + if(!Adapter->bInHctTest) + { + // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence + // So disable the different RF on/off sequence for hidden AP. + NicIFDisableNIC(Adapter); + RT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); + } + } + break; + + default: + bResult = FALSE; + RT_ASSERT(FALSE, ("phy_SetRFPowerState_8814U(): unknow state to set: 0x%X!!!\n", eRFPowerState)); + break; + } + + if(bResult) + { + // Update current RF state variable. + pHalData->eRFPowerState = eRFPowerState; + + switch(pHalData->rf_chip ) + { + default: + switch(pHalData->eRFPowerState) + { + case eRfOff: + // + //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015 + // + if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS ) + Adapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); + else // Turn off LED if RF is not ON. + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); + break; + + case eRfOn: + // Turn on RF we are still linked, which might happen when + // we quickly turn off and on HW RF. 2006.05.12, by rcnjko. + if( pMgntInfo->bMediaConnect == TRUE ) + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); + else // Turn off LED if RF is not ON. + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); + break; + + default: + // do nothing. + break; + }// Switch RF state + + break; + }// Switch rf_chip + } + + pHalData->SetRFPowerStateInProgress = FALSE; + RT_TRACE(COMP_INIT, DBG_LOUD, ("<====== phy_SetRFPowerState_8814U .\n")); + return bResult; +} + +#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE + +BOOLEAN +phy_SetRFPowerState_8814Sdio( + IN PADAPTER Adapter, + IN rt_rf_power_state eRFPowerState + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + BOOLEAN bResult = TRUE; + u8 i, QueueID; + PRT_SDIO_DEVICE pDevice = GET_RT_SDIO_DEVICE(Adapter); + + if(pHalData->SetRFPowerStateInProgress == TRUE) + return FALSE; + + pHalData->SetRFPowerStateInProgress = TRUE; + RT_TRACE(COMP_INIT, DBG_LOUD, ("======> phy_SetRFPowerState_8814Sdio .\n")) + + switch( eRFPowerState ) + { + case eRfOn: + if((pHalData->eRFPowerState == eRfOff) && + RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC)) + { // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC. + RT_TRACE(COMP_RF, DBG_LOUD, ("======> phy_SetRFPowerState_8814Sdio-eRfOn .\n")); + + if(!Adapter->bInHctTest) + { + // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence + // So disable the different RF on/off sequence for hidden AP. + NicIFEnableNIC(Adapter); + RT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); + } + } + + // 2010/08/26 MH Prevent IQK to send out packet. + if(pHalData->bIQKInitialized ) + phy_iq_calibrate_8814a(Adapter, TRUE); + else + { + phy_iq_calibrate_8814a(Adapter,FALSE); + pHalData->bIQKInitialized = _TRUE; + } + break; + + // + // In current solution, RFSleep=RFOff in order to save power under 802.11 power save. + // By Bruce, 2008-01-16. + // + case eRfSleep: + { + // ToDo: + } + break; + + case eRfOff: + // HW setting had been configured. + // Both of these RF configures are the same, configuring twice may cause HW abnormal. + if(pHalData->eRFPowerState == eRfSleep || pHalData->eRFPowerState== eRfOff) + break; + + // Make sure BusyQueue is empty befor turn off RFE pwoer. + for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) + { + if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID])) + { + //DbgPrint("QueueID = %d", QueueID); + QueueID++; + continue; + } + else + { + RT_TRACE(COMP_POWER, DBG_LOUD, ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID)); + PlatformSleepUs(10); + i++; + } + + if(i >= MAX_DOZE_WAITING_TIMES_9x) + { + RT_TRACE(COMP_POWER, DBG_LOUD, ("\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID)); + break; + } + } + + // + //RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon. + // Added by + // + //================================================================== + // CU will call card disable flow to set RF off, such that we call halt directly + // and set the PS_LEVEL to HALT_NIC or we might call halt twice in N6usbHalt in some cases. + // 2010.03.05. Added by tynli. + if(pMgntInfo->RfOffReason & RF_CHANGE_BY_IPS || + pMgntInfo->RfOffReason & RF_CHANGE_BY_HW || + pMgntInfo->RfOffReason & RF_CHANGE_BY_SW) + { //for HW/Sw radio off and IPS flow + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> CardDisableWithoutHWSM -eRfOff.\n")); + if(!Adapter->bInHctTest) + { + // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence + // So disable the different RF on/off sequence for hidden AP. + NicIFDisableNIC(Adapter); + + RT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); + } + } + break; + + default: + bResult = FALSE; + RT_ASSERT(FALSE, ("phy_SetRFPowerState_8814Sdio(): unknow state to set: 0x%X!!!\n", eRFPowerState)); + break; + } + + if(bResult) + { + // Update current RF state variable. + pHalData->eRFPowerState = eRFPowerState; + + switch(pHalData->rf_chip ) + { + default: + switch(pHalData->eRFPowerState) + { + case eRfOff: + // + //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015 + // + if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS ) + Adapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); + else // Turn off LED if RF is not ON. + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); + break; + + case eRfOn: + // Turn on RF we are still linked, which might happen when + // we quickly turn off and on HW RF. 2006.05.12, by rcnjko. + if( pMgntInfo->bMediaConnect == TRUE ) + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); + else // Turn off LED if RF is not ON. + Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); + break; + + default: + // do nothing. + break; + }// Switch RF state + + break; + }// Switch rf_chip + } + + pHalData->SetRFPowerStateInProgress = FALSE; + + return bResult; +} + +#endif + + + +BOOLEAN +PHY_SetRFPowerState8814A( + IN PADAPTER Adapter, + IN rt_rf_power_state eRFPowerState + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN bResult = FALSE; + + RT_TRACE(COMP_RF, DBG_LOUD, ("---------> PHY_SetRFPowerState8814(): eRFPowerState(%d)\n", eRFPowerState)); + if(eRFPowerState == pHalData->eRFPowerState) + { + RT_TRACE(COMP_RF, DBG_LOUD, ("<--------- PHY_SetRFPowerState8814(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState)); + return bResult; + } +#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) + bResult = phy_SetRFPowerState_8814E(Adapter, eRFPowerState); +#elif (DEV_BUS_TYPE == RT_USB_INTERFACE) + bResult = phy_SetRFPowerState_8814U(Adapter, eRFPowerState); +#elif (DEV_BUS_TYPE == RT_SDIO_INTERFACE) + bResult = phy_SetRFPowerState_8814Sdio(Adapter, eRFPowerState); +#endif + + RT_TRACE(COMP_RF, DBG_LOUD, ("<--------- PHY_SetRFPowerState8814(): bResult(%d)\n", bResult)); + + return bResult; +} +todo */ +//1 5. Tx Power setting API + +VOID +phy_TxPwrAdjInPercentage( + IN PADAPTER Adapter, + OUT u8* pTxPwrIdx) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int txPower = *pTxPwrIdx + pHalData->CurrentTxPwrIdx - 18; + + *pTxPwrIdx = txPower > RF6052_MAX_TX_PWR ? RF6052_MAX_TX_PWR : txPower; +} + +VOID +PHY_GetTxPowerLevel8814( + IN PADAPTER Adapter, + OUT s32* powerlevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + *powerlevel = pHalData->CurrentTxPwrIdx; +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + s4Byte TxPwrDbm = 13; + + if ( pMgntInfo->ClientConfigPwrInDbm != UNSPECIFIED_PWR_DBM ) + *powerlevel = pMgntInfo->ClientConfigPwrInDbm; + else + *powerlevel = TxPwrDbm; +#endif //0 +/* + //PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx); + //u8 mgn_rate = mpt_to_mgnt_rate(HwRateToMPTRate(Adapter->mppriv.rateidx)); + *powerlevel=PHY_GetTxPowerIndex8814A(Adapter,RF_PATH_A ,MGN_MCS7, pHalData->current_channel_bw, pHalData->current_channel, NULL); + *powerlevel/=2; +*/ +} + +VOID +PHY_SetTxPowerLevel8814( + IN PADAPTER Adapter, + IN u8 Channel + ) +{ + u32 i, j, k = 0; + u32 value[264]={0}; + u32 path = 0, PowerIndex, txagc_table_wd = 0x00801000; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u8 jaguar2Rates[][4] = { {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M}, + {MGN_6M, MGN_9M, MGN_12M, MGN_18M}, + {MGN_24M, MGN_36M, MGN_48M, MGN_54M}, + {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3}, + {MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7}, + {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11}, + {MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15}, + {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19}, + {MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23}, + {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3}, + {MGN_VHT1SS_MCS4, MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7}, + {MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9, MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1}, + {MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, MGN_VHT2SS_MCS5}, + {MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9}, + {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3}, + {MGN_VHT3SS_MCS4, MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7}, + {MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9, 0, 0}}; + + + for( path = RF_PATH_A; path <= RF_PATH_D; ++path ) + { + phy_set_tx_power_level_by_path(Adapter, Channel, (u8)path); + } +#if 0 //todo H2C_TXPOWER_INDEX_OFFLOAD ? + if(Adapter->MgntInfo.bScanInProgress == FALSE && pHalData->RegFWOffload == 2) + { + HalDownloadTxPowerLevel8814(Adapter, value); + } +#endif //0 +} + +/************************************************************************************************************** + * Description: + * The low-level interface to get the FINAL Tx Power Index , called by both MP and Normal Driver. + * + * <20120830, Kordan> + **************************************************************************************************************/ +u8 +PHY_GetTxPowerIndex8814A( + IN PADAPTER pAdapter, + IN enum rf_path RFPath, + IN u8 Rate, + IN u8 BandWidth, + IN u8 Channel, + struct txpwr_idx_comp *tic + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + struct hal_spec_t *hal_spec = GET_HAL_SPEC(pAdapter); + s8 powerDiffByRate = 0; + s8 txPower = 0, limit = 0; + u8 ntx_idx = MgntQuery_NssTxRate(Rate ); + BOOLEAN bIn24G = FALSE; + s8 tpt_offset = 0; + + /* RTW_INFO( "===>%s\n", __FUNCTION__ ); */ + if(pAdapter->mppriv.bSetTxPower) + { + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx); + txPower = pMptCtx->TxPwrLevel[RFPath]; + } + else + { + txPower = (s8) PHY_GetTxPowerIndexBase( pAdapter, RFPath, Rate, ntx_idx, BandWidth, Channel, &bIn24G ); + + powerDiffByRate = PHY_GetTxPowerByRate( pAdapter, (u8)(!bIn24G), RFPath, Rate ); + + limit = PHY_GetTxPowerLimit( pAdapter, NULL, (u8)(!bIn24G), pHalData->current_channel_bw, RFPath, Rate,ntx_idx, pHalData->current_channel); + tpt_offset = PHY_GetTxPowerTrackingOffset(pAdapter, RFPath, Rate); + + powerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate; + /*RTW_INFO("Rate-0x%x: (TxPower, PowerDiffByRate Path-%c) = (0x%X, %d)\n", Rate, ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), txPower, powerDiffByRate);*/ + + txPower += powerDiffByRate; + + //txPower += PHY_GetTxPowerTrackingOffset( pAdapter, RFPath, Rate ); + #if 0 //todo ? + #if CCX_SUPPORT + CCX_CellPowerLimit( pAdapter, Channel, Rate, &txPower ); + #endif + #endif + phy_TxPwrAdjInPercentage(pAdapter, (u8 *)&txPower); + } + if (tic) { + tic->ntx_idx = ntx_idx; + tic->base = txPower; + tic->by_rate = powerDiffByRate; + tic->limit = limit; + tic->tpt = tpt_offset; + tic->ebias = 0; + } + + if(txPower > hal_spec->txgi_max) + txPower = hal_spec->txgi_max; + + //if (Adapter->registrypriv.mp_mode==0 && + //(pHalData->bautoload_fail_flag || pHalData->EfuseMap[EFUSE_INIT_MAP][EEPROM_TX_PWR_INX_JAGUAR] == 0xFF)) + //txPower = 0x12; + + /*RTW_INFO("Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), Channel, + txPower, txPower);*/ + + return (u8) txPower; +} + + +VOID +PHY_SetTxPowerIndex_8814A( + IN PADAPTER Adapter, + IN u32 PowerIndex, + IN enum rf_path RFPath, + IN u8 Rate + ) +{ + u32 txagc_table_wd = 0x00801000; + + txagc_table_wd |= (RFPath << 8) | MRateToHwRate(Rate) | (PowerIndex << 24); + phy_set_bb_reg(Adapter, 0x1998, bMaskDWord, txagc_table_wd); + /* RTW_INFO("txagc_table_wd %x\n", txagc_table_wd); */ + if (Rate == MGN_1M) { + phy_set_bb_reg(Adapter, 0x1998, bMaskDWord, txagc_table_wd); /* first time to turn on the txagc table */ + /* second to write the addr0 */ + } +} + + +BOOLEAN +PHY_UpdateTxPowerDbm8814A( + IN PADAPTER Adapter, + IN s4Byte powerInDbm + ) +{ + return TRUE; +} + + +u32 +PHY_GetTxBBSwing_8814A( + IN PADAPTER Adapter, + IN BAND_TYPE Band, + IN enum rf_path RFPath + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); + struct dm_struct * pDM_Odm = &pHalData->odmpriv; + struct dm_rf_calibration_struct * pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info); + s8 bbSwing_2G = -1 * GetRegTxBBSwing_2G(Adapter); + s8 bbSwing_5G = -1 * GetRegTxBBSwing_5G(Adapter); + u32 out = 0x200; + const s8 AUTO = -1; + + RTW_DBG("===> PHY_GetTxBBSwing_8814A, bbSwing_2G: %d, bbSwing_5G: %d\n", + (s4Byte)bbSwing_2G, (s4Byte)bbSwing_5G); + + if ( pHalData->bautoload_fail_flag ) + { + if ( Band == BAND_ON_2_4G ) + { + pRFCalibrateInfo->bb_swing_diff_2g = bbSwing_2G; + if (bbSwing_2G == 0) out = 0x200; // 0 dB + else if (bbSwing_2G == -3) out = 0x16A; // -3 dB + else if (bbSwing_2G == -6) out = 0x101; // -6 dB + else if (bbSwing_2G == -9) out = 0x0B6; // -9 dB + else + { + if ( pHalData->ExternalPA_2G ) + { + pRFCalibrateInfo->bb_swing_diff_2g = -3; + out = 0x16A; + } + else + { + pRFCalibrateInfo->bb_swing_diff_2g = 0; + out = 0x200; + } + } + } + else if ( Band == BAND_ON_5G ) + { + pRFCalibrateInfo->bb_swing_diff_5g = bbSwing_5G; + if(bbSwing_5G == 0) out = 0x200; // 0 dB + else if (bbSwing_5G == -3) out = 0x16A; // -3 dB + else if (bbSwing_5G == -6) out = 0x101; // -6 dB + else if (bbSwing_5G == -9) out = 0x0B6; // -9 dB + else + { + if (pHalData->external_pa_5g) + { + pRFCalibrateInfo->bb_swing_diff_5g = -3; + out = 0x16A; + } + else + { + pRFCalibrateInfo->bb_swing_diff_5g = 0; + out = 0x200; + } + } + } + else + { + pRFCalibrateInfo->bb_swing_diff_2g = -3; + pRFCalibrateInfo->bb_swing_diff_5g = -3; + out = 0x16A; // -3 dB + } + } + else + { + u32 swing = 0, onePathSwing = 0; + + if (Band == BAND_ON_2_4G) + { + if (GetRegTxBBSwing_2G(Adapter) == AUTO) + { + EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_2G_8814, (u32 *)&swing); + if (swing == 0xFF) + { + if(bbSwing_2G == 0) swing = 0x00; // 0 dB + else if (bbSwing_2G == -3) swing = 0x55; // -3 dB + else if (bbSwing_2G == -6) swing = 0xAA; // -6 dB + else if (bbSwing_2G == -9) swing = 0xFF; // -9 dB + else swing = 0x00; + } + } + else if (bbSwing_2G == 0) swing = 0x00; // 0 dB + else if (bbSwing_2G == -3) swing = 0x55; // -3 dB + else if (bbSwing_2G == -6) swing = 0xAA; // -6 dB + else if (bbSwing_2G == -9) swing = 0xFF; // -9 dB + else swing = 0x00; + } + else + { + if (GetRegTxBBSwing_5G(Adapter) == AUTO) + { + EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_5G_8814, (u32 *)&swing); + if (swing == 0xFF) + { + if(bbSwing_5G == 0) swing = 0x00; // 0 dB + else if (bbSwing_5G == -3) swing = 0x55; // -3 dB + else if (bbSwing_5G == -6) swing = 0xAA; // -6 dB + else if (bbSwing_5G == -9) swing = 0xFF; // -9 dB + else swing = 0x00; + } + } + else if (bbSwing_5G == 0) swing = 0x00; // 0 dB + else if (bbSwing_5G == -3) swing = 0x55; // -3 dB + else if (bbSwing_5G == -6) swing = 0xAA; // -6 dB + else if (bbSwing_5G == -9) swing = 0xFF; // -9 dB + else swing = 0x00; + } + + if (RFPath == RF_PATH_A) + onePathSwing = (swing & 0x3) >> 0; // 0xC6/C7[1:0] + else if(RFPath == RF_PATH_B) + onePathSwing = (swing & 0xC) >> 2; // 0xC6/C7[3:2] + else if(RFPath == RF_PATH_C) + onePathSwing = (swing & 0x30) >> 4; // 0xC6/C7[5:4] + else if(RFPath == RF_PATH_D) + onePathSwing = (swing & 0xC0) >> 6; // 0xC6/C7[7:6] + + if (onePathSwing == 0x0) + { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->bb_swing_diff_2g = 0; + else + pRFCalibrateInfo->bb_swing_diff_5g = 0; + out = 0x200; // 0 dB + } + else if (onePathSwing == 0x1) + { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->bb_swing_diff_2g = -3; + else + pRFCalibrateInfo->bb_swing_diff_5g = -3; + out = 0x16A; // -3 dB + } + else if (onePathSwing == 0x2) + { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->bb_swing_diff_2g = -6; + else + pRFCalibrateInfo->bb_swing_diff_5g = -6; + out = 0x101; // -6 dB + } + else if (onePathSwing == 0x3) + { + if (Band == BAND_ON_2_4G) + pRFCalibrateInfo->bb_swing_diff_2g = -9; + else + pRFCalibrateInfo->bb_swing_diff_5g = -9; + out = 0x0B6; // -9 dB + } + } + RTW_DBG("<=== PHY_GetTxBBSwing_8814A, out = 0x%X\n", out); + return out; +} + + +//1 7. BandWidth setting API + +VOID +phy_SetBwRegAdc_8814A( + IN PADAPTER Adapter, + IN u8 Band, + IN enum channel_width CurrentBW +) +{ + switch(CurrentBW) + { + case CHANNEL_WIDTH_20: + if(Band == BAND_ON_5G) + { + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x0); // 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0011_0000 + } + else + { + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x0); // 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0101_0000 + } + break; + + case CHANNEL_WIDTH_40: + if(Band == BAND_ON_5G) + { + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x1); // 0x8ac[17, 11, 10, 7:6,1,0]=7'b100_0001 + } + else + { + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x1); // 0x8ac[17, 11, 10, 7:6,1,0]=7'b101_0001 + } + break; + + case CHANNEL_WIDTH_80: + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x02); // 0x8ac[7:6,1,0]=4'b0010 + break; + + default: + RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegAdc_8814A(): unknown Bandwidth: %#X\n",CurrentBW)); + break; + } +} + + +VOID +phy_SetBwRegAgc_8814A( + IN PADAPTER Adapter, + IN u8 Band, + IN enum channel_width CurrentBW +) +{ + u32 AgcValue = 7; + switch(CurrentBW) + { + case CHANNEL_WIDTH_20: + if(Band == BAND_ON_5G) + AgcValue = 6; + else + AgcValue = 6; + break; + + case CHANNEL_WIDTH_40: + if(Band == BAND_ON_5G) + AgcValue = 8; + else + AgcValue = 7; + break; + + case CHANNEL_WIDTH_80: + AgcValue = 3; + break; + + default: + RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegAgc_8814A(): unknown Bandwidth: %#X\n",CurrentBW)); + break; + } + + phy_set_bb_reg(Adapter, rAGC_table_Jaguar, 0xf000, AgcValue); // 0x82C[15:12] = AgcValue +} + + +BOOLEAN +phy_SwBand8814A( + IN PADAPTER pAdapter, + IN u8 channelToSW) +{ + u8 u1Btmp; + BOOLEAN ret_value = _TRUE; + u8 Band = BAND_ON_5G, BandToSW; + + u1Btmp = rtw_read8(pAdapter, REG_CCK_CHECK_8814A); + if(u1Btmp & BIT7) + Band = BAND_ON_5G; + else + Band = BAND_ON_2_4G; + + // Use current channel to judge Band Type and switch Band if need. + if(channelToSW > 14) + { + BandToSW = BAND_ON_5G; + } + else + { + BandToSW = BAND_ON_2_4G; + } + + if(BandToSW != Band) + { + PHY_SwitchWirelessBand8814A(pAdapter,BandToSW); + } + + return ret_value; +} + + +VOID +PHY_SetRFEReg8814A( + IN PADAPTER Adapter, + IN BOOLEAN bInit, + IN u8 Band +) +{ + u8 u1tmp = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(bInit) + { + switch(pHalData->rfe_type){ + case 2:case 1: + phy_set_bb_reg(Adapter, 0x1994, 0xf, 0xf); // 0x1994[3:0] = 0xf + u1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A); + rtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xf0); // 0x40[23:20] = 0xf + break; + case 0: + phy_set_bb_reg(Adapter, 0x1994, 0xf, 0xf); // 0x1994[3:0] = 0xf + u1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A); + rtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xc0); // 0x40[23:22] = 2b'11 + break; + } + } + else if(Band == BAND_ON_2_4G) + { + switch(pHalData->rfe_type){ + case 2: + phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); // 0xCB0 = 0x72707270 + phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); // 0xEB0 = 0x72707270 + phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); // 0x18B4 = 0x72707270 + phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77707770); // 0x1AB4 = 0x77707770 + phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x72); // 0x1ABC[27:20] = 0x72 + break; + + case 1: + phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xCB0 = 0x77777777 + phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xEB0 = 0x77777777 + phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0x18B4 = 0x77777777 + phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0x1AB4 = 0x77777777 + phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x77); // 0x1ABC[27:20] = 0x77 + break; + + case 0: + default: + phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xCB0 = 0x77777777 + phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xEB0 = 0x77777777 + phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0x18B4 = 0x77777777 + phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x77); // 0x1ABC[27:20] = 0x77 + break; + + } + } + else + { + switch(pHalData->rfe_type){ + case 2: + phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717); // 0xCB0 = 0x33173717 + phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717); // 0xEB0 = 0x33173717 + phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717); // 0x18B4 = 0x33173717 + phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717); // 0x1AB4 = 0x77177717 + phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x37); // 0x1ABC[27:20] = 0x37 + break; + + case 1: + phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); // 0xCB0 = 0x33173317 + phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); // 0xEB0 = 0x33173317 + phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); // 0x18B4 = 0x33173317 + phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717); // 0x1AB4 = 0x77177717 + phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x33); // 0x1ABC[27:20] = 0x33 + break; + + case 0: + default: + phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0xCB0 = 0x54775477 + phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0xEB0 = 0x54775477 + phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0x18B4 = 0x54775477 + phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0x1AB4 = 0x54775477 + phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x54); // 0x1ABC[27:20] = 0x54 + break; + } + } +} + +VOID +phy_SetBBSwingByBand_8814A( + IN PADAPTER Adapter, + IN u8 Band, + IN u8 PreviousBand + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + s8 BBDiffBetweenBand = 0; + struct dm_struct * pDM_Odm = &pHalData->odmpriv; + struct dm_rf_calibration_struct * pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info); + + phy_set_bb_reg(Adapter, rA_TxScale_Jaguar, 0xFFE00000, + PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_A)); // 0xC1C[31:21] + phy_set_bb_reg(Adapter, rB_TxScale_Jaguar, 0xFFE00000, + PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_B)); // 0xE1C[31:21] + phy_set_bb_reg(Adapter, rC_TxScale_Jaguar2, 0xFFE00000, + PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_C)); // 0x181C[31:21] + phy_set_bb_reg(Adapter, rD_TxScale_Jaguar2, 0xFFE00000, + PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_D)); // 0x1A1C[31:21] + + // <20121005, Kordan> When TxPowerTrack is ON, we should take care of the change of BB swing. + // That is, reset all info to trigger Tx power tracking. + + if (Band != PreviousBand) + { + BBDiffBetweenBand = (pRFCalibrateInfo->bb_swing_diff_2g - pRFCalibrateInfo->bb_swing_diff_5g); + BBDiffBetweenBand = (Band == BAND_ON_2_4G) ? BBDiffBetweenBand : (-1 * BBDiffBetweenBand); + pRFCalibrateInfo->default_ofdm_index += BBDiffBetweenBand*2; + } + + odm_clear_txpowertracking_state(pDM_Odm); +} + + +s32 +PHY_SwitchWirelessBand8814A( + IN PADAPTER Adapter, + IN u8 Band +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 PreBand = pHalData->current_band_type, tepReg = 0; + + RTW_INFO("==>PHY_SwitchWirelessBand8814() %s\n", ((Band==0)?"2.4G":"5G")); + + pHalData->current_band_type =(BAND_TYPE)Band; + + /*clear 0x1000[16], When this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled. */ + tepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A+2); + rtw_write8(Adapter, REG_SYS_CFG3_8814A+2, tepReg & (~BIT0)); + + // STOP Tx/Rx + //phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); + + if(Band == BAND_ON_2_4G) + {// 2.4G band + + // AGC table select + phy_set_bb_reg(Adapter, rAGC_table_Jaguar2, 0x1F, 0); // 0x958[4:0] = 5b'00000 + + PHY_SetRFEReg8814A(Adapter, FALSE, Band); + + // cck_enable + //phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); + + if(Adapter->registrypriv.mp_mode == 0) + { + // 0x80C & 0xa04 should use same antenna. + phy_set_bb_reg(Adapter, rTxPath_Jaguar, 0xf0, 0x2); + phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5); + } + + phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); + + + // CCK_CHECK_en + rtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x0); + /* after 5G swicth 2G , set A82[2] = 0 */ + phy_set_bb_reg(Adapter, 0xa80, BIT18, 0x0); + + } + else //5G band + { + // CCK_CHECK_en + rtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x80); + /* Enable CCK Tx function, even when CCK is off */ + phy_set_bb_reg(Adapter, 0xa80, BIT18, 0x1); + + // AGC table select + // Postpone to channel switch + //phy_set_bb_reg(Adapter, rAGC_table_Jaguar2, 0x1F, 1); // 0x958[4:0] = 5b'00001 + + PHY_SetRFEReg8814A(Adapter, FALSE, Band); + + if(Adapter->registrypriv.mp_mode == 0) + { + phy_set_bb_reg(Adapter, rTxPath_Jaguar, 0xf0, 0x0); + phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0xF); + } + + phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x02); + //RTW_INFO("==>PHY_SwitchWirelessBand8814() BAND_ON_5G settings OFDM index 0x%x\n", pHalData->OFDM_index[0]); + } + + phy_SetBBSwingByBand_8814A(Adapter, Band, PreBand); + phy_SetBwRegAdc_8814A(Adapter, Band, pHalData->current_channel_bw); + phy_SetBwRegAgc_8814A(Adapter, Band, pHalData->current_channel_bw); + /* set 0x1000[16], When this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled.*/ + tepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A+2); + rtw_write8(Adapter, REG_SYS_CFG3_8814A+2, tepReg | BIT0); + + RTW_INFO("<==PHY_SwitchWirelessBand8814():Switch Band OK.\n"); + return _SUCCESS; +} + + +u8 +phy_GetSecondaryChnl_8814A( + IN PADAPTER Adapter +) +{ + u8 SCSettingOf40 = 0, SCSettingOf20 = 0; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + //RTW_INFO("SCMapping: Case: pHalData->current_channel_bw %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); + if(pHalData->current_channel_bw== CHANNEL_WIDTH_80) + { + if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ; + else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ; + else + RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); + + if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) + SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) + SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) + SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) + SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ; + else + { + if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + SCSettingOf20 = VHT_DATA_SC_40_LOWER_OF_80MHZ; + else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + SCSettingOf20 = VHT_DATA_SC_40_UPPER_OF_80MHZ; + else + RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); + } + } + else if(pHalData->current_channel_bw == CHANNEL_WIDTH_40) + { + RTW_INFO("SCMapping: pHalData->current_channel_bw %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur40MhzPrimeSC); + + if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; + else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; + else + RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); + } + + /*RTW_INFO("SCMapping: SC Value %x\n", ((SCSettingOf40 << 4) | SCSettingOf20));*/ + return ( (SCSettingOf40 << 4) | SCSettingOf20); +} + + +VOID +phy_SetBwRegMac_8814A( + IN PADAPTER Adapter, + enum channel_width CurrentBW +) +{ + u16 RegRfMod_BW, u2tmp = 0; + RegRfMod_BW = PlatformEFIORead2Byte(Adapter, REG_TRXPTCL_CTL_8814A); + + switch(CurrentBW) + { + case CHANNEL_WIDTH_20: + PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (RegRfMod_BW & 0xFE7F)); // BIT 7 = 0, BIT 8 = 0 + break; + + case CHANNEL_WIDTH_40: + u2tmp = RegRfMod_BW | BIT7; + PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFEFF)); // BIT 7 = 1, BIT 8 = 0 + break; + + case CHANNEL_WIDTH_80: + u2tmp = RegRfMod_BW | BIT8; + PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFF7F)); // BIT 7 = 0, BIT 8 = 1 + break; + + default: + RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegMac_8814A(): unknown Bandwidth: %#X\n",CurrentBW)); + break; + } +} + +void PHY_Set_SecCCATH_by_RXANT_8814A(PADAPTER pAdapter,u4Byte ulAntennaRx) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); + + if ((pHalData->bSWToBW40M == TRUE) && (pHalData->current_channel_bw != CHANNEL_WIDTH_40)) { + phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000,pHalData->BackUp_BB_REG_4_2nd_CCA[0]); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00,pHalData->BackUp_BB_REG_4_2nd_CCA[1]); + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,pHalData->BackUp_BB_REG_4_2nd_CCA[2]); + pHalData->bSWToBW40M = FALSE; + } + + if ((pHalData->bSWToBW80M == TRUE) && (pHalData->current_channel_bw != CHANNEL_WIDTH_80)) { + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, pHalData->BackUp_BB_REG_4_2nd_CCA[2]); + pHalData->bSWToBW80M = FALSE; + } + + /*1 Setting CCA TH 2nd CCA parameter by Rx Antenna*/ + if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) { + if (pHalData->bSWToBW80M == FALSE) { + pHalData->BackUp_BB_REG_4_2nd_CCA[2] = phy_query_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000); + } + + pHalData->bSWToBW80M = TRUE; + + switch (ulAntennaRx) { + case ANTENNA_A: + case ANTENNA_B: + case ANTENNA_C: + case ANTENNA_D: + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0b);/* 0x844[27:24] = 0xb */ + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* 0x838 Enable 2ndCCA */ + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x89); /* 0x82C[23:20] = 8, PWDB_TH_QB, 0x82C[19:16] = 9, PWDB_TH_HB*/ + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x887); /* 838[27:24]=8, RF80_secondary40, 838[23:20]=8, RF80_secondary20, 838[19:16]=7, RF80_primary*/ + phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/ + break; + + case ANTENNA_AB: + case ANTENNA_AC: + case ANTENNA_AD: + case ANTENNA_BC: + case ANTENNA_BD: + case ANTENNA_CD: + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/ + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x78); /* 0x82C[23:20] = 7, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x444); /* 838[27:24]=4, RF80_secondary40, 838[23:20]=4, RF80_secondary20, 838[19:16]=4, RF80_primary*/ + phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/ + break; + + case ANTENNA_ABC: + case ANTENNA_ABD: + case ANTENNA_ACD: + case ANTENNA_BCD: + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/ + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/ + phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/ + break; + + case ANTENNA_ABCD: + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /*Enable 2ndCCA*/ + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/ + phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /*840[15:12]=7, L1_square_Pk_weight_80M*/ + break; + + default: + RTW_INFO("Unknown Rx antenna.\n"); + break; + } + } else if(pHalData->current_channel_bw == CHANNEL_WIDTH_40) { + if (pHalData->bSWToBW40M == FALSE) { + pHalData->BackUp_BB_REG_4_2nd_CCA[0] = phy_query_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000); + pHalData->BackUp_BB_REG_4_2nd_CCA[1] = phy_query_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00); + pHalData->BackUp_BB_REG_4_2nd_CCA[2] = phy_query_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000); + } + + switch (ulAntennaRx) { + case ANTENNA_A: /* xT1R*/ + case ANTENNA_B: + case ANTENNA_C: + case ANTENNA_D: + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0b); + phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xe); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); + break; + case ANTENNA_AB: /* xT2R*/ + case ANTENNA_AC: + case ANTENNA_AD: + case ANTENNA_BC: + case ANTENNA_BD: + case ANTENNA_CD: + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); + phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0x8); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); + break; + case ANTENNA_ABC: /* xT3R*/ + case ANTENNA_ABD: + case ANTENNA_ACD: + case ANTENNA_BCD: + case ANTENNA_ABCD: /* xT4R*/ + phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); + phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xa); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43); + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); + break; + default: + break; + } + pHalData->bSWToBW40M = TRUE; + } else { + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x0); /* Enable 2ndCCA*/ + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x43); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ + phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x7aa); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/ + phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/ + } + +} + + +VOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u1Byte SubChnlNum) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) { + if (SubChnlNum == 0) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); + else if (SubChnlNum == 1) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); + else if (SubChnlNum == 2) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2); + else if (SubChnlNum == 4) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x4); + else if (SubChnlNum == 3) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x3); + else if (SubChnlNum == 9) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); + else if (SubChnlNum == 10) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2); + } else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) { + if (SubChnlNum == 1) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); + else if (SubChnlNum == 2) + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2); + } else + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x0); +} + + +/* <20141230, James> A workaround to eliminate the 5280MHz & 5600MHz & 5760MHzspur of 8814A. (Asked by BBSD Neil.)*/ +VOID phy_SpurCalibration_8814A(PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + BOOLEAN Reset_NBI_CSI = TRUE; + struct dm_struct * pDM_Odm = &pHalData->odmpriv; + + /*RTW_INFO("%s(),RFE Type =%d, CurrentCh = %d ,ChannelBW =%d\n", __func__, pHalData->rfe_type, pHalData->current_channel, pHalData->current_channel_bw);*/ + /*RTW_INFO("%s(),Before RrNBI_Setting_Jaguar= %x\n", __func__, phy_query_bb_reg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/ + + if (pHalData->rfe_type == 0) { + switch (pHalData->current_channel_bw) { + case CHANNEL_WIDTH_40: + if (pHalData->current_channel == 54 || pHalData->current_channel == 118) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3e >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); + Reset_NBI_CSI = FALSE; + } else if (pHalData->current_channel == 151) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); + Reset_NBI_CSI = FALSE; + } + break; + + case CHANNEL_WIDTH_80: + if (pHalData->current_channel == 58 || pHalData->current_channel == 122) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3a >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(0), 1); + Reset_NBI_CSI = FALSE; + } else if (pHalData->current_channel == 155) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); + Reset_NBI_CSI = FALSE; + } + break; + case CHANNEL_WIDTH_20: + if (pHalData->current_channel == 153) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1); + Reset_NBI_CSI = FALSE; + } + break; + + default: + break; + } + } else if (pHalData->rfe_type == 1 || pHalData->rfe_type == 2) { + switch (pHalData->current_channel_bw) { + case CHANNEL_WIDTH_20: + if (pHalData->current_channel == 153) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1E >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1); + Reset_NBI_CSI = FALSE; + } + break; + case CHANNEL_WIDTH_40: + if (pHalData->current_channel == 151) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); + Reset_NBI_CSI = FALSE; + } + break; + case CHANNEL_WIDTH_80: + if (pHalData->current_channel == 155) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); + Reset_NBI_CSI = FALSE; + } + break; + + default: + break; + } + } + + if (Reset_NBI_CSI) { + phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0xfc >> 1); + phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); + phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); + } + + phydm_spur_nbi_setting_8814a(pDM_Odm); + /*RTW_INFO("%s(),After RrNBI_Setting_Jaguar= %x\n", __func__, phy_query_bb_reg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/ +} + + +void phy_ModifyInitialGain_8814A( + PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 channel = pHalData->current_channel; + s1Byte offset[4]; /*{A,B,C,D}*/ + u8 i = 0; + u8 chnl_section = 0xff; + + if (channel <= 14 && channel > 0) + chnl_section = 0; /*2G*/ + else if (channel <= 64 && channel >= 36) + chnl_section = 1; /*5GL*/ + else if (channel <= 144 && channel >= 100) + chnl_section = 2; /*5GM*/ + else if (channel <= 177 && channel >= 149) + chnl_section = 3; /*5GH*/ + + if (chnl_section > 3) { + RTW_INFO("%s: worng channel section\n", __func__); + return; + } + + for (i = 0; i < 4; i++) { + u1Byte hex_offset; + + hex_offset = (u1Byte)(pHalData->RxGainOffset[chnl_section] >> (12-4*i))&0x0f; + RTW_INFO("%s: pHalData->RxGainOffset[%d] = %x\n", __func__, chnl_section, pHalData->RxGainOffset[chnl_section]); + RTW_INFO("%s: hex_offset = %x\n", __func__, hex_offset); + + if (hex_offset == 0xf) + offset[i] = 0; + else if (hex_offset >= 0x8) + offset[i] = 0x11 - hex_offset; + else + offset[i] = 0x0 - hex_offset; + offset[i] = (offset[i] / 2) * 2; + RTW_INFO("%s: offset[%d] = %x\n", __func__, i, offset[i]); + RTW_INFO("%s: BackUp_IG_REG_4_Chnl_Section[%d] = %x\n", __func__, i, pHalData->BackUp_IG_REG_4_Chnl_Section[i]); + } + + if (pHalData->BackUp_IG_REG_4_Chnl_Section[0] != 0 && + pHalData->BackUp_IG_REG_4_Chnl_Section[1] != 0 && + pHalData->BackUp_IG_REG_4_Chnl_Section[2] != 0 && + pHalData->BackUp_IG_REG_4_Chnl_Section[3] != 0 + ) { + phy_set_bb_reg(Adapter, rA_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[0] + offset[0]); + phy_set_bb_reg(Adapter, rB_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[1] + offset[1]); + phy_set_bb_reg(Adapter, rC_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[2] + offset[2]); + phy_set_bb_reg(Adapter, rD_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[3] + offset[3]); + } +} + + +VOID phy_SetBwMode8814A(PADAPTER Adapter) +{ + u8 SubChnlNum = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //3 Set Reg668 BW + phy_SetBwRegMac_8814A(Adapter, pHalData->current_channel_bw); + + //3 Set Reg483 + SubChnlNum = phy_GetSecondaryChnl_8814A(Adapter); + rtw_write8(Adapter, REG_DATA_SC_8814A, SubChnlNum); + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + RTW_INFO("phy_SetBwMode8814A: return for PSEUDO \n"); + return; + } + + //3 Set Reg8AC Reg8C4 Reg8C8 + phy_SetBwRegAdc_8814A(Adapter, pHalData->current_band_type, pHalData->current_channel_bw); + //3 Set Reg82C + phy_SetBwRegAgc_8814A(Adapter, pHalData->current_band_type, pHalData->current_channel_bw); + + //3 Set Reg848 RegA00 + switch(pHalData->current_channel_bw) + { + case CHANNEL_WIDTH_20: + break; + + case CHANNEL_WIDTH_40: + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); // 0x8ac[5:2]=1/2 + + if(SubChnlNum == VHT_DATA_SC_20_UPPER_OF_80MHZ) // 0xa00[4]=1/0 + phy_set_bb_reg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 1); + else + phy_set_bb_reg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 0); + break; + + case CHANNEL_WIDTH_80: + phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); // 0x8ac[5:2]=1/2/3/4/9/10 + break; + + default: + RTW_INFO("%s():unknown Bandwidth:%#X\n", __func__, pHalData->current_channel_bw); + break; + } + +#if (MP_DRIVER == 1) +if (Adapter->registrypriv.mp_mode == 1) { + /* 2 Set Reg 0x8AC */ + PHY_SetRXSC_by_TXSC_8814A(Adapter, (SubChnlNum & 0xf)); + PHY_Set_SecCCATH_by_RXANT_8814A(Adapter, pHalData->AntennaRxPath); +} +#endif + /* 3 Set RF related register */ + PHY_RF6052SetBandwidth8814A(Adapter, pHalData->current_channel_bw); + + phy_ADC_CLK_8814A(Adapter); + phy_SpurCalibration_8814A(Adapter); +} + + + +//1 6. Channel setting API + +// Add for KFree Feature Requested by RF David. +// We need support ABCD four path Kfree +#if 0 /* no equivalent in 5.2.20... maybe not needed */ +VOID +phy_SetKfreeToRF_8814A( + IN PADAPTER Adapter, + IN u8 eRFPath, + IN u8 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); + struct dm_struct * pDM_Odm = &pHalData->odmpriv; + BOOLEAN bOdd; + struct dm_rf_calibration_struct * pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); + if((Data%2) != 0) //odd -> positive + { + Data = Data - 1; + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT19, 1); + bOdd = TRUE; + } + else // even -> negative + { + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT19, 0); + bOdd = FALSE; + } + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): RF_0x55[19]= %d\n", bOdd)); + switch(Data) + { + case 2: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 0; + break; + case 4: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 1); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 1; + break; + case 6: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 1); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 1; + break; + case 8: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 2); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 2; + break; + case 10: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 2); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 2; + break; + case 12: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 3); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 3; + break; + case 14: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 3); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 3; + break; + case 16: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 4); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 4; + break; + case 18: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 4); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 4; + break; + case 20: + phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 5); + pRFCalibrateInfo->KfreeOffset[eRFPath] = 5; + break; + + default: + break; + } + + if(bOdd == FALSE) // that means Kfree offset is negative, we need to record it. + { + pRFCalibrateInfo->KfreeOffset[eRFPath] = (-1)*pRFCalibrateInfo->KfreeOffset[eRFPath]; + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): KfreeOffset = %d\n", pRFCalibrateInfo->KfreeOffset[eRFPath])); + } + else + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): KfreeOffset = %d\n", pRFCalibrateInfo->KfreeOffset[eRFPath])); + +} + + +VOID +phy_ConfigKFree8814A( + IN PADAPTER Adapter, + IN u8 channelToSW, + IN BAND_TYPE bandType + ) +{ + u8 targetval_A = 0xFF; + u8 targetval_B = 0xFF; + u8 targetval_C = 0xFF; + u8 targetval_D = 0xFF; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //RTW_INFO("===>phy_ConfigKFree8814A()\n"); + + if (Adapter->registrypriv.RegPwrTrimEnable == 2) + { + //RTW_INFO("phy_ConfigKFree8814A(): RegPwrTrimEnable == 2, Disable \n"); + return; + } + else if (Adapter->registrypriv.RegPwrTrimEnable == 1 || Adapter->registrypriv.RegPwrTrimEnable == 0) + { + RTW_INFO("phy_ConfigKFree8814A(): RegPwrTrimEnable == TRUE \n"); + if (bandType == BAND_ON_2_4G) // 2G + { + RTW_INFO("phy_ConfigKFree8814A(): bandType == BAND_ON_2_4G, channelToSW= %d \n", channelToSW); + if (channelToSW <= 14 && channelToSW >= 1) + { + efuse_OneByteRead(Adapter, 0x3F4, &targetval_A, FALSE); // for Path A and B + efuse_OneByteRead(Adapter, 0x3F5, &targetval_B, FALSE); // for Path C and D + } + + } + else if (bandType == BAND_ON_5G) + { + RTW_INFO("phy_ConfigKFree8814A(): bandType == BAND_ON_5G, channelToSW= %d \n", channelToSW); + if (channelToSW >= 36 && channelToSW < 50) // 5GLB_1 + { + efuse_OneByteRead(Adapter, 0x3E0, &targetval_A, FALSE); + efuse_OneByteRead(Adapter, 0x3E1, &targetval_B, FALSE); + efuse_OneByteRead(Adapter, 0x3E2, &targetval_C, FALSE); + efuse_OneByteRead(Adapter, 0x3E3, &targetval_D, FALSE); + } + else if (channelToSW >= 50 && channelToSW <= 64) // 5GLB_2 + { + efuse_OneByteRead(Adapter, 0x3E4, &targetval_A, FALSE); + efuse_OneByteRead(Adapter, 0x3E5, &targetval_B, FALSE); + efuse_OneByteRead(Adapter, 0x3E6, &targetval_C, FALSE); + efuse_OneByteRead(Adapter, 0x3E7, &targetval_D, FALSE); + } + else if (channelToSW >= 100 && channelToSW <= 118) // 5GMB_1 + { + efuse_OneByteRead(Adapter, 0x3E8, &targetval_A, FALSE); + efuse_OneByteRead(Adapter, 0x3E9, &targetval_B, FALSE); + efuse_OneByteRead(Adapter, 0x3EA, &targetval_C, FALSE); + efuse_OneByteRead(Adapter, 0x3EB, &targetval_D, FALSE); + } + else if (channelToSW >= 120 && channelToSW <= 140) // 5GMB_2 + { + efuse_OneByteRead(Adapter, 0x3EC, &targetval_A, FALSE); + efuse_OneByteRead(Adapter, 0x3ED, &targetval_B, FALSE); + efuse_OneByteRead(Adapter, 0x3EE, &targetval_C, FALSE); + efuse_OneByteRead(Adapter, 0x3EF, &targetval_D, FALSE); + } + else if (channelToSW >= 149 && channelToSW <= 165) // 5GHB + { + efuse_OneByteRead(Adapter, 0x3F0, &targetval_A, FALSE); + efuse_OneByteRead(Adapter, 0x3F1, &targetval_B, FALSE); + efuse_OneByteRead(Adapter, 0x3F2, &targetval_C, FALSE); + efuse_OneByteRead(Adapter, 0x3F3, &targetval_D, FALSE); + } + } + RTW_INFO("phy_ConfigKFree8814A(): targetval_A= %#x \n", targetval_A); + RTW_INFO("phy_ConfigKFree8814A(): targetval_B= %#x \n", targetval_B); + RTW_INFO("phy_ConfigKFree8814A(): targetval_C= %#x \n", targetval_C); + RTW_INFO("phy_ConfigKFree8814A(): targetval_D= %#x \n", targetval_D); + + // Make sure the targetval is defined + if ((Adapter->registrypriv.RegPwrTrimEnable == 1) && ((targetval_A != 0xFF) || (pHalData->RfKFreeEnable == TRUE))) + { + if (bandType == BAND_ON_2_4G) // 2G + { + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_A: %#x \n", targetval_A&0x0F)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_A, targetval_A&0x0F); + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_B: %#x \n", (targetval_A&0xF0)>>4)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_B, (targetval_A&0xF0)>>4); + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_C: %#x \n", targetval_B&0x0F)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_C, targetval_B&0x0F); + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_D: %#x \n", (targetval_B&0xF0)>>4)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_D, (targetval_B&0xF0)>>4); + } + else if(bandType == BAND_ON_5G) + { + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_A: %#x \n", targetval_A&0x1F)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_A, targetval_A&0x1F); + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_B: %#x \n", targetval_B&0x1F)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_B, targetval_B&0x1F); + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_C: %#x \n", targetval_C&0x1F)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_C, targetval_C&0x1F); + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_D: %#x \n", targetval_D&0x1F)); + phy_SetKfreeToRF_8814A(Adapter, RF_PATH_D, targetval_D&0x1F); + } + } + else + { + RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): targetval not defined, Don't execute KFree Process.\n")); + return; + } + } + RT_TRACE(COMP_MP, DBG_LOUD, ("<===phy_ConfigKFree8814A()\n")); +} +#endif +VOID +phy_SwChnl8814A( + IN PADAPTER pAdapter + ) +{ + u8 eRFPath = 0 , channelIdx = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); +#ifdef CONFIG_RF_GAIN_OFFSET + struct kfree_data_t *kfree_data = &pHalData->kfree_data; +#endif + u8 channelToSW = pHalData->current_channel; + u32 RFValToWR , RFTmpVal, BitShift, BitMask; + + //RTW_INFO("[BW:CHNL], phy_SwChnl8814A(), switch to channel %d !!\n", channelToSW); + + if (phy_SwBand8814A(pAdapter, channelToSW) == FALSE) + { + RTW_INFO("error Chnl %d", channelToSW); + } + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + RTW_DBG("phy_SwChnl8814A: return for PSEUDO\n"); + return; + } + +#ifdef CONFIG_RF_GAIN_OFFSET + /* Add for KFree Feature Requested by RF David. */ + if (kfree_data->flag & KFREE_FLAG_ON) { + + channelIdx = rtw_ch_to_bb_gain_sel(channelToSW); + #if 0 + if (pHalData->RfKFree_ch_group != channelIdx) { + /* Todo: wait for new phydm ready */ + phy_ConfigKFree8814A(pAdapter, channelToSW, pHalData->current_band_type); + phydm_ConfigKFree(pDM_Odm, channelToSW, kfree_data->bb_gain); + RTW_INFO("RfKFree_ch_group =%d\n", channelIdx); + } + #endif + + pHalData->RfKFree_ch_group = channelIdx; + + } +#endif + if(pHalData->RegFWOffload == 2) + { + FillH2CCmd_8814(pAdapter, H2C_CHNL_SWITCH_OFFLOAD, 1, &channelToSW); + } + else + { + // fc_area + if (36 <= channelToSW && channelToSW <= 48) + phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x494); + else if (50 <= channelToSW && channelToSW <= 64) + phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x453); + else if (100 <= channelToSW && channelToSW <= 116) + phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x452); + else if (118 <= channelToSW) + phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x412); + else + phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x96a); + + for(eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) + { + // RF_MOD_AG + if (36 <= channelToSW && channelToSW <= 64) + RFValToWR = 0x101; //5'b00101 + else if (100 <= channelToSW && channelToSW <= 140) + RFValToWR = 0x301; //5'b01101 + else if (140 < channelToSW) + RFValToWR = 0x501; //5'b10101 + else + RFValToWR = 0x000; //5'b00000 + + // Channel to switch + BitMask = BIT18|BIT17|BIT16|BIT9|BIT8; + BitShift = PHY_CalculateBitShift(BitMask); + RFTmpVal = channelToSW | (RFValToWR << BitShift); + + BitMask = BIT18|BIT17|BIT16|BIT9|BIT8|bMaskByte0; + + phy_set_rf_reg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BitMask, RFTmpVal); + } + + if (36 <= channelToSW && channelToSW <= 64) // Band 1 & Band 2 + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 1); // 0x958[4:0] = 0x1 + else if (100 <= channelToSW && channelToSW <= 144) // Band 3 + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 2); // 0x958[4:0] = 0x2 + else if(channelToSW >= 149) // Band 4 + phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 3); // 0x958[4:0] = 0x3 + } + + if (pAdapter->registrypriv.mp_mode == 1) { + if (!pHalData->bSetChnlBW) + phy_ADC_CLK_8814A(pAdapter); + phy_SpurCalibration_8814A(pAdapter); + phy_ModifyInitialGain_8814A(pAdapter); + } + + /* 2.4G CCK TX DFIR */ + if (channelToSW >= 1 && channelToSW <= 11) { + phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030); + phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1317); + phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000204); + } else if (channelToSW >= 12 && channelToSW <= 13) { + phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030); + phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1217); + phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000305); + } else if (channelToSW == 14) { + phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030); + phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x00000E17); + phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000000); + } + +} + +/* +VOID +PHY_SwChnlTimerCallback8814A( + IN PRT_TIMER pTimer + ) +{ + PADAPTER pAdapter = (PADAPTER)pTimer->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SwChnlTimerCallback8814A(), switch to channel %d\n", pHalData->current_channel)); + + if (rtw_is_drv_stopped(padapter)) + return; + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + pHalData->SwChnlInProgress=FALSE; + return; //return immediately if it is peudo-phy + } + + + PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + pHalData->SwChnlInProgress=TRUE; + PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + + phy_SwChnl8814A(pAdapter); + + PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + pHalData->SwChnlInProgress=FALSE; + PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + + RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SwChnlTimerCallback8814()\n")); +} + + +VOID +PHY_SwChnlWorkItemCallback8814A( + IN PVOID pContext + ) +{ + PADAPTER pAdapter = (PADAPTER)pContext; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SwChnlWorkItemCallback8814A(), switch to channel %d\n", pHalData->current_channel)); + + if(pAdapter->bInSetPower && RT_USB_CANNOT_IO(pAdapter)) + { + RT_TRACE(COMP_SCAN, DBG_LOUD, ("<== PHY_SwChnlWorkItemCallback8814A() SwChnlInProgress FALSE driver sleep or unload\n")); + + pHalData->SwChnlInProgress = FALSE; + return; + } + + if (rtw_is_drv_stopped(padapter)) + return; + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + pHalData->SwChnlInProgress=FALSE; + return; //return immediately if it is peudo-phy + } + + PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + pHalData->SwChnlInProgress=TRUE; + PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + + phy_SwChnl8814A(pAdapter); + + PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + pHalData->SwChnlInProgress=FALSE; + PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); + + RT_TRACE(COMP_P2P, DBG_LOUD, ("PHY_SwChnlWorkItemCallback8814A(), switch to channel %d\n", pHalData->current_channel)); + RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SwChnlWorkItemCallback8814A()\n")); +} + + +VOID +HAL_HandleSwChnl8814A( // Call after initialization + IN PADAPTER pAdapter, + IN u8 channel + ) +{ + PADAPTER Adapter = GetDefaultAdapter(pAdapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("HAL_HandleSwChnl8814A()===>\n")); + pHalData->current_channel = channel; + phy_SwChnl8814A(Adapter); + + +#if (MP_DRIVER == 1) + // <20120712, Kordan> IQK on each channel, asked by James. + PHY_IQCalibrate_8814A(pAdapter, FALSE); +#endif + + RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("<==HAL_HandleSwChnl8814A()\n")); +} +*/ + +VOID +phy_SwChnlAndSetBwMode8814A( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_struct * pDM_Odm = &pHalData->odmpriv; + + //RTW_INFO("phy_SwChnlAndSetBwMode8814A(): bSwChnl %d, bSetChnlBW %d \n", pHalData->bSwChnl, pHalData->bSetChnlBW); + if ( Adapter->bNotifyChannelChange ) + { + RTW_INFO( "[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n", + __FUNCTION__, + pHalData->bSwChnl, + pHalData->current_channel, + pHalData->bSetChnlBW, + pHalData->current_channel_bw); + } + + if (RTW_CANNOT_RUN(Adapter)) { + pHalData->bSwChnlAndSetBWInProgress= FALSE; + return; + } + + if (pHalData->bSwChnl) + { + phy_SwChnl8814A(Adapter); + pHalData->bSwChnl = FALSE; + } + + if (pHalData->bSetChnlBW) + { + phy_SetBwMode8814A(Adapter); + pHalData->bSetChnlBW = FALSE; + } + + if (Adapter->registrypriv.mp_mode == 0) { + odm_clear_txpowertracking_state(pDM_Odm); + PHY_SetTxPowerLevel8814(Adapter, pHalData->current_channel); + if (pHalData->bNeedIQK == _TRUE) { + phy_iq_calibrate_8814a(pDM_Odm, _FALSE); + pHalData->bNeedIQK = _FALSE; + } + } else + phy_iq_calibrate_8814a(pDM_Odm, _FALSE); +#if 0 //todo +#if (AUTO_CHNL_SEL_NHM == 1) + if(IS_AUTO_CHNL_SUPPORT(Adapter) && + P2PIsSocialChannel(pHalData->current_channel)) + { + RT_TRACE(COMP_SCAN, DBG_TRACE, ("[ACS] phy_SwChnlAndSetBwMode8723B(): current_channel %d Reset NHM counter!!\n", pHalData->current_channel)); + RT_TRACE(COMP_SCAN, DBG_TRACE, ("[ACS] phy_SwChnlAndSetBwMode8723B(): AutoChnlSelPeriod(%d)\n", + GetDefaultAdapter(Adapter)->MgntInfo.AutoChnlSel.AutoChnlSelPeriod)); + + // Reset NHM counter + odm_AutoChannelSelectReset(GET_PDM_ODM(Adapter)); + + SET_AUTO_CHNL_STATE(Adapter, ACS_BEFORE_NHM);// Before NHM measurement + } +#endif +#endif //0 + pHalData->bSwChnlAndSetBWInProgress= FALSE; +} + + +VOID +PHY_SwChnlAndSetBWModeCallback8814A( + IN PVOID pContext +) +{ + PADAPTER Adapter = (PADAPTER)pContext; + phy_SwChnlAndSetBwMode8814A(Adapter); +} + +/* +// +// Description: +// Switch channel synchronously. Called by SwChnlByDelayHandler. +// +// Implemented by Bruce, 2008-02-14. +// The following procedure is operted according to SwChanlCallback8190Pci(). +// However, this procedure is performed synchronously which should be running under +// passive level. +// +VOID +PHY_SwChnlSynchronously8814A( // Only called during initialize + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlSynchronously(), switch from channel %d to channel %d.\n", pHalData->current_channel, channel)); + + // Cannot IO. + if(RT_CANNOT_IO(Adapter)) + return; + + // Channel Switching is in progress. + if(pHalData->bSwChnlAndSetBWInProgress) + return; + + //return immediately if it is peudo-phy + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + pHalData->bSwChnlAndSetBWInProgress=FALSE; + return; + } + + switch(pHalData->CurrentWirelessMode) + { + case WIRELESS_MODE_A: + case WIRELESS_MODE_N_5G: + case WIRELESS_MODE_AC_5G: + //Get first channel error when change between 5G and 2.4G band. + //FIX ME!!! + if(channel <=14) + return; + RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); + break; + + case WIRELESS_MODE_B: + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + case WIRELESS_MODE_AC_24G: + //Get first channel error when change between 5G and 2.4G band. + //FIX ME!!! + if(channel > 14) + return; + RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); + break; + + default: + RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); + break; + + } + + pHalData->bSwChnlAndSetBWInProgress = TRUE; + if( channel == 0) + channel = 1; + + pHalData->bSwChnl = TRUE; + pHalData->bSetChnlBW = FALSE; + pHalData->current_channel=channel; + + phy_SwChnlAndSetBwMode8814A(Adapter); + + RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("<==PHY_SwChnlSynchronously(), switch from channel %d to channel %d.\n", pHalData->current_channel, channel)); + +} +*/ + +VOID +PHY_HandleSwChnlAndSetBW8814A( + IN PADAPTER Adapter, + IN BOOLEAN bSwitchChannel, + IN BOOLEAN bSetBandWidth, + IN u8 ChannelNum, + enum channel_width ChnlWidth, + IN u8 ChnlOffsetOf40MHz, + IN u8 ChnlOffsetOf80MHz, + IN u8 CenterFrequencyIndex1 +) +{ + PADAPTER pDefAdapter = GetDefaultAdapter(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDefAdapter); + u8 tmpChannel = pHalData->current_channel; + enum channel_width tmpBW= pHalData->current_channel_bw; + u8 tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC; + u8 tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC; + u8 tmpCenterFrequencyIndex1 =pHalData->CurrentCenterFrequencyIndex1; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + + //check is swchnl or setbw + if(!bSwitchChannel && !bSetBandWidth) + { + RTW_INFO("PHY_HandleSwChnlAndSetBW8812: not switch channel and not set bandwidth \n"); + return; + } + + //skip change for channel or bandwidth is the same + if(bSwitchChannel) + { + if(pHalData->current_channel != ChannelNum) + { + if (HAL_IsLegalChannel(Adapter, ChannelNum)) + pHalData->bSwChnl = _TRUE; + else + return; + } + } + + if(bSetBandWidth) + { + if(pHalData->bChnlBWInitialized == _FALSE) + { + pHalData->bChnlBWInitialized = _TRUE; + pHalData->bSetChnlBW = _TRUE; + } + else if((pHalData->current_channel_bw != ChnlWidth) || + (pHalData->nCur40MhzPrimeSC != ChnlOffsetOf40MHz) || + (pHalData->nCur80MhzPrimeSC != ChnlOffsetOf80MHz) || + (pHalData->CurrentCenterFrequencyIndex1!= CenterFrequencyIndex1)) + { + pHalData->bSetChnlBW = _TRUE; + } + } + + if(!pHalData->bSetChnlBW && !pHalData->bSwChnl) + { + //RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); + return; + } + + + if(pHalData->bSwChnl) + { + pHalData->current_channel=ChannelNum; + pHalData->CurrentCenterFrequencyIndex1 = ChannelNum; + } + + + if(pHalData->bSetChnlBW) + { + pHalData->current_channel_bw = ChnlWidth; +#if 0 + if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_LOWER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_UPPER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_LOWER) + pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_UPPER) + pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; +#else + pHalData->nCur40MhzPrimeSC = ChnlOffsetOf40MHz; + pHalData->nCur80MhzPrimeSC = ChnlOffsetOf80MHz; +#endif + + pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1; + } + + //Switch workitem or set timer to do switch channel or setbandwidth operation + if (!RTW_CANNOT_RUN(Adapter)) + phy_SwChnlAndSetBwMode8814A(Adapter); + else { + if(pHalData->bSwChnl) + { + pHalData->current_channel = tmpChannel; + pHalData->CurrentCenterFrequencyIndex1 = tmpChannel; + } + if(pHalData->bSetChnlBW) + { + pHalData->current_channel_bw = tmpBW; + pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC; + pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC; + pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1; + } + } + + //RTW_INFO("Channel %d ChannelBW %d ",pHalData->current_channel, pHalData->current_channel_bw); + //RTW_INFO("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC); + //RTW_INFO("CenterFrequencyIndex1 %d \n",pHalData->CurrentCenterFrequencyIndex1); + + //RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); + +} + + +/* +// +// Description: +// Configure H/W functionality to enable/disable Monitor mode. +// Note, because we possibly need to configure BB and RF in this function, +// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. +// +VOID +PHY_SetMonitorMode8814A( + IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; + + //2 Note: we may need to stop antenna diversity. + if(bEnableMonitorMode) + { + bFilterOutNonAssociatedBSSID = FALSE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8814A(): enable monitor mode\n")); + + pHalData->bInMonitorMode = TRUE; + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); + rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID); + } + else + { + bFilterOutNonAssociatedBSSID = TRUE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8814A(): disable monitor mode\n")); + + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); + pHalData->bInMonitorMode = FALSE; + rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID); + } +} +*/ + +BOOLEAN +SetAntennaConfig8814A( + IN PADAPTER pAdapter, + IN u8 DefaultAnt // 0: Main, 1: Aux. +) +{ + return TRUE; +} + +VOID +PHY_SetBWMode8814( + IN PADAPTER Adapter, + IN enum channel_width Bandwidth, // 20M or 40M + IN u8 Offset // Upper, Lower, or Don't care +) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + //RTW_INFO("%s()===>\n",__FUNCTION__); + + PHY_HandleSwChnlAndSetBW8814A(Adapter, _FALSE, _TRUE, pHalData->current_channel, Bandwidth, Offset, Offset, pHalData->current_channel); + + //RTW_INFO("<==%s()\n",__FUNCTION__); +} + +VOID +PHY_SwChnl8814( + IN PADAPTER Adapter, + IN u8 channel + ) +{ + //RTW_INFO("%s()===>\n",__FUNCTION__); + + PHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _FALSE, channel, 0, 0, 0, channel); + + //RTW_INFO("<==%s()\n",__FUNCTION__); +} + +VOID +PHY_SetSwChnlBWMode8814( + IN PADAPTER Adapter, + IN u8 channel, + IN enum channel_width Bandwidth, + IN u8 Offset40, + IN u8 Offset80 +) +{ + //RTW_INFO("%s()===>\n",__FUNCTION__); + + PHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel); + + //RTW_INFO("<==%s()\n",__FUNCTION__); +} + diff --git a/hal/rtl8814a/rtl8814a_rf6052.c b/hal/rtl8814a/rtl8814a_rf6052.c new file mode 100644 index 0000000..f298471 --- /dev/null +++ b/hal/rtl8814a/rtl8814a_rf6052.c @@ -0,0 +1,210 @@ +/****************************************************************************** + * + * 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 _RTL8814A_RF6052_C_ + +//#include +#include + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetBandwidth() + * + * Overview: This function is called by SetBWModeCallback8190Pci() only + * + * Input: PADAPTER Adapter + * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: For RF type 0222D + *---------------------------------------------------------------------------*/ +VOID +PHY_RF6052SetBandwidth8814A( + IN PADAPTER Adapter, + IN enum channel_width Bandwidth) //20M or 40M +{ + switch(Bandwidth) + { + case CHANNEL_WIDTH_20: + /*RTW_INFO("PHY_RF6052SetBandwidth8814A(), set 20MHz\n");*/ + phy_set_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); + phy_set_rf_reg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); + phy_set_rf_reg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); + phy_set_rf_reg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); + break; + + case CHANNEL_WIDTH_40: + /*RTW_INFO("PHY_RF6052SetBandwidth8814A(), set 40MHz\n");*/ + phy_set_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); + phy_set_rf_reg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); + phy_set_rf_reg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); + phy_set_rf_reg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); + break; + + case CHANNEL_WIDTH_80: + /*RTW_INFO("PHY_RF6052SetBandwidth8814A(), set 80MHz\n");*/ + phy_set_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); + phy_set_rf_reg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); + phy_set_rf_reg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); + phy_set_rf_reg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); + break; + + default: + RTW_INFO("PHY_RF6052SetBandwidth8814A(): unknown Bandwidth: %#X\n",Bandwidth ); + break; + } +} + +static int +phy_RF6052_Config_ParaFile_8814A( + IN PADAPTER Adapter + ) +{ + u32 u4RegValue=0; + u8 eRFPath; + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + static char sz8814RadioAFile[] = PHY_FILE_RADIO_A; + static char sz8814RadioBFile[] = PHY_FILE_RADIO_B; + static char sz8814RadioCFile[] = PHY_FILE_RADIO_C; + static char sz8814RadioDFile[] = PHY_FILE_RADIO_D; + static char sz8814TxPwrTrack[] = PHY_FILE_TXPWR_TRACK; + char *pszRadioAFile = NULL, *pszRadioBFile = NULL, *pszRadioCFile = NULL, *pszRadioDFile = NULL, *pszTxPwrTrack = NULL; + + + pszRadioAFile = sz8814RadioAFile; + pszRadioBFile = sz8814RadioBFile; + pszRadioCFile = sz8814RadioCFile; + pszRadioDFile = sz8814RadioDFile; + pszTxPwrTrack = sz8814TxPwrTrack; + + //3//----------------------------------------------------------------- + //3// <2> Initialize RF + //3//----------------------------------------------------------------- + //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + /*----Initialize RF fom connfiguration file----*/ + switch(eRFPath) + { + case RF_PATH_A: +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, eRFPath) == _FAIL) +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + { +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) + rtStatus = _FAIL; +#endif //CONFIG_EMBEDDED_FWIMG + } + break; + case RF_PATH_B: +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, eRFPath) == _FAIL) +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + { +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) + rtStatus = _FAIL; +#endif //CONFIG_EMBEDDED_FWIMG + } + break; + case RF_PATH_C: +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (PHY_ConfigRFWithParaFile(Adapter, pszRadioCFile, eRFPath) == _FAIL) +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + { +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) + rtStatus = _FAIL; +#endif //CONFIG_EMBEDDED_FWIMG + } + break; + case RF_PATH_D: +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (PHY_ConfigRFWithParaFile(Adapter, pszRadioDFile, eRFPath) == _FAIL) +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + { +#ifdef CONFIG_EMBEDDED_FWIMG + if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) + rtStatus = _FAIL; +#endif //CONFIG_EMBEDDED_FWIMG + } + break; + default: + break; + } + + if(rtStatus != _SUCCESS){ + RTW_INFO("%s():Radio[%d] Fail!!", __FUNCTION__, eRFPath); + goto phy_RF6052_Config_ParaFile_Fail; + } + + } + + u4RegValue = phy_query_rf_reg(Adapter, RF_PATH_A, RF_RCK1_Jaguar, bRFRegOffsetMask); + phy_set_rf_reg(Adapter, RF_PATH_B, RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue); + phy_set_rf_reg(Adapter, RF_PATH_C, RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue); + phy_set_rf_reg(Adapter, RF_PATH_D, RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue); + + //3 ----------------------------------------------------------------- + //3 Configuration of Tx Power Tracking + //3 ----------------------------------------------------------------- + +#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE + if (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrack) == _FAIL) +#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE + { +#ifdef CONFIG_EMBEDDED_FWIMG + odm_config_rf_with_tx_pwr_track_header_file(&pHalData->odmpriv); +#endif + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile_8812()\n")); + +phy_RF6052_Config_ParaFile_Fail: + return rtStatus; +} + + +int +PHY_RF6052_Config_8814A( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // Initialize general global value + pHalData->NumTotalRFPath = 4; + + // + // Config BB and RF + // + rtStatus = phy_RF6052_Config_ParaFile_8814A(Adapter); + + return rtStatus; + +} + + +/* End of HalRf6052.c */ + diff --git a/hal/rtl8814a/rtl8814a_rxdesc.c b/hal/rtl8814a/rtl8814a_rxdesc.c new file mode 100644 index 0000000..7de802c --- /dev/null +++ b/hal/rtl8814a/rtl8814a_rxdesc.c @@ -0,0 +1,68 @@ +/****************************************************************************** + * + * 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 _RTL8814A_RXDESC_C_ + +//#include +#include + +void rtl8814_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)); + +#ifdef CONFIG_RADIOTAP_WITH_RXDESC + _rtw_memcpy(pattrib->rxdesc, pdesc, RXDESC_SIZE); +#endif + + //Offset 0 + pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw0)&0x00003fff) + pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 14) & 0x1); + pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 15) & 0x1); + pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8814A(pdesc) * 8;//((le32_to_cpu(pdesc->rxdw0) >> 16) & 0xf) * 8;//uint 2^3 = 8 bytes + pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 20) & 0x7); + pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8814A(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_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 24) & 0x3); + pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 26) & 0x1); + pattrib->bdecrypted = !GET_RX_STATUS_DESC_SWDEC_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw0) & BIT(27))? 0:1; + + //Offset 4 + pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 8) & 0xf); + pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 26) & 0x1); + pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 27) & 0x1);//more fragment bit + + //Offset 8 + pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw2) & 0x00000fff); + pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw2) >> 12) & 0xf);//fragmentation number + + + if (GET_RX_STATUS_DESC_RPT_SEL_8814A(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_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw3))&0x7f); + + //Offset 16 + //Offset 20 + +} + diff --git a/hal/rtl8814a/rtl8814a_sreset.c b/hal/rtl8814a/rtl8814a_sreset.c new file mode 100644 index 0000000..5d7e423 --- /dev/null +++ b/hal/rtl8814a/rtl8814a_sreset.c @@ -0,0 +1,114 @@ +/****************************************************************************** + * + * 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 _RTL8814A_SRESET_C_ + +//#include +#include + +#ifdef DBG_CONFIG_ERROR_DETECT +void rtl8814_sreset_xmit_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + unsigned long current_time; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + unsigned int diff_time; + u32 txdma_status; + + if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){ + RTW_INFO("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status); + rtw_hal_sreset_reset(padapter); + } +#ifdef CONFIG_USB_HCI + //total xmit irp = 4 + //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); + //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) + current_time = rtw_get_current_time(); + + if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) { + + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time); + + if (diff_time > 2000) { + if (psrtpriv->last_tx_complete_time == 0) { + psrtpriv->last_tx_complete_time = current_time; + } + else{ + diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); + if (diff_time > 4000) { + u32 ability = 0; + + //padapter->Wifi_Error_Status = WIFI_TX_HANG; + ability = rtw_phydm_ability_get(padapter); + + RTW_INFO("%s tx hang %s\n", __FUNCTION__, + (ability & ODM_BB_ADAPTIVITY)? "ODM_BB_ADAPTIVITY" : ""); + + if (!(ability & ODM_BB_ADAPTIVITY)) + rtw_hal_sreset_reset(padapter); + } + } + } + } +#endif //CONFIG_USB_HCI + + if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) { + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; + rtw_hal_sreset_reset(padapter); + return; + } +} + +void rtl8814_sreset_linked_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u32 rx_dma_status = 0; + rx_dma_status = rtw_read32(padapter,REG_RXDMA_STATUS); + if(rx_dma_status!= 0x00){ + RTW_INFO("%s REG_RXDMA_STATUS:0x%08x\n",__FUNCTION__,rx_dma_status); + } +#if 0 + u32 regc50,regc58,reg824,reg800; + regc50 = rtw_read32(padapter,0xc50); + regc58 = rtw_read32(padapter,0xc58); + reg824 = rtw_read32(padapter,0x824); + reg800 = rtw_read32(padapter,0x800); + if( ((regc50&0xFFFFFF00)!= 0x69543400)|| + ((regc58&0xFFFFFF00)!= 0x69543400)|| + (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| + ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) + { + DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__, + regc50, regc58, reg824, reg800); + rtw_hal_sreset_reset(padapter); + } +#endif + + if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) { + psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; + rtw_hal_sreset_reset(padapter); + return; + } +} +#endif + diff --git a/hal/rtl8814a/rtl8814a_xmit.c b/hal/rtl8814a/rtl8814a_xmit.c new file mode 100644 index 0000000..8e9047b --- /dev/null +++ b/hal/rtl8814a/rtl8814a_xmit.c @@ -0,0 +1,515 @@ +/****************************************************************************** + * + * 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 _RTL8814A_XMIT_C_ + +//#include +#include + +/* + * Description: + * Aggregation packets and send to hardware + * + * Return: + * 0 Success + * -1 Hardware resource(TX FIFO) not ready + * -2 Software resource(xmitbuf) not ready + */ +#ifdef CONFIG_TX_EARLY_MODE + +//#define DBG_EMINFO + +#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1 + #define EARLY_MODE_MAX_PKT_NUM 10 +#else + #define EARLY_MODE_MAX_PKT_NUM 5 +#endif + + +struct EMInfo{ + u8 EMPktNum; + u16 EMPktLen[EARLY_MODE_MAX_PKT_NUM]; +}; + + +void +InsertEMContent_8814( + struct EMInfo *pEMInfo, + IN pu1Byte VirtualAddress) +{ + +#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1 + u1Byte index=0; + u4Byte dwtmp=0; +#endif + + _rtw_memset(VirtualAddress, 0, EARLY_MODE_INFO_SIZE); + if(pEMInfo->EMPktNum==0) + return; + + #ifdef DBG_EMINFO + { + int i; + RTW_INFO("\n%s ==> pEMInfo->EMPktNum =%d\n",__FUNCTION__,pEMInfo->EMPktNum); + for(i=0;i< EARLY_MODE_MAX_PKT_NUM;i++){ + RTW_INFO("%s ==> pEMInfo->EMPktLen[%d] =%d\n",__FUNCTION__,i,pEMInfo->EMPktLen[i]); + } + + } + #endif + +#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1 + SET_EARLYMODE_PKTNUM(VirtualAddress, pEMInfo->EMPktNum); + + if(pEMInfo->EMPktNum == 1){ + dwtmp = pEMInfo->EMPktLen[0]; + }else{ + dwtmp = pEMInfo->EMPktLen[0]; + dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; + dwtmp += pEMInfo->EMPktLen[1]; + } + SET_EARLYMODE_LEN0(VirtualAddress, dwtmp); + if(pEMInfo->EMPktNum <= 3){ + dwtmp = pEMInfo->EMPktLen[2]; + }else{ + dwtmp = pEMInfo->EMPktLen[2]; + dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; + dwtmp += pEMInfo->EMPktLen[3]; + } + SET_EARLYMODE_LEN1(VirtualAddress, dwtmp); + if(pEMInfo->EMPktNum <= 5){ + dwtmp = pEMInfo->EMPktLen[4]; + }else{ + dwtmp = pEMInfo->EMPktLen[4]; + dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; + dwtmp += pEMInfo->EMPktLen[5]; + } + SET_EARLYMODE_LEN2_1(VirtualAddress, dwtmp&0xF); + SET_EARLYMODE_LEN2_2(VirtualAddress, dwtmp>>4); + if(pEMInfo->EMPktNum <= 7){ + dwtmp = pEMInfo->EMPktLen[6]; + }else{ + dwtmp = pEMInfo->EMPktLen[6]; + dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; + dwtmp += pEMInfo->EMPktLen[7]; + } + SET_EARLYMODE_LEN3(VirtualAddress, dwtmp); + if(pEMInfo->EMPktNum <= 9){ + dwtmp = pEMInfo->EMPktLen[8]; + }else{ + dwtmp = pEMInfo->EMPktLen[8]; + dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; + dwtmp += pEMInfo->EMPktLen[9]; + } + SET_EARLYMODE_LEN4(VirtualAddress, dwtmp); +#else + SET_EARLYMODE_PKTNUM(VirtualAddress, pEMInfo->EMPktNum); + SET_EARLYMODE_LEN0(VirtualAddress, pEMInfo->EMPktLen[0]); + SET_EARLYMODE_LEN1(VirtualAddress, pEMInfo->EMPktLen[1]); + SET_EARLYMODE_LEN2_1(VirtualAddress, pEMInfo->EMPktLen[2]&0xF); + SET_EARLYMODE_LEN2_2(VirtualAddress, pEMInfo->EMPktLen[2]>>4); + SET_EARLYMODE_LEN3(VirtualAddress, pEMInfo->EMPktLen[3]); + SET_EARLYMODE_LEN4(VirtualAddress, pEMInfo->EMPktLen[4]); +#endif + //RT_PRINT_DATA(COMP_SEND, DBG_LOUD, "EMHdr:", VirtualAddress, 8); + +} + + + +void UpdateEarlyModeInfo8814(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ) +{ + //_adapter *padapter, struct xmit_frame *pxmitframe,struct tx_servq *ptxservq + int index,j; + u16 offset,pktlen; + PTXDESC_8814 ptxdesc; + + u8 *pmem,*pEMInfo_mem; + s8 node_num_0=0,node_num_1=0; + struct EMInfo eminfo; + struct agg_pkt_info *paggpkt; + struct xmit_frame *pframe = (struct xmit_frame*)pxmitbuf->priv_data; + pmem= pframe->buf_addr; + + #ifdef DBG_EMINFO + RTW_INFO("\n%s ==> agg_num:%d\n",__FUNCTION__, pframe->agg_num); + for(index=0;indexagg_num;index++){ + offset = pxmitpriv->agg_pkt[index].offset; + pktlen = pxmitpriv->agg_pkt[index].pkt_len; + RTW_INFO("%s ==> agg_pkt[%d].offset=%d\n",__FUNCTION__,index,offset); + RTW_INFO("%s ==> agg_pkt[%d].pkt_len=%d\n",__FUNCTION__,index,pktlen); + } + #endif + + if( pframe->agg_num > EARLY_MODE_MAX_PKT_NUM) + { + node_num_0 = pframe->agg_num; + node_num_1= EARLY_MODE_MAX_PKT_NUM-1; + } + + for(index=0;indexagg_num;index++){ + + offset = pxmitpriv->agg_pkt[index].offset; + pktlen = pxmitpriv->agg_pkt[index].pkt_len; + + _rtw_memset(&eminfo,0,sizeof(struct EMInfo)); + if( pframe->agg_num > EARLY_MODE_MAX_PKT_NUM){ + if(node_num_0 > EARLY_MODE_MAX_PKT_NUM){ + eminfo.EMPktNum = EARLY_MODE_MAX_PKT_NUM; + node_num_0--; + } + else{ + eminfo.EMPktNum = node_num_1; + node_num_1--; + } + } + else{ + eminfo.EMPktNum = pframe->agg_num-(index+1); + } + for(j=0;j< eminfo.EMPktNum ;j++){ + eminfo.EMPktLen[j] = pxmitpriv->agg_pkt[index+1+j].pkt_len+4;// 4 bytes CRC + } + + if(pmem){ + if(index==0){ + ptxdesc = (PTXDESC_8814)(pmem); + pEMInfo_mem = ((u8 *)ptxdesc)+TXDESC_SIZE; + } + else{ + pmem = pmem + pxmitpriv->agg_pkt[index-1].offset; + ptxdesc = (PTXDESC_8814)(pmem); + pEMInfo_mem = ((u8 *)ptxdesc)+TXDESC_SIZE; + } + + #ifdef DBG_EMINFO + RTW_INFO("%s ==> desc.pkt_len=%d\n",__FUNCTION__,ptxdesc->pktlen); + #endif + InsertEMContent_8814(&eminfo,pEMInfo_mem); + } + + + } + _rtw_memset(pxmitpriv->agg_pkt,0,sizeof(struct agg_pkt_info)*MAX_AGG_PKT_NUM); + +} +#endif + +#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) +void rtl8814a_cal_txdesc_chksum(u8 *ptxdesc) +{ + u16 *usPtr; + u32 count; + u32 index; + u16 checksum = 0; + + + usPtr = (u16*)ptxdesc; + // checksume is always calculated by first 32 bytes, + // and it doesn't depend on TX DESC length. + // Thomas,Lucas@SD4,20130515 + count = 16; + + // Clear first + SET_TX_DESC_TX_DESC_CHECKSUM_8814A(ptxdesc, 0); + + for(index = 0 ; index < count ; index++){ + checksum = checksum ^ le16_to_cpu(*(usPtr + index)); + } + + SET_TX_DESC_TX_DESC_CHECKSUM_8814A(ptxdesc, checksum); +} +#endif + +// +// Description: In normal chip, we should send some packet to Hw which will be used by Fw +// in FW LPS mode. The function is to fill the Tx descriptor of this packets, then +// Fw can tell Hw to send these packet derectly. +// +void rtl8814a_fill_fake_txdesc( + PADAPTER padapter, + u8* pDesc, + u32 BufferLen, + u8 IsPsPoll, + u8 IsBTQosNull, + u8 bDataFrame) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + + // Clear all status + _rtw_memset(pDesc, 0, TXDESC_SIZE); + + SET_TX_DESC_LAST_SEG_8814A(pDesc, 1); + + SET_TX_DESC_OFFSET_8814A(pDesc, TXDESC_SIZE); + + SET_TX_DESC_PKT_SIZE_8814A(pDesc, BufferLen); + + SET_TX_DESC_QUEUE_SEL_8814A(pDesc, QSLT_MGNT); + + if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { + SET_TX_DESC_RATE_ID_8814A(pDesc, RATEID_IDX_B); + } else { + SET_TX_DESC_RATE_ID_8814A(pDesc, RATEID_IDX_G); + } + + //Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. + if (IsPsPoll) + { + SET_TX_DESC_NAV_USE_HDR_8814A(pDesc, 1); + } + else + { + SET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); // Hw set sequence number + } +#if 0 //todo + if(IsBTQosNull) + { + SET_TX_DESC_BT_INT_8812(pDesc, 1); + } +#endif //0 + + SET_TX_DESC_USE_RATE_8814A(pDesc, 1); + + //8814 no OWN bit? + //SET_TX_DESC_OWN_8812(pDesc, 1); + + // + // Encrypt the data frame if under security mode excepct null data. Suggested by CCW. + // + if (_TRUE ==bDataFrame) + { + u32 EncAlg; + + EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm; + switch (EncAlg) + { + case _NO_PRIVACY_: + SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x0); + break; + case _WEP40_: + case _WEP104_: + case _TKIP_: + SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x1); + break; + case _SMS4_: + SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x2); + break; + case _AES_: + SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x3); + break; + default: + SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x0); + break; + } + } + SET_TX_DESC_TX_RATE_8814A(pDesc, MRateToHwRate(pmlmeext->tx_rate)); + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) + // USB interface drop packet if the checksum of descriptor isn't correct. + // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). + rtl8814a_cal_txdesc_chksum(pDesc); +#endif +} + +void rtl8814a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc) +{ + if ((pattrib->encrypt > 0) && !pattrib->bswenc) + { + switch (pattrib->encrypt) + { + //SEC_TYPE : 0:NO_ENC,1:WEP40/TKIP,2:WAPI,3:AES + case _WEP40_: + case _WEP104_: + case _TKIP_: + case _TKIP_WTMIC_: + SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x1); + break; +#ifdef CONFIG_WAPI_SUPPORT + case _SMS4_: + SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x2); + break; +#endif + case _AES_: + SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x3); + break; + case _NO_PRIVACY_: + default: + SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x0); + break; + + } + + } + +} + +void rtl8814a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //RTW_INFO("vcs_mode=%d\n", pattrib->vcs_mode); + + if (pattrib->vcs_mode) { + + switch(pattrib->vcs_mode) + { + case RTS_CTS: + SET_TX_DESC_RTS_ENABLE_8814A(ptxdesc, 1); + break; + case CTS_TO_SELF: + SET_TX_DESC_CTS2SELF_8814A(ptxdesc, 1); + break; + case NONE_VCS: + default: + break; + } + + if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT) + SET_TX_DESC_RTS_SHORT_8814A(ptxdesc, 1); + + SET_TX_DESC_RTS_RATE_8814A(ptxdesc, 0x8);//RTS Rate=24M + + SET_TX_DESC_RTS_RATE_FB_LIMIT_8814A(ptxdesc, 0xf); + + } +} + + +u8 +BWMapping_8814( + IN PADAPTER Adapter, + IN struct pkt_attrib *pattrib +) +{ + u8 BWSettingOfDesc = 0; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + //RTW_INFO("BWMapping pHalData->current_channel_bw %d, pattrib->bwmode %d \n",pHalData->current_channel_bw,pattrib->bwmode); + + if(pHalData->current_channel_bw== CHANNEL_WIDTH_80) + { + if(pattrib->bwmode == CHANNEL_WIDTH_80) + BWSettingOfDesc= 2; + else if(pattrib->bwmode == CHANNEL_WIDTH_40) + BWSettingOfDesc = 1; + else + BWSettingOfDesc = 0; + } + else if(pHalData->current_channel_bw== CHANNEL_WIDTH_40) + { + if((pattrib->bwmode == CHANNEL_WIDTH_40) || (pattrib->bwmode == CHANNEL_WIDTH_80)) + BWSettingOfDesc = 1; + else + BWSettingOfDesc = 0; + } + else + BWSettingOfDesc = 0; + + return BWSettingOfDesc; +} + +u8 +SCMapping_8814( + IN PADAPTER Adapter, + IN struct pkt_attrib *pattrib +) +{ + u8 SCSettingOfDesc = 0; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + //RTW_INFO("SCMapping: pHalData->current_channel_bw %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); + + if(pHalData->current_channel_bw == CHANNEL_WIDTH_80) + { + if(pattrib->bwmode == CHANNEL_WIDTH_80) + { + SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; + } + else if(pattrib->bwmode == CHANNEL_WIDTH_40) + { + if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + SCSettingOfDesc = VHT_DATA_SC_40_LOWER_OF_80MHZ; + else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + SCSettingOfDesc = VHT_DATA_SC_40_UPPER_OF_80MHZ; + else + RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); + } + else + { + if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) + SCSettingOfDesc = VHT_DATA_SC_20_LOWEST_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) + SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) + SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ; + else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) + SCSettingOfDesc = VHT_DATA_SC_20_UPPERST_OF_80MHZ; + else + RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); + } + } + else if(pHalData->current_channel_bw== CHANNEL_WIDTH_40) + { + //RTW_INFO("SCMapping: HT Case: pHalData->current_channel_bw %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur40MhzPrimeSC); + + if(pattrib->bwmode == CHANNEL_WIDTH_40) + { + SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; + } + else if(pattrib->bwmode == CHANNEL_WIDTH_20) + { + if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) + { + SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ; + } + else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) + { + SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ; + } + else + { + SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; + } + + } + } + else + { + SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; + } + + return SCSettingOfDesc; +} + + +void rtl8814a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc) +{ + //RTW_INFO("bwmode=%d, ch_off=%d\n", pattrib->bwmode, pattrib->ch_offset); + + if(pattrib->ht_en) + { + // Set Bandwidth and sub-channel settings. + SET_TX_DESC_DATA_BW_8814A(ptxdesc, BWMapping_8814(padapter,pattrib)); + + SET_TX_DESC_DATA_SC_8814A(ptxdesc, SCMapping_8814(padapter,pattrib)); + } +} + + diff --git a/hal/rtl8814a/usb/rtl8814au_led.c b/hal/rtl8814a/usb/rtl8814au_led.c new file mode 100644 index 0000000..070f886 --- /dev/null +++ b/hal/rtl8814a/usb/rtl8814au_led.c @@ -0,0 +1,147 @@ +/****************************************************************************** + * + * 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 _RTL8814AU_LED_C_ + +//#include +#include +#ifdef CONFIG_RTW_SW_LED +//================================================================================ +// LED object. +//================================================================================ + + +//================================================================================ +// Prototype of protected function. +//================================================================================ + + +//================================================================================ +// LED_819xUsb routines. +//================================================================================ + +// +// Description: +// Turn on LED according to LedPin specified. +// +static void +SwLedOn_8814AU( + PADAPTER padapter, + PLED_USB pLed +) +{ + u32 LedGpioCfg; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if (RTW_CANNOT_RUN(padapter)) + return; + + LedGpioCfg = rtw_read32(padapter , REG_GPIO_PIN_CTRL_2); /* 0x60. In 8814AU, the name should be REG_GPIO_EXT_CTRL */ + switch (pLed->LedPin) { + case LED_PIN_LED0: + LedGpioCfg |= (BIT16 | BIT17 | BIT21 | BIT22); /* config as gpo */ + LedGpioCfg &= ~(BIT8 | BIT9 | BIT13 | BIT14); /* set gpo value */ + LedGpioCfg &= ~(BIT0 | BIT1 | BIT5 | BIT6); /* set gpi value. TBD: may not need this */ + rtw_write32(padapter , REG_GPIO_PIN_CTRL_2 , LedGpioCfg); + break; + default: + break; + } + pLed->bLedOn = _TRUE; +} + + +// +// Description: +// Turn off LED according to LedPin specified. +// +static void +SwLedOff_8814AU( + PADAPTER padapter, + PLED_USB pLed +) +{ + u32 LedGpioCfg; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if (RTW_CANNOT_RUN(padapter)) + return; + LedGpioCfg = rtw_read32(padapter , REG_GPIO_PIN_CTRL_2); /* 0x60. In 8814AU, the name should be REG_GPIO_EXT_CTRL */ + switch (pLed->LedPin) { + case LED_PIN_LED0: + LedGpioCfg |= (BIT16 | BIT17 | BIT21 | BIT22); /* config as gpo */ + LedGpioCfg |= (BIT8 | BIT9 | BIT13 | BIT14); /* set gpo output value */ + rtw_write32(padapter , REG_GPIO_PIN_CTRL_2 , LedGpioCfg); + break; + default: + break; + } + + pLed->bLedOn = _FALSE; +} + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ + + +//================================================================================ +// Default LED behavior. +//================================================================================ + +// +// Description: +// Initialize all LED_871x objects. +// +void +rtl8814au_InitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *pledpriv = adapter_to_led(padapter); + + pledpriv->LedControlHandler = LedControlUSB; + + pledpriv->SwLedOn = SwLedOn_8814AU; + pledpriv->SwLedOff = SwLedOff_8814AU; + + InitLed(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); + + InitLed(padapter, &(pledpriv->SwLed1), LED_PIN_LED1); + + InitLed(padapter, &(pledpriv->SwLed2), LED_PIN_LED2); +} + + +// +// Description: +// DeInitialize all LED_819xUsb objects. +// +void +rtl8814au_DeInitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *ledpriv = adapter_to_led(padapter); + + DeInitLed( &(ledpriv->SwLed0) ); + DeInitLed( &(ledpriv->SwLed1) ); + DeInitLed( &(ledpriv->SwLed2) ); +} +#endif diff --git a/hal/rtl8814a/usb/rtl8814au_recv.c b/hal/rtl8814a/usb/rtl8814au_recv.c new file mode 100644 index 0000000..4d38179 --- /dev/null +++ b/hal/rtl8814a/usb/rtl8814au_recv.c @@ -0,0 +1,34 @@ +/****************************************************************************** + * + * 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 _RTL8814AU_RECV_C_ + +//#include +#include + +int rtl8814au_init_recv_priv(_adapter *padapter) +{ + return usb_init_recv_priv(padapter, INTERRUPT_MSG_FORMAT_LEN); +} + +void rtl8814au_free_recv_priv(_adapter *padapter) +{ + usb_free_recv_priv(padapter, INTERRUPT_MSG_FORMAT_LEN); +} + diff --git a/hal/rtl8814a/usb/rtl8814au_xmit.c b/hal/rtl8814a/usb/rtl8814au_xmit.c new file mode 100644 index 0000000..73b1acc --- /dev/null +++ b/hal/rtl8814a/usb/rtl8814au_xmit.c @@ -0,0 +1,1121 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ +#define _RTL8812AU_XMIT_C_ + +/* #include */ +#include + + +s32 rtl8814au_init_xmit_priv(_adapter *padapter) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + +#ifdef PLATFORM_LINUX + tasklet_init(&pxmitpriv->xmit_tasklet, + (void(*)(unsigned long))rtl8814au_xmit_tasklet, + (unsigned long)padapter); +#endif +#ifdef CONFIG_TX_EARLY_MODE + pHalData->bEarlyModeEnable = padapter->registrypriv.early_mode; +#endif + + return _SUCCESS; +} + +void rtl8814au_free_xmit_priv(_adapter *padapter) +{ +} + +static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz ,u8 bagg_pkt) +{ + int pull=0; + uint qsel; + u8 data_rate,pwr_status,offset; + _adapter *padapter = pxmitframe->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 *ptxdesc = pmem; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + sint bmcst = IS_MCAST(pattrib->ra); + u16 SWDefineContent = 0x0; + u8 DriverFixedRate = 0x0; + +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + if (padapter->registrypriv.mp_mode == 0) + { + if((PACKET_OFFSET_SZ != 0) && (!bagg_pkt) &&(rtw_usb_bulk_size_boundary(padapter,TXDESC_SIZE+sz)==_FALSE)) + { + ptxdesc = (pmem+PACKET_OFFSET_SZ); + //RTW_INFO("==> non-agg-pkt,shift pointer...\n"); + pull = 1; + } + } +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + + _rtw_memset(ptxdesc, 0, TXDESC_SIZE); + + //4 offset 0 + //SET_TX_DESC_FIRST_SEG_8812(ptxdesc, 1); + SET_TX_DESC_LAST_SEG_8814A(ptxdesc, 1); + //SET_TX_DESC_OWN_8812(ptxdesc, 1); + + //RTW_INFO("%s==> pkt_len=%d,bagg_pkt=%02x\n",__FUNCTION__,sz,bagg_pkt); + SET_TX_DESC_PKT_SIZE_8814A(ptxdesc, sz); + + offset = TXDESC_SIZE + OFFSET_SZ; + +#ifdef CONFIG_TX_EARLY_MODE + if(bagg_pkt){ + offset += EARLY_MODE_INFO_SIZE ;//0x28 + } +#endif + //RTW_INFO("%s==>offset(0x%02x) \n",__FUNCTION__,offset); + SET_TX_DESC_OFFSET_8814A(ptxdesc, offset); + + if (bmcst) { + SET_TX_DESC_BMC_8814A(ptxdesc, 1); + } + +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + if (padapter->registrypriv.mp_mode == 0) + { + if ((PACKET_OFFSET_SZ != 0) && (!bagg_pkt)) { + if ((pull) && (pxmitframe->pkt_offset>0)) { + pxmitframe->pkt_offset = pxmitframe->pkt_offset -1; + } + } + } +#endif + + //RTW_INFO("%s, pkt_offset=0x%02x\n",__FUNCTION__,pxmitframe->pkt_offset); + // pkt_offset, unit:8 bytes padding + if (pxmitframe->pkt_offset > 0) { + SET_TX_DESC_PKT_OFFSET_8814A(ptxdesc, pxmitframe->pkt_offset); + } + + SET_TX_DESC_MACID_8814A(ptxdesc, pattrib->mac_id); + SET_TX_DESC_RATE_ID_8814A(ptxdesc, pattrib->raid); + + SET_TX_DESC_QUEUE_SEL_8814A(ptxdesc, pattrib->qsel); + + //offset 12 + + if (!pattrib->qos_en) { + /* HW sequence, to fix to use 0 queue. todo: 4AC packets to use auto queue select */ + SET_TX_DESC_HWSEQ_EN_8814A(ptxdesc, 1); // Hw set sequence number + SET_TX_DESC_EN_HWEXSEQ_8814A(ptxdesc, 0); + SET_TX_DESC_DISQSELSEQ_8814A(ptxdesc, 1); + SET_TX_DESC_HW_SSN_SEL_8814A(ptxdesc, 0); + } else { + SET_TX_DESC_SEQ_8814A(ptxdesc, pattrib->seqnum); + } + + + + if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) { + //RTW_INFO("pxmitframe->frame_tag == DATA_FRAMETAG\n"); + + rtl8814a_fill_txdesc_sectype(pattrib, ptxdesc); + + //offset 20 + } +#ifdef CONFIG_USB_TX_AGGREGATION + if (pxmitframe->agg_num > 1){ + //RTW_INFO("%s agg_num:%d\n",__FUNCTION__,pxmitframe->agg_num ); + SET_TX_DESC_USB_TXAGG_NUM_8814A(ptxdesc, pxmitframe->agg_num); + } +#endif //CONFIG_USB_TX_AGGREGATION + + rtl8814a_fill_txdesc_vcs(padapter, pattrib, ptxdesc); + + if ((pattrib->ether_type != 0x888e) && + (pattrib->ether_type != 0x0806) && + (pattrib->ether_type != 0x88b4) && + (pattrib->dhcp_pkt != 1) +#ifdef CONFIG_AUTO_AP_MODE + && (pattrib->pctrl != _TRUE) +#endif + ) + { + //Non EAP & ARP & DHCP type data packet + + if (pattrib->ampdu_en==_TRUE) { + SET_TX_DESC_AGG_ENABLE_8814A(ptxdesc, 1); + SET_TX_DESC_MAX_AGG_NUM_8814A(ptxdesc, 0x1f); + // Set A-MPDU aggregation. + SET_TX_DESC_AMPDU_DENSITY_8814A(ptxdesc, pattrib->ampdu_spacing); + } + else { + SET_TX_DESC_BK_8814A(ptxdesc, 1); + } + + rtl8814a_fill_txdesc_phy(padapter, pattrib, ptxdesc); + + //DATA Rate FB LMT + //SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 0x1f); + if(pHalData->current_band_type == BAND_ON_5G) + { + SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 4); + } + else + { + SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 0); + } + + if (pHalData->fw_ractrl == _FALSE) { + SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); + DriverFixedRate = 0x01; + + if(pHalData->INIDATA_RATE[pattrib->mac_id] & BIT(7)) + SET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1); + + SET_TX_DESC_TX_RATE_8814A(ptxdesc, (pHalData->INIDATA_RATE[pattrib->mac_id] & 0x7F)); + } + + if (padapter->fix_rate != 0xFF) { // modify data rate by iwpriv + SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); + DriverFixedRate = 0x01; + if(padapter->fix_rate & BIT(7)) + SET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1); + + SET_TX_DESC_TX_RATE_8814A(ptxdesc, (padapter->fix_rate & 0x7F)); + if (!padapter->data_fb) + SET_TX_DESC_DISABLE_FB_8814A(ptxdesc,1); + } + + if (pattrib->ldpc) + SET_TX_DESC_DATA_LDPC_8814A(ptxdesc, 1); + if (pattrib->stbc) + SET_TX_DESC_DATA_STBC_8814A(ptxdesc, 1); + + //work arond before fixing RA + //SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); + //SET_TX_DESC_TX_RATE_8814A(ptxdesc, 0x10); + } + else + { + // EAP data packet and ARP packet and DHCP. + // Use the 1M data rate to send the EAP/ARP packet. + // This will maybe make the handshake smooth. + + SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); + DriverFixedRate = 0x01; + SET_TX_DESC_BK_8814A(ptxdesc, 1); + + // HW will ignore this setting if the transmission rate is legacy OFDM. + if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT) { + SET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1); + } + + SET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pmlmeext->tx_rate)); + } + + if ((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG) { + //RTW_INFO("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); + + SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); + DriverFixedRate = 0x01; + +#ifdef CONFIG_INTEL_PROXIM + if ((padapter->proximity.proxim_on==_TRUE)&&(pattrib->intel_proxim==_TRUE)){ + RTW_INFO("\n %s pattrib->rate=%d\n", __func__,pattrib->rate); + SET_TX_DESC_TX_RATE_8814A(ptxdesc, pattrib->rate); + } + else +#endif + { + SET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pattrib->rate)); + } + + // VHT NDPA or HT NDPA Packet for Beamformer. + if ((pattrib->subtype == WIFI_NDPA) || + ((pattrib->subtype == WIFI_ACTION_NOACK) && (pattrib->order == 1))) + { + SET_TX_DESC_NAV_USE_HDR_8814A(ptxdesc, 1); + + SET_TX_DESC_DATA_BW_8814A(ptxdesc, BWMapping_8814(padapter,pattrib)); + SET_TX_DESC_RTS_SC_8814A(ptxdesc, SCMapping_8814(padapter,pattrib)); + + SET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(ptxdesc, 1); + SET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 5); + SET_TX_DESC_DISABLE_FB_8814A(ptxdesc, 1); + + //if(pattrib->rts_cca) + //{ + // SET_TX_DESC_NDPA_8812(ptxdesc, 2); + //} + //else + { + SET_TX_DESC_NDPA_8814A(ptxdesc, 1); + } + } + else + { + SET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(ptxdesc, 1); + if (pattrib->retry_ctrl == _TRUE) { + SET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 6); + } else { + SET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 12); + } + } + +#ifdef CONFIG_XMIT_ACK + //CCX-TXRPT ack for xmit mgmt frames. + if (pxmitframe->ack_report) { + SET_TX_DESC_SPE_RPT_8814A(ptxdesc, 1); + #ifdef DBG_CCX + RTW_INFO("%s set tx report\n", __func__); + #endif + } +#endif //CONFIG_XMIT_ACK + } + else if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG) + { + RTW_INFO("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); + } +#ifdef CONFIG_MP_INCLUDED + else if(((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG) && + (padapter->registrypriv.mp_mode == 1)) + { + fill_txdesc_for_mp(padapter, ptxdesc); + } +#endif + else + { + RTW_INFO("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); + + SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); + DriverFixedRate = 0x01; + SET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pmlmeext->tx_rate)); + } + if (DriverFixedRate) + SWDefineContent |= 0x01; + SET_TX_DESC_SW_DEFINE_8814A(ptxdesc, SWDefineContent); + + SET_TX_DESC_GID_8814A(ptxdesc, pattrib->txbf_g_id); + SET_TX_DESC_PAID_8814A(ptxdesc, pattrib->txbf_p_aid); + + rtl8814a_cal_txdesc_chksum(ptxdesc); + _dbg_dump_tx_info(padapter,pxmitframe->frame_tag,ptxdesc); + return pull; +} + + +#ifdef CONFIG_XMIT_THREAD_MODE +/* + * Description + * Transmit xmitbuf to hardware tx fifo + * + * Return + * _SUCCESS ok + * _FAIL something error + */ +s32 rtl8814au_xmit_buf_handler(PADAPTER padapter) +{ + PHAL_DATA_TYPE phal; + struct xmit_priv *pxmitpriv; + struct xmit_buf *pxmitbuf; + s32 ret; + + + phal = GET_HAL_DATA(padapter); + pxmitpriv = &padapter->xmitpriv; + + ret = _rtw_down_sema(&pxmitpriv->xmit_sema); + if (_FAIL == ret) { + RTW_ERR("%s: down SdioXmitBufSema fail!\n", __FUNCTION__); + return _FAIL; + } + + if (RTW_CANNOT_RUN(padapter)) { + RTW_ERR( + , ("%s: bDriverStopped(%s) bSurpriseRemoved(%s)!\n" + , __func__ + , rtw_is_drv_stopped(padapter)?"True":"False" + , rtw_is_surprise_removed(padapter)?"True":"False"); + return _FAIL; + } + + if(check_pending_xmitbuf(pxmitpriv) == _FALSE) + return _SUCCESS; + +#ifdef CONFIG_LPS_LCLK + ret = rtw_register_tx_alive(padapter); + if (ret != _SUCCESS) { + RTW_ERR("%s: wait to leave LPS_LCLK\n", __FUNCTION__); + return _SUCCESS; + } +#endif //CONFIG_LPS_LCLK + + do { + pxmitbuf = dequeue_pending_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) break; + + rtw_write_port(padapter, pxmitbuf->ff_hwaddr, pxmitbuf->len, (unsigned char*)pxmitbuf); + + } while (1); + +#ifdef CONFIG_LPS_LCLK + rtw_unregister_tx_alive(padapter); +#endif //CONFIG_LPS_LCLK + + return _SUCCESS; +} +#endif //CONFIG_XMIT_THREAD_MODE + + +//for non-agg data frame or management frame +static s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + s32 ret = _SUCCESS; + s32 inner_ret = _SUCCESS; + int t, sz, w_sz, pull=0; + u8 *mem_addr; + u32 ff_hwaddr; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; +#ifdef CONFIG_80211N_HT + if ((pxmitframe->frame_tag == DATA_FRAMETAG) && + (pxmitframe->attrib.ether_type != 0x0806) && + (pxmitframe->attrib.ether_type != 0x888e) && + (pxmitframe->attrib.ether_type != 0x88b4) && + (pxmitframe->attrib.dhcp_pkt != 1)) + { + rtw_issue_addbareq_cmd(padapter, pxmitframe); + } +#endif //CONFIG_80211N_HT + mem_addr = pxmitframe->buf_addr; + + //RTW_INFO("rtw_dump_xframe()\n"); + + for (t = 0; t < pattrib->nr_frags; t++) + { + if (inner_ret != _SUCCESS && ret == _SUCCESS) + ret = _FAIL; + + if (t != (pattrib->nr_frags - 1)) + { + RTW_DBG("pattrib->nr_frags=%d\n", pattrib->nr_frags); + + sz = pxmitpriv->frag_len; + sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len); + } + else //no frag + { + sz = pattrib->last_txcmdsz; + } + + pull = update_txdesc(pxmitframe, mem_addr, sz, _FALSE); + + if (pull) { + mem_addr += PACKET_OFFSET_SZ; //pull txdesc head + + //pxmitbuf ->pbuf = mem_addr; + pxmitframe->buf_addr = mem_addr; + + w_sz = sz + TXDESC_SIZE; + } + else + { + w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ; + } + + ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe); + +#ifdef CONFIG_XMIT_THREAD_MODE + pxmitbuf->len = w_sz; + pxmitbuf->ff_hwaddr = ff_hwaddr; + enqueue_pending_xmitbuf(pxmitpriv, pxmitbuf); +#else + inner_ret = rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf); +#endif + rtw_count_tx_stats(padapter, pxmitframe, sz); + + //RTW_INFO("rtw_write_port, w_sz=%d\n", w_sz); + //RTW_INFO("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority); + + mem_addr += w_sz; + + mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr))); + + } + + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + if (ret != _SUCCESS) + rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN); + + return ret; +} + +#ifdef CONFIG_USB_TX_AGGREGATION +static u32 xmitframe_need_length(struct xmit_frame *pxmitframe) +{ + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + u32 len = 0; + + // no consider fragement + len = pattrib->hdrlen + pattrib->iv_len + + SNAP_SIZE + sizeof(u16) + + pattrib->pktlen + + ((pattrib->bswenc) ? pattrib->icv_len : 0); + + if(pattrib->encrypt ==_TKIP_) + len += 8; + + return len; +} + +#define IDEA_CONDITION 1 // check all packets before enqueue +s32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct xmit_frame *pxmitframe = NULL; + struct xmit_frame *pfirstframe = NULL; + + // aggregate variable + struct hw_xmit *phwxmit; + struct sta_info *psta = NULL; + struct tx_servq *ptxservq = NULL; + + _irqL irqL; + _list *xmitframe_plist = NULL, *xmitframe_phead = NULL; + + u32 pbuf; // next pkt address + u32 pbuf_tail; // last pkt tail + u32 len; // packet length, except TXDESC_SIZE and PKT_OFFSET + + u32 bulkSize = pHalData->UsbBulkOutSize; + u8 descCount; + u32 bulkPtr; + + // dump frame variable + u32 ff_hwaddr; + + _list *sta_plist, *sta_phead; + u8 single_sta_in_queue = _FALSE; + +#ifndef IDEA_CONDITION + int res = _SUCCESS; +#endif + + RTW_INFO("+xmitframe_complete\n"); + + + // check xmitbuffer is ok + if (pxmitbuf == NULL) { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL){ + //RTW_INFO("%s #1, connot alloc xmitbuf!!!! \n",__FUNCTION__); + return _FALSE; + } + } + +//RTW_INFO("%s ===================================== \n",__FUNCTION__); + //3 1. pick up first frame + do { + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); + if (pxmitframe == NULL) { + // no more xmit frame, release xmit buffer + //RTW_INFO("no more xmit frame ,return\n"); + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _FALSE; + } + +#ifndef IDEA_CONDITION + if (pxmitframe->frame_tag != DATA_FRAMETAG) { + RTW_INFO("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", + pxmitframe->frame_tag, DATA_FRAMETAG); +// rtw_free_xmitframe(pxmitpriv, pxmitframe); + continue; + } + + // TID 0~15 + if ((pxmitframe->attrib.priority < 0) || + (pxmitframe->attrib.priority > 15)) { + RTW_INFO("xmitframe_complete: TID(%d) should be 0~15!\n", + pxmitframe->attrib.priority); +// rtw_free_xmitframe(pxmitpriv, pxmitframe); + continue; + } +#endif + //RTW_INFO("==> pxmitframe->attrib.priority:%d\n",pxmitframe->attrib.priority); + pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf; + pxmitbuf->priv_data = pxmitframe; + + pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. + #ifdef CONFIG_TX_EARLY_MODE + pxmitframe->pkt_offset = (PACKET_OFFSET_SZ/8)+1; // 2; // first frame of aggregation, reserve one offset for EM info ,another for usb bulk-out block check + #else + pxmitframe->pkt_offset = (PACKET_OFFSET_SZ/8); // 1; // first frame of aggregation, reserve offset + #endif + + if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { + RTW_INFO("%s coalesce 1st xmitframe failed \n",__FUNCTION__); + continue; + } + + + // always return ndis_packet after rtw_xmitframe_coalesce + rtw_os_xmit_complete(padapter, pxmitframe); + + break; + } while (1); + + //3 2. aggregate same priority and same DA(AP or STA) frames + pfirstframe = pxmitframe; + len = xmitframe_need_length(pfirstframe) + TXDESC_SIZE+(pfirstframe->pkt_offset*PACKET_OFFSET_SZ); + pbuf_tail = len; + pbuf = _RND8(pbuf_tail); + + // check pkt amount in one bulk + descCount = 0; + bulkPtr = bulkSize; + if (pbuf < bulkPtr) + descCount++; + if (descCount == pHalData->UsbTxAggDescNum) + goto agg_end; + else { + descCount = 0; + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize + } + + // dequeue same priority packet from station tx queue + psta = pfirstframe->attrib.psta; + switch (pfirstframe->attrib.priority) { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + phwxmit = pxmitpriv->hwxmits + 3; + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + phwxmit = pxmitpriv->hwxmits + 1; + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + phwxmit = pxmitpriv->hwxmits; + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + phwxmit = pxmitpriv->hwxmits + 2; + break; + } +//RTW_INFO("==> pkt_no=%d,pkt_len=%d,len=%d,RND8_LEN=%d,pkt_offset=0x%02x\n", + //pxmitframe->agg_num,pxmitframe->attrib.last_txcmdsz,len,pbuf,pxmitframe->pkt_offset ); + + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + sta_phead = get_list_head(phwxmit->sta_queue); + sta_plist = get_next(sta_phead); + single_sta_in_queue = rtw_end_of_queue_search(sta_phead, get_next(sta_plist)); + + xmitframe_phead = get_list_head(&ptxservq->sta_pending); + 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); + xmitframe_plist = get_next(xmitframe_plist); + + if(_FAIL == rtw_hal_busagg_qsel_check(padapter,pfirstframe->attrib.qsel,pxmitframe->attrib.qsel)) + break; + + pxmitframe->agg_num = 0; // not first frame of aggregation + #ifdef CONFIG_TX_EARLY_MODE + pxmitframe->pkt_offset = 1;// not first frame of aggregation,reserve offset for EM Info + #else + pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset + #endif + + len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE +(pxmitframe->pkt_offset*PACKET_OFFSET_SZ); + + if (_RND8(pbuf + len) > MAX_XMITBUF_SZ) + //if (_RND8(pbuf + len) > (MAX_XMITBUF_SZ/2))//to do : for TX TP finial tune , Georgia 2012-0323 + { + //RTW_INFO("%s....len> MAX_XMITBUF_SZ\n",__FUNCTION__); + pxmitframe->agg_num = 1; + pxmitframe->pkt_offset = 1; + break; + } + rtw_list_delete(&pxmitframe->list); + ptxservq->qcnt--; + phwxmit->accnt--; + +#ifndef IDEA_CONDITION + // suppose only data frames would be in queue + if (pxmitframe->frame_tag != DATA_FRAMETAG) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", + pxmitframe->frame_tag, DATA_FRAMETAG)); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + continue; + } + + // TID 0~15 + if ((pxmitframe->attrib.priority < 0) || + (pxmitframe->attrib.priority > 15)) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: TID(%d) should be 0~15!\n", + pxmitframe->attrib.priority)); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + continue; + } +#endif + +// pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf; + + if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { + RTW_INFO("%s coalesce failed \n",__FUNCTION__); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + continue; + } + + //RTW_INFO("==> pxmitframe->attrib.priority:%d\n",pxmitframe->attrib.priority); + // always return ndis_packet after rtw_xmitframe_coalesce + rtw_os_xmit_complete(padapter, pxmitframe); + + // (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz + update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz,_TRUE); + + // don't need xmitframe any more + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + // handle pointer and stop condition + pbuf_tail = pbuf + len; + pbuf = _RND8(pbuf_tail); + + + pfirstframe->agg_num++; +#ifdef CONFIG_TX_EARLY_MODE + pxmitpriv->agg_pkt[pfirstframe->agg_num-1].offset = _RND8(len); + pxmitpriv->agg_pkt[pfirstframe->agg_num-1].pkt_len = pxmitframe->attrib.last_txcmdsz; +#endif + if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) + break; + + if (pbuf < bulkPtr) { + descCount++; + if (descCount == pHalData->UsbTxAggDescNum) + break; + } else { + descCount = 0; + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; + } + }//end while( aggregate same priority and same DA(AP or STA) frames) + if (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE) + rtw_list_delete(&ptxservq->tx_pending); + else if (single_sta_in_queue == _FALSE) { + /* Re-arrange the order of stations in this ac queue to balance the service for these stations */ + rtw_list_delete(&ptxservq->tx_pending); + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmit->sta_queue)); + } + + _exit_critical_bh(&pxmitpriv->lock, &irqL); +agg_end: +#ifdef CONFIG_80211N_HT + if ((pfirstframe->attrib.ether_type != 0x0806) && + (pfirstframe->attrib.ether_type != 0x888e) && + (pfirstframe->attrib.ether_type != 0x88b4) && + (pfirstframe->attrib.dhcp_pkt != 1)) + { + rtw_issue_addbareq_cmd(padapter, pfirstframe); + } +#endif //CONFIG_80211N_HT +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + //3 3. update first frame txdesc + if ((PACKET_OFFSET_SZ != 0) && ((pbuf_tail % bulkSize) == 0)) { + // remove pkt_offset + pbuf_tail -= PACKET_OFFSET_SZ; + pfirstframe->buf_addr += PACKET_OFFSET_SZ; + pfirstframe->pkt_offset--; + //RTW_INFO("$$$$$ buf size equal to USB block size $$$$$$\n"); + } +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + + update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz,_TRUE); + + #ifdef CONFIG_TX_EARLY_MODE + //prepare EM info for first frame, agg_num value start from 1 + pxmitpriv->agg_pkt[0].offset = _RND8(pfirstframe->attrib.last_txcmdsz +TXDESC_SIZE +(pfirstframe->pkt_offset*PACKET_OFFSET_SZ)); + pxmitpriv->agg_pkt[0].pkt_len = pfirstframe->attrib.last_txcmdsz;//get from rtw_xmitframe_coalesce + + UpdateEarlyModeInfo8812(pxmitpriv,pxmitbuf ); + #endif + + //3 4. write xmit buffer to USB FIFO + ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe); +//RTW_INFO("%s ===================================== write port,buf_size(%d) \n",__FUNCTION__,pbuf_tail); + // xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr + rtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf); + + + //3 5. update statisitc + pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE); + pbuf_tail -= (pfirstframe->pkt_offset * PACKET_OFFSET_SZ); + + + rtw_count_tx_stats(padapter, pfirstframe, pbuf_tail); + + rtw_free_xmitframe(pxmitpriv, pfirstframe); + + return _TRUE; +} + +#else //CONFIG_USB_TX_AGGREGATION + +s32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + + struct hw_xmit *phwxmits; + sint hwentry; + struct xmit_frame *pxmitframe=NULL; + int res=_SUCCESS, xcnt = 0; + + phwxmits = pxmitpriv->hwxmits; + hwentry = pxmitpriv->hwxmit_entry; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete()\n")); + + if(pxmitbuf==NULL) + { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if(!pxmitbuf) + { + return _FALSE; + } + } + + + do + { + pxmitframe = rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry); + + if(pxmitframe) + { + pxmitframe->pxmitbuf = pxmitbuf; + + pxmitframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pxmitframe; + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + if(pxmitframe->attrib.priority<=15)//TID0~15 + { + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + } + //RTW_INFO("==> pxmitframe->attrib.priority:%d\n",pxmitframe->attrib.priority); + rtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce + } + + + RTW_DBG("xmitframe_complete(): rtw_dump_xframe\n"); + + + if(res == _SUCCESS) + { + rtw_dump_xframe(padapter, pxmitframe); + } + else + { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + } + + xcnt++; + + } + else + { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _FALSE; + } + + break; + + }while(0/*xcnt < (NR_XMITFRAME >> 3)*/); + + return _TRUE; + +} +#endif + + + +static s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + s32 res = _SUCCESS; +//RTW_INFO("==> %s \n",__FUNCTION__); + + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _SUCCESS) { + rtw_dump_xframe(padapter, pxmitframe); + } + else{ + RTW_INFO("==> %s xmitframe_coalsece failed\n",__FUNCTION__); + } + + return res; +} + +/* + * Return + * _TRUE dump packet directly + * _FALSE enqueue packet + */ +static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + s32 res; + struct xmit_buf *pxmitbuf = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 lg_sta_num; + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0) + { + //RTW_INFO("enqueue AC(%d)\n",pattrib->priority); + goto enqueue; + } + + if (rtw_xmit_ac_blocked(padapter) == _TRUE) + goto enqueue; + + if (padapter->dvobj->iface_state.lg_sta_num) + goto enqueue; + + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) + goto enqueue; + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf; + pxmitbuf->priv_data = pxmitframe; + + if (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + } + + return _TRUE; + +enqueue: + res = rtw_xmitframe_enqueue(padapter, pxmitframe); + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if (res != _SUCCESS) { + RTW_ERR("pre_xmitframe: enqueue xmitframe fail\n"); + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + pxmitpriv->tx_drop++; + return _TRUE; + } + + return _FALSE; +} + +s32 rtl8814au_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) +{ + return rtw_dump_xframe(padapter, pmgntframe); +} + +/* + * Return + * _TRUE dump packet directly ok + * _FALSE temporary can't transmit packets to hardware + */ +s32 rtl8814au_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + return pre_xmitframe(padapter, pxmitframe); +} + +s32 rtl8814au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + s32 err; + + if ((err=rtw_xmitframe_enqueue(padapter, pxmitframe)) != _SUCCESS) + { + rtw_free_xmitframe(pxmitpriv, pxmitframe); + + pxmitpriv->tx_drop++; + } + else + { +#ifdef PLATFORM_LINUX + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); +#endif + } + + return err; + +} + + +#ifdef CONFIG_HOSTAPD_MLME + +static void rtl8814au_hostap_mgnt_xmit_cb(struct urb *urb) +{ +#ifdef PLATFORM_LINUX + struct sk_buff *skb = (struct sk_buff *)urb->context; + + //RTW_INFO("%s\n", __FUNCTION__); + + rtw_skb_free(skb); +#endif +} + +s32 rtl8814au_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) +{ +#ifdef PLATFORM_LINUX + u16 fc; + int rc, len, pipe; + unsigned int bmcst, tid, qsel; + struct sk_buff *skb, *pxmit_skb; + struct urb *urb; + unsigned char *pxmitbuf; + struct tx_desc *ptxdesc; + struct rtw_ieee80211_hdr *tx_hdr; + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pnetdev = padapter->pnetdev; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); + + + //RTW_INFO("%s\n", __FUNCTION__); + + skb = pkt; + + len = skb->len; + tx_hdr = (struct rtw_ieee80211_hdr *)(skb->data); + fc = le16_to_cpu(tx_hdr->frame_ctl); + bmcst = IS_MCAST(tx_hdr->addr1); + + if ((fc & RTW_IEEE80211_FCTL_FTYPE) != RTW_IEEE80211_FTYPE_MGMT) + goto _exit; + + pxmit_skb = rtw_skb_alloc(len + TXDESC_SIZE); + + if(!pxmit_skb) + goto _exit; + + pxmitbuf = pxmit_skb->data; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + goto _exit; + } + + // ----- fill tx desc ----- + ptxdesc = (struct tx_desc *)pxmitbuf; + _rtw_memset(ptxdesc, 0, sizeof(*ptxdesc)); + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(OWN | FSG | LSG); + + if(bmcst) + { + ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); + } + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID + + ptxdesc->txdw1 |= cpu_to_le32((0x12<txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + + + //HW append seq + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + + + rtl8188eu_cal_txdesc_chksum(ptxdesc); + // ----- end of fill tx desc ----- + + // + skb_put(pxmit_skb, len + TXDESC_SIZE); + pxmitbuf = pxmitbuf + TXDESC_SIZE; + _rtw_memcpy(pxmitbuf, skb->data, len); + + //RTW_INFO("mgnt_xmit, len=%x\n", pxmit_skb->len); + + + // ----- prepare urb for submit ----- + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX); + pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f); + + usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe, + pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb); + + urb->transfer_flags |= URB_ZERO_PACKET; + usb_anchor_urb(urb, &phostapdpriv->anchored); + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + usb_unanchor_urb(urb); + kfree_skb(skb); + } + usb_free_urb(urb); + + +_exit: + + rtw_skb_free(skb); + +#endif + + return 0; + +} +#endif + diff --git a/hal/rtl8814a/usb/usb_halinit.c b/hal/rtl8814a/usb/usb_halinit.c new file mode 100644 index 0000000..5796689 --- /dev/null +++ b/hal/rtl8814a/usb/usb_halinit.c @@ -0,0 +1,2416 @@ +/****************************************************************************** + * + * 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. + * + *****************************************************************************/ +#define _HCI_HAL_INIT_C_ + +/* #include */ +#include + +#ifndef CONFIG_USB_HCI + + #error "CONFIG_USB_HCI shall be on!\n" + +#endif + + +static void _dbg_dump_macreg(_adapter *padapter) +{ + u32 offset = 0; + u32 val32 = 0; + u32 index = 0 ; + for (index = 0; index < 64; index++) { + offset = index * 4; + val32 = rtw_read32(padapter, offset); + RTW_INFO("offset : 0x%02x ,val:0x%08x\n", offset, val32); + } +} + +static VOID +_ConfigChipOutEP_8814( + IN PADAPTER pAdapter, + IN u8 NumOutPipe +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + pHalData->OutEpQueueSel = 0; + pHalData->OutEpNumber = 0; + + switch (NumOutPipe) { + case 4: + pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ | TX_SELE_NQ | TX_SELE_EQ; + pHalData->OutEpNumber = 4; + break; + case 3: + pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ | TX_SELE_NQ; + pHalData->OutEpNumber = 3; + break; + case 2: + pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_NQ; + pHalData->OutEpNumber = 2; + break; + case 1: + pHalData->OutEpQueueSel = TX_SELE_HQ; + pHalData->OutEpNumber = 1; + break; + default: + break; + + } + RTW_INFO("%s OutEpQueueSel(0x%02x), OutEpNumber(%d)\n", __FUNCTION__, pHalData->OutEpQueueSel, pHalData->OutEpNumber); + +} + +static BOOLEAN HalUsbSetQueuePipeMapping8814AUsb( + IN PADAPTER pAdapter, + IN u8 NumInPipe, + IN u8 NumOutPipe +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN result = _FALSE; + + _ConfigChipOutEP_8814(pAdapter, NumOutPipe); + + // Normal chip with one IN and one OUT doesn't have interrupt IN EP. + if(1 == pHalData->OutEpNumber){ + if(1 != NumInPipe){ + return result; + } + } + + // All config other than above support one Bulk IN and one Interrupt IN. + //if(2 != NumInPipe){ + // return result; + //} + + result = Hal_MappingOutPipe(pAdapter, NumOutPipe); + + return result; + +} + +void rtl8814au_interface_configure(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); + + if (IS_SUPER_SPEED_USB(padapter)) + { + pHalData->UsbBulkOutSize = USB_SUPER_SPEED_BULK_SIZE;//1024 bytes + } + else if (IS_HIGH_SPEED_USB(padapter)) + { + pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes + } + else + { + pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes + } + + pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber; + +#ifdef CONFIG_USB_TX_AGGREGATION + pHalData->UsbTxAggMode = 1; + pHalData->UsbTxAggDescNum = 3; /* only 4 bits */ +#endif //CONFIG_USB_TX_AGGREGATION + +#ifdef CONFIG_USB_RX_AGGREGATION + pHalData->rxagg_mode = RX_AGG_DMA; //todo: change to USB_RX_AGG_DMA; + pHalData->rxagg_usb_size = 8; //unit : 512b + pHalData->rxagg_usb_timeout = 0x6; + pHalData->rxagg_dma_size = 16; //uint :128 b //0x0A; // 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize + pHalData->rxagg_dma_timeout = 0x6; //6, absolute time = 34ms/(2^6) + + if (IS_SUPER_SPEED_USB(padapter)) { + pHalData->rxagg_usb_size = 0x7; + pHalData->rxagg_usb_timeout = 0x1a; + } else { +#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER + u32 remainder = 0; + u8 quotient = 0; + + remainder = MAX_RECVBUF_SZ % (4 * 1024); + quotient = (u8)(MAX_RECVBUF_SZ >> 12); + + if (quotient > 5) { + pHalData->rxagg_usb_size = 0x5; + pHalData->rxagg_usb_timeout = 0x20; + } else { + if (remainder >= 2048) { + pHalData->rxagg_usb_size = quotient; + pHalData->rxagg_usb_timeout = 0x10; + } else { + pHalData->rxagg_usb_size = (quotient - 1); + pHalData->rxagg_usb_timeout = 0x10; + } + } +#else /* !CONFIG_PREALLOC_RX_SKB_BUFFER */ + //the setting to reduce RX FIFO overflow on USB2.0 and increase rx throughput + pHalData->rxagg_dma_size = 0x5; + pHalData->rxagg_usb_timeout = 0x20; +#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */ + } +#endif //CONFIG_USB_RX_AGGREGATION + + HalUsbSetQueuePipeMapping8814AUsb(padapter, + pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); + +} + +static VOID +_InitBurstPktLen(IN PADAPTER Adapter) +{ + u8 u1bTmp; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //yx_qi 131128 move to 0x1448, 144c + rtw_write32(Adapter, REG_FAST_EDCA_VOVI_SETTING_8814A, 0x08070807); //yx_qi 131128 + rtw_write32(Adapter, REG_FAST_EDCA_BEBK_SETTING_8814A, 0x08070807); //yx_qi 131128 + + u1bTmp = rtw_read8(Adapter, 0xff); //check device operation speed: SS 0xff bit7 + + if(u1bTmp & BIT7) //USB2/1.1 Mode + { + pHalData->bSupportUSB3 = FALSE; + } + else //USB3 Mode + { + pHalData->bSupportUSB3 = TRUE; + } + + if(pHalData->bSupportUSB3 == _FALSE) //USB2/1.1 Mode + { + if(pHalData->UsbBulkOutSize == 512) + { + //set burst pkt len=512B + rtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x1e); + } + else + { + //set burst pkt len=64B + rtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x2e); + } + + rtw_write16(Adapter, REG_RXDMA_AGG_PG_TH_8814A,0x2005); //dmc agg th 20K + } + else //USB3 Mode + { + //set burst pkt len=1k + rtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x0e); + rtw_write16(Adapter, REG_RXDMA_AGG_PG_TH_8814A,0x0a05); //dmc agg th 20K + + // set Reg 0xf008[3:4] to 2'00 to disable U1/U2 Mode to avoid 2.5G spur in USB3.0. added by page, 20120712 + rtw_write8(Adapter, 0xf008, rtw_read8(Adapter, 0xf008)&0xE7); + //to avoid usb 3.0 H2C fail + rtw_write16(Adapter, 0xf002, 0); + + rtw_write8(Adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8814A, rtw_read8(Adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8814A) & ~BIT(6)); + RTW_INFO("turn off the LDPC pre-TX\n"); + + } + + if(pHalData->AMPDUBurstMode) + { + rtw_write8(Adapter,REG_SW_AMPDU_BURST_MODE_CTRL_8814A, 0x5F); + } +} + + +VOID +_InitQueueReservedPage_8814AUsb( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 txpktbuf_bndy; + + RTW_INFO("===>_InitQueueReservedPage_8814AUsb()\n"); + + //---- Set Fifo page for each Queue under Mac Direct LPBK nonsec mode ------------// + rtw_write32(Adapter, REG_FIFOPAGE_INFO_1_8814A, HPQ_PGNUM_8814A); + rtw_write32(Adapter, REG_FIFOPAGE_INFO_2_8814A, LPQ_PGNUM_8814A); + rtw_write32(Adapter, REG_FIFOPAGE_INFO_3_8814A, NPQ_PGNUM_8814A); + rtw_write32(Adapter, REG_FIFOPAGE_INFO_4_8814A, EPQ_PGNUM_8814A); + + rtw_write32(Adapter, REG_FIFOPAGE_INFO_5_8814A, PUB_PGNUM_8814A); + + rtw_write32(Adapter, REG_RQPN_CTRL_2_8814A, 0x80000000); + + if(!pregistrypriv->wifi_spec) + txpktbuf_bndy = TX_PAGE_BOUNDARY_8814A; + else // for WMM + txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8814A; + + //Set page boundary and header + rtw_write16(Adapter,REG_TXPKTBUF_BCNQ_BDNY_8814A, txpktbuf_bndy); + rtw_write16(Adapter,REG_TXPKTBUF_BCNQ1_BDNY_8814A, txpktbuf_bndy); + rtw_write16(Adapter,REG_MGQ_PGBNDY_8814A, txpktbuf_bndy); + + //Set The head page of packet of Bcnq + rtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A, txpktbuf_bndy); + //The head page of packet of Bcnq1 + rtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A+2,txpktbuf_bndy); + + RTW_INFO("<===_InitQueueReservedPage_8814AUsb()\n"); +} + + +static u32 _InitPowerOn_8814AU(_adapter *padapter) +{ + int status = _SUCCESS; + u16 u2btmp=0; + + // YX sugguested 2014.06.03 + u8 u1btmp = rtw_read8(padapter, 0x10C2); + rtw_write8(padapter, 0x10C2, (u1btmp | BIT1)); + + if(!HalPwrSeqCmdParsing(padapter, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8814A_NIC_ENABLE_FLOW)) + return _FAIL; + + + // Enable MAC DMA/WMAC/SCHEDULE/SEC block + // Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31. + rtw_write16(padapter, REG_CR_8814A, 0x00); //suggseted by zhouzhou, by page, 20111230 + u2btmp = PlatformEFIORead2Byte(padapter, REG_CR_8814A); + u2btmp |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN + | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN); + rtw_write16(padapter, REG_CR_8814A, u2btmp); + + _InitQueueReservedPage_8814AUsb(padapter); + return status; +} + + + + + +//--------------------------------------------------------------- +// +// MAC init functions +// +//--------------------------------------------------------------- + +// Shall USB interface init this? +static VOID +_InitInterrupt_8814AU( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // HIMR + rtw_write32(Adapter, REG_HIMR0_8814A, pHalData->IntrMask[0]&0xFFFFFFFF); + rtw_write32(Adapter, REG_HIMR1_8814A, pHalData->IntrMask[1]&0xFFFFFFFF); +} + +static void _InitID_8814A(IN PADAPTER Adapter) +{ +// hal_init_macaddr(Adapter);//set mac_address + //rtw_restore_mac_addr(Adapter); +} + +static VOID +_InitPageBoundary_8814AUsb( + IN PADAPTER Adapter + ) +{ + //20130416 KaiYuan modified for 8814 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + rtw_write16(Adapter, REG_RXFF_PTR_8814A, RX_DMA_BOUNDARY_8814A); //yx_qi 20140331 + +} + + +static VOID +_InitNormalChipRegPriority_8814AUsb( + IN PADAPTER Adapter, + IN u16 beQ, + IN u16 bkQ, + IN u16 viQ, + IN u16 voQ, + IN u16 mgtQ, + IN u16 hiQ + ) +{ + u16 value16 = (PlatformEFIORead2Byte(Adapter, REG_TRXDMA_CTRL_8814A) & 0x7); + + value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | + _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | + _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ) | BIT2; + + rtw_write16(Adapter, REG_TRXDMA_CTRL_8814A, value16); +} + +static VOID +_InitNormalChipTwoOutEpPriority_8814AUsb( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; + + + u16 valueHi = 0; + u16 valueLow = 0; + + switch(pHalData->OutEpQueueSel) + { + case (TX_SELE_HQ | TX_SELE_LQ): + valueHi = QUEUE_HIGH; + valueLow = QUEUE_LOW; + break; + case (TX_SELE_NQ | TX_SELE_LQ): + valueHi = QUEUE_NORMAL; + valueLow = QUEUE_LOW; + break; + case (TX_SELE_HQ | TX_SELE_NQ): + valueHi = QUEUE_HIGH; + valueLow = QUEUE_NORMAL; + break; + default: + valueHi = QUEUE_HIGH; + valueLow = QUEUE_NORMAL; + break; + } + + if(!pregistrypriv->wifi_spec){ + beQ = valueLow; + bkQ = valueLow; + viQ = valueHi; + voQ = valueHi; + mgtQ = valueHi; + hiQ = valueHi; + } + else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE + beQ = valueLow; + bkQ = valueHi; + viQ = valueHi; + voQ = valueLow; + mgtQ = valueHi; + hiQ = valueHi; + } + + _InitNormalChipRegPriority_8814AUsb(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); +} + +static VOID +_InitNormalChipThreeOutEpPriority_8814AUsb( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; + + if(!pregistrypriv->wifi_spec){// typical setting + beQ = QUEUE_LOW; + bkQ = QUEUE_LOW; + viQ = QUEUE_NORMAL; + voQ = QUEUE_HIGH; + mgtQ = QUEUE_HIGH; + hiQ = QUEUE_HIGH; + } + else{// for WMM + beQ = QUEUE_LOW; + bkQ = QUEUE_NORMAL; + viQ = QUEUE_NORMAL; + voQ = QUEUE_HIGH; + mgtQ = QUEUE_HIGH; + hiQ = QUEUE_HIGH; + } + _InitNormalChipRegPriority_8814AUsb(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); +} + +static VOID +_InitQueuePriority_8814AUsb( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(pHalData->OutEpNumber) + { + case 2: + _InitNormalChipTwoOutEpPriority_8814AUsb(Adapter); + break; + case 3: + case 4: + _InitNormalChipThreeOutEpPriority_8814AUsb(Adapter); + break; + default: + RTW_INFO("_InitQueuePriority_8814AUsb(): Shall not reach here!\n"); + break; + } +} + + + +static VOID +_InitHardwareDropIncorrectBulkOut_8814A( + IN PADAPTER Adapter + ) +{ +#ifdef ENABLE_USB_DROP_INCORRECT_OUT + u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK); + value32 |= DROP_DATA_EN; + rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32); +#endif //ENABLE_USB_DROP_INCORRECT_OUT +} + +static VOID +_InitNetworkType_8814A( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_CR); + // TODO: use the other function to set network type + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); + + rtw_write32(Adapter, REG_CR, value32); +} + +static VOID +_InitTransferPageSize_8814AUsb( + IN PADAPTER Adapter + ) +{ + //8814 doesn't need this by Alex +} + +static VOID +_InitDriverInfoSize_8814A( + IN PADAPTER Adapter, + IN u8 drvInfoSize + ) +{ + rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize); +} +/* +static VOID +_InitWMACSetting_8814A( + IN PADAPTER Adapter + ) +{ + //u32 value32; + u16 value16; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; + pHalData->ReceiveConfig = + RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF; + +#if (1 == RTL8812A_RX_PACKET_INCLUDE_CRC) + pHalData->ReceiveConfig |= ACRC32; +#endif //(1 == RTL8812A_RX_PACKET_INCLUDE_CRC) + +#ifdef CONFIG_RX_PACKET_APPEND_FCS + pHalData->ReceiveConfig |= RCR_APPFCS; +#endif //CONFIG_RX_PACKET_APPEND_FCS + + pHalData->ReceiveConfig |= FORCEACK; + + // some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile() + rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); + + // Accept all multicast address + rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF); + rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF); + + + // Accept all data frames + //value16 = 0xFFFF; + //rtw_write16(Adapter, REG_RXFLTMAP2, value16); + + // 2010.09.08 hpfan + // Since ADF is removed from RCR, ps-poll will not be indicate to driver, + // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. + value16 = BIT10; +#ifdef CONFIG_BEAMFORMING + // NDPA packet subtype is 0x0101 + value16 |= BIT5; +#endif + rtw_write16(Adapter, REG_RXFLTMAP1, value16); + + // Accept all management frames + //value16 = 0xFFFF; + //rtw_write16(Adapter, REG_RXFLTMAP0, value16); + + //enable RX_SHIFT bits + //rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1)); + +} +*/ + +//old _InitWMACSetting_8812A + _InitAdaptiveCtrl_8812AUsb = new _InitMacConfigure_8814A +static VOID +_InitMacConfigure_8814A( + IN PADAPTER Adapter + ) +{ + u16 value16; + u32 regRRSR; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch (Adapter->registrypriv.wireless_mode) + { + case WIRELESS_11B: + regRRSR = RATE_ALL_CCK; + break; + + case WIRELESS_11G: + case WIRELESS_11A: + case WIRELESS_11_5N: + case WIRELESS_11A_5N://Todo: no basic rate for ofdm ? + case WIRELESS_11_5AC: + regRRSR = RATE_ALL_OFDM_AG; + break; + + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11_24N: + case WIRELESS_11BG_24N: + default: + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + + } + + // Init value for RRSR. + rtw_write32(Adapter, REG_RRSR, regRRSR); + + // Retry Limit + value16 = BIT_LRL(0x30) | BIT_SRL(0x30); + rtw_write16(Adapter, REG_RETRY_LIMIT, value16); + + pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF; + pHalData->ReceiveConfig |= FORCEACK; +#if (1 == RTL8812A_RX_PACKET_INCLUDE_CRC) + pHalData->ReceiveConfig |= ACRC32; +#endif //(1 == RTL8812A_RX_PACKET_INCLUDE_CRC) + +#ifdef CONFIG_RX_PACKET_APPEND_FCS + pHalData->ReceiveConfig |= RCR_APPFCS; +#endif //CONFIG_RX_PACKET_APPEND_FCS + rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); + + // 2010.09.08 hpfan + // Since ADF is removed from RCR, ps-poll will not be indicate to driver, + // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. + value16 = BIT10; +#ifdef CONFIG_BEAMFORMING + // NDPA packet subtype is 0x0101 + value16 |= BIT5; +#endif /*CONFIG_BEAMFORMING*/ + rtw_write16(Adapter, REG_RXFLTMAP1, value16); + + // 201409/25 MH When RA is enabled, we need to reduce the value. + rtw_write8(Adapter, REG_MAX_AGGR_NUM_8814A, 0x36); + rtw_write8(Adapter, REG_RTS_MAX_AGGR_NUM_8814A,0x36); + +} + +/* +static VOID +_InitAdaptiveCtrl_8812AUsb( + IN PADAPTER Adapter + ) +{ + u16 value16; + u32 value32; + + // Response Rate Set + value32 = rtw_read32(Adapter, REG_RRSR); + value32 &= ~RATE_BITMAP_ALL; + + if(Adapter->registrypriv.wireless_mode & WIRELESS_11B) + value32 |= RATE_RRSR_CCK_ONLY_1M; + else + value32 |= RATE_RRSR_WITHOUT_CCK; + + value32 |= RATE_RRSR_CCK_ONLY_1M; + rtw_write32(Adapter, REG_RRSR, value32); + + // CF-END Threshold + //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1); + + // SIFS (used in NAV) + value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); + rtw_write16(Adapter, REG_SPEC_SIFS, value16); + + // Retry Limit + value16 = _LRL(0x30) | _SRL(0x30); + rtw_write16(Adapter, REG_RL, value16); + +}*/ + +static VOID +_InitEDCA_8814AUsb( + IN PADAPTER Adapter + ) +{ + // Set Spec SIFS (used in NAV) + rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a); + rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a); + + // Set SIFS for CCK + rtw_write16(Adapter,REG_SIFS_CTX, 0x100a); + + // Set SIFS for OFDM + rtw_write16(Adapter,REG_SIFS_TRX, 0x100a); + + // TXOP + rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B); + rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F); + rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324); + rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226); + + // 0x50 for 80MHz clock + //rtw_write8(Adapter, REG_USTIME_TSF, 0x50); + //rtw_write8(Adapter, REG_USTIME_EDCA, 0x50); +} + + +static VOID +_InitBeaconMaxError_8814A( + IN PADAPTER Adapter, + IN BOOLEAN InfraMode + ) +{ +#ifdef CONFIG_ADHOC_WORKAROUND_SETTING + rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); +#else + //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10)); +#endif +} + + +#ifdef CONFIG_RTW_LED +static void _InitHWLed(PADAPTER Adapter) +{ + struct led_priv *pledpriv = adapter_to_led(Adapter); + + if( pledpriv->LedStrategy != HW_LED) + return; + +// HW led control +// to do .... +//must consider cases of antenna diversity/ commbo card/solo card/mini card + +} +#endif //CONFIG_LED + +/* +static VOID +_InitRDGSetting_8812A( + IN PADAPTER Adapter + ) +{ + rtw_write8(Adapter,REG_RD_CTRL,0xFF); + rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200); + rtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05); +}*/ + +static VOID +_InitRetryFunction_8814A( + IN PADAPTER Adapter + ) +{ + u8 value8; + + value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); + value8 |= EN_AMPDU_RTY_NEW; + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); + + // Set ACK timeout + //rtw_write8(Adapter, REG_ACKTO, 0x40); //masked by page for BCM IOT issue temporally + rtw_write8(Adapter, REG_ACKTO, 0x80); +} + +/*----------------------------------------------------------------------------- + * Function: usb_AggSettingTxUpdate() + * + * Overview: Seperate TX/RX parameters update independent for TP detection and + * dynamic TX/RX aggreagtion parameters update. + * + * Input: PADAPTER + * + * Output/Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Seperate to smaller function. + * + *---------------------------------------------------------------------------*/ +static VOID +usb_AggSettingTxUpdate_8814A( + IN PADAPTER Adapter + ) +{ +#ifdef CONFIG_USB_TX_AGGREGATION + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 value32; + + if(Adapter->registrypriv.wifi_spec) + pHalData->UsbTxAggDescNum = 1; + + if(pHalData->UsbTxAggMode){ + value32 = rtw_read32(Adapter, REG_TDECTRL); + value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); + value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); + + rtw_write32(Adapter, REG_TDECTRL, value32); + rtw_write8(Adapter, REG_TDECTRL+3, pHalData->UsbTxAggDescNum<<1); + } + +#endif //CONFIG_USB_TX_AGGREGATION +} // usb_AggSettingTxUpdate + + +/*----------------------------------------------------------------------------- + * Function: usb_AggSettingRxUpdate() + * + * Overview: Seperate TX/RX parameters update independent for TP detection and + * dynamic TX/RX aggreagtion parameters update. + * + * Input: PADAPTER + * + * Output/Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Seperate to smaller function. + * + *---------------------------------------------------------------------------*/ +static VOID +usb_AggSettingRxUpdate_8814A( + IN PADAPTER Adapter + ) +{ +#ifdef CONFIG_USB_RX_AGGREGATION + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 valueDMA; + u8 valueUSB; + + valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL_8814A); + valueUSB = rtw_read8(Adapter, REG_RXDMA_AGG_PG_TH_8814A+3); + switch(pHalData->rxagg_mode) + { + case RX_AGG_DMA: + valueDMA |= RXDMA_AGG_EN; + valueUSB &= ~USB_AGG_EN_8814A; //yx_qi 131128 + break; + case RX_AGG_USB: + valueDMA &= ~RXDMA_AGG_EN; + valueUSB |= USB_AGG_EN_8814A; + break; + case RX_AGG_MIX: + valueDMA |= RXDMA_AGG_EN; + valueUSB |= USB_AGG_EN_8814A; + break; + case RX_AGG_DISABLE: + default: + valueDMA &= ~RXDMA_AGG_EN; + valueUSB &= ~USB_AGG_EN_8814A; + break; + } + + rtw_write8(Adapter, REG_TRXDMA_CTRL_8814A, valueDMA); + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH_8814A+3, valueUSB); //yx_qi 131128 +#endif //CONFIG_USB_RX_AGGREGATION +} // usb_AggSettingRxUpdate + +static VOID +init_UsbAggregationSetting_8814A( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Tx aggregation setting + usb_AggSettingTxUpdate_8814A(Adapter); + + // Rx aggregation setting + usb_AggSettingRxUpdate_8814A(Adapter); + + // 201/12/10 MH Add for USB agg mode dynamic switch. + pHalData->UsbRxHighSpeedMode = _FALSE; + pHalData->UsbTxVeryHighSpeedMode = _FALSE; +} + +/*----------------------------------------------------------------------------- + * Function: USB_AggModeSwitch() + * + * Overview: When RX traffic is more than 40M, we need to adjust some parameters to increase + * RX speed by increasing batch indication size. This will decrease TCP ACK speed, we + * need to monitor the influence of FTP/network share. + * For TX mode, we are still ubder investigation. + * + * Input: PADAPTER + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +USB_AggModeSwitch( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + //pHalData->UsbRxHighSpeedMode = _FALSE; + // How to measure the RX speed? We assume that when traffic is more than + if (pMgntInfo->bRegAggDMEnable == _FALSE) + { + return; // Inf not support. + } + + + if (pMgntInfo->LinkDetectInfo.bHigherBusyRxTraffic == _TRUE && + pHalData->UsbRxHighSpeedMode == _FALSE) + { + pHalData->UsbRxHighSpeedMode = _TRUE; + RT_TRACE(COMP_INIT, DBG_LOUD, ("UsbAggModeSwitchCheck to HIGH\n")); + } + else if (pMgntInfo->LinkDetectInfo.bHigherBusyRxTraffic == _FALSE && + pHalData->UsbRxHighSpeedMode == _TRUE) + { + pHalData->UsbRxHighSpeedMode = _FALSE; + RT_TRACE(COMP_INIT, DBG_LOUD, ("UsbAggModeSwitchCheck to LOW\n")); + } + else + { + return; + } + + +#if USB_RX_AGGREGATION_92C + if (pHalData->UsbRxHighSpeedMode == _TRUE) + { + // 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator. + // USB mode +#if (RT_PLATFORM == PLATFORM_LINUX) + if (pMgntInfo->LinkDetectInfo.bTxBusyTraffic) + { + pHalData->RxAggBlockCount = 16; + pHalData->RxAggBlockTimeout = 7; + } + else +#endif + { + pHalData->RxAggBlockCount = 40; + pHalData->RxAggBlockTimeout = 5; + } + // Mix mode + pHalData->RxAggPageCount = 72; + pHalData->RxAggPageTimeout = 6; + } + else + { + // USB mode + pHalData->RxAggBlockCount = pMgntInfo->RegRxAggBlockCount; + pHalData->RxAggBlockTimeout = pMgntInfo->RegRxAggBlockTimeout; + // Mix mode + pHalData->RxAggPageCount = pMgntInfo->RegRxAggPageCount; + pHalData->RxAggPageTimeout = pMgntInfo->RegRxAggPageTimeout; + } + + if (pHalData->RxAggBlockCount > MAX_RX_AGG_BLKCNT) + pHalData->RxAggBlockCount = MAX_RX_AGG_BLKCNT; +#if (OS_WIN_FROM_VISTA(OS_VERSION)) || (RT_PLATFORM == PLATFORM_LINUX) // do not support WINXP to prevent usbehci.sys BSOD + if (IS_WIRELESS_MODE_N_24G(Adapter) || IS_WIRELESS_MODE_N_5G(Adapter)) + { + // + // 2010/12/24 MH According to V1012 QC IOT test, XP BSOD happen when running chariot test + // with the aggregation dynamic change!! We need to disable the function to prevent it is broken + // in usbehci.sys. + // + usb_AggSettingRxUpdate_8188E(Adapter); + + // 2010/12/27 MH According to designer's suggstion, we can only modify Timeout value. Otheriwse + // there might many HW incorrect behavior, the XP BSOD at usbehci.sys may be relative to the + // issue. Base on the newest test, we can not enable block cnt > 30, otherwise XP usbehci.sys may + // BSOD. + } +#endif + +#endif +#endif +} // USB_AggModeSwitch + +static VOID +_InitOperationMode_8814A( + IN PADAPTER Adapter + ) +{ +#if 0//gtest + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 regBwOpMode = 0; + u32 regRATR = 0, regRRSR = 0; + + + //1 This part need to modified according to the rate set we filtered!! + // + // Set RRSR, RATR, and REG_BWOPMODE registers + // + switch(Adapter->RegWirelessMode) + { + case WIRELESS_MODE_B: + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK; + regRRSR = RATE_ALL_CCK; + break; + case WIRELESS_MODE_A: + regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ; + regRATR = RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_G: + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_AUTO: + if (Adapter->bInHctTest) + { + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + } + else + { + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + } + break; + case WIRELESS_MODE_N_24G: + // It support CCK rate by default. + // CCK rate will be filtered out only when associated AP does not support it. + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_N_5G: + regBwOpMode = BW_OPMODE_5G; + regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_OFDM_AG; + break; + + default: //for MacOSX compiler warning. + break; + } + + // Ziv ???????? + //rtw_write32(Adapter, REG_INIRTS_RATE_SEL, regRRSR); + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); +#endif +} + +/* +// Set CCK and OFDM Block "ON" +static VOID _BBTurnOnBlock( + IN PADAPTER Adapter + ) +{ +#if (DISABLE_BB_RF) + return; +#endif + + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1); +} + + +static VOID _RfPowerSave( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u8 eRFPath; + +#if (DISABLE_BB_RF) + return; +#endif + + if(pMgntInfo->RegRfOff == _TRUE){ // User disable RF via registry. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n")); + MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW); + // Those action will be discard in MgntActSet_RF_State because off the same state + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + PHY_SetRFReg(Adapter, eRFPath, 0x4, 0xC00, 0x0); + } + else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason)); + MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason); + } + else{ + pHalData->eRFPowerState = eRfOn; + pMgntInfo->RfOffReason = 0; + if(Adapter->bInSetPower || Adapter->bResetInProgress) + PlatformUsbEnableInPipes(Adapter); + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): RF is on.\n")); + } +#endif +} +*/ +enum { + Antenna_Lfet = 1, + Antenna_Right = 2, +}; + +static VOID +_InitAntenna_Selection_8814A(IN PADAPTER Adapter) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(pHalData->AntDivCfg==0) + return; +/* + RTW_INFO("==> %s ....\n",__FUNCTION__); + + rtw_write8(Adapter, REG_LEDCFG2, 0x82); + + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + + if(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == MAIN_ANT) + pHalData->CurAntenna = MAIN_ANT; + else + pHalData->CurAntenna = AUX_ANT; + RTW_INFO("%s,Cur_ant:(%x)%s\n",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == MAIN_ANT)?"MAIN_ANT":"AUX_ANT"); + +*/ +} + +// +// 2010/08/26 MH Add for selective suspend mode check. +// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and +// slim card. +// +static VOID +HalDetectSelectiveSuspendMode( + IN PADAPTER Adapter + ) +{ +#if 0 + u8 tmpvalue; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter); + + // If support HW radio detect, we need to enable WOL ability, otherwise, we + // can not use FW to notify host the power state switch. + + EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue); + + DBG_8192C("HalDetectSelectiveSuspendMode(): SS "); + if(tmpvalue & BIT1) + { + DBG_8192C("Enable\n"); + } + else + { + DBG_8192C("Disable\n"); + pdvobjpriv->RegUsbSS = _FALSE; + } + + // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode. + if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData)) + { + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + //if (!pMgntInfo->bRegDongleSS) + //{ + // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n")); + pdvobjpriv->RegUsbSS = _FALSE; + //} + } +#endif +} // HalDetectSelectiveSuspendMode + +static rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ) +{ + rt_rf_power_state rfpowerstate = rf_on; + + return rfpowerstate; +} // HalDetectPwrDownMode + +static void _ps_open_RF(_adapter *padapter) { + //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified + //phy_SsPwrSwitch92CU(padapter, rf_on, 1); +} + +static void _ps_close_RF(_adapter *padapter){ + //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified + //phy_SsPwrSwitch92CU(padapter, rf_off, 1); +} + + +/* A lightweight deinit function */ +static void rtl8814au_hw_reset(_adapter *Adapter) +{ +#if 0 + u8 reg_val=0; + if(rtw_read8(Adapter, REG_MCUFWDL)&BIT7) + { + _8051Reset8812(Adapter); + rtw_write8(Adapter, REG_MCUFWDL, 0x00); + //before BB reset should do clock gated + rtw_write32(Adapter, rFPGA0_XCD_RFPara, + rtw_read32(Adapter, rFPGA0_XCD_RFPara)|(BIT6)); + //reset BB + reg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN); + reg_val &= ~(BIT(0) | BIT(1)); + rtw_write8(Adapter, REG_SYS_FUNC_EN, reg_val); + //reset RF + rtw_write8(Adapter, REG_RF_CTRL, 0); + //reset TRX path + rtw_write16(Adapter, REG_CR, 0); + //reset MAC + reg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); + reg_val |= BIT(1); + reg_val = rtw_write8(Adapter, REG_APS_FSMCO+1, reg_val); //reg0x5[1] ,auto FSM off + + reg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); + + //check if reg0x5[1] auto cleared + while(reg_val & BIT(1)){ + rtw_udelay_os(1); + reg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); + } + reg_val |= BIT(0); + reg_val = rtw_write8(Adapter, REG_APS_FSMCO+1, reg_val); //reg0x5[0] ,auto FSM on + + reg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + reg_val &= ~(BIT(4) | BIT(7)); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, reg_val); + reg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + reg_val |= BIT(4) | BIT(7); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, reg_val); + } +#endif //0 +} + +u32 rtl8814au_hal_init(PADAPTER Adapter) +{ + u8 value8 = 0, u1bRegCR; + u16 value16; + u8 txpktbuf_bndy; + u32 status = _SUCCESS; + u32 NavUpper = WiFiNavUpperUs; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + + rt_rf_power_state eRfPowerStateToSet; + + u32 init_start_time = rtw_get_current_time(); + + +#ifdef DBG_HAL_INIT_PROFILING + + enum HAL_INIT_STAGES { + HAL_INIT_STAGES_BEGIN = 0, + HAL_INIT_STAGES_INIT_PW_ON, + HAL_INIT_STAGES_INIT_LLTT, + HAL_INIT_STAGES_DOWNLOAD_FW, + HAL_INIT_STAGES_MAC, + HAL_INIT_STAGES_MISC01, + HAL_INIT_STAGES_MISC02, + HAL_INIT_STAGES_BB, + HAL_INIT_STAGES_RF, + HAL_INIT_STAGES_TURN_ON_BLOCK, + HAL_INIT_STAGES_INIT_SECURITY, + HAL_INIT_STAGES_MISC11, + HAL_INIT_STAGES_INIT_HAL_DM, + //HAL_INIT_STAGES_RF_PS, + HAL_INIT_STAGES_IQK, + HAL_INIT_STAGES_PW_TRACK, + HAL_INIT_STAGES_LCK, + HAL_INIT_STAGES_MISC21, + //HAL_INIT_STAGES_INIT_PABIAS, + #ifdef CONFIG_BT_COEXIST + HAL_INIT_STAGES_BT_COEXIST, + #endif + //HAL_INIT_STAGES_ANTENNA_SEL, + HAL_INIT_STAGES_MISC31, + HAL_INIT_STAGES_END, + HAL_INIT_STAGES_NUM + }; + + char * hal_init_stages_str[] = { + "HAL_INIT_STAGES_BEGIN", + "HAL_INIT_STAGES_INIT_PW_ON", + "HAL_INIT_STAGES_INIT_LLTT", + "HAL_INIT_STAGES_DOWNLOAD_FW", + "HAL_INIT_STAGES_MAC", + "HAL_INIT_STAGES_MISC01", + "HAL_INIT_STAGES_MISC02", + "HAL_INIT_STAGES_BB", + "HAL_INIT_STAGES_RF", + "HAL_INIT_STAGES_TURN_ON_BLOCK", + "HAL_INIT_STAGES_INIT_SECURITY", + "HAL_INIT_STAGES_MISC11", + "HAL_INIT_STAGES_INIT_HAL_DM", + //"HAL_INIT_STAGES_RF_PS", + "HAL_INIT_STAGES_IQK", + "HAL_INIT_STAGES_PW_TRACK", + "HAL_INIT_STAGES_LCK", + "HAL_INIT_STAGES_MISC21", + #ifdef CONFIG_BT_COEXIST + "HAL_INIT_STAGES_BT_COEXIST", + #endif + //"HAL_INIT_STAGES_ANTENNA_SEL", + "HAL_INIT_STAGES_MISC31", + "HAL_INIT_STAGES_END", + }; + + int hal_init_profiling_i; + u32 hal_init_stages_timestamp[HAL_INIT_STAGES_NUM]; //used to record the time of each stage's starting point + + for(hal_init_profiling_i=0;hal_init_profiling_ibkeepfwalive) + { + _ps_open_RF(Adapter); + + if(pHalData->bIQKInitialized){ + //PHY_IQCalibrate_8812A(Adapter,_TRUE); + } + else + { + //PHY_IQCalibrate_8812A(Adapter,_FALSE); + //pHalData->bIQKInitialized = _TRUE; + } + + //ODM_TXPowerTrackingCheck(&pHalData->odmpriv ); + //PHY_LCCalibrate_8812A(Adapter); + + goto exit; + } + + // Check if MAC has already power on. by tynli. 2011.05.27. + value8 = rtw_read8(Adapter, REG_SYS_CLKR+1); + u1bRegCR = rtw_read8(Adapter, REG_CR); + RTW_INFO(" power-on :REG_SYS_CLKR 0x09=0x%02x. REG_CR 0x100=0x%02x.\n", value8, u1bRegCR); + if((value8&BIT3) && (u1bRegCR != 0 && u1bRegCR != 0xEA)) + { + //pHalData->bMACFuncEnable = _TRUE; + RTW_INFO(" MAC has already power on.\n"); + } + else + { + //pHalData->bMACFuncEnable = _FALSE; + // Set FwPSState to ALL_ON mode to prevent from the I/O be return because of 32k + // state which is set before sleep under wowlan mode. 2012.01.04. by tynli. + //pHalData->FwPSState = FW_PS_STATE_ALL_ON_88E; + RTW_INFO(" MAC has not been powered on yet.\n"); + } + + // + // 2012/11/13 MH Revise for U2/U3 switch we can not update RF-A/B reset. + // After discuss with BB team YN, reset after MAC power on to prevent RF + // R/W error. Is it a right method? + // + /*if(!IS_HARDWARE_TYPE_8821(Adapter)) + { + rtw_write8(Adapter, REG_RF_CTRL, 5); + rtw_write8(Adapter, REG_RF_CTRL, 7); + rtw_write8(Adapter, REG_RF_B_CTRL_8812, 5); + rtw_write8(Adapter, REG_RF_B_CTRL_8812, 7); + }*/ + +/* + If HW didn't go through a complete de-initial procedure, + it probably occurs some problem for double initial procedure. + Like "CONFIG_DEINIT_BEFORE_INIT" in 92du chip +*/ + rtl8814au_hw_reset(Adapter); //todo + + + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON); + status = _InitPowerOn_8814AU(Adapter); + if(status == _FAIL){ + RTW_INFO("Failed to init power on!\n"); + goto exit; + } + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT); + + status = InitLLTTable8814A(Adapter); + if(status == _FAIL){ + RTW_INFO("Failed to init LLT table\n"); + goto exit; + } + + _InitHardwareDropIncorrectBulkOut_8814A(Adapter); + + /*if(pHalData->bRDGEnable){ + _InitRDGSetting_8812A(Adapter); + }*/ + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW); + if (Adapter->registrypriv.mp_mode == 0) { + status = FirmwareDownload8814A(Adapter, _FALSE); + if (status != _SUCCESS) { + RTW_INFO("%s: Download Firmware failed!!\n", __FUNCTION__); + GET_HAL_DATA(Adapter)->bFWReady = _FALSE; + pHalData->fw_ractrl = _FALSE; + //return status; + } else { + RTW_INFO("%s: Download Firmware Success!!\n",__FUNCTION__); + GET_HAL_DATA(Adapter)->bFWReady = _TRUE; + pHalData->fw_ractrl = _TRUE; + } + } + + InitializeFirmwareVars8814(Adapter); + + if(pwrctrlpriv->reg_rfoff == _TRUE){ + pwrctrlpriv->rf_pwrstate = rf_off; + } + + // 2010/08/09 MH We need to check if we need to turnon or off RF after detecting + // HW GPIO pin. Before PHY_RFConfig8192C. + //HalDetectPwrDownMode(Adapter); + // 2010/08/26 MH If Efuse does not support sective suspend then disable the function. + //HalDetectSelectiveSuspendMode(Adapter); + + // Save target channel + // Current Channel will be updated again later. + pHalData->current_channel = 0;//set 0 to trigger switch correct channel + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MAC); +#if (HAL_MAC_ENABLE == 1) + status = PHY_MACConfig8814(Adapter); + if(status == _FAIL) + { + goto exit; + } +#endif //HAL_MAC_ENABLE + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01); + + _InitQueuePriority_8814AUsb(Adapter); + _InitPageBoundary_8814AUsb(Adapter); + + _InitTransferPageSize_8814AUsb(Adapter); + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02); + // Get Rx PHY status in order to report RSSI and others. + _InitDriverInfoSize_8814A(Adapter, DRVINFO_SZ); + + _InitInterrupt_8814AU(Adapter); + _InitID_8814A(Adapter);//set mac_address + _InitNetworkType_8814A(Adapter);//set msr + _InitMacConfigure_8814A(Adapter); + //_InitWMACSetting_8814A(Adapter); + //_InitAdaptiveCtrl_8814AUsb(Adapter); + _InitEDCA_8814AUsb(Adapter); + + _InitRetryFunction_8814A(Adapter); + init_UsbAggregationSetting_8814A(Adapter); + //_InitOperationMode_8814A(Adapter);//todo + _InitBeaconParameters_8814A(Adapter); + _InitBeaconMaxError_8814A(Adapter, _TRUE); + + _InitBurstPktLen(Adapter); //added by page. 20110919 + + // + // Init CR MACTXEN, MACRXEN after setting RxFF boundary REG_TRXFF_BNDY to patch + // Hw bug which Hw initials RxFF boundry size to a value which is larger than the real Rx buffer size in 88E. + // 2011.08.05. by tynli. + // + value8 = rtw_read8(Adapter, REG_CR); + rtw_write8(Adapter, REG_CR, (value8|MACTXEN|MACRXEN)); + +#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI) + +#ifdef CONFIG_CHECK_AC_LIFETIME + // Enable lifetime check for the four ACs + rtw_write8(Adapter, REG_LIFETIME_CTRL, 0x0F); +#endif // CONFIG_CHECK_AC_LIFETIME + +#ifdef CONFIG_TX_MCAST2UNI + rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); // unit: 256us. 256ms + rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); // unit: 256us. 256ms +#else // CONFIG_TX_MCAST2UNI + rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x3000); // unit: 256us. 3s + rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x3000); // unit: 256us. 3s +#endif // CONFIG_TX_MCAST2UNI +#endif // CONFIG_CONCURRENT_MODE || CONFIG_TX_MCAST2UNI + + +#ifdef CONFIG_RTW_LED + _InitHWLed(Adapter); +#endif //CONFIG_LED + + // + //d. Initialize BB related configurations. + // + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BB); +#if (HAL_BB_ENABLE == 1) + status = PHY_BBConfig8814(Adapter); + if(status == _FAIL) + { + goto exit; + } +#endif //HAL_BB_ENABLE + + // 92CU use 3-wire to r/w RF + //pHalData->Rf_Mode = RF_OP_By_SW_3wire; + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_RF); +#if (HAL_RF_ENABLE == 1) + status = PHY_RFConfig8814A(Adapter); + if(status == _FAIL) + { + goto exit; + } + + //todo: + //if(pHalData->rf_type == RF_1T1R && IS_HARDWARE_TYPE_8812AU(Adapter)) + //PHY_BB8812_Config_1T(Adapter); +#endif + + PHY_ConfigBB_8814A(Adapter); + + if(Adapter->registrypriv.channel <= 14) + PHY_SwitchWirelessBand8814A(Adapter, BAND_ON_2_4G); + else + PHY_SwitchWirelessBand8814A(Adapter, BAND_ON_5G); + + rtw_hal_set_chnl_bw(Adapter, Adapter->registrypriv.channel, + CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HAL_PRIME_CHNL_OFFSET_DONT_CARE); + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_TURN_ON_BLOCK); + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_SECURITY); + invalidate_cam_all(Adapter); + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC11); + _InitAntenna_Selection_8814A(Adapter); + + // HW SEQ CTRL + //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. + rtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF); + + // + // Disable BAR, suggested by Scott + // 2010.04.09 add by hpfan + // + rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff); + + rtw_write8(Adapter,REG_SECONDARY_CCA_CTRL_8814A,0x03); + + if(pregistrypriv->wifi_spec) + rtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0); + //adjust EDCCA to avoid collision + /*if(pregistrypriv->wifi_spec) + { + rtw_write16(Adapter, rEDCCA_Jaguar, 0xfe01); + }*/ + //Nav limit , suggest by scott + rtw_write8(Adapter, 0x652, 0x0); + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM); + rtl8814_InitHalDm(Adapter); + + // + // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status + // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not + // call init_adapter. May cause some problem?? + // + // Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed + // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState + // is the same as eRfOff, we should change it to eRfOn after we config RF parameters. + // Added by tynli. 2010.03.30. + pwrctrlpriv->rf_pwrstate = rf_on; + + PHY_IQCalibrate_8814A_Init(&pHalData->odmpriv); + +#if (HAL_BB_ENABLE == 1) + PHY_SetRFEReg8814A(Adapter, _TRUE, pHalData->current_band_type); +#endif //HAL_BB_ENABLE + + //0x4c6[3] 1: RTS BW = Data BW + //0: RTS BW depends on CCA / secondary CCA result. + rtw_write8(Adapter, REG_QUEUE_CTRL, rtw_read8(Adapter, REG_QUEUE_CTRL)&0xF7); + + rtw_hal_set_hwreg(Adapter, HW_VAR_NAV_UPPER, ((u8 *)&NavUpper)); + + // enable Tx report. + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+1, 0x0F); + + // Suggested by SD1 pisa. Added by tynli. 2011.10.21. + //rtw_write8(Adapter, REG_EARLY_MODE_CONTROL_8812+3, 0x01);//Pretx_en, for WEP/TKIP SEC + + //tynli_test_tx_report. + //rtw_write16(Adapter, REG_TX_RPT_TIME, 0x3DF0); + + // Reset USB mode switch setting + rtw_write8(Adapter, REG_SDIO_CTRL_8814A, 0x0); + rtw_write8(Adapter, REG_ACLK_MON, 0x0); + + //RT_TRACE(COMP_INIT, DBG_TRACE, ("InitializeAdapter8188EUsb() <====\n")); + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK); + // 2010/08/26 MH Merge from 8192CE. + if(pwrctrlpriv->rf_pwrstate == rf_on) + { +/* if(IS_HARDWARE_TYPE_8812AU(Adapter)) + { +#if (RTL8812A_SUPPORT == 1) + pHalData->bNeedIQK = _TRUE; + if(pHalData->bIQKInitialized) + PHY_IQCalibrate_8812A(Adapter, _TRUE); + else + { + PHY_IQCalibrate_8812A(Adapter, _FALSE); + pHalData->bIQKInitialized = _TRUE; + } +#endif + }*/ + //this should be done by rf team using phydm code + //PHY_IQCalibrate_8814A(&pHalData->odmpriv, _FALSE); +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_PW_TRACK); + + //ODM_TXPowerTrackingCheck(&pHalData->odmpriv ); + + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_LCK); + //PHY_LCCalibrate_8812A(Adapter); + } + + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC21); + + +//HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PABIAS); +// _InitPABias(Adapter); +#if (MP_DRIVER == 1) + if (Adapter->registrypriv.mp_mode == 1) + { + Adapter->mppriv.channel = pHalData->current_channel; + MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel); + } +#endif //#if (MP_DRIVER == 1) + +#ifdef CONFIG_BT_COEXIST +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BT_COEXIST); + //_InitBTCoexist(Adapter); + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter + // suspend mode automatically. + //HwSuspendModeEnable92Cu(Adapter, _FALSE); + + if ( _TRUE == pHalData->EEPROMBluetoothCoexist) + { + // Init BT hw config. + rtw_btcoex_HAL_Initialize(Adapter, _FALSE); + } + else + { + // In combo card run wifi only , must setting some hardware reg. + rtl8812a_combo_card_WifiOnlyHwInit(Adapter); + } +#endif //CONFIG_BT_COEXIST + +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31); + + //rtw_write8(Adapter, REG_USB_HRPWM, 0); + +#ifdef CONFIG_XMIT_ACK + //ack for xmit mgmt frames. + rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_CTRL)|BIT(12)); +#endif //CONFIG_XMIT_ACK + + //misc + { + int i; + u8 mac_addr[6]; + for(i=0; i<6; i++) + { +#ifdef CONFIG_CONCURRENT_MODE + if(Adapter->iface_type == IFACE_PORT1) + mac_addr[i] = rtw_read8(Adapter, REG_MACID1+i); + else +#endif + mac_addr[i] = rtw_read8(Adapter, REG_MACID+i); + } + + RTW_INFO("MAC Address from REG_MACID = "MAC_FMT"\n", MAC_ARG(mac_addr)); + } + +exit: +HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END); + + RTW_INFO("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time)); + + #ifdef DBG_HAL_INIT_PROFILING + hal_init_stages_timestamp[HAL_INIT_STAGES_END]=rtw_get_current_time(); + + for(hal_init_profiling_i=0;hal_init_profiling_ibFWReady = _FALSE; + +} + +static void rtl8814au_hw_power_down(_adapter *padapter) +{ + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. + + // Enable register area 0x0-0xc. + rtw_write8(padapter,REG_RSV_CTRL, 0x0); + rtw_write16(padapter, REG_APS_FSMCO, 0x8812); +} + +u32 rtl8814au_hal_deinit(PADAPTER Adapter) + { + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + RTW_INFO("==> %s \n",__FUNCTION__); + +#ifdef CONFIG_BT_COEXIST + if (hal_btcoex_IsBtExist(Adapter)) + { + RTW_INFO("BT module enable SIC\n"); + // Only under WIN7 we can support selective suspend and enter D3 state when system call halt adapter. + + //rtw_write16(Adapter, REG_GPIO_MUXCFG, rtw_read16(Adapter, REG_GPIO_MUXCFG)|BIT12); + // 2010/10/13 MH If we enable SIC in the position and then call _ResetDigitalProcedure1. in XP, + // the system will hang due to 8051 reset fail. + } + else +#endif //CONFIG_BT_COEXIST + { + rtw_write16(Adapter, REG_GPIO_MUXCFG, rtw_read16(Adapter, REG_GPIO_MUXCFG)&(~BIT12)); + } + + if(pHalData->bSupportUSB3 == _TRUE) + { + // set Reg 0xf008[3:4] to 2'11 to eable U1/U2 Mode in USB3.0. added by page, 20120712 + rtw_write8(Adapter, 0xf008, rtw_read8(Adapter, 0xf008)|0x18); + } + + rtw_write32(Adapter, REG_HISR, 0xFFFFFFFF); + rtw_write32(Adapter, REG_HISRE, 0xFFFFFFFF); + rtw_write32(Adapter, REG_HIMR, 0); + rtw_write32(Adapter, REG_HIMRE, 0); + + #ifdef SUPPORT_HW_RFOFF_DETECTED + RTW_INFO("bkeepfwalive(%x)\n", pwrctl->bkeepfwalive); + if(pwrctl->bkeepfwalive) + { + _ps_close_RF(Adapter); + if((pwrctl->bHWPwrPindetect) && (pwrctl->bHWPowerdown)) + rtl8814au_hw_power_down(Adapter); + } + else +#endif + { + if (rtw_is_hw_init_completed(Adapter)) { + hal_carddisable_8814(Adapter); + + if((pwrctl->bHWPwrPindetect ) && (pwrctl->bHWPowerdown)) + rtl8814au_hw_power_down(Adapter); + } + } + return _SUCCESS; + } + + +unsigned int rtl8814au_inirp_init(PADAPTER Adapter) +{ + u8 i; + struct recv_buf *precvbuf; + uint status; + struct dvobj_priv *pdev= adapter_to_dvobj(Adapter); + struct intf_hdl * pintfhdl=&Adapter->iopriv.intf; + struct recv_priv *precvpriv = &(Adapter->recvpriv); + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); +#endif + + _read_port = pintfhdl->io_ops._read_port; + + status = _SUCCESS; + + RTW_INFO("===> usb_inirp_init \n"); + + precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR; + + //issue Rx irp to receive data + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + for(i=0; iff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE ) + { + RTW_ERR("usb_rx_init: usb_read_port error \n"); + status = _FAIL; + goto exit; + } + + precvbuf++; + precvpriv->free_recv_buf_queue_cnt--; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + if (pdev->RtInPipe[REALTEK_USB_IN_INT_EP_IDX] != 0x05) { + status = _FAIL; + RTW_INFO("%s =>Warning !! Have not USB Int-IN pipe, RtIntInPipe(%d)!!!\n", __func__, pdev->RtInPipe[REALTEK_USB_IN_INT_EP_IDX]); + goto exit; + } + _read_interrupt = pintfhdl->io_ops._read_interrupt; + if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE ) + { + RTW_ERR("usb_rx_init: usb_read_interrupt error \n"); + status = _FAIL; + } +#endif + +exit: + + RTW_INFO("<=== usb_inirp_init \n"); + + return status; + +} + +unsigned int rtl8814au_inirp_deinit(PADAPTER Adapter) +{ + RTW_INFO("\n ===> usb_rx_deinit \n"); + + rtw_read_port_cancel(Adapter); + + RTW_INFO("\n <=== usb_rx_deinit \n"); + + return _SUCCESS; +} + +//------------------------------------------------------------------- +// +// EEPROM/EFUSE Content Parsing +// +//------------------------------------------------------------------- +VOID +hal_ReadIDs_8814AU( + IN PADAPTER Adapter, + IN pu1Byte PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if( !AutoloadFail ) + { + pHalData->EEPROMVID = EF2Byte( *(pu2Byte)&PROMContent[EEPROM_VID_8814AU] ); + pHalData->EEPROMPID = EF2Byte( *(pu2Byte)&PROMContent[EEPROM_PID_8814AU] ); + + // Customer ID, 0x00 and 0xff are reserved for Realtek. + pHalData->EEPROMCustomerID = *(pu1Byte)&PROMContent[EEPROM_CustomID_8814]; + pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; + } + else + { + pHalData->EEPROMVID = EEPROM_Default_VID; + pHalData->EEPROMPID = EEPROM_Default_PID; + + // Customer ID, 0x00 and 0xff are reserved for Realtek. + pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID; + pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; + } + + RTW_INFO("VID = 0x%04X, PID = 0x%04X\n", pHalData->EEPROMVID, pHalData->EEPROMPID); + RTW_INFO("Customer ID: 0x%02X, SubCustomer ID: 0x%02X\n", pHalData->EEPROMCustomerID, pHalData->EEPROMSubCustomerID); +} + +VOID +hal_InitPGData_8814A( + IN PADAPTER padapter, + IN OUT u8* PROMContent + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u32 i; + u16 value16; + + if(_FALSE == pHalData->bautoload_fail_flag) + { // autoload OK. + // hal_ReadeFuse_8814A is FW offload read efuse, todo + //#if ((DEV_BUS_TYPE==RT_USB_INTERFACE || DEV_BUS_TYPE==RT_SDIO_INTERFACE)) && (MP_DRIVER != 1) + //if(hal_ReadeFuse_8814A(pAdapter) == _FAIL) + //#endif + + // Read EFUSE real map to shadow. + EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); + } + else + {//autoload fail + RTW_INFO("AutoLoad Fail reported from CR9346!!\n"); + //update to default value 0xFF + EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); + } + +#ifdef CONFIG_EFUSE_CONFIG_FILE + if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) { + if (Hal_readPGDataFromConfigFile(padapter) != _SUCCESS) + RTW_ERR("invalid phy efuse and read from file fail, will use driver default!!\n"); + } +#endif +} + +VOID +hal_CustomizedBehavior_8814AU( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct led_priv *pledpriv = adapter_to_led(Adapter); + + + // Led mode + switch(pHalData->CustomerID) + { + case RT_CID_DEFAULT: + pledpriv->LedStrategy = SW_LED_MODE9; +#ifdef CONFIG_RTW_SW_LED + pledpriv->bRegUseLed = _TRUE; +#endif + break; + + default: + pledpriv->LedStrategy = SW_LED_MODE9; + break; + } +} + +static void +hal_CustomizeByCustomerID_8814AU( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + RTW_INFO("PID= 0x%x, VID= %x\n",pHalData->EEPROMPID,pHalData->EEPROMVID); + + // Decide CustomerID according to VID/DID or EEPROM + switch(pHalData->EEPROMCustomerID) + { + case EEPROM_CID_DEFAULT: + if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x0BFF) && (pHalData->EEPROMPID == 0x8160)) + { + pHalData->CustomerID = RT_CID_CHINA_MOBILE; + } + else if((pHalData->EEPROMVID == 0x0BDA) && (pHalData->EEPROMPID == 0x5088)) + pHalData->CustomerID = RT_CID_CC_C; + + break; + case EEPROM_CID_WHQL: + //padapter->bInHctTest = _TRUE; + + //pMgntInfo->bSupportTurboMode = _FALSE; + //pMgntInfo->bAutoTurboBy8186 = _FALSE; + + //pMgntInfo->PowerSaveControl.bInactivePs = _FALSE; + //pMgntInfo->PowerSaveControl.bIPSModeBackup = _FALSE; + //pMgntInfo->PowerSaveControl.bLeisurePs = _FALSE; + //pMgntInfo->PowerSaveControl.bLeisurePsModeBackup = _FALSE; + //pMgntInfo->keepAliveLevel = 0; + + //padapter->bUnloadDriverwhenS3S4 = _FALSE; + break; + default: + pHalData->CustomerID = RT_CID_DEFAULT; + break; + + } + RTW_INFO("Customer ID: 0x%2x\n", pHalData->CustomerID); + + hal_CustomizedBehavior_8814AU(pAdapter); +} + +VOID +hal_ReadUsbModeSwitch_8814AU( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if (AutoloadFail) + pHalData->EEPROMUsbSwitch = _FALSE; + else + /* check efuse 0x0E bit2 */ + pHalData->EEPROMUsbSwitch = (PROMContent[EEPROM_USB_MODE_8814A] & BIT1) >> 1; +} + +static VOID +ReadLEDSetting_8814AU( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + struct led_priv *pledpriv = adapter_to_led(Adapter); + +#ifdef CONFIG_RTW_SW_LED + pledpriv->bRegUseLed = _TRUE; +#else // HW LED + pledpriv->LedStrategy = HW_LED; +#endif //CONFIG_RTW_LED +} + +VOID +InitAdapterVariablesByPROM_8814AU( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + hal_InitPGData_8814A(Adapter, pHalData->efuse_eeprom_data); + + //Hal_EfuseParseIDCode8812A(Adapter, pHalData->efuse_eeprom_data); + hal_ReadPROMVersion8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadIDs_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_config_macaddr(Adapter, pHalData->bautoload_fail_flag); + hal_ReadTxPowerInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadBoardType8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_Read_TRX_antenna_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + // + // Read Bluetooth co-exist and initialize + // + hal_EfuseParseBTCoexistInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + hal_ReadChannelPlan8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_EfuseParseXtal_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadThermalMeter_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadRemoteWakeup_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadAntennaDiversity8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_ReadRFEType_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + ReadLEDSetting_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + hal_ReadUsbModeSwitch_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + hal_CustomizeByCustomerID_8814AU(Adapter); + + hal_GetRxGainOffset_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); + + Hal_EfuseParseKFreeData_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); +} + +static void hal_ReadPROMContent_8814A( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 eeValue; + + /* check system boot selection */ + eeValue = rtw_read8(Adapter, REG_9346CR); + pHalData->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; + pHalData->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; + + RTW_INFO("Boot from %s, Autoload %s !\n", (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"), + (pHalData->bautoload_fail_flag ? "Fail" : "OK") ); + + //pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE; + + InitAdapterVariablesByPROM_8814AU(Adapter); +} + +u8 +ReadAdapterInfo8814AU( + IN PADAPTER Adapter + ) +{ + Hal_InitEfuseVars_8814A(Adapter); + + /* Read all content in Efuse/EEPROM. */ + hal_ReadPROMContent_8814A(Adapter); + + /* We need to define the RF type after all PROM value is recognized. */ + ReadRFType8814A(Adapter); + + return _SUCCESS; +} + +void UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 RemoveMSR) +{ + HAL_DATA_TYPE *pHalData; + + u32 *himr; + pHalData = GET_HAL_DATA(padapter); + + if(bHIMR0) + himr = &(pHalData->IntrMask[0]); + else + himr = &(pHalData->IntrMask[1]); + + if (AddMSR) + *himr |= AddMSR; + + if (RemoveMSR) + *himr &= (~RemoveMSR); + + if(bHIMR0) + rtw_write32(padapter, REG_HIMR0_8814A, *himr); + else + rtw_write32(padapter, REG_HIMR1_8814A, *himr); + +} + +u8 SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); + struct registry_priv *registry_par = &Adapter->registrypriv; + u8 ret = _SUCCESS; + + switch (variable) { + case HW_VAR_RXDMA_AGG_PG_TH: +#ifdef CONFIG_USB_RX_AGGREGATION + { + /*u8 threshold = *((u8 *)val); + if( threshold == 0) + { + threshold = pHalData->UsbRxAggPageCount; + } + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold);*/ + } +#endif + break; + case HW_VAR_SET_RPWM: +#ifdef CONFIG_LPS_LCLK + { + u8 ps_state = *((u8 *)val); + + /*rpwm value only use BIT0(clock bit) ,BIT6(Ack bit), and BIT7(Toggle bit) for 88e. + BIT0 value - 1: 32k, 0:40MHz. + BIT6 value - 1: report cpwm value after success set, 0:do not report. + BIT7 value - Toggle bit change. + modify by Thomas. 2012/4/2.*/ + ps_state = ps_state & 0xC1; + /*RTW_INFO("##### Change RPWM value to = %x for switch clk #####\n", ps_state);*/ + rtw_write8(Adapter, REG_USB_HRPWM, ps_state); + } +#endif +#ifdef CONFIG_AP_WOWLAN + if (pwrctl->wowlan_ap_mode == _TRUE) { + u8 ps_state = *((u8 *)val); + + RTW_INFO("%s, RPWM\n", __func__); + ps_state = ps_state & 0xC1; + rtw_write8(Adapter, REG_USB_HRPWM, ps_state); + } +#endif + break; + + case HW_VAR_USB_MODE: + /* U2 to U3 */ + if (registry_par->switch_usb_mode == 1) { + if (IS_HIGH_SPEED_USB(Adapter)) { + if ((rtw_read8(Adapter, 0x74) & (BIT(2) | BIT(3))) != BIT(3)) { + rtw_write8(Adapter, 0x74, 0x8); + rtw_write8(Adapter, 0x70, 0x2); + rtw_write8(Adapter, 0x3e, 0x1); + rtw_write8(Adapter, 0x3d, 0x3); + /* usb disconnect */ + rtw_write8(Adapter, 0x5, 0x80); + *val = _TRUE; + } + } else if (IS_SUPER_SPEED_USB(Adapter)) { + rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1))); + rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0))); + } + } else if (registry_par->switch_usb_mode == 2) { + /* U3 to U2 */ + if (IS_SUPER_SPEED_USB(Adapter)) { + if ((rtw_read8(Adapter, 0x74) & (BIT(2) | BIT(3))) != BIT(2)) { + rtw_write8(Adapter, 0x74, 0x4); + rtw_write8(Adapter, 0x70, 0x2); + rtw_write8(Adapter, 0x3e, 0x1); + rtw_write8(Adapter, 0x3d, 0x3); + /* usb disconnect */ + rtw_write8(Adapter, 0x5, 0x80); + *val = _TRUE; + } + } else if (IS_HIGH_SPEED_USB(Adapter)) { + rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1))); + rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0))); + } + } + break; + default: + ret = SetHwReg8814A(Adapter, variable, val); + break; + } + + return ret; +} + +void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(variable) + { + default: + GetHwReg8814A(Adapter,variable,val); + break; + } + +} + +// +// Description: +// Change default setting of specified variable. +// +u8 +SetHalDefVar8814AUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 bResult = _SUCCESS; + + switch(eVariable) + { + default: + SetHalDefVar8814A(Adapter,eVariable,pValue); + break; + } + + return bResult; +} + +// +// Description: +// Query setting of specified variable. +// +u8 +GetHalDefVar8814AUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 bResult = _SUCCESS; + + switch(eVariable) + { + default: + GetHalDefVar8814A(Adapter,eVariable,pValue); + break; + } + + return bResult; +} + +static void rtl8814au_init_default_value(_adapter * padapter) +{ + PHAL_DATA_TYPE pHalData; + + pHalData = GET_HAL_DATA(padapter); + + InitDefaultValue8814A(padapter); + + pHalData->IntrMask[0] = (u32)( \ + //IMR_ROK | + //IMR_RDU | + //IMR_VODOK | + //IMR_VIDOK | + //IMR_BEDOK | + //IMR_BKDOK | + //IMR_MGNTDOK | + //IMR_HIGHDOK | + //IMR_CPWM | + //IMR_CPWM2 | + //IMR_C2HCMD | + //IMR_HISR1_IND_INT | + //IMR_ATIMEND | + //IMR_BCNDMAINT_E | + //IMR_HSISR_IND_ON_INT | + //IMR_BCNDOK0 | + //IMR_BCNDMAINT0 | + //IMR_TSF_BIT32_TOGGLE | + //IMR_TXBCN0OK | + //IMR_TXBCN0ERR | + //IMR_GTINT3 | + //IMR_GTINT4 | + //IMR_TXCCK | + 0); + + pHalData->IntrMask[1] = (u32)(\ + //IMR_RXFOVW | + //IMR_TXFOVW | + //IMR_RXERR | + //IMR_TXERR | + //IMR_ATIMEND_E | + //IMR_BCNDOK1 | + //IMR_BCNDOK2 | + //IMR_BCNDOK3 | + //IMR_BCNDOK4 | + //IMR_BCNDOK5 | + //IMR_BCNDOK6 | + //IMR_BCNDOK7 | + //IMR_BCNDMAINT1 | + //IMR_BCNDMAINT2 | + //IMR_BCNDMAINT3 | + //IMR_BCNDMAINT4 | + //IMR_BCNDMAINT5 | + //IMR_BCNDMAINT6 | + //IMR_BCNDMAINT7 | + 0); +} + +static u8 rtl8814au_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) +{ + u8 bResult = _TRUE; + switch(efunc_id){ + + #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) + case HAL_USB_SELECT_SUSPEND: + { + u8 bfwpoll = *(( u8*)val); + //rtl8188e_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect + } + break; + #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED + + default: + break; + } + return bResult; +} + +void rtl8814au_set_hal_ops(_adapter * padapter) +{ + struct hal_ops *pHalFunc = &padapter->hal_func; + + pHalFunc->hal_power_on = _InitPowerOn_8814AU; + pHalFunc->hal_power_off = hal_carddisable_8814; + + pHalFunc->hal_init = &rtl8814au_hal_init; + pHalFunc->hal_deinit = &rtl8814au_hal_deinit; + + pHalFunc->inirp_init = &rtl8814au_inirp_init; + pHalFunc->inirp_deinit = &rtl8814au_inirp_deinit; + + pHalFunc->init_xmit_priv = &rtl8814au_init_xmit_priv; + pHalFunc->free_xmit_priv = &rtl8814au_free_xmit_priv; + + pHalFunc->init_recv_priv = &rtl8814au_init_recv_priv; + pHalFunc->free_recv_priv = &rtl8814au_free_recv_priv; +#ifdef CONFIG_RTW_SW_LED + pHalFunc->InitSwLeds = &rtl8814au_InitSwLeds; + pHalFunc->DeInitSwLeds = &rtl8814au_DeInitSwLeds; +//#else //case of hw led or no led +// pHalFunc->InitSwLeds = NULL; +// pHalFunc->DeInitSwLeds = NULL; +#endif//CONFIG_RTW_LED + + pHalFunc->init_default_value = &rtl8814au_init_default_value; + pHalFunc->intf_chip_configure = &rtl8814au_interface_configure; + pHalFunc->read_adapter_info = &ReadAdapterInfo8814AU; + + pHalFunc->set_hw_reg_handler = &SetHwReg8814AU; + pHalFunc->GetHwRegHandler = &GetHwReg8814AU; + pHalFunc->get_hal_def_var_handler = &GetHalDefVar8814AUsb; + pHalFunc->SetHalDefVarHandler = &SetHalDefVar8814AUsb; + + + pHalFunc->hal_xmit = &rtl8814au_hal_xmit; + pHalFunc->mgnt_xmit = &rtl8814au_mgnt_xmit; + pHalFunc->hal_xmitframe_enqueue = &rtl8814au_hal_xmitframe_enqueue; + +#ifdef CONFIG_HOSTAPD_MLME + pHalFunc->hostap_mgnt_xmit_entry = &rtl8812au_hostap_mgnt_xmit_entry; +#endif + pHalFunc->interface_ps_func = &rtl8814au_ps_func; +#ifdef CONFIG_XMIT_THREAD_MODE + pHalFunc->xmit_thread_handler = &rtl8812au_xmit_buf_handler; +#endif +#ifdef CONFIG_SUPPORT_USB_INT + pHalFunc->interrupt_handler = interrupt_handler_8814au; +#endif + pHalFunc->fw_correct_bcn = &rtl8814_fw_update_beacon_cmd; + rtl8814_set_hal_ops(pHalFunc); + +} + diff --git a/hal/rtl8814a/usb/usb_ops_linux.c b/hal/rtl8814a/usb/usb_ops_linux.c new file mode 100644 index 0000000..a7f7293 --- /dev/null +++ b/hal/rtl8814a/usb/usb_ops_linux.c @@ -0,0 +1,314 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ +#define _HCI_OPS_OS_C_ + +/* #include */ +#include + +#ifdef CONFIG_SUPPORT_USB_INT +void interrupt_handler_8814au(_adapter *padapter, u16 pkt_len, u8 *pbuf) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct reportpwrstate_parm pwr_rpt; + + if (pkt_len != INTERRUPT_MSG_FORMAT_LEN) { + RTW_INFO("%s Invalid interrupt content length (%d)!\n", __FUNCTION__, pkt_len); + return ; + } + + /* HISR */ + _rtw_memcpy(&(pHalData->IntArray[0]), &(pbuf[USB_INTR_CONTENT_HISR_OFFSET]), 4); + _rtw_memcpy(&(pHalData->IntArray[1]), &(pbuf[USB_INTR_CONTENT_HISRE_OFFSET]), 4); + +#if 0 /*DBG*/ + { + u32 hisr = 0 , hisr_ex = 0; + _rtw_memcpy(&hisr, &(pHalData->IntArray[0]), 4); + hisr = le32_to_cpu(hisr); + + _rtw_memcpy(&hisr_ex, &(pHalData->IntArray[1]), 4); + hisr_ex = le32_to_cpu(hisr_ex); + + if ((hisr != 0) || (hisr_ex != 0)) + RTW_INFO("===> %s hisr:0x%08x ,hisr_ex:0x%08x\n", __FUNCTION__, hisr, hisr_ex); + } +#endif + + +#ifdef CONFIG_LPS_LCLK + if (pHalData->IntArray[0] & IMR_CPWM_88E) { + _rtw_memcpy(&pwr_rpt.state, &(pbuf[USB_INTR_CONTENT_CPWM1_OFFSET]), 1); + /* _rtw_memcpy(&pwr_rpt.state2, &(pbuf[USB_INTR_CONTENT_CPWM2_OFFSET]), 1); */ + + /* 88e's cpwm value only change BIT0, so driver need to add PS_STATE_S2 for LPS flow. */ + pwr_rpt.state |= PS_STATE_S2; + _set_workitem(&(adapter_to_pwrctl(padapter)->cpwm_event)); + } +#endif/* CONFIG_LPS_LCLK */ + +#ifdef CONFIG_INTERRUPT_BASED_TXBCN + +#ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT + if (pHalData->IntArray[0] & IMR_BCNDMAINT0_88E) +#endif +#ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR + if (pHalData->IntArray[0] & (IMR_TBDER_88E | IMR_TBDOK_88E)) +#endif + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#if 0 + if (pHalData->IntArray[0] & IMR_BCNDMAINT0_88E) + RTW_INFO("%s: HISR_BCNERLY_INT\n", __func__); + if (pHalData->IntArray[0] & IMR_TBDOK_88E) + RTW_INFO("%s: HISR_TXBCNOK\n", __func__); + if (pHalData->IntArray[0] & IMR_TBDER_88E) + RTW_INFO("%s: HISR_TXBCNERR\n", __func__); +#endif /* 0 */ + + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + //send_beacon(padapter); + if(pmlmepriv->update_bcn == _TRUE) + { + //tx_beacon_hdl(padapter, NULL); + set_tx_beacon_cmd(padapter); + } + } +#ifdef CONFIG_CONCURRENT_MODE + if(check_buddy_fwstate(padapter, WIFI_AP_STATE)) + { + //send_beacon(padapter); + if(padapter->pbuddy_adapter->mlmepriv.update_bcn == _TRUE) + { + //tx_beacon_hdl(padapter, NULL); + set_tx_beacon_cmd(padapter->pbuddy_adapter); + } + } +#endif + + } +#endif /* CONFIG_INTERRUPT_BASED_TXBCN */ + + + + +#ifdef DBG_CONFIG_ERROR_DETECT_INT + if (pHalData->IntArray[1] & IMR_TXERR_88E) + RTW_INFO("===> %s Tx Error Flag Interrupt Status\n", __FUNCTION__); + if (pHalData->IntArray[1] & IMR_RXERR_88E) + RTW_INFO("===> %s Rx Error Flag INT Status\n", __FUNCTION__); + if (pHalData->IntArray[1] & IMR_TXFOVW_88E) + RTW_INFO("===> %s Transmit FIFO Overflow\n", __FUNCTION__); + if (pHalData->IntArray[1] & IMR_RXFOVW_88E) + RTW_INFO("===> %s Receive FIFO Overflow\n", __FUNCTION__); +#endif/* DBG_CONFIG_ERROR_DETECT_INT */ + +#ifdef CONFIG_FW_C2H_REG + /* C2H Event */ + if (pbuf[0] != 0) + usb_c2h_hisr_hdl(padapter, pbuf); +#endif +} +#endif /* CONFIG_SUPPORT_USB_INT */ +#if 0 +int recvbuf2recvframe(PADAPTER padapter, void *ptr) +{ + u8 *pbuf; + u8 pkt_cnt = 0; + u32 pkt_offset; + s32 transfer_len; + u8 *pphy_status = NULL; + union recv_frame *precvframe = NULL; + struct rx_pkt_attrib *pattrib = NULL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &precvpriv->free_recv_queue; + _pkt *pskb; + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + pskb = NULL; + transfer_len = (s32)((struct recv_buf *)ptr)->transfer_len; + pbuf = ((struct recv_buf *)ptr)->pbuf; +#else + pskb = (_pkt *)ptr; + transfer_len = (s32)pskb->len; + pbuf = pskb->data; +#endif/* CONFIG_USE_USB_BUFFER_ALLOC_RX */ + + +#ifdef CONFIG_USB_RX_AGGREGATION + pkt_cnt = GET_RX_STATUS_DESC_DMA_AGG_NUM_8814A(pbuf); +#endif + + do { + precvframe = rtw_alloc_recvframe(pfree_recv_queue); + if (precvframe == NULL) { + RTW_INFO("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __FUNCTION__, __LINE__); + goto _exit_recvbuf2recvframe; + } + + _rtw_init_listhead(&precvframe->u.hdr.list); + precvframe->u.hdr.precvbuf = NULL; /* can't access the precvbuf for new arch. */ + precvframe->u.hdr.len = 0; + + rtl8814_query_rx_desc_status(precvframe, pbuf); + + pattrib = &precvframe->u.hdr.attrib; + + if ((padapter->registrypriv.mp_mode == 0) && ((pattrib->crc_err) || (pattrib->icv_err))) { + RTW_INFO("%s: RX Warning! crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err); + + rtw_free_recvframe(precvframe, pfree_recv_queue); + goto _exit_recvbuf2recvframe; + } + + pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len; + + if ((pattrib->pkt_len <= 0) || (pkt_offset > transfer_len)) { + RTW_INFO("%s()-%d: RX Warning!,pkt_len<=0 or pkt_offset> transfer_len\n", __FUNCTION__, __LINE__); + rtw_free_recvframe(precvframe, pfree_recv_queue); + goto _exit_recvbuf2recvframe; + } + +#ifdef CONFIG_RX_PACKET_APPEND_FCS + if(pattrib->pkt_rpt_type == NORMAL_RX) + pattrib->pkt_len -= IEEE80211_FCS_LEN; +#endif + if (rtw_os_alloc_recvframe(padapter, precvframe, + (pbuf + pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), pskb) == _FAIL) { + rtw_free_recvframe(precvframe, pfree_recv_queue); + + goto _exit_recvbuf2recvframe; + } + + recvframe_put(precvframe, pattrib->pkt_len); + /* recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); */ + + if(pattrib->pkt_rpt_type == NORMAL_RX)//Normal rx packet + { + if(pattrib->physt) + pphy_status = (pbuf + RXDESC_OFFSET); + +#ifdef CONFIG_CONCURRENT_MODE + if(rtw_buddy_adapter_up(padapter)) + { + if(pre_recv_entry(precvframe, pphy_status) != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_, + ("recvbuf2recvframe: recv_entry(precvframe) != _SUCCESS\n")); + } + } +#endif //CONFIG_CONCURRENT_MODE + + if(pattrib->physt && pphy_status) + rx_query_phy_status(precvframe, pphy_status); + + if(rtw_recv_entry(precvframe) != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_, + ("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); + } + + } + else{ // pkt_rpt_type == TX_REPORT1-CCX, TX_REPORT2-TX RTP,HIS_REPORT-USB HISR RTP + if (pattrib->pkt_rpt_type == C2H_PACKET) { + //RTW_INFO("rx C2H_PACKET \n"); + rtw_hal_c2h_pkt_pre_hdl(padapter,precvframe->u.hdr.rx_data,pattrib->pkt_len); + } + rtw_free_recvframe(precvframe, pfree_recv_queue); + } + +#ifdef CONFIG_USB_RX_AGGREGATION + /* jaguar 8-byte alignment */ + pkt_offset = (u16)_RND8(pkt_offset); + pkt_cnt--; + pbuf += pkt_offset; +#endif + transfer_len -= pkt_offset; + precvframe = NULL; + + } while (transfer_len > 0); + +_exit_recvbuf2recvframe: + + return _SUCCESS; +} +#endif + +void rtl8814au_xmit_tasklet(void *priv) +{ + int ret = _FALSE; + _adapter *padapter = (_adapter*)priv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + while(1) + { + if (RTW_CANNOT_TX(padapter)) + { + RTW_INFO("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n"); + break; + } + + if (rtw_xmit_ac_blocked(padapter) == _TRUE) + break; + + ret = rtl8814au_xmitframe_complete(padapter, pxmitpriv, NULL); + + if(ret==_FALSE) + break; + + } + +} + +void rtl8814au_set_intf_ops(struct _io_ops *pops) +{ + _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops)); + + pops->_read8 = &usb_read8; + pops->_read16 = &usb_read16; + pops->_read32 = &usb_read32; + pops->_read_mem = &usb_read_mem; + pops->_read_port = &usb_read_port; + + pops->_write8 = &usb_write8; + pops->_write16 = &usb_write16; + pops->_write32 = &usb_write32; + pops->_writeN = &usb_writeN; + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ + pops->_write8_async= &usb_async_write8; + pops->_write16_async = &usb_async_write16; + pops->_write32_async = &usb_async_write32; +#endif + pops->_write_mem = &usb_write_mem; + pops->_write_port = &usb_write_port; + + pops->_read_port_cancel = &usb_read_port_cancel; + pops->_write_port_cancel = &usb_write_port_cancel; + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + pops->_read_interrupt = &usb_read_interrupt; +#endif + +} + +void rtl8814au_set_hw_type(struct dvobj_priv *pdvobj) +{ + pdvobj->HardwareType = HARDWARE_TYPE_RTL8814AU; + RTW_INFO("CHIP TYPE: RTL8814\n"); +} + diff --git a/include/hal_data.h b/include/hal_data.h index 888b14b..47d6fcc 100644 --- a/include/hal_data.h +++ b/include/hal_data.h @@ -494,6 +494,8 @@ typedef struct hal_com_data { u8 txpwr_limit_from_file:1; u8 rf_power_tracking_type; + u8 CurrentTxPwrIdx; + /* Read/write are allow for following hardware information variables */ u8 crystal_cap; diff --git a/include/rtl8814a_hal.h b/include/rtl8814a_hal.h index aa7b498..9670d36 100644 --- a/include/rtl8814a_hal.h +++ b/include/rtl8814a_hal.h @@ -32,11 +32,11 @@ #ifdef DBG_CONFIG_ERROR_DETECT #include "rtl8814a_sreset.h" #endif /* DBG_CONFIG_ERROR_DETECT */ - +/* enum { VOLTAGE_V25 = 0x03, LDOE25_SHIFT = 28 , -}; +};*/ /* max. iram is 64k , max dmen is 32k. Total = 96k = 0x18000*/ #define FW_SIZE 0x18000 #define FW_START_ADDRESS 0x1000 diff --git a/include/rtl8814a_spec.h b/include/rtl8814a_spec.h index 917b961..fd5fb04 100644 --- a/include/rtl8814a_spec.h +++ b/include/rtl8814a_spec.h @@ -645,4 +645,12 @@ So the following defines for 92C is not entire!!!!!! #define LAST_ENTRY_OF_TX_PKT_BUFFER_8814A (2048-1) /* 20130415 KaiYuan add for 8814 */ +#define MACID_NUM_8814A 128 +#define SEC_CAM_ENT_NUM_8814A 64 +#define HW_PORT_NUM_8814A 5 +#define NSS_NUM_8814A 3 +#define BAND_CAP_8814A (BAND_CAP_2G | BAND_CAP_5G) +#define BW_CAP_8814A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M) +#define PROTO_CAP_8814A (PROTO_CAP_11B | PROTO_CAP_11G | PROTO_CAP_11N | PROTO_CAP_11AC) + #endif /* __RTL8814A_SPEC_H__ */ diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index bd9e8a7..82e26af 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -9220,12 +9220,12 @@ static void rtw_cfg80211_init_ht_capab_ex(_adapter *padapter case RF_2T2R: case RF_1T2R: - ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/* Only one spatial-stream STBC RX is supported */ + ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_2R;/* Only one spatial-stream STBC RX is supported */ break; case RF_3T3R: case RF_3T4R: case RF_4T4R: - ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/* Only one spatial-stream STBC RX is supported */ + ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_3R;/* Only one spatial-stream STBC RX is supported */ break; default: RTW_INFO("[warning] rf_type %d is not expected\n", rf_type); @@ -9413,6 +9413,8 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *adapter, struct wiphy *wiphy) { struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); struct registry_priv *regsty = dvobj_to_regsty(dvobj); + struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); +struct ieee80211_supported_band *band; wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; @@ -9552,6 +9554,31 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *adapter, struct wiphy *wiphy) #if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) wiphy->features |= NL80211_FEATURE_SAE; #endif + + wiphy->available_antennas_tx = hal_spec->tx_nss_num; + wiphy->available_antennas_rx = hal_spec->rx_nss_num; + +if (IsSupported24G(adapter->registrypriv.wireless_mode)) { + band = wiphy->bands[NL80211_BAND_2GHZ]; + if (band) { + #if defined(CONFIG_80211N_HT) + rtw_cfg80211_init_ht_capab(adapter, &band->ht_cap, BAND_ON_2_4G, RF_1T1R); + #endif + } + } +#ifdef CONFIG_IEEE80211_BAND_5GHZ + if (is_supported_5g(adapter->registrypriv.wireless_mode)) { + band = wiphy->bands[NL80211_BAND_5GHZ]; + if (band) { + #if defined(CONFIG_80211N_HT) + rtw_cfg80211_init_ht_capab(adapter, &band->ht_cap, BAND_ON_5G, RF_1T1R); + #endif + #if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + rtw_cfg80211_init_vht_capab(adapter, &band->vht_cap, BAND_ON_5G, RF_1T1R); + #endif + } + } +#endif } #ifdef CONFIG_RFKILL_POLL diff --git a/os_dep/linux/ioctl_cfg80211.c.orig b/os_dep/linux/ioctl_cfg80211.c.orig new file mode 100644 index 0000000..bd9e8a7 --- /dev/null +++ b/os_dep/linux/ioctl_cfg80211.c.orig @@ -0,0 +1,10260 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2017 Realtek Corporation. + * + * 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. + * + *****************************************************************************/ +#define _IOCTL_CFG80211_C_ + +#include +#include + +#ifdef CONFIG_IOCTL_CFG80211 + +#ifndef DBG_RTW_CFG80211_STA_PARAM +#define DBG_RTW_CFG80211_STA_PARAM 0 +#endif + +#ifndef DBG_RTW_CFG80211_MESH_CONF +#define DBG_RTW_CFG80211_MESH_CONF 0 +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) +#define STATION_INFO_INACTIVE_TIME BIT(NL80211_STA_INFO_INACTIVE_TIME) +#define STATION_INFO_LLID BIT(NL80211_STA_INFO_LLID) +#define STATION_INFO_PLID BIT(NL80211_STA_INFO_PLID) +#define STATION_INFO_PLINK_STATE BIT(NL80211_STA_INFO_PLINK_STATE) +#define STATION_INFO_SIGNAL BIT(NL80211_STA_INFO_SIGNAL) +#define STATION_INFO_TX_BITRATE BIT(NL80211_STA_INFO_TX_BITRATE) +#define STATION_INFO_RX_PACKETS BIT(NL80211_STA_INFO_RX_PACKETS) +#define STATION_INFO_TX_PACKETS BIT(NL80211_STA_INFO_TX_PACKETS) +#define STATION_INFO_TX_FAILED BIT(NL80211_STA_INFO_TX_FAILED) +#define STATION_INFO_LOCAL_PM BIT(NL80211_STA_INFO_LOCAL_PM) +#define STATION_INFO_PEER_PM BIT(NL80211_STA_INFO_PEER_PM) +#define STATION_INFO_NONPEER_PM BIT(NL80211_STA_INFO_NONPEER_PM) +#define STATION_INFO_ASSOC_REQ_IES 0 +#endif /* Linux kernel >= 4.0.0 */ + +#include + +#define RTW_MAX_MGMT_TX_CNT (8) +#define RTW_MAX_MGMT_TX_MS_GAS (500) + +#define RTW_SCAN_IE_LEN_MAX 2304 +#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 /* ms */ +#define RTW_MAX_NUM_PMKIDS 4 + +#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ + +#ifdef CONFIG_WAPI_SUPPORT + +#ifndef WLAN_CIPHER_SUITE_SMS4 +#define WLAN_CIPHER_SUITE_SMS4 0x00147201 +#endif + +#ifndef WLAN_AKM_SUITE_WAPI_PSK +#define WLAN_AKM_SUITE_WAPI_PSK 0x000FAC04 +#endif + +#ifndef WLAN_AKM_SUITE_WAPI_CERT +#define WLAN_AKM_SUITE_WAPI_CERT 0x000FAC12 +#endif + +#ifndef NL80211_WAPI_VERSION_1 +#define NL80211_WAPI_VERSION_1 (1 << 2) +#endif + +#endif /* CONFIG_WAPI_SUPPORT */ + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(4, 11, 12)) +#ifdef CONFIG_RTW_80211R +#define WLAN_AKM_SUITE_FT_8021X 0x000FAC03 +#define WLAN_AKM_SUITE_FT_PSK 0x000FAC04 +#endif +#endif + +/* + * In the current design of Wi-Fi driver, it will return success to the system (e.g. supplicant) + * when Wi-Fi driver decides to abort the scan request in the scan flow by default. + * Defining this flag makes Wi-Fi driver to return -EBUSY to the system if Wi-Fi driver is too busy to do the scan. + */ +#ifndef CONFIG_NOTIFY_SCAN_ABORT_WITH_BUSY + #define CONFIG_NOTIFY_SCAN_ABORT_WITH_BUSY 0 +#endif + +static const u32 rtw_cipher_suites[] = { + WLAN_CIPHER_SUITE_WEP40, + WLAN_CIPHER_SUITE_WEP104, + WLAN_CIPHER_SUITE_TKIP, + WLAN_CIPHER_SUITE_CCMP, +#ifdef CONFIG_WAPI_SUPPORT + WLAN_CIPHER_SUITE_SMS4, +#endif /* CONFIG_WAPI_SUPPORT */ +#ifdef CONFIG_IEEE80211W + WLAN_CIPHER_SUITE_AES_CMAC, +#endif /* CONFIG_IEEE80211W */ +}; + +#define RATETAB_ENT(_rate, _rateid, _flags) \ + { \ + .bitrate = (_rate), \ + .hw_value = (_rateid), \ + .flags = (_flags), \ + } + +#define CHAN2G(_channel, _freq, _flags) { \ + .band = NL80211_BAND_2GHZ, \ + .center_freq = (_freq), \ + .hw_value = (_channel), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ + } + +#define CHAN5G(_channel, _flags) { \ + .band = NL80211_BAND_5GHZ, \ + .center_freq = 5000 + (5 * (_channel)), \ + .hw_value = (_channel), \ + .flags = (_flags), \ + .max_antenna_gain = 0, \ + .max_power = 30, \ + } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) +/* if wowlan is not supported, kernel generate a disconnect at each suspend + * cf: /net/wireless/sysfs.c, so register a stub wowlan. + * Moreover wowlan has to be enabled via a the nl80211_set_wowlan callback. + * (from user space, e.g. iw phy0 wowlan enable) + */ +static const struct wiphy_wowlan_support wowlan_stub = { + .flags = WIPHY_WOWLAN_ANY, + .n_patterns = 0, + .pattern_max_len = 0, + .pattern_min_len = 0, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + .max_pkt_offset = 0, +#endif +}; +#endif + +static struct ieee80211_rate rtw_rates[] = { + RATETAB_ENT(10, 0x1, 0), + RATETAB_ENT(20, 0x2, 0), + RATETAB_ENT(55, 0x4, 0), + RATETAB_ENT(110, 0x8, 0), + RATETAB_ENT(60, 0x10, 0), + RATETAB_ENT(90, 0x20, 0), + RATETAB_ENT(120, 0x40, 0), + RATETAB_ENT(180, 0x80, 0), + RATETAB_ENT(240, 0x100, 0), + RATETAB_ENT(360, 0x200, 0), + RATETAB_ENT(480, 0x400, 0), + RATETAB_ENT(540, 0x800, 0), +}; + +#define rtw_a_rates (rtw_rates + 4) +#define RTW_A_RATES_NUM 8 +#define rtw_g_rates (rtw_rates + 0) +#define RTW_G_RATES_NUM 12 + +/* from center_ch_2g */ +static struct ieee80211_channel rtw_2ghz_channels[MAX_CHANNEL_NUM_2G] = { + CHAN2G(1, 2412, 0), + CHAN2G(2, 2417, 0), + CHAN2G(3, 2422, 0), + CHAN2G(4, 2427, 0), + CHAN2G(5, 2432, 0), + CHAN2G(6, 2437, 0), + CHAN2G(7, 2442, 0), + CHAN2G(8, 2447, 0), + CHAN2G(9, 2452, 0), + CHAN2G(10, 2457, 0), + CHAN2G(11, 2462, 0), + CHAN2G(12, 2467, 0), + CHAN2G(13, 2472, 0), + CHAN2G(14, 2484, 0), +}; + +/* from center_ch_5g_20m */ +static struct ieee80211_channel rtw_5ghz_a_channels[MAX_CHANNEL_NUM_5G] = { + CHAN5G(36, 0), CHAN5G(40, 0), CHAN5G(44, 0), CHAN5G(48, 0), + + CHAN5G(52, 0), CHAN5G(56, 0), CHAN5G(60, 0), CHAN5G(64, 0), + + CHAN5G(100, 0), CHAN5G(104, 0), CHAN5G(108, 0), CHAN5G(112, 0), + CHAN5G(116, 0), CHAN5G(120, 0), CHAN5G(124, 0), CHAN5G(128, 0), + CHAN5G(132, 0), CHAN5G(136, 0), CHAN5G(140, 0), CHAN5G(144, 0), + + CHAN5G(149, 0), CHAN5G(153, 0), CHAN5G(157, 0), CHAN5G(161, 0), + CHAN5G(165, 0), CHAN5G(169, 0), CHAN5G(173, 0), CHAN5G(177, 0), +}; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) +static const char *nl80211_channel_type_str(enum nl80211_channel_type ctype) +{ + switch (ctype) { + case NL80211_CHAN_NO_HT: + return "NO_HT"; + case NL80211_CHAN_HT20: + return "HT20"; + case NL80211_CHAN_HT40MINUS: + return "HT40-"; + case NL80211_CHAN_HT40PLUS: + return "HT40+"; + default: + return "INVALID"; + }; +} + +static enum nl80211_channel_type rtw_chbw_to_nl80211_channel_type(u8 ch, u8 bw, u8 offset, u8 ht) +{ + rtw_warn_on(!ht && (bw >= CHANNEL_WIDTH_40 || offset != HAL_PRIME_CHNL_OFFSET_DONT_CARE)); + + if (!ht) + return NL80211_CHAN_NO_HT; + if (bw >= CHANNEL_WIDTH_40) { + if (offset == HAL_PRIME_CHNL_OFFSET_UPPER) + return NL80211_CHAN_HT40MINUS; + else if (offset == HAL_PRIME_CHNL_OFFSET_LOWER) + return NL80211_CHAN_HT40PLUS; + else + rtw_warn_on(1); + } + return NL80211_CHAN_HT20; +} + +static void rtw_get_chbw_from_nl80211_channel_type(struct ieee80211_channel *chan, enum nl80211_channel_type ctype, u8 *ht, u8 *ch, u8 *bw, u8 *offset) +{ + int pri_freq; + + pri_freq = rtw_ch2freq(chan->hw_value); + if (!pri_freq) { + RTW_INFO("invalid channel:%d\n", chan->hw_value); + rtw_warn_on(1); + *ch = 0; + return; + } + *ch = chan->hw_value; + + switch (ctype) { + case NL80211_CHAN_NO_HT: + *ht = 0; + *bw = CHANNEL_WIDTH_20; + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_HT20: + *ht = 1; + *bw = CHANNEL_WIDTH_20; + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_HT40MINUS: + *ht = 1; + *bw = CHANNEL_WIDTH_40; + *offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + case NL80211_CHAN_HT40PLUS: + *ht = 1; + *bw = CHANNEL_WIDTH_40; + *offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + default: + *ht = 0; + *bw = CHANNEL_WIDTH_20; + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + RTW_INFO("unsupported ctype:%s\n", nl80211_channel_type_str(ctype)); + rtw_warn_on(1); + }; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +static const char *nl80211_chan_width_str(enum nl80211_chan_width cwidth) +{ + switch (cwidth) { + case NL80211_CHAN_WIDTH_20_NOHT: + return "20_NOHT"; + case NL80211_CHAN_WIDTH_20: + return "20"; + case NL80211_CHAN_WIDTH_40: + return "40"; + case NL80211_CHAN_WIDTH_80: + return "80"; + case NL80211_CHAN_WIDTH_80P80: + return "80+80"; + case NL80211_CHAN_WIDTH_160: + return "160"; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + case NL80211_CHAN_WIDTH_5: + return "5"; + case NL80211_CHAN_WIDTH_10: + return "10"; +#endif + default: + return "INVALID"; + }; +} + +static u8 rtw_chbw_to_cfg80211_chan_def(struct wiphy *wiphy, struct cfg80211_chan_def *chdef, u8 ch, u8 bw, u8 offset, u8 ht) +{ + int freq, cfreq; + struct ieee80211_channel *chan; + u8 ret = _FAIL; + + freq = rtw_ch2freq(ch); + if (!freq) + goto exit; + + cfreq = rtw_get_center_ch(ch, bw, offset); + if (!cfreq) + goto exit; + cfreq = rtw_ch2freq(cfreq); + if (!cfreq) + goto exit; + + chan = ieee80211_get_channel(wiphy, freq); + if (!chan) + goto exit; + + if (bw == CHANNEL_WIDTH_20) + chdef->width = ht ? NL80211_CHAN_WIDTH_20 : NL80211_CHAN_WIDTH_20_NOHT; + else if (bw == CHANNEL_WIDTH_40) + chdef->width = NL80211_CHAN_WIDTH_40; + else if (bw == CHANNEL_WIDTH_80) + chdef->width = NL80211_CHAN_WIDTH_80; + else if (bw == CHANNEL_WIDTH_160) + chdef->width = NL80211_CHAN_WIDTH_160; + else { + rtw_warn_on(1); + goto exit; + } + + chdef->chan = chan; + chdef->center_freq1 = cfreq; + chdef->center_freq2 = 0; + + ret = _SUCCESS; + +exit: + return ret; +} + +static void rtw_get_chbw_from_cfg80211_chan_def(struct cfg80211_chan_def *chdef, u8 *ht, u8 *ch, u8 *bw, u8 *offset) +{ + int pri_freq; + struct ieee80211_channel *chan = chdef->chan; + + pri_freq = rtw_ch2freq(chan->hw_value); + if (!pri_freq) { + RTW_INFO("invalid channel:%d\n", chan->hw_value); + rtw_warn_on(1); + *ch = 0; + return; + } + + switch (chdef->width) { + case NL80211_CHAN_WIDTH_20_NOHT: + *ht = 0; + *bw = CHANNEL_WIDTH_20; + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + *ch = chan->hw_value; + break; + case NL80211_CHAN_WIDTH_20: + *ht = 1; + *bw = CHANNEL_WIDTH_20; + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + *ch = chan->hw_value; + break; + case NL80211_CHAN_WIDTH_40: + *ht = 1; + *bw = CHANNEL_WIDTH_40; + *offset = pri_freq > chdef->center_freq1 ? HAL_PRIME_CHNL_OFFSET_UPPER : HAL_PRIME_CHNL_OFFSET_LOWER; + if (rtw_get_offset_by_chbw(chan->hw_value, *bw, offset)) + *ch = chan->hw_value; + break; + case NL80211_CHAN_WIDTH_80: + *ht = 1; + *bw = CHANNEL_WIDTH_80; + if (rtw_get_offset_by_chbw(chan->hw_value, *bw, offset)) + *ch = chan->hw_value; + break; + case NL80211_CHAN_WIDTH_160: + *ht = 1; + *bw = CHANNEL_WIDTH_160; + if (rtw_get_offset_by_chbw(chan->hw_value, *bw, offset)) + *ch = chan->hw_value; + break; + case NL80211_CHAN_WIDTH_80P80: + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + case NL80211_CHAN_WIDTH_5: + case NL80211_CHAN_WIDTH_10: + #endif + default: + *ht = 0; + *bw = CHANNEL_WIDTH_20; + *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + RTW_INFO("unsupported cwidth:%s\n", nl80211_chan_width_str(chdef->width)); + rtw_warn_on(1); + }; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) +bool rtw_cfg80211_allow_ch_switch_notify(_adapter *adapter) +{ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)) + if ((!MLME_IS_AP(adapter)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)) + && (!MLME_IS_ADHOC(adapter)) + && (!MLME_IS_ADHOC_MASTER(adapter)) + && (!MLME_IS_MESH(adapter)) +#elif defined(CONFIG_RTW_MESH) + && (!MLME_IS_MESH(adapter)) +#endif + ) + return 0; +#endif + return 1; +} + +u8 rtw_cfg80211_ch_switch_notify(_adapter *adapter, u8 ch, u8 bw, u8 offset, + u8 ht, bool started) +{ + struct wiphy *wiphy = adapter_to_wiphy(adapter); + u8 ret = _SUCCESS; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct cfg80211_chan_def chdef; + + ret = rtw_chbw_to_cfg80211_chan_def(wiphy, &chdef, ch, bw, offset, ht); + if (ret != _SUCCESS) + goto exit; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) + if (started) { + cfg80211_ch_switch_started_notify(adapter->pnetdev, &chdef, 0); + goto exit; + } +#endif + + if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) + goto exit; + + cfg80211_ch_switch_notify(adapter->pnetdev, &chdef); + +#else + int freq = rtw_ch2freq(ch); + enum nl80211_channel_type ctype; + + if (!rtw_cfg80211_allow_ch_switch_notify(adapter)) + goto exit; + + if (!freq) { + ret = _FAIL; + goto exit; + } + + ctype = rtw_chbw_to_nl80211_channel_type(ch, bw, offset, ht); + cfg80211_ch_switch_notify(adapter->pnetdev, freq, ctype); +#endif + +exit: + return ret; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) */ + +void rtw_2g_channels_init(struct ieee80211_channel *channels) +{ + _rtw_memcpy((void *)channels, (void *)rtw_2ghz_channels, sizeof(rtw_2ghz_channels)); +} + +void rtw_5g_channels_init(struct ieee80211_channel *channels) +{ + _rtw_memcpy((void *)channels, (void *)rtw_5ghz_a_channels, sizeof(rtw_5ghz_a_channels)); +} + +void rtw_2g_rates_init(struct ieee80211_rate *rates) +{ + _rtw_memcpy(rates, rtw_g_rates, + sizeof(struct ieee80211_rate) * RTW_G_RATES_NUM + ); +} + +void rtw_5g_rates_init(struct ieee80211_rate *rates) +{ + _rtw_memcpy(rates, rtw_a_rates, + sizeof(struct ieee80211_rate) * RTW_A_RATES_NUM + ); +} + +struct ieee80211_supported_band *rtw_spt_band_alloc(BAND_TYPE band) +{ + struct ieee80211_supported_band *spt_band = NULL; + int n_channels, n_bitrates; + + if (band == BAND_ON_2_4G) { + n_channels = MAX_CHANNEL_NUM_2G; + n_bitrates = RTW_G_RATES_NUM; + } else if (band == BAND_ON_5G) { + n_channels = MAX_CHANNEL_NUM_5G; + n_bitrates = RTW_A_RATES_NUM; + } else + goto exit; + + spt_band = (struct ieee80211_supported_band *)rtw_zmalloc( + sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel) * n_channels + + sizeof(struct ieee80211_rate) * n_bitrates + ); + if (!spt_band) + goto exit; + + spt_band->channels = (struct ieee80211_channel *)(((u8 *)spt_band) + sizeof(struct ieee80211_supported_band)); + spt_band->bitrates = (struct ieee80211_rate *)(((u8 *)spt_band->channels) + sizeof(struct ieee80211_channel) * n_channels); + spt_band->band = rtw_band_to_nl80211_band(band); + spt_band->n_channels = n_channels; + spt_band->n_bitrates = n_bitrates; + + if (band == BAND_ON_2_4G) { + rtw_2g_channels_init(spt_band->channels); + rtw_2g_rates_init(spt_band->bitrates); + } else if (band == BAND_ON_5G) { + rtw_5g_channels_init(spt_band->channels); + rtw_5g_rates_init(spt_band->bitrates); + } + + /* spt_band.ht_cap */ + +exit: + + return spt_band; +} + +void rtw_spt_band_free(struct ieee80211_supported_band *spt_band) +{ + u32 size = 0; + + if (!spt_band) + return; + + if (spt_band->band == NL80211_BAND_2GHZ) { + size = sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel) * MAX_CHANNEL_NUM_2G + + sizeof(struct ieee80211_rate) * RTW_G_RATES_NUM; + } else if (spt_band->band == NL80211_BAND_5GHZ) { + size = sizeof(struct ieee80211_supported_band) + + sizeof(struct ieee80211_channel) * MAX_CHANNEL_NUM_5G + + sizeof(struct ieee80211_rate) * RTW_A_RATES_NUM; + } else { + + } + rtw_mfree((u8 *)spt_band, size); +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) +static const struct ieee80211_txrx_stypes + rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { + [NL80211_IFTYPE_ADHOC] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_STATION] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, + [NL80211_IFTYPE_AP] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_AP_VLAN] = { + /* copy AP */ + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, + [NL80211_IFTYPE_P2P_CLIENT] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, + [NL80211_IFTYPE_P2P_GO] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) + }, +#if defined(RTW_DEDICATED_P2P_DEVICE) + [NL80211_IFTYPE_P2P_DEVICE] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) + }, +#endif +#if defined(CONFIG_RTW_MESH) + [NL80211_IFTYPE_MESH_POINT] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) + | BIT(IEEE80211_STYPE_AUTH >> 4) + }, +#endif + +}; +#endif + +NDIS_802_11_NETWORK_INFRASTRUCTURE nl80211_iftype_to_rtw_network_type(enum nl80211_iftype type) +{ + switch (type) { + case NL80211_IFTYPE_ADHOC: + return Ndis802_11IBSS; + + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_CLIENT: + #endif + case NL80211_IFTYPE_STATION: + return Ndis802_11Infrastructure; + +#ifdef CONFIG_AP_MODE + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_GO: + #endif + case NL80211_IFTYPE_AP: + return Ndis802_11APMode; +#endif + +#ifdef CONFIG_RTW_MESH + case NL80211_IFTYPE_MESH_POINT: + return Ndis802_11_mesh; +#endif + + case NL80211_IFTYPE_MONITOR: + return Ndis802_11Monitor; + + default: + return Ndis802_11InfrastructureMax; + } +} + +u32 nl80211_iftype_to_rtw_mlme_state(enum nl80211_iftype type) +{ + switch (type) { + case NL80211_IFTYPE_ADHOC: + return WIFI_ADHOC_STATE; + + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_CLIENT: + #endif + case NL80211_IFTYPE_STATION: + return WIFI_STATION_STATE; + +#ifdef CONFIG_AP_MODE + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_GO: + #endif + case NL80211_IFTYPE_AP: + return WIFI_AP_STATE; +#endif + +#ifdef CONFIG_RTW_MESH + case NL80211_IFTYPE_MESH_POINT: + return WIFI_MESH_STATE; +#endif + + case NL80211_IFTYPE_MONITOR: + return WIFI_MONITOR_STATE; + + default: + return WIFI_NULL_STATE; + } +} + +static int rtw_cfg80211_sync_iftype(_adapter *adapter) +{ + struct wireless_dev *rtw_wdev = adapter->rtw_wdev; + + if (!(nl80211_iftype_to_rtw_mlme_state(rtw_wdev->iftype) & MLME_STATE(adapter))) { + /* iftype and mlme state is not syc */ + NDIS_802_11_NETWORK_INFRASTRUCTURE network_type; + + network_type = nl80211_iftype_to_rtw_network_type(rtw_wdev->iftype); + if (network_type != Ndis802_11InfrastructureMax) { + if (rtw_pwr_wakeup(adapter) == _FAIL) { + RTW_WARN(FUNC_ADPT_FMT" call rtw_pwr_wakeup fail\n", FUNC_ADPT_ARG(adapter)); + return _FAIL; + } + + rtw_set_802_11_infrastructure_mode(adapter, network_type, 0); + rtw_setopmode_cmd(adapter, network_type, RTW_CMDF_WAIT_ACK); + } else { + rtw_warn_on(1); + RTW_WARN(FUNC_ADPT_FMT" iftype:%u is not support\n", FUNC_ADPT_ARG(adapter), rtw_wdev->iftype); + return _FAIL; + } + } + + return _SUCCESS; +} + +static u64 rtw_get_systime_us(void) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)) + return ktime_to_us(ktime_get_boottime()); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) + struct timespec ts; + get_monotonic_boottime(&ts); + return ((u64)ts.tv_sec * 1000000) + ts.tv_nsec / 1000; +#else + struct timeval tv; + do_gettimeofday(&tv); + return ((u64)tv.tv_sec * 1000000) + tv.tv_usec; +#endif +} + +/* Try to remove non target BSS's SR to reduce PBC overlap rate */ +static int rtw_cfg80211_clear_wps_sr_of_non_target_bss(_adapter *padapter, struct wlan_network *pnetwork, struct cfg80211_ssid *req_ssid) +{ + int ret = 0; + u8 *psr = NULL, sr = 0; + NDIS_802_11_SSID *pssid = &pnetwork->network.Ssid; + u32 wpsielen = 0; + u8 *wpsie = NULL; + + if (pssid->SsidLength == req_ssid->ssid_len + && _rtw_memcmp(pssid->Ssid, req_ssid->ssid, req_ssid->ssid_len) == _TRUE) + goto exit; + + wpsie = rtw_get_wps_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_ + , pnetwork->network.IELength - _FIXED_IE_LENGTH_, NULL, &wpsielen); + if (wpsie && wpsielen > 0) + psr = rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_SELECTED_REGISTRAR, &sr, NULL); + + if (psr && sr) { + if (0) + RTW_INFO("clear sr of non target bss:%s("MAC_FMT")\n" + , pssid->Ssid, MAC_ARG(pnetwork->network.MacAddress)); + *psr = 0; /* clear sr */ + ret = 1; + } + +exit: + return ret; +} + +#define MAX_BSSINFO_LEN 1000 +struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork) +{ + struct ieee80211_channel *notify_channel; + struct cfg80211_bss *bss = NULL; + /* struct ieee80211_supported_band *band; */ + u16 channel; + u32 freq; + u64 notify_timestamp; + u16 notify_capability; + u16 notify_interval; + u8 *notify_ie; + size_t notify_ielen; + s32 notify_signal; + /* u8 buf[MAX_BSSINFO_LEN]; */ + + u8 *pbuf; + size_t buf_size = MAX_BSSINFO_LEN; + size_t len, bssinf_len = 0; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + struct wireless_dev *wdev = padapter->rtw_wdev; + struct wiphy *wiphy = wdev->wiphy; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + pbuf = rtw_zmalloc(buf_size); + if (pbuf == NULL) { + RTW_INFO("%s pbuf allocate failed !!\n", __FUNCTION__); + return bss; + } + + /* RTW_INFO("%s\n", __func__); */ + + bssinf_len = pnetwork->network.IELength + sizeof(struct rtw_ieee80211_hdr_3addr); + if (bssinf_len > buf_size) { + RTW_INFO("%s IE Length too long > %zu byte\n", __FUNCTION__, buf_size); + goto exit; + } + +#ifndef CONFIG_WAPI_SUPPORT + { + u16 wapi_len = 0; + + if (rtw_get_wapi_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &wapi_len) > 0) { + if (wapi_len > 0) { + RTW_INFO("%s, no support wapi!\n", __FUNCTION__); + goto exit; + } + } + } +#endif /* !CONFIG_WAPI_SUPPORT */ + + channel = pnetwork->network.Configuration.DSConfig; + freq = rtw_ch2freq(channel); + notify_channel = ieee80211_get_channel(wiphy, freq); + + if (0) + notify_timestamp = le64_to_cpu(*(u64 *)rtw_get_timestampe_from_ie(pnetwork->network.IEs)); + else + notify_timestamp = rtw_get_systime_us(); + + notify_interval = le16_to_cpu(*(u16 *)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs)); + notify_capability = le16_to_cpu(*(u16 *)rtw_get_capability_from_ie(pnetwork->network.IEs)); + + notify_ie = pnetwork->network.IEs + _FIXED_IE_LENGTH_; + notify_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_; + + /* We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) */ + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && + is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) { + notify_signal = 100 * translate_percentage_to_dbm(padapter->recvpriv.signal_strength); /* dbm */ + } else { + notify_signal = 100 * translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength); /* dbm */ + } + +#if 0 + RTW_INFO("bssid: "MAC_FMT"\n", MAC_ARG(pnetwork->network.MacAddress)); + RTW_INFO("Channel: %d(%d)\n", channel, freq); + RTW_INFO("Capability: %X\n", notify_capability); + RTW_INFO("Beacon interval: %d\n", notify_interval); + RTW_INFO("Signal: %d\n", notify_signal); + RTW_INFO("notify_timestamp: %llu\n", notify_timestamp); +#endif + + /* pbuf = buf; */ + + pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + /* pmlmeext->mgnt_seq++; */ + + if (pnetwork->network.Reserved[0] == BSS_TYPE_BCN) { /* WIFI_BEACON */ + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + set_frame_sub_type(pbuf, WIFI_BEACON); + } else { + _rtw_memcpy(pwlanhdr->addr1, adapter_mac_addr(padapter), ETH_ALEN); + set_frame_sub_type(pbuf, WIFI_PROBERSP); + } + + _rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); + + + /* pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); */ + len = sizeof(struct rtw_ieee80211_hdr_3addr); + _rtw_memcpy((pbuf + len), pnetwork->network.IEs, pnetwork->network.IELength); + *((u64 *)(pbuf + len)) = cpu_to_le64(notify_timestamp); + + len += pnetwork->network.IELength; + + #if defined(CONFIG_P2P) && 0 + if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL)) + RTW_INFO("%s, got p2p_ie\n", __func__); + #endif + +#if 1 + bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)pbuf, + len, notify_signal, GFP_ATOMIC); +#else + + bss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress, + notify_timestamp, notify_capability, notify_interval, notify_ie, + notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/); +#endif + + if (unlikely(!bss)) { + RTW_INFO(FUNC_ADPT_FMT" bss NULL\n", FUNC_ADPT_ARG(padapter)); + goto exit; + } + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 38)) +#ifndef COMPAT_KERNEL_RELEASE + /* patch for cfg80211, update beacon ies to information_elements */ + if (pnetwork->network.Reserved[0] == BSS_TYPE_BCN) { /* WIFI_BEACON */ + + if (bss->len_information_elements != bss->len_beacon_ies) { + bss->information_elements = bss->beacon_ies; + bss->len_information_elements = bss->len_beacon_ies; + } + } +#endif /* COMPAT_KERNEL_RELEASE */ +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 38) */ + +#if 0 + { + if (bss->information_elements == bss->proberesp_ies) { + if (bss->len_information_elements != bss->len_proberesp_ies) + RTW_INFO("error!, len_information_elements != bss->len_proberesp_ies\n"); + } else if (bss->len_information_elements < bss->len_beacon_ies) { + bss->information_elements = bss->beacon_ies; + bss->len_information_elements = bss->len_beacon_ies; + } + } +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + cfg80211_put_bss(wiphy, bss); +#else + cfg80211_put_bss(bss); +#endif + +exit: + if (pbuf) + rtw_mfree(pbuf, buf_size); + return bss; + +} + +/* + Check the given bss is valid by kernel API cfg80211_get_bss() + @padapter : the given adapter + + return _TRUE if bss is valid, _FALSE for not found. +*/ +int rtw_cfg80211_check_bss(_adapter *padapter) +{ + WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network); + struct cfg80211_bss *bss = NULL; + struct ieee80211_channel *notify_channel = NULL; + u32 freq; + + if (!(pnetwork) || !(padapter->rtw_wdev)) + return _FALSE; + + freq = rtw_ch2freq(pnetwork->Configuration.DSConfig); + notify_channel = ieee80211_get_channel(padapter->rtw_wdev->wiphy, freq); + bss = cfg80211_get_bss(padapter->rtw_wdev->wiphy, notify_channel, + pnetwork->MacAddress, pnetwork->Ssid.Ssid, + pnetwork->Ssid.SsidLength, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) + pnetwork->InfrastructureMode == Ndis802_11Infrastructure?IEEE80211_BSS_TYPE_ESS:IEEE80211_BSS_TYPE_IBSS, + IEEE80211_PRIVACY(pnetwork->Privacy)); +#else + pnetwork->InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS, pnetwork->InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS); +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss); +#else + cfg80211_put_bss(bss); +#endif + + return bss != NULL; +} + +void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wireless_dev *pwdev = padapter->rtw_wdev; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) + struct wiphy *wiphy = pwdev->wiphy; + int freq = 2412; + struct ieee80211_channel *notify_channel; +#endif + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + if (pwdev->iftype != NL80211_IFTYPE_ADHOC) + return; + + if (!rtw_cfg80211_check_bss(padapter)) { + WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network); + struct wlan_network *scanned = pmlmepriv->cur_network_scanned; + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { + + _rtw_memcpy(&cur_network->network, pnetwork, sizeof(WLAN_BSSID_EX)); + if (cur_network) { + if (!rtw_cfg80211_inform_bss(padapter, cur_network)) + RTW_INFO(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter)); + else + RTW_INFO(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter)); + } else { + RTW_INFO("cur_network is not exist!!!\n"); + return ; + } + } else { + if (scanned == NULL) + rtw_warn_on(1); + + if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE + && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE + ) { + if (!rtw_cfg80211_inform_bss(padapter, scanned)) + RTW_INFO(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter)); + else { + /* RTW_INFO(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter)); */ + } + } else { + RTW_INFO("scanned & pnetwork compare fail\n"); + rtw_warn_on(1); + } + } + + if (!rtw_cfg80211_check_bss(padapter)) + RTW_PRINT(FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter)); + } + /* notify cfg80211 that device joined an IBSS */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) + freq = rtw_ch2freq(cur_network->network.Configuration.DSConfig); + if (1) + RTW_INFO("chan: %d, freq: %d\n", cur_network->network.Configuration.DSConfig, freq); + notify_channel = ieee80211_get_channel(wiphy, freq); + cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, notify_channel, GFP_ATOMIC); +#else + cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_indicate_connect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + _irqL irqL; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) + struct cfg80211_roam_info roam_info ={}; +#endif + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + if (pwdev->iftype != NL80211_IFTYPE_STATION + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT + #endif + ) + return; + + if (!MLME_IS_STA(padapter)) + return; + +#ifdef CONFIG_P2P + if (pwdinfo->driver_interface == DRIVER_CFG80211) { + #if !RTW_P2P_GROUP_INTERFACE + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); + RTW_INFO("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + #endif + } +#endif /* CONFIG_P2P */ + + if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) != _TRUE) { + WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network); + struct wlan_network *scanned = pmlmepriv->cur_network_scanned; + + /* RTW_INFO(FUNC_ADPT_FMT" BSS not found\n", FUNC_ADPT_ARG(padapter)); */ + + if (scanned == NULL) { + rtw_warn_on(1); + goto check_bss; + } + + if (_rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE + && _rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE + ) { + if (!rtw_cfg80211_inform_bss(padapter, scanned)) + RTW_INFO(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter)); + else { + /* RTW_INFO(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter)); */ + } + } else { + RTW_INFO("scanned: %s("MAC_FMT"), cur: %s("MAC_FMT")\n", + scanned->network.Ssid.Ssid, MAC_ARG(scanned->network.MacAddress), + pnetwork->Ssid.Ssid, MAC_ARG(pnetwork->MacAddress) + ); + rtw_warn_on(1); + } + } + +check_bss: + if (!rtw_cfg80211_check_bss(padapter)) + RTW_PRINT(FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter)); + + _enter_critical_bh(&pwdev_priv->connect_req_lock, &irqL); + + if (rtw_to_roam(padapter) > 0) { + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) + struct wiphy *wiphy = pwdev->wiphy; + struct ieee80211_channel *notify_channel; + u32 freq; + u16 channel = cur_network->network.Configuration.DSConfig; + + freq = rtw_ch2freq(channel); + notify_channel = ieee80211_get_channel(wiphy, freq); + #endif + + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) + roam_info.bssid = cur_network->network.MacAddress; + roam_info.req_ie = pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2; + roam_info.req_ie_len = pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2; + roam_info.resp_ie = pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6; + roam_info.resp_ie_len = pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6; + + cfg80211_roamed(padapter->pnetdev, &roam_info, GFP_ATOMIC); + #else + cfg80211_roamed(padapter->pnetdev + #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE) + , notify_channel + #endif + , cur_network->network.MacAddress + , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 + , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 + , pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6 + , pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6 + , GFP_ATOMIC); + #endif /*LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)*/ + + RTW_INFO(FUNC_ADPT_FMT" call cfg80211_roamed\n", FUNC_ADPT_ARG(padapter)); + +#ifdef CONFIG_RTW_80211R + if (rtw_ft_roam(padapter)) + rtw_ft_set_status(padapter, RTW_FT_ASSOCIATED_STA); +#endif + } else { + #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE) + RTW_INFO("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + #endif + + if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) != _TRUE) + rtw_cfg80211_connect_result(pwdev, cur_network->network.MacAddress + , pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2 + , pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 2 + , pmlmepriv->assoc_rsp + sizeof(struct rtw_ieee80211_hdr_3addr) + 6 + , pmlmepriv->assoc_rsp_len - sizeof(struct rtw_ieee80211_hdr_3addr) - 6 + , WLAN_STATUS_SUCCESS, GFP_ATOMIC); + #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE) + RTW_INFO("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + #endif + } + + rtw_wdev_free_connect_req(pwdev_priv); + + _exit_critical_bh(&pwdev_priv->connect_req_lock, &irqL); +} + +void rtw_cfg80211_indicate_disconnect(_adapter *padapter, u16 reason, u8 locally_generated) +{ + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + _irqL irqL; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + + /*always replace privated definitions with wifi reserved value 0*/ + if (WLAN_REASON_IS_PRIVATE(reason)) + reason = 0; + + if (pwdev->iftype != NL80211_IFTYPE_STATION + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + && pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT + #endif + ) + return; + + if (!MLME_IS_STA(padapter)) + return; + +#ifdef CONFIG_P2P + if (pwdinfo->driver_interface == DRIVER_CFG80211) { + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); + + #if RTW_P2P_GROUP_INTERFACE + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + if (pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT) + #endif + #endif + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + + RTW_INFO("%s, role=%d, p2p_state=%d, pre_p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); + } + } +#endif /* CONFIG_P2P */ + + _enter_critical_bh(&pwdev_priv->connect_req_lock, &irqL); + + if (padapter->ndev_unregistering || !rtw_wdev_not_indic_disco(pwdev_priv)) { + #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE) + RTW_INFO("pwdev->sme_state(b)=%d\n", pwdev->sme_state); + + if (pwdev->sme_state == CFG80211_SME_CONNECTING) { + RTW_INFO(FUNC_ADPT_FMT" call cfg80211_connect_result\n", FUNC_ADPT_ARG(padapter)); + rtw_cfg80211_connect_result(pwdev, NULL, NULL, 0, NULL, 0, + reason, GFP_ATOMIC); + } else if (pwdev->sme_state == CFG80211_SME_CONNECTED) { + RTW_INFO(FUNC_ADPT_FMT" call cfg80211_disconnected\n", FUNC_ADPT_ARG(padapter)); + rtw_cfg80211_disconnected(pwdev, reason, NULL, 0, locally_generated, GFP_ATOMIC); + } + + RTW_INFO("pwdev->sme_state(a)=%d\n", pwdev->sme_state); + #else + if (pwdev_priv->connect_req) { + RTW_INFO(FUNC_ADPT_FMT" call cfg80211_connect_result\n", FUNC_ADPT_ARG(padapter)); + rtw_cfg80211_connect_result(pwdev, NULL, NULL, 0, NULL, 0, + reason, GFP_ATOMIC); + } else { + RTW_INFO(FUNC_ADPT_FMT" call cfg80211_disconnected\n", FUNC_ADPT_ARG(padapter)); + rtw_cfg80211_disconnected(pwdev, reason, NULL, 0, locally_generated, GFP_ATOMIC); + } + #endif + } + + rtw_wdev_free_connect_req(pwdev_priv); + + _exit_critical_bh(&pwdev_priv->connect_req_lock, &irqL); +} + + +#ifdef CONFIG_AP_MODE +static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param) +{ + int ret = 0; + u32 wep_key_idx, wep_key_len; + struct sta_info *psta = NULL, *pbcmc_sta = NULL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + RTW_INFO("%s\n", __FUNCTION__); + + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + + if (is_broadcast_mac_addr(param->sta_addr)) { + if (param->u.crypt.idx >= WEP_KEYS + #ifdef CONFIG_IEEE80211W + && param->u.crypt.idx > BIP_MAX_KEYID + #endif + ) { + ret = -EINVAL; + goto exit; + } + } else { + psta = rtw_get_stainfo(pstapriv, param->sta_addr); + if (!psta) { + ret = -EINVAL; + RTW_INFO(FUNC_ADPT_FMT", sta "MAC_FMT" not found\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(param->sta_addr)); + goto exit; + } + } + + if (strcmp(param->u.crypt.alg, "none") == 0 && (psta == NULL)) { + /* todo:clear default encryption keys */ + + RTW_INFO("clear default encryption keys, keyid=%d\n", param->u.crypt.idx); + + goto exit; + } + + + if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta == NULL)) { + RTW_INFO("r871x_set_encryption, crypt.alg = WEP\n"); + + wep_key_idx = param->u.crypt.idx; + wep_key_len = param->u.crypt.key_len; + + RTW_INFO("r871x_set_encryption, wep_key_idx=%d, len=%d\n", wep_key_idx, wep_key_len); + + if ((wep_key_idx >= WEP_KEYS) || (wep_key_len <= 0)) { + ret = -EINVAL; + goto exit; + } + + if (wep_key_len > 0) + wep_key_len = wep_key_len <= 5 ? 5 : 13; + + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) { + /* wep default key has not been set, so use this key index as default key. */ + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + + if (wep_key_len == 13) { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; + } + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); + + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + + rtw_ap_set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx, 1); + + goto exit; + + } + + if (!psta) { /* group key */ + if (param->u.crypt.set_tx == 0) { /* group key, TX only */ + if (strcmp(param->u.crypt.alg, "WEP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set WEP TX GTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.idx, param->u.crypt.key_len); + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if (param->u.crypt.key_len == 13) + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + + } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set TKIP TX GTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.idx, param->u.crypt.key_len); + psecuritypriv->dot118021XGrpPrivacy = _TKIP_; + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + /* set mic key */ + _rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); + psecuritypriv->busetkipkey = _TRUE; + + } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set CCMP TX GTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.idx, param->u.crypt.key_len); + psecuritypriv->dot118021XGrpPrivacy = _AES_; + _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + + #ifdef CONFIG_IEEE80211W + } else if (strcmp(param->u.crypt.alg, "BIP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set TX IGTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.idx, param->u.crypt.key_len); + _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + padapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx; + psecuritypriv->dot11wBIPtxpn.val = RTW_GET_LE64(param->u.crypt.seq); + padapter->securitypriv.binstallBIPkey = _TRUE; + goto exit; + #endif /* CONFIG_IEEE80211W */ + + } else if (strcmp(param->u.crypt.alg, "none") == 0) { + RTW_INFO(FUNC_ADPT_FMT" clear group key, idx:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.idx); + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + } else { + RTW_WARN(FUNC_ADPT_FMT" set group key, not support\n" + , FUNC_ADPT_ARG(padapter)); + goto exit; + } + + psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; + pbcmc_sta = rtw_get_bcmc_stainfo(padapter); + if (pbcmc_sta) { + pbcmc_sta->dot11txpn.val = RTW_GET_LE64(param->u.crypt.seq); + pbcmc_sta->ieee8021x_blocked = _FALSE; + pbcmc_sta->dot118021XPrivacy = psecuritypriv->dot118021XGrpPrivacy; /* rx will use bmc_sta's dot118021XPrivacy */ + } + psecuritypriv->binstallGrpkey = _TRUE; + psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;/* !!! */ + + rtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); + } + + goto exit; + + } + + if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) { /* psk/802_1x */ + if (param->u.crypt.set_tx == 1) { + /* pairwise key */ + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + + if (strcmp(param->u.crypt.alg, "WEP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set WEP PTK of "MAC_FMT" idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx, param->u.crypt.key_len); + psta->dot118021XPrivacy = _WEP40_; + if (param->u.crypt.key_len == 13) + psta->dot118021XPrivacy = _WEP104_; + + } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set TKIP PTK of "MAC_FMT" idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx, param->u.crypt.key_len); + psta->dot118021XPrivacy = _TKIP_; + /* set mic key */ + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); + psecuritypriv->busetkipkey = _TRUE; + + } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set CCMP PTK of "MAC_FMT" idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx, param->u.crypt.key_len); + psta->dot118021XPrivacy = _AES_; + + } else if (strcmp(param->u.crypt.alg, "none") == 0) { + RTW_INFO(FUNC_ADPT_FMT" clear pairwise key of "MAC_FMT" idx:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx); + psta->dot118021XPrivacy = _NO_PRIVACY_; + } else { + RTW_WARN(FUNC_ADPT_FMT" set pairwise key of "MAC_FMT", not support\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr)); + goto exit; + } + + psta->dot11txpn.val = RTW_GET_LE64(param->u.crypt.seq); + psta->dot11rxpn.val = RTW_GET_LE64(param->u.crypt.seq); + psta->ieee8021x_blocked = _FALSE; + + if (psta->dot118021XPrivacy != _NO_PRIVACY_) { + psta->bpairwise_key_installed = _TRUE; + + /* WPA2 key-handshake has completed */ + if (psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) + psta->state &= (~WIFI_UNDER_KEY_HANDSHAKE); + } + + rtw_ap_set_pairwise_key(padapter, psta); + } else { + /* peer's group key, RX only */ + #ifdef CONFIG_RTW_MESH + if (strcmp(param->u.crypt.alg, "CCMP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set CCMP GTK of "MAC_FMT", idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx, param->u.crypt.key_len); + psta->group_privacy = _AES_; + _rtw_memcpy(psta->gtk.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + psta->gtk_bmp |= BIT(param->u.crypt.idx); + psta->gtk_pn.val = RTW_GET_LE64(param->u.crypt.seq); + + #ifdef CONFIG_IEEE80211W + } else if (strcmp(param->u.crypt.alg, "BIP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set IGTK of "MAC_FMT", idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx, param->u.crypt.key_len); + _rtw_memcpy(psta->igtk.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + psta->igtk_bmp |= BIT(param->u.crypt.idx); + psta->igtk_id = param->u.crypt.idx; + psta->igtk_pn.val = RTW_GET_LE64(param->u.crypt.seq); + goto exit; + #endif /* CONFIG_IEEE80211W */ + + } else if (strcmp(param->u.crypt.alg, "none") == 0) { + RTW_INFO(FUNC_ADPT_FMT" clear group key of "MAC_FMT", idx:%u\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr) + , param->u.crypt.idx); + psta->group_privacy = _NO_PRIVACY_; + psta->gtk_bmp &= ~BIT(param->u.crypt.idx); + } else + #endif /* CONFIG_RTW_MESH */ + { + RTW_WARN(FUNC_ADPT_FMT" set group key of "MAC_FMT", not support\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr)); + goto exit; + } + + #ifdef CONFIG_RTW_MESH + rtw_ap_set_sta_key(padapter, psta->cmn.mac_addr, psta->group_privacy + , param->u.crypt.key, param->u.crypt.idx, 1); + #endif + } + + } + +exit: + return ret; +} +#endif /* CONFIG_AP_MODE */ + +static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param) +{ + int ret = 0; + u32 wep_key_idx, wep_key_len; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +#endif /* CONFIG_P2P */ + + RTW_INFO("%s\n", __func__); + + param->u.crypt.err = 0; + param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; + + if (is_broadcast_mac_addr(param->sta_addr)) { + if (param->u.crypt.idx >= WEP_KEYS + #ifdef CONFIG_IEEE80211W + && param->u.crypt.idx > BIP_MAX_KEYID + #endif + ) { + ret = -EINVAL; + goto exit; + } + } else { +#ifdef CONFIG_WAPI_SUPPORT + if (strcmp(param->u.crypt.alg, "SMS4")) +#endif + { + ret = -EINVAL; + goto exit; + } + } + + if (strcmp(param->u.crypt.alg, "WEP") == 0) { + RTW_INFO("wpa_set_encryption, crypt.alg = WEP\n"); + + wep_key_idx = param->u.crypt.idx; + wep_key_len = param->u.crypt.key_len; + + if ((wep_key_idx >= WEP_KEYS) || (wep_key_len <= 0)) { + ret = -EINVAL; + goto exit; + } + + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) { + /* wep default key has not been set, so use this key index as default key. */ + + wep_key_len = wep_key_len <= 5 ? 5 : 13; + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + + if (wep_key_len == 13) { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; + } + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len); + + psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + + rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0, _TRUE); + + goto exit; + } + + if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { /* 802_1x */ + struct sta_info *psta, *pbcmc_sta; + struct sta_priv *pstapriv = &padapter->stapriv; + + /* RTW_INFO("%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X\n", __func__); */ + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) { /* sta mode */ +#ifdef CONFIG_RTW_80211R + if (rtw_ft_roam(padapter)) + psta = rtw_get_stainfo(pstapriv, pmlmepriv->assoc_bssid); + else +#endif + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + /* DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail\n")); */ + RTW_INFO("%s, : Obtain Sta_info fail\n", __func__); + } else { + /* Jeff: don't disable ieee8021x_blocked while clearing key */ + if (strcmp(param->u.crypt.alg, "none") != 0) + psta->ieee8021x_blocked = _FALSE; + + if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled) || + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) + psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + + if (param->u.crypt.set_tx == 1) { /* pairwise key */ + RTW_INFO(FUNC_ADPT_FMT" set %s PTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.alg, param->u.crypt.idx, param->u.crypt.key_len); + _rtw_memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + if (strcmp(param->u.crypt.alg, "TKIP") == 0) { /* set mic key */ + _rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); + padapter->securitypriv.busetkipkey = _FALSE; + } + psta->dot11txpn.val = RTW_GET_LE64(param->u.crypt.seq); + psta->dot11rxpn.val = RTW_GET_LE64(param->u.crypt.seq); + psta->bpairwise_key_installed = _TRUE; + #ifdef CONFIG_RTW_80211R + psta->ft_pairwise_key_installed = _TRUE; + #endif + rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _TRUE); + + } else { /* group key */ + if (strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set %s GTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.alg, param->u.crypt.idx, param->u.crypt.key_len); + _rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, + (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + _rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); + _rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); + padapter->securitypriv.binstallGrpkey = _TRUE; + if (param->u.crypt.idx < 4) + _rtw_memcpy(padapter->securitypriv.iv_seq[param->u.crypt.idx], param->u.crypt.seq, 8); + padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; + rtw_set_key(padapter, &padapter->securitypriv, param->u.crypt.idx, 1, _TRUE); + + #ifdef CONFIG_IEEE80211W + } else if (strcmp(param->u.crypt.alg, "BIP") == 0) { + RTW_INFO(FUNC_ADPT_FMT" set IGTK idx:%u, len:%u\n" + , FUNC_ADPT_ARG(padapter), param->u.crypt.idx, param->u.crypt.key_len); + _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key, + (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); + psecuritypriv->dot11wBIPKeyid = param->u.crypt.idx; + psecuritypriv->dot11wBIPrxpn.val = RTW_GET_LE64(param->u.crypt.seq); + psecuritypriv->binstallBIPkey = _TRUE; + #endif /* CONFIG_IEEE80211W */ + + } + +#ifdef CONFIG_P2P + if (pwdinfo->driver_interface == DRIVER_CFG80211) { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING)) + rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE); + } +#endif /* CONFIG_P2P */ + + /* WPA/WPA2 key-handshake has completed */ + clr_fwstate(pmlmepriv, WIFI_UNDER_KEY_HANDSHAKE); + + } + } + + pbcmc_sta = rtw_get_bcmc_stainfo(padapter); + if (pbcmc_sta == NULL) { + /* DEBUG_ERR( ("Set OID_802_11_ADD_KEY: bcmc stainfo is null\n")); */ + } else { + /* Jeff: don't disable ieee8021x_blocked while clearing key */ + if (strcmp(param->u.crypt.alg, "none") != 0) + pbcmc_sta->ieee8021x_blocked = _FALSE; + + if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled) || + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) + pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; + } + } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { /* adhoc mode */ + } + } + + #ifdef CONFIG_WAPI_SUPPORT + if (strcmp(param->u.crypt.alg, "SMS4") == 0) + rtw_wapi_set_set_encryption(padapter, param); + #endif + +exit: + + RTW_INFO("%s, ret=%d\n", __func__, ret); + + + return ret; +} + +static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev + , u8 key_index +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + , bool pairwise +#endif + , const u8 *mac_addr, struct key_params *params) +{ + char *alg_name; + u32 param_len; + struct ieee_param *param = NULL; + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct wireless_dev *rtw_wdev = padapter->rtw_wdev; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TDLS + struct sta_info *ptdls_sta; +#endif /* CONFIG_TDLS */ + + if (mac_addr) + RTW_INFO(FUNC_NDEV_FMT" adding key for %pM\n", FUNC_NDEV_ARG(ndev), mac_addr); + RTW_INFO(FUNC_NDEV_FMT" cipher=0x%x\n", FUNC_NDEV_ARG(ndev), params->cipher); + RTW_INFO(FUNC_NDEV_FMT" key_len=%d, key_index=%d\n", FUNC_NDEV_ARG(ndev), params->key_len, key_index); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + RTW_INFO(FUNC_NDEV_FMT" pairwise=%d\n", FUNC_NDEV_ARG(ndev), pairwise); +#endif + + if (rtw_cfg80211_sync_iftype(padapter) != _SUCCESS) { + ret = -ENOTSUPP; + goto addkey_end; + } + + param_len = sizeof(struct ieee_param) + params->key_len; + param = rtw_malloc(param_len); + if (param == NULL) + return -1; + + _rtw_memset(param, 0, param_len); + + param->cmd = IEEE_CMD_SET_ENCRYPTION; + _rtw_memset(param->sta_addr, 0xff, ETH_ALEN); + + switch (params->cipher) { + case IW_AUTH_CIPHER_NONE: + /* todo: remove key */ + /* remove = 1; */ + alg_name = "none"; + break; + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + alg_name = "WEP"; + break; + case WLAN_CIPHER_SUITE_TKIP: + alg_name = "TKIP"; + break; + case WLAN_CIPHER_SUITE_CCMP: + alg_name = "CCMP"; + break; +#ifdef CONFIG_IEEE80211W + case WLAN_CIPHER_SUITE_AES_CMAC: + alg_name = "BIP"; + break; +#endif /* CONFIG_IEEE80211W */ +#ifdef CONFIG_WAPI_SUPPORT + case WLAN_CIPHER_SUITE_SMS4: + alg_name = "SMS4"; + if (pairwise == NL80211_KEYTYPE_PAIRWISE) { + if (key_index != 0 && key_index != 1) { + ret = -ENOTSUPP; + goto addkey_end; + } + _rtw_memcpy((void *)param->sta_addr, (void *)mac_addr, ETH_ALEN); + } else + RTW_INFO("mac_addr is null\n"); + RTW_INFO("rtw_wx_set_enc_ext: SMS4 case\n"); + break; +#endif + + default: + ret = -ENOTSUPP; + goto addkey_end; + } + + strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN); + + + if (!mac_addr || is_broadcast_ether_addr(mac_addr) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + || !pairwise + #endif + ) { + param->u.crypt.set_tx = 0; /* for wpa/wpa2 group key */ + } else { + param->u.crypt.set_tx = 1; /* for wpa/wpa2 pairwise key */ + } + + param->u.crypt.idx = key_index; + + if (params->seq_len && params->seq) { + _rtw_memcpy(param->u.crypt.seq, (u8 *)params->seq, params->seq_len); + RTW_INFO(FUNC_NDEV_FMT" seq_len:%u, seq:0x%llx\n", FUNC_NDEV_ARG(ndev) + , params->seq_len, RTW_GET_LE64(param->u.crypt.seq)); + } + + if (params->key_len && params->key) { + param->u.crypt.key_len = params->key_len; + _rtw_memcpy(param->u.crypt.key, (u8 *)params->key, params->key_len); + } + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { +#ifdef CONFIG_TDLS + if (rtw_tdls_is_driver_setup(padapter) == _FALSE && mac_addr) { + ptdls_sta = rtw_get_stainfo(&padapter->stapriv, (void *)mac_addr); + if (ptdls_sta != NULL && ptdls_sta->tdls_sta_state) { + _rtw_memcpy(ptdls_sta->tpk.tk, params->key, params->key_len); + rtw_tdls_set_key(padapter, ptdls_sta); + goto addkey_end; + } + } +#endif /* CONFIG_TDLS */ + ret = rtw_cfg80211_set_encryption(ndev, param); + } else if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) { +#ifdef CONFIG_AP_MODE + if (mac_addr) + _rtw_memcpy(param->sta_addr, (void *)mac_addr, ETH_ALEN); + + ret = rtw_cfg80211_ap_set_encryption(ndev, param); +#endif + } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE + || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE + ) { + /* RTW_INFO("@@@@@@@@@@ fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); */ + ret = rtw_cfg80211_set_encryption(ndev, param); + } else + RTW_INFO("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype); + + +addkey_end: + if (param) + rtw_mfree(param, param_len); + + return ret; + +} + +static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev + , u8 keyid +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + , bool pairwise +#endif + , const u8 *mac_addr, void *cookie + , void (*callback)(void *cookie, struct key_params *)) +{ +#define GET_KEY_PARAM_FMT_S " keyid=%d" +#define GET_KEY_PARAM_ARG_S , keyid +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + #define GET_KEY_PARAM_FMT_2_6_37 ", pairwise=%d" + #define GET_KEY_PARAM_ARG_2_6_37 , pairwise +#else + #define GET_KEY_PARAM_FMT_2_6_37 "" + #define GET_KEY_PARAM_ARG_2_6_37 +#endif +#define GET_KEY_PARAM_FMT_E ", addr=%pM" +#define GET_KEY_PARAM_ARG_E , mac_addr + + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *sec = &adapter->securitypriv; + struct sta_priv *stapriv = &adapter->stapriv; + struct sta_info *sta = NULL; + u32 cipher = _NO_PRIVACY_; + union Keytype *key = NULL; + u8 key_len = 0; + u64 *pn = NULL; + u8 pn_len = 0; + u8 pn_val[8] = {0}; + + struct key_params params; + int ret = -ENOENT; + + if (keyid >= WEP_KEYS + #ifdef CONFIG_IEEE80211W + && keyid > BIP_MAX_KEYID + #endif + ) + goto exit; + + if (!mac_addr || is_broadcast_ether_addr(mac_addr) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + || (MLME_IS_STA(adapter) && !pairwise) + #endif + ) { + /* WEP key, TX GTK/IGTK, RX GTK/IGTK(for STA mode) */ + if (is_wep_enc(sec->dot118021XGrpPrivacy)) { + if (keyid >= WEP_KEYS) + goto exit; + if (!(sec->key_mask & BIT(keyid))) + goto exit; + cipher = sec->dot118021XGrpPrivacy; + key = &sec->dot11DefKey[keyid]; + } else { + if (keyid < WEP_KEYS) { + if (sec->binstallGrpkey != _TRUE) + goto exit; + cipher = sec->dot118021XGrpPrivacy; + key = &sec->dot118021XGrpKey[keyid]; + sta = rtw_get_bcmc_stainfo(adapter); + if (sta) + pn = &sta->dot11txpn.val; + #ifdef CONFIG_IEEE80211W + } else if (keyid < BIP_MAX_KEYID) { + if (SEC_IS_BIP_KEY_INSTALLED(sec) != _TRUE) + goto exit; + cipher = _BIP_; + key = &sec->dot11wBIPKey[keyid]; + pn = &sec->dot11wBIPtxpn.val; + #endif + } + } + } else { + /* Pairwise key, RX GTK/IGTK for specific peer */ + sta = rtw_get_stainfo(stapriv, mac_addr); + if (!sta) + goto exit; + + if (keyid < WEP_KEYS && pairwise) { + if (sta->bpairwise_key_installed != _TRUE) + goto exit; + cipher = sta->dot118021XPrivacy; + key = &sta->dot118021x_UncstKey; + #ifdef CONFIG_RTW_MESH + } else if (keyid < WEP_KEYS && !pairwise) { + if (!(sta->gtk_bmp & BIT(keyid))) + goto exit; + cipher = sta->group_privacy; + key = &sta->gtk; + #ifdef CONFIG_IEEE80211W + } else if (keyid < BIP_MAX_KEYID && !pairwise) { + if (!(sta->igtk_bmp & BIT(keyid))) + goto exit; + cipher = _BIP_; + key = &sta->igtk; + pn = &sta->igtk_pn.val; + #endif + #endif /* CONFIG_RTW_MESH */ + } + } + + if (!key) + goto exit; + + if (cipher == _WEP40_) { + cipher = WLAN_CIPHER_SUITE_WEP40; + key_len = sec->dot11DefKeylen[keyid]; + } else if (cipher == _WEP104_) { + cipher = WLAN_CIPHER_SUITE_WEP104; + key_len = sec->dot11DefKeylen[keyid]; + } else if (cipher == _TKIP_) { + cipher = WLAN_CIPHER_SUITE_TKIP; + key_len = 16; + } else if (cipher == _AES_) { + cipher = WLAN_CIPHER_SUITE_CCMP; + key_len = 16; + #ifdef CONFIG_IEEE80211W + } else if (cipher == _BIP_) { + cipher = WLAN_CIPHER_SUITE_AES_CMAC; + key_len = 16; + #endif + } else { + RTW_WARN(FUNC_NDEV_FMT" unknown cipher:%u\n", FUNC_NDEV_ARG(ndev), cipher); + rtw_warn_on(1); + goto exit; + } + + if (pn) { + *((u64 *)pn_val) = cpu_to_le64(*pn); + pn_len = 6; + } + + ret = 0; + +exit: + RTW_INFO(FUNC_NDEV_FMT + GET_KEY_PARAM_FMT_S + GET_KEY_PARAM_FMT_2_6_37 + GET_KEY_PARAM_FMT_E + " ret %d\n", FUNC_NDEV_ARG(ndev) + GET_KEY_PARAM_ARG_S + GET_KEY_PARAM_ARG_2_6_37 + GET_KEY_PARAM_ARG_E + , ret); + if (pn) + RTW_INFO(FUNC_NDEV_FMT " seq:0x%llx\n", FUNC_NDEV_ARG(ndev), *pn); + + if (ret == 0) { + _rtw_memset(¶ms, 0, sizeof(params)); + + params.cipher = cipher; + params.key = key->skey; + params.key_len = key_len; + if (pn) { + params.seq = pn_val; + params.seq_len = pn_len; + } + + callback(cookie, ¶ms); + } + + return ret; +} + +static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + u8 key_index, bool pairwise, const u8 *mac_addr) +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) */ + u8 key_index, const u8 *mac_addr) +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) */ +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + RTW_INFO(FUNC_NDEV_FMT" key_index=%d, addr=%pM\n", FUNC_NDEV_ARG(ndev), key_index, mac_addr); + + if (key_index == psecuritypriv->dot11PrivacyKeyIndex) { + /* clear the flag of wep default key set. */ + psecuritypriv->bWepDefaultKeyIdxSet = 0; + } + + return 0; +} + +static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, + struct net_device *ndev, u8 key_index + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + , bool unicast, bool multicast + #endif +) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + +#define SET_DEF_KEY_PARAM_FMT " key_index=%d" +#define SET_DEF_KEY_PARAM_ARG , key_index +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + #define SET_DEF_KEY_PARAM_FMT_2_6_38 ", unicast=%d, multicast=%d" + #define SET_DEF_KEY_PARAM_ARG_2_6_38 , unicast, multicast +#else + #define SET_DEF_KEY_PARAM_FMT_2_6_38 "" + #define SET_DEF_KEY_PARAM_ARG_2_6_38 +#endif + + RTW_INFO(FUNC_NDEV_FMT + SET_DEF_KEY_PARAM_FMT + SET_DEF_KEY_PARAM_FMT_2_6_38 + "\n", FUNC_NDEV_ARG(ndev) + SET_DEF_KEY_PARAM_ARG + SET_DEF_KEY_PARAM_ARG_2_6_38 + ); + + if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) { /* set wep default key */ + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + + psecuritypriv->dot11PrivacyKeyIndex = key_index; + + psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + if (psecuritypriv->dot11DefKeylen[key_index] == 13) { + psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; + psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + } + + psecuritypriv->bWepDefaultKeyIdxSet = 1; /* set the flag to represent that wep default key has been set */ + } + + return 0; + +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) +int cfg80211_rtw_set_default_mgmt_key(struct wiphy *wiphy, + struct net_device *ndev, u8 key_index) +{ +#define SET_DEF_KEY_PARAM_FMT " key_index=%d" +#define SET_DEF_KEY_PARAM_ARG , key_index + + RTW_INFO(FUNC_NDEV_FMT + SET_DEF_KEY_PARAM_FMT + "\n", FUNC_NDEV_ARG(ndev) + SET_DEF_KEY_PARAM_ARG + ); + + return 0; +} +#endif + +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) +static int cfg80211_rtw_set_rekey_data(struct wiphy *wiphy, + struct net_device *ndev, + struct cfg80211_gtk_rekey_data *data) +{ + /*int i;*/ + struct sta_info *psta; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &(padapter->securitypriv); + + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + RTW_INFO("%s, : Obtain Sta_info fail\n", __func__); + return -1; + } + + _rtw_memcpy(psta->kek, data->kek, NL80211_KEK_LEN); + /*printk("\ncfg80211_rtw_set_rekey_data KEK:"); + for(i=0;ikek[i]);*/ + _rtw_memcpy(psta->kck, data->kck, NL80211_KCK_LEN); + /*printk("\ncfg80211_rtw_set_rekey_data KCK:"); + for(i=0;ikck[i]);*/ + _rtw_memcpy(psta->replay_ctr, data->replay_ctr, NL80211_REPLAY_CTR_LEN); + psecuritypriv->binstallKCK_KEK = _TRUE; + /*printk("\nREPLAY_CTR: "); + for(i=0;ireplay_ctr[i]);*/ + + return 0; +} +#endif /*CONFIG_GTK_OL*/ + +#ifdef CONFIG_RTW_MESH +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) +static enum nl80211_mesh_power_mode rtw_mesh_ps_to_nl80211_mesh_power_mode(u8 ps) +{ + if (ps == RTW_MESH_PS_UNKNOWN) + return NL80211_MESH_POWER_UNKNOWN; + if (ps == RTW_MESH_PS_ACTIVE) + return NL80211_MESH_POWER_ACTIVE; + if (ps == RTW_MESH_PS_LSLEEP) + return NL80211_MESH_POWER_LIGHT_SLEEP; + if (ps == RTW_MESH_PS_DSLEEP) + return NL80211_MESH_POWER_DEEP_SLEEP; + + rtw_warn_on(1); + return NL80211_MESH_POWER_UNKNOWN; +} +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) +enum nl80211_plink_state rtw_plink_state_to_nl80211_plink_state(u8 plink_state) +{ + if (plink_state == RTW_MESH_PLINK_UNKNOWN) + return NUM_NL80211_PLINK_STATES; + if (plink_state == RTW_MESH_PLINK_LISTEN) + return NL80211_PLINK_LISTEN; + if (plink_state == RTW_MESH_PLINK_OPN_SNT) + return NL80211_PLINK_OPN_SNT; + if (plink_state == RTW_MESH_PLINK_OPN_RCVD) + return NL80211_PLINK_OPN_RCVD; + if (plink_state == RTW_MESH_PLINK_CNF_RCVD) + return NL80211_PLINK_CNF_RCVD; + if (plink_state == RTW_MESH_PLINK_ESTAB) + return NL80211_PLINK_ESTAB; + if (plink_state == RTW_MESH_PLINK_HOLDING) + return NL80211_PLINK_HOLDING; + if (plink_state == RTW_MESH_PLINK_BLOCKED) + return NL80211_PLINK_BLOCKED; + + rtw_warn_on(1); + return NUM_NL80211_PLINK_STATES; +} + +u8 nl80211_plink_state_to_rtw_plink_state(enum nl80211_plink_state plink_state) +{ + if (plink_state == NL80211_PLINK_LISTEN) + return RTW_MESH_PLINK_LISTEN; + if (plink_state == NL80211_PLINK_OPN_SNT) + return RTW_MESH_PLINK_OPN_SNT; + if (plink_state == NL80211_PLINK_OPN_RCVD) + return RTW_MESH_PLINK_OPN_RCVD; + if (plink_state == NL80211_PLINK_CNF_RCVD) + return RTW_MESH_PLINK_CNF_RCVD; + if (plink_state == NL80211_PLINK_ESTAB) + return RTW_MESH_PLINK_ESTAB; + if (plink_state == NL80211_PLINK_HOLDING) + return RTW_MESH_PLINK_HOLDING; + if (plink_state == NL80211_PLINK_BLOCKED) + return RTW_MESH_PLINK_BLOCKED; + + rtw_warn_on(1); + return RTW_MESH_PLINK_UNKNOWN; +} +#endif + +static void rtw_cfg80211_fill_mesh_only_sta_info(struct mesh_plink_ent *plink, struct sta_info *sta, struct station_info *sinfo) +{ + sinfo->filled |= STATION_INFO_LLID; + sinfo->llid = plink->llid; + sinfo->filled |= STATION_INFO_PLID; + sinfo->plid = plink->plid; + sinfo->filled |= STATION_INFO_PLINK_STATE; + sinfo->plink_state = rtw_plink_state_to_nl80211_plink_state(plink->plink_state); + if (!sta && plink->scanned) { + sinfo->filled |= STATION_INFO_SIGNAL; + sinfo->signal = translate_percentage_to_dbm(plink->scanned->network.PhyInfo.SignalStrength); + sinfo->filled |= STATION_INFO_INACTIVE_TIME; + if (plink->plink_state == RTW_MESH_PLINK_UNKNOWN) + sinfo->inactive_time = 0 - 1; + else + sinfo->inactive_time = rtw_get_passing_time_ms(plink->scanned->last_scanned); + } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + if (sta) { + sinfo->filled |= STATION_INFO_LOCAL_PM; + sinfo->local_pm = rtw_mesh_ps_to_nl80211_mesh_power_mode(sta->local_mps); + sinfo->filled |= STATION_INFO_PEER_PM; + sinfo->peer_pm = rtw_mesh_ps_to_nl80211_mesh_power_mode(sta->peer_mps); + sinfo->filled |= STATION_INFO_NONPEER_PM; + sinfo->nonpeer_pm = rtw_mesh_ps_to_nl80211_mesh_power_mode(sta->nonpeer_mps); + } +#endif +} +#endif /* CONFIG_RTW_MESH */ + +static int cfg80211_rtw_get_station(struct wiphy *wiphy, + struct net_device *ndev, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)) + u8 *mac, +#else + const u8 *mac, +#endif + struct station_info *sinfo) +{ + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; +#ifdef CONFIG_RTW_MESH + struct mesh_plink_ent *plink = NULL; +#endif + + sinfo->filled = 0; + + if (!mac) { + RTW_INFO(FUNC_NDEV_FMT" mac==%p\n", FUNC_NDEV_ARG(ndev), mac); + ret = -ENOENT; + goto exit; + } + + psta = rtw_get_stainfo(pstapriv, mac); +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) { + if (psta) + plink = psta->plink; + if (!plink) + plink = rtw_mesh_plink_get(padapter, mac); + } +#endif /* CONFIG_RTW_MESH */ + + if ((!MLME_IS_MESH(padapter) && !psta) + #ifdef CONFIG_RTW_MESH + || (MLME_IS_MESH(padapter) && !plink) + #endif + ) { + RTW_INFO(FUNC_NDEV_FMT" no sta info for mac="MAC_FMT"\n" + , FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); + ret = -ENOENT; + goto exit; + } + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO(FUNC_NDEV_FMT" mac="MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); +#endif + + /* for infra./P2PClient mode */ + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) + && check_fwstate(pmlmepriv, _FW_LINKED) + ) { + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + + if (_rtw_memcmp((u8 *)mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) { + RTW_INFO("%s, mismatch bssid="MAC_FMT"\n", __func__, MAC_ARG(cur_network->network.MacAddress)); + ret = -ENOENT; + goto exit; + } + + sinfo->filled |= STATION_INFO_SIGNAL; + sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); + + sinfo->filled |= STATION_INFO_TX_BITRATE; + sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); + } + + if (psta) { + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE + || check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE + ) { + sinfo->filled |= STATION_INFO_SIGNAL; + sinfo->signal = translate_percentage_to_dbm(psta->cmn.rssi_stat.rssi); + } + sinfo->filled |= STATION_INFO_INACTIVE_TIME; + sinfo->inactive_time = rtw_get_passing_time_ms(psta->sta_stats.last_rx_time); + sinfo->filled |= STATION_INFO_RX_PACKETS; + sinfo->rx_packets = sta_rx_data_pkts(psta); + sinfo->filled |= STATION_INFO_TX_PACKETS; + sinfo->tx_packets = psta->sta_stats.tx_pkts; + sinfo->filled |= STATION_INFO_TX_FAILED; + sinfo->tx_failed = psta->sta_stats.tx_fail_cnt; + } + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) + rtw_cfg80211_fill_mesh_only_sta_info(plink, psta, sinfo); +#endif + +exit: + return ret; +} + +extern int netdev_open(struct net_device *pnetdev); + +#if 0 +enum nl80211_iftype { + NL80211_IFTYPE_UNSPECIFIED, + NL80211_IFTYPE_ADHOC, /* 1 */ + NL80211_IFTYPE_STATION, /* 2 */ + NL80211_IFTYPE_AP, /* 3 */ + NL80211_IFTYPE_AP_VLAN, + NL80211_IFTYPE_WDS, + NL80211_IFTYPE_MONITOR, /* 6 */ + NL80211_IFTYPE_MESH_POINT, + NL80211_IFTYPE_P2P_CLIENT, /* 8 */ + NL80211_IFTYPE_P2P_GO, /* 9 */ + /* keep last */ + NUM_NL80211_IFTYPES, + NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1 +}; +#endif +static int cfg80211_rtw_change_iface(struct wiphy *wiphy, + struct net_device *ndev, + enum nl80211_iftype type, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)) + u32 *flags, +#endif + struct vif_params *params) +{ + enum nl80211_iftype old_type; + NDIS_802_11_NETWORK_INFRASTRUCTURE networkType; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct wireless_dev *rtw_wdev = padapter->rtw_wdev; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 is_p2p = _FALSE; +#endif +#ifdef CONFIG_MONITOR_MODE_XMIT + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); +#endif + int ret = 0; + u8 change = _FALSE; + + RTW_INFO(FUNC_NDEV_FMT" type=%d, hw_port:%d\n", FUNC_NDEV_ARG(ndev), type, padapter->hw_port); + + if (adapter_to_dvobj(padapter)->processing_dev_remove == _TRUE) { + ret = -EPERM; + goto exit; + } + + + RTW_INFO(FUNC_NDEV_FMT" call netdev_open\n", FUNC_NDEV_ARG(ndev)); + if (netdev_open(ndev) != 0) { + RTW_INFO(FUNC_NDEV_FMT" call netdev_open fail\n", FUNC_NDEV_ARG(ndev)); + ret = -EPERM; + goto exit; + } + + + if (_FAIL == rtw_pwr_wakeup(padapter)) { + RTW_INFO(FUNC_NDEV_FMT" call rtw_pwr_wakeup fail\n", FUNC_NDEV_ARG(ndev)); + ret = -EPERM; + goto exit; + } + + old_type = rtw_wdev->iftype; + RTW_INFO(FUNC_NDEV_FMT" old_iftype=%d, new_iftype=%d\n", + FUNC_NDEV_ARG(ndev), old_type, type); + + if (old_type != type) { + change = _TRUE; + pmlmeext->action_public_rxseq = 0xffff; + pmlmeext->action_public_dialog_token = 0xff; + } + + /* initial default type */ + ndev->type = ARPHRD_ETHER; + + /* + * Disable Power Save in moniter mode, + * and enable it after leaving moniter mode. + */ + if (type == NL80211_IFTYPE_MONITOR) { + rtw_ps_deny(padapter, PS_DENY_MONITOR_MODE); + LeaveAllPowerSaveMode(padapter); + } else if (old_type == NL80211_IFTYPE_MONITOR) { + /* driver in moniter mode in last time */ + rtw_ps_deny_cancel(padapter, PS_DENY_MONITOR_MODE); + } + + switch (type) { + case NL80211_IFTYPE_ADHOC: + networkType = Ndis802_11IBSS; + break; + + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_CLIENT: + is_p2p = _TRUE; + #endif + case NL80211_IFTYPE_STATION: + networkType = Ndis802_11Infrastructure; + + #ifdef CONFIG_P2P + if (change && pwdinfo->driver_interface == DRIVER_CFG80211) { + if (is_p2p == _TRUE) + rtw_p2p_enable(padapter, P2P_ROLE_CLIENT); + #if !RTW_P2P_GROUP_INTERFACE + else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) + || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) + ) { + /* it means remove GC/GO and change mode from GC/GO to station(P2P DEVICE) */ + rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); + } + #endif + } + #endif /* CONFIG_P2P */ + + break; + + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_GO: + is_p2p = _TRUE; + #endif + case NL80211_IFTYPE_AP: + networkType = Ndis802_11APMode; + + #ifdef CONFIG_P2P + if (change && pwdinfo->driver_interface == DRIVER_CFG80211) { + if (is_p2p == _TRUE) + rtw_p2p_enable(padapter, P2P_ROLE_GO); + #if !RTW_P2P_GROUP_INTERFACE + else if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + /* it means P2P Group created, we will be GO and change mode from P2P DEVICE to AP(GO) */ + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + } + #endif + } + #endif /* CONFIG_P2P */ + + break; + +#ifdef CONFIG_RTW_MESH + case NL80211_IFTYPE_MESH_POINT: + networkType = Ndis802_11_mesh; + break; +#endif + + case NL80211_IFTYPE_MONITOR: + networkType = Ndis802_11Monitor; +#if 0 + ndev->type = ARPHRD_IEEE80211; /* IEEE 802.11 : 801 */ +#endif + ndev->type = ARPHRD_IEEE80211_RADIOTAP; /* IEEE 802.11 + radiotap header : 803 */ + break; + default: + ret = -EOPNOTSUPP; + goto exit; + } + + rtw_wdev->iftype = type; + + if (rtw_set_802_11_infrastructure_mode(padapter, networkType, 0) == _FALSE) { + rtw_wdev->iftype = old_type; + ret = -EPERM; + goto exit; + } + + rtw_setopmode_cmd(padapter, networkType, RTW_CMDF_WAIT_ACK); +#ifdef CONFIG_MONITOR_MODE_XMIT + if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) == _TRUE) + rtw_indicate_connect(padapter); +#endif +exit: + + RTW_INFO(FUNC_NDEV_FMT" ret:%d\n", FUNC_NDEV_ARG(ndev), ret); + return ret; +} + +void rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted) +{ + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter); + _irqL irqL; + +#if (KERNEL_VERSION(4, 7, 0) <= LINUX_VERSION_CODE) + struct cfg80211_scan_info info; + + memset(&info, 0, sizeof(info)); + info.aborted = aborted; +#endif + + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + if (pwdev_priv->scan_request != NULL) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s with scan req\n", __FUNCTION__); + #endif + + /* avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); */ + if (pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) + RTW_INFO("error wiphy compare\n"); + else +#if (KERNEL_VERSION(4, 7, 0) <= LINUX_VERSION_CODE) + cfg80211_scan_done(pwdev_priv->scan_request, &info); +#else + cfg80211_scan_done(pwdev_priv->scan_request, aborted); +#endif + + pwdev_priv->scan_request = NULL; + } else { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s without scan req\n", __FUNCTION__); + #endif + } + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); +} + +u32 rtw_cfg80211_wait_scan_req_empty(_adapter *adapter, u32 timeout_ms) +{ + struct rtw_wdev_priv *wdev_priv = adapter_wdev_data(adapter); + u8 empty = _FALSE; + systime start; + u32 pass_ms; + + start = rtw_get_current_time(); + + while (rtw_get_passing_time_ms(start) <= timeout_ms) { + + if (RTW_CANNOT_RUN(adapter)) + break; + + if (!wdev_priv->scan_request) { + empty = _TRUE; + break; + } + + rtw_msleep_os(10); + } + + pass_ms = rtw_get_passing_time_ms(start); + + if (empty == _FALSE && pass_ms > timeout_ms) + RTW_PRINT(FUNC_ADPT_FMT" pass_ms:%u, timeout\n" + , FUNC_ADPT_ARG(adapter), pass_ms); + + return pass_ms; +} + +void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork) +{ + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct wiphy *wiphy = pwdev->wiphy; + struct cfg80211_bss *bss = NULL; + WLAN_BSSID_EX select_network = pnetwork->network; + + bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/, + select_network.MacAddress, select_network.Ssid.Ssid, + select_network.Ssid.SsidLength, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) + select_network.InfrastructureMode == Ndis802_11Infrastructure?IEEE80211_BSS_TYPE_ESS:IEEE80211_BSS_TYPE_IBSS, + IEEE80211_PRIVACY(select_network.Privacy)); +#else + select_network.InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS, + select_network.InfrastructureMode == Ndis802_11Infrastructure?WLAN_CAPABILITY_ESS:WLAN_CAPABILITY_IBSS); +#endif + + if (bss) { + cfg80211_unlink_bss(wiphy, bss); + RTW_INFO("%s(): cfg80211_unlink %s!!\n", __func__, select_network.Ssid.Ssid); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss); +#else + cfg80211_put_bss(bss); +#endif + } + return; +} + +/* if target wps scan ongoing, target_ssid is filled */ +int rtw_cfg80211_is_target_wps_scan(struct cfg80211_scan_request *scan_req, struct cfg80211_ssid *target_ssid) +{ + int ret = 0; + + if (scan_req->n_ssids != 1 + || scan_req->ssids[0].ssid_len == 0 + || scan_req->n_channels != 1 + ) + goto exit; + + /* under target WPS scan */ + _rtw_memcpy(target_ssid, scan_req->ssids, sizeof(struct cfg80211_ssid)); + ret = 1; + +exit: + return ret; +} + +static void _rtw_cfg80211_surveydone_event_callback(_adapter *padapter, struct cfg80211_scan_request *scan_req) +{ + struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); + RT_CHANNEL_INFO *chset = rfctl->channel_set; + _irqL irqL; + _list *plist, *phead; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + struct cfg80211_ssid target_ssid; + u8 target_wps_scan = 0; + u8 ch; + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s\n", __func__); +#endif + + if (scan_req) + target_wps_scan = rtw_cfg80211_is_target_wps_scan(scan_req, &target_ssid); + else { + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + if (pwdev_priv->scan_request != NULL) + target_wps_scan = rtw_cfg80211_is_target_wps_scan(pwdev_priv->scan_request, &target_ssid); + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + } + + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + phead = get_list_head(queue); + plist = get_next(phead); + + while (1) { + if (rtw_end_of_queue_search(phead, plist) == _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + ch = pnetwork->network.Configuration.DSConfig; + + /* report network only if the current channel set contains the channel to which this network belongs */ + if (rtw_chset_search_ch(chset, ch) >= 0 + && rtw_mlme_band_check(padapter, ch) == _TRUE + && _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid)) + && (!IS_DFS_SLAVE_WITH_RD(rfctl) + || rtw_odm_dfs_domain_unknown(rfctl_to_dvobj(rfctl)) + || !rtw_chset_is_ch_non_ocp(chset, ch)) + ) { + if (target_wps_scan) + rtw_cfg80211_clear_wps_sr_of_non_target_bss(padapter, pnetwork, &target_ssid); + rtw_cfg80211_inform_bss(padapter, pnetwork); + } +#if 0 + /* check ralink testbed RSN IE length */ + { + if (_rtw_memcmp(pnetwork->network.Ssid.Ssid, "Ralink_11n_AP", 13)) { + uint ie_len = 0; + u8 *p = NULL; + p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_)); + RTW_INFO("ie_len=%d\n", ie_len); + } + } +#endif + plist = get_next(plist); + + } + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); +} + +inline void rtw_cfg80211_surveydone_event_callback(_adapter *padapter) +{ + _rtw_cfg80211_surveydone_event_callback(padapter, NULL); +} + +static int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, ielen=%d\n", __func__, len); +#endif + + if (len > 0) { + wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen); + if (wps_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("probe_req_wps_ielen=%d\n", wps_ielen); + #endif + + if (pmlmepriv->wps_probe_req_ie) { + u32 free_len = pmlmepriv->wps_probe_req_ie_len; + pmlmepriv->wps_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->wps_probe_req_ie, free_len); + pmlmepriv->wps_probe_req_ie = NULL; + } + + pmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen); + if (pmlmepriv->wps_probe_req_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); + pmlmepriv->wps_probe_req_ie_len = wps_ielen; + } + + /* buf += wps_ielen; */ + /* len -= wps_ielen; */ + + #ifdef CONFIG_P2P + p2p_ie = rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen); + if (p2p_ie) { + struct wifidirect_info *wdinfo = &padapter->wdinfo; + u32 attr_contentlen = 0; + u8 listen_ch_attr[5]; + + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("probe_req_p2p_ielen=%d\n", p2p_ielen); + #endif + + if (pmlmepriv->p2p_probe_req_ie) { + u32 free_len = pmlmepriv->p2p_probe_req_ie_len; + pmlmepriv->p2p_probe_req_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len); + pmlmepriv->p2p_probe_req_ie = NULL; + } + + pmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen); + if (pmlmepriv->p2p_probe_req_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; + + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, (u8 *)listen_ch_attr, (uint *) &attr_contentlen) + && attr_contentlen == 5) { + if (wdinfo->listen_channel != listen_ch_attr[4]) { + RTW_INFO(FUNC_ADPT_FMT" listen channel - country:%c%c%c, class:%u, ch:%u\n", + FUNC_ADPT_ARG(padapter), listen_ch_attr[0], listen_ch_attr[1], listen_ch_attr[2], + listen_ch_attr[3], listen_ch_attr[4]); + wdinfo->listen_channel = listen_ch_attr[4]; + } + } + } + #endif /* CONFIG_P2P */ + + #ifdef CONFIG_WFD + wfd_ie = rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen); + if (wfd_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("probe_req_wfd_ielen=%d\n", wfd_ielen); + #endif + + if (rtw_mlme_update_wfd_ie_data(pmlmepriv, MLME_PROBE_REQ_IE, wfd_ie, wfd_ielen) != _SUCCESS) + return -EINVAL; + } + #endif /* CONFIG_WFD */ + } + + return ret; + +} + +#ifdef CONFIG_CONCURRENT_MODE +u8 rtw_cfg80211_scan_via_buddy(_adapter *padapter, struct cfg80211_scan_request *request) +{ + int i; + u8 ret = _FALSE; + _adapter *iface = NULL; + _irqL irqL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + for (i = 0; i < dvobj->iface_nums; i++) { + struct mlme_priv *buddy_mlmepriv; + struct rtw_wdev_priv *buddy_wdev_priv; + + iface = dvobj->padapters[i]; + if (iface == NULL) + continue; + + if (iface == padapter) + continue; + + if (rtw_is_adapter_up(iface) == _FALSE) + continue; + + buddy_mlmepriv = &iface->mlmepriv; + if (!check_fwstate(buddy_mlmepriv, _FW_UNDER_SURVEY)) + continue; + + buddy_wdev_priv = adapter_wdev_data(iface); + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + _enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); + if (buddy_wdev_priv->scan_request) { + pmlmepriv->scanning_via_buddy_intf = _TRUE; + _enter_critical_bh(&pmlmepriv->lock, &irqL); + set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + pwdev_priv->scan_request = request; + ret = _TRUE; + } + _exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL); + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + + if (ret == _TRUE) + goto exit; + } + +exit: + return ret; +} + +void rtw_cfg80211_indicate_scan_done_for_buddy(_adapter *padapter, bool bscan_aborted) +{ + int i; + u8 ret = 0; + _adapter *iface = NULL; + _irqL irqL; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct mlme_priv *mlmepriv; + struct rtw_wdev_priv *wdev_priv; + bool indicate_buddy_scan; + + for (i = 0; i < dvobj->iface_nums; i++) { + iface = dvobj->padapters[i]; + if ((iface) && rtw_is_adapter_up(iface)) { + + if (iface == padapter) + continue; + + mlmepriv = &(iface->mlmepriv); + wdev_priv = adapter_wdev_data(iface); + + indicate_buddy_scan = _FALSE; + _enter_critical_bh(&wdev_priv->scan_req_lock, &irqL); + if (mlmepriv->scanning_via_buddy_intf == _TRUE) { + mlmepriv->scanning_via_buddy_intf = _FALSE; + clr_fwstate(mlmepriv, _FW_UNDER_SURVEY); + if (wdev_priv->scan_request) + indicate_buddy_scan = _TRUE; + } + _exit_critical_bh(&wdev_priv->scan_req_lock, &irqL); + + if (indicate_buddy_scan == _TRUE) { + rtw_cfg80211_surveydone_event_callback(iface); + rtw_indicate_scan_done(iface, bscan_aborted); + } + + } + } +} +#endif /* CONFIG_CONCURRENT_MODE */ + +static int cfg80211_rtw_scan(struct wiphy *wiphy + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + , struct net_device *ndev + #endif + , struct cfg80211_scan_request *request) +{ + int i; + u8 _status = _FALSE; + int ret = 0; + struct sitesurvey_parm parm; + _irqL irqL; + u8 survey_times = 3; + u8 survey_times_for_one_ch = 6; + struct cfg80211_ssid *ssids = request->ssids; + int social_channel = 0, j = 0; + bool need_indicate_scan_done = _FALSE; + bool ps_denied = _FALSE; + u8 ssc_chk; + _adapter *padapter; + struct wireless_dev *wdev; + struct rtw_wdev_priv *pwdev_priv; + struct mlme_priv *pmlmepriv = NULL; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo; +#endif /* CONFIG_P2P */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + wdev = request->wdev; + #if defined(RTW_DEDICATED_P2P_DEVICE) + if (wdev == wiphy_to_pd_wdev(wiphy)) + padapter = wiphy_to_adapter(wiphy); + else + #endif + if (wdev_to_ndev(wdev)) + padapter = (_adapter *)rtw_netdev_priv(wdev_to_ndev(wdev)); + else { + ret = -EINVAL; + goto exit; + } +#else + if (ndev == NULL) { + ret = -EINVAL; + goto exit; + } + padapter = (_adapter *)rtw_netdev_priv(ndev); + wdev = ndev_to_wdev(ndev); +#endif + + pwdev_priv = adapter_wdev_data(padapter); + pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_P2P + pwdinfo = &(padapter->wdinfo); +#endif /* CONFIG_P2P */ + + RTW_INFO(FUNC_ADPT_FMT"%s\n", FUNC_ADPT_ARG(padapter) + , wdev == wiphy_to_pd_wdev(wiphy) ? " PD" : ""); + +#if 1 + ssc_chk = rtw_sitesurvey_condition_check(padapter, _TRUE); + + if (ssc_chk == SS_DENY_MP_MODE) + goto bypass_p2p_chk; +#ifdef DBG_LA_MODE + if (ssc_chk == SS_DENY_LA_MODE) + goto bypass_p2p_chk; +#endif +#ifdef CONFIG_P2P + if (pwdinfo->driver_interface == DRIVER_CFG80211) { + if (ssids->ssid != NULL + && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) + && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) + ) { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + else { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); + #endif + } + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + if (request->n_channels == 3 && + request->channels[0]->hw_value == 1 && + request->channels[1]->hw_value == 6 && + request->channels[2]->hw_value == 11 + ) + social_channel = 1; + } + } +#endif /*CONFIG_P2P*/ + + if (request->ie && request->ie_len > 0) + rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len); + +bypass_p2p_chk: + + switch (ssc_chk) { + case SS_ALLOW : + break; + + case SS_DENY_MP_MODE: + ret = -EPERM; + goto exit; + #ifdef DBG_LA_MODE + case SS_DENY_LA_MODE: + ret = -EPERM; + goto exit; + #endif + #ifdef CONFIG_RTW_REPEATER_SON + case SS_DENY_RSON_SCANING : + #endif + case SS_DENY_BLOCK_SCAN : + case SS_DENY_SELF_AP_UNDER_WPS : + case SS_DENY_SELF_AP_UNDER_LINKING : + case SS_DENY_SELF_AP_UNDER_SURVEY : + case SS_DENY_SELF_STA_UNDER_SURVEY : + #ifdef CONFIG_CONCURRENT_MODE + case SS_DENY_BUDDY_UNDER_LINK_WPS : + #endif + case SS_DENY_BUSY_TRAFFIC : + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + + case SS_DENY_BY_DRV : + #if CONFIG_NOTIFY_SCAN_ABORT_WITH_BUSY + ret = -EBUSY; + goto exit; + #else + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + #endif + break; + + case SS_DENY_SELF_STA_UNDER_LINKING : + ret = -EBUSY; + goto check_need_indicate_scan_done; + + #ifdef CONFIG_CONCURRENT_MODE + case SS_DENY_BUDDY_UNDER_SURVEY : + { + bool scan_via_buddy = rtw_cfg80211_scan_via_buddy(padapter, request); + + if (scan_via_buddy == _FALSE) + need_indicate_scan_done = _TRUE; + + goto check_need_indicate_scan_done; + } + #endif + + default : + RTW_ERR("site survey check code (%d) unknown\n", ssc_chk); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + rtw_ps_deny(padapter, PS_DENY_SCAN); + ps_denied = _TRUE; + if (_FAIL == rtw_pwr_wakeup(padapter)) { + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + +#else + + +#ifdef CONFIG_MP_INCLUDED + if (rtw_mp_mode_check(padapter)) { + RTW_INFO("MP mode block Scan request\n"); + ret = -EPERM; + goto exit; + } +#endif + +#ifdef CONFIG_P2P + if (pwdinfo->driver_interface == DRIVER_CFG80211) { + if (ssids->ssid != NULL + && _rtw_memcmp(ssids->ssid, "DIRECT-", 7) + && rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL) + ) { + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + else { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); + #endif + } + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + if (request->n_channels == 3 && + request->channels[0]->hw_value == 1 && + request->channels[1]->hw_value == 6 && + request->channels[2]->hw_value == 11 + ) + social_channel = 1; + } + } +#endif /*CONFIG_P2P*/ + + if (request->ie && request->ie_len > 0) + rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len); + +#ifdef CONFIG_RTW_REPEATER_SON + if (padapter->rtw_rson_scanstage == RSON_SCAN_PROCESS) { + RTW_INFO(FUNC_ADPT_FMT" blocking scan for under rson scanning process\n", FUNC_ADPT_ARG(padapter)); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } +#endif + + if (adapter_wdev_data(padapter)->block_scan == _TRUE) { + RTW_INFO(FUNC_ADPT_FMT" wdev_priv.block_scan is set\n", FUNC_ADPT_ARG(padapter)); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + rtw_ps_deny(padapter, PS_DENY_SCAN); + ps_denied = _TRUE; + if (_FAIL == rtw_pwr_wakeup(padapter)) { + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + + if (rtw_is_scan_deny(padapter)) { + RTW_INFO(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter)); +#if CONFIG_NOTIFY_SCAN_ABORT_WITH_BUSY + ret = -EBUSY; + goto exit; +#else + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; +#endif + } + + /* check fw state*/ + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO(FUNC_ADPT_FMT" under WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter)); +#endif + + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS | _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == _TRUE) { + RTW_INFO("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) + RTW_INFO("AP mode process WPS\n"); + + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } + } + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) { + RTW_INFO("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + RTW_INFO("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state); + ret = -EBUSY; + goto check_need_indicate_scan_done; + } + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_LINKING | WIFI_UNDER_WPS)) { + RTW_INFO("%s exit due to buddy_intf's mlme state under linking or wps\n", __func__); + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + + } else if (rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_SURVEY)) { + bool scan_via_buddy = rtw_cfg80211_scan_via_buddy(padapter, request); + + if (scan_via_buddy == _FALSE) + need_indicate_scan_done = _TRUE; + + goto check_need_indicate_scan_done; + } +#endif /* CONFIG_CONCURRENT_MODE */ + + /* busy traffic check*/ + if (rtw_mi_busy_traffic_check(padapter, _TRUE)) { + need_indicate_scan_done = _TRUE; + goto check_need_indicate_scan_done; + } +#endif + +#ifdef CONFIG_P2P + if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { + rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); + + if (social_channel == 0) + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE); + else + rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST); + } +#endif /* CONFIG_P2P */ + + rtw_init_sitesurvey_parm(padapter, &parm); + + /* parsing request ssids, n_ssids */ + for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("ssid=%s, len=%d\n", ssids[i].ssid, ssids[i].ssid_len); + #endif + _rtw_memcpy(&parm.ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len); + parm.ssid[i].SsidLength = ssids[i].ssid_len; + } + parm.ssid_num = i; + + /* parsing channels, n_channels */ + for (i = 0; i < request->n_channels && i < RTW_CHANNEL_SCAN_AMOUNT; i++) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO(FUNC_ADPT_FMT CHAN_FMT"\n", FUNC_ADPT_ARG(padapter), CHAN_ARG(request->channels[i])); + #endif + parm.ch[i].hw_value = request->channels[i]->hw_value; + parm.ch[i].flags = request->channels[i]->flags; + } + parm.ch_num = i; + + if (request->n_channels == 1) { + for (i = 1; i < survey_times_for_one_ch; i++) + _rtw_memcpy(&parm.ch[i], &parm.ch[0], sizeof(struct rtw_ieee80211_channel)); + parm.ch_num = survey_times_for_one_ch; + } else if (request->n_channels <= 4) { + for (j = request->n_channels - 1; j >= 0; j--) + for (i = 0; i < survey_times; i++) + _rtw_memcpy(&parm.ch[j * survey_times + i], &parm.ch[j], sizeof(struct rtw_ieee80211_channel)); + parm.ch_num = survey_times * request->n_channels; + } + + _enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _status = rtw_sitesurvey_cmd(padapter, &parm); + if (_status == _SUCCESS) + pwdev_priv->scan_request = request; + else + ret = -1; + _exit_critical_bh(&pmlmepriv->lock, &irqL); + _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL); + +check_need_indicate_scan_done: + if (_TRUE == need_indicate_scan_done) { +#if (KERNEL_VERSION(4, 7, 0) <= LINUX_VERSION_CODE) + struct cfg80211_scan_info info; + + memset(&info, 0, sizeof(info)); + info.aborted = 0; +#endif + + _rtw_cfg80211_surveydone_event_callback(padapter, request); +#if (KERNEL_VERSION(4, 7, 0) <= LINUX_VERSION_CODE) + cfg80211_scan_done(request, &info); +#else + cfg80211_scan_done(request, 0); +#endif + } + +cancel_ps_deny: + if (ps_denied == _TRUE) + rtw_ps_deny_cancel(padapter, PS_DENY_SCAN); + +exit: + if (pmlmepriv) + pmlmepriv->lastscantime = rtw_get_current_time(); + + return ret; +} + +static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + + if (changed & WIPHY_PARAM_RTS_THRESHOLD && + (iwm->conf.rts_threshold != wiphy->rts_threshold)) { + int ret; + + iwm->conf.rts_threshold = wiphy->rts_threshold; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, + CFG_RTS_THRESHOLD, + iwm->conf.rts_threshold); + if (ret < 0) + return ret; + } + + if (changed & WIPHY_PARAM_FRAG_THRESHOLD && + (iwm->conf.frag_threshold != wiphy->frag_threshold)) { + int ret; + + iwm->conf.frag_threshold = wiphy->frag_threshold; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, + CFG_FRAG_THRESHOLD, + iwm->conf.frag_threshold); + if (ret < 0) + return ret; + } +#endif + RTW_INFO("%s\n", __func__); + return 0; +} + + + +static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version) +{ + RTW_INFO("%s, wpa_version=%d\n", __func__, wpa_version); + + if (!wpa_version) { + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + return 0; + } + + + if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; + +#if 0 + if (wpa_version & NL80211_WPA_VERSION_2) + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; +#endif + + #ifdef CONFIG_WAPI_SUPPORT + if (wpa_version & NL80211_WAPI_VERSION_1) + psecuritypriv->ndisauthtype = Ndis802_11AuthModeWAPI; + #endif + + return 0; + +} + +static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, + enum nl80211_auth_type sme_auth_type) +{ + RTW_INFO("%s, nl80211_auth_type=%d\n", __func__, sme_auth_type); + + psecuritypriv->auth_type = sme_auth_type; + + switch (sme_auth_type) { + case NL80211_AUTHTYPE_AUTOMATIC: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; + + break; + case NL80211_AUTHTYPE_OPEN_SYSTEM: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; + + if (psecuritypriv->ndisauthtype > Ndis802_11AuthModeWPA) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + +#ifdef CONFIG_WAPI_SUPPORT + if (psecuritypriv->ndisauthtype == Ndis802_11AuthModeWAPI) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; +#endif + + break; + case NL80211_AUTHTYPE_SHARED_KEY: + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; + + psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; + + + break; + case NL80211_AUTHTYPE_SAE: + psecuritypriv->auth_alg = WLAN_AUTH_SAE; + break; + default: + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; + /* return -ENOTSUPP; */ + } + + return 0; + +} + +static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast) +{ + u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; + + u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : + &psecuritypriv->dot118021XGrpPrivacy; + + RTW_INFO("%s, ucast=%d, cipher=0x%x\n", __func__, ucast, cipher); + + + if (!cipher) { + *profile_cipher = _NO_PRIVACY_; + psecuritypriv->ndisencryptstatus = ndisencryptstatus; + return 0; + } + + switch (cipher) { + case IW_AUTH_CIPHER_NONE: + *profile_cipher = _NO_PRIVACY_; + ndisencryptstatus = Ndis802_11EncryptionDisabled; +#ifdef CONFIG_WAPI_SUPPORT + if (psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) + *profile_cipher = _SMS4_; +#endif + break; + case WLAN_CIPHER_SUITE_WEP40: + *profile_cipher = _WEP40_; + ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WLAN_CIPHER_SUITE_WEP104: + *profile_cipher = _WEP104_; + ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WLAN_CIPHER_SUITE_TKIP: + *profile_cipher = _TKIP_; + ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WLAN_CIPHER_SUITE_CCMP: + *profile_cipher = _AES_; + ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; +#ifdef CONFIG_WAPI_SUPPORT + case WLAN_CIPHER_SUITE_SMS4: + *profile_cipher = _SMS4_; + ndisencryptstatus = Ndis802_11_EncrypteionWAPI; + break; +#endif + default: + RTW_INFO("Unsupported cipher: 0x%x\n", cipher); + return -ENOTSUPP; + } + + if (ucast) { + psecuritypriv->ndisencryptstatus = ndisencryptstatus; + + /* if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_) */ + /* psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; */ + } + + return 0; +} + +static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt) +{ + RTW_INFO("%s, key_mgt=0x%x\n", __func__, key_mgt); + + if (key_mgt == WLAN_AKM_SUITE_8021X) { + /* *auth_type = UMAC_AUTH_TYPE_8021X; */ + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + psecuritypriv->rsn_akm_suite_type = 1; + } else if (key_mgt == WLAN_AKM_SUITE_PSK) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + psecuritypriv->rsn_akm_suite_type = 2; + } +#ifdef CONFIG_WAPI_SUPPORT + else if (key_mgt == WLAN_AKM_SUITE_WAPI_PSK) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; + else if (key_mgt == WLAN_AKM_SUITE_WAPI_CERT) + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI; +#endif +#ifdef CONFIG_RTW_80211R + else if (key_mgt == WLAN_AKM_SUITE_FT_8021X) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + psecuritypriv->rsn_akm_suite_type = 3; + } else if (key_mgt == WLAN_AKM_SUITE_FT_PSK) { + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + psecuritypriv->rsn_akm_suite_type = 4; + } +#endif + else { + RTW_INFO("Invalid key mgt: 0x%x\n", key_mgt); + /* return -EINVAL; */ + } + + return 0; +} + +static int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen) +{ + u8 *buf = NULL, *pos = NULL; + int group_cipher = 0, pairwise_cipher = 0; + u8 mfp_opt = MFP_NO; + int ret = 0; + int wpa_ielen = 0; + int wpa2_ielen = 0; + u8 *pwpa, *pwpa2; + u8 null_addr[] = {0, 0, 0, 0, 0, 0}; + + if (pie == NULL || !ielen) { + /* Treat this as normal case, but need to clear WIFI_UNDER_WPS */ + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + goto exit; + } + + if (ielen > MAX_WPA_IE_LEN + MAX_WPS_IE_LEN + MAX_P2P_IE_LEN) { + ret = -EINVAL; + goto exit; + } + + buf = rtw_zmalloc(ielen); + if (buf == NULL) { + ret = -ENOMEM; + goto exit; + } + + _rtw_memcpy(buf, pie , ielen); + + RTW_INFO("set wpa_ie(length:%zu):\n", ielen); + RTW_INFO_DUMP(NULL, buf, ielen); + + pos = buf; + if (ielen < RSN_HEADER_LEN) { + ret = -1; + goto exit; + } + + pwpa = rtw_get_wpa_ie(buf, &wpa_ielen, ielen); + if (pwpa && wpa_ielen > 0) { + if (rtw_parse_wpa_ie(pwpa, wpa_ielen + 2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS) { + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPAPSK; + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen + 2); + + RTW_INFO("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); + } + } + + pwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen); + if (pwpa2 && wpa2_ielen > 0) { + if (rtw_parse_wpa2_ie(pwpa2, wpa2_ielen + 2, &group_cipher, &pairwise_cipher, NULL, &mfp_opt) == _SUCCESS) { + padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; + padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPA2PSK; + _rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen + 2); + + RTW_INFO("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); + } + } + + if (group_cipher == 0) + group_cipher = WPA_CIPHER_NONE; + if (pairwise_cipher == 0) + pairwise_cipher = WPA_CIPHER_NONE; + + switch (group_cipher) { + case WPA_CIPHER_NONE: + padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; + break; + case WPA_CIPHER_WEP40: + padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WPA_CIPHER_TKIP: + padapter->securitypriv.dot118021XGrpPrivacy = _TKIP_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WPA_CIPHER_CCMP: + padapter->securitypriv.dot118021XGrpPrivacy = _AES_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; + case WPA_CIPHER_WEP104: + padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + } + + switch (pairwise_cipher) { + case WPA_CIPHER_NONE: + padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; + break; + case WPA_CIPHER_WEP40: + padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + case WPA_CIPHER_TKIP: + padapter->securitypriv.dot11PrivacyAlgrthm = _TKIP_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; + break; + case WPA_CIPHER_CCMP: + padapter->securitypriv.dot11PrivacyAlgrthm = _AES_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; + break; + case WPA_CIPHER_WEP104: + padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; + padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; + break; + } + + if (mfp_opt == MFP_INVALID) { + RTW_INFO(FUNC_ADPT_FMT" invalid MFP setting\n", FUNC_ADPT_ARG(padapter)); + ret = -EINVAL; + goto exit; + } + padapter->securitypriv.mfp_opt = mfp_opt; + + {/* handle wps_ie */ + uint wps_ielen; + u8 *wps_ie; + + wps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen); + if (wps_ie && wps_ielen > 0) { + RTW_INFO("got wps_ie, wps_ielen:%u\n", wps_ielen); + padapter->securitypriv.wps_ie_len = wps_ielen < MAX_WPS_IE_LEN ? wps_ielen : MAX_WPS_IE_LEN; + _rtw_memcpy(padapter->securitypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len); + set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); + } else + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + } + + {/* handle owe_ie */ + uint owe_ielen; + u8 *owe_ie; + + owe_ie = rtw_get_owe_ie(buf, ielen, NULL, &owe_ielen); + if (owe_ie && owe_ielen > 0) { + RTW_INFO("got owe_ie, owe_ielen:%u\n", owe_ielen); + padapter->securitypriv.owe_ie_len = owe_ielen < MAX_OWE_IE_LEN ? owe_ielen : MAX_OWE_IE_LEN; + _rtw_memcpy(padapter->securitypriv.owe_ie, owe_ie, padapter->securitypriv.owe_ie_len); + } + } + + #ifdef CONFIG_P2P + {/* check p2p_ie for assoc req; */ + uint p2p_ielen = 0; + u8 *p2p_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + p2p_ie = rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen); + if (p2p_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s p2p_assoc_req_ielen=%d\n", __FUNCTION__, p2p_ielen); + #endif + + if (pmlmepriv->p2p_assoc_req_ie) { + u32 free_len = pmlmepriv->p2p_assoc_req_ie_len; + pmlmepriv->p2p_assoc_req_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len); + pmlmepriv->p2p_assoc_req_ie = NULL; + } + + pmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen); + if (pmlmepriv->p2p_assoc_req_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + goto exit; + } + _rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; + } + } + #endif /* CONFIG_P2P */ + + #ifdef CONFIG_WFD + { + uint wfd_ielen = 0; + u8 *wfd_ie; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + wfd_ie = rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen); + if (wfd_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s wfd_assoc_req_ielen=%d\n", __FUNCTION__, wfd_ielen); + #endif + + if (rtw_mlme_update_wfd_ie_data(pmlmepriv, MLME_ASSOC_REQ_IE, wfd_ie, wfd_ielen) != _SUCCESS) + goto exit; + } + } + #endif /* CONFIG_WFD */ + + /* TKIP and AES disallow multicast packets until installing group key */ + if (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ + || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ + || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) + /* WPS open need to enable multicast */ + /* || check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE) */ + rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr); + + +exit: + if (buf) + rtw_mfree(buf, ielen); + if (ret) + _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); + + return ret; +} + +static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ibss_params *params) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + NDIS_802_11_SSID ndis_ssid; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct cfg80211_chan_def *pch_def; +#endif + struct ieee80211_channel *pch; + int ret = 0; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + pch_def = (struct cfg80211_chan_def *)(¶ms->chandef); + pch = (struct ieee80211_channel *) pch_def->chan; +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) + pch = (struct ieee80211_channel *)(params->channel); +#endif + + if (!params->ssid || !params->ssid_len) { + ret = -EINVAL; + goto exit; + } + + if (params->ssid_len > IW_ESSID_MAX_SIZE) { + ret = -E2BIG; + goto exit; + } + + rtw_ps_deny(padapter, PS_DENY_JOIN); + if (_FAIL == rtw_pwr_wakeup(padapter)) { + ret = -EPERM; + goto cancel_ps_deny; + } + +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_LINKING)) { + RTW_INFO("%s, but buddy_intf is under linking\n", __FUNCTION__); + ret = -EINVAL; + goto cancel_ps_deny; + } + rtw_mi_buddy_scan_abort(padapter, _TRUE); /* OR rtw_mi_scan_abort(padapter, _TRUE);*/ +#endif /*CONFIG_CONCURRENT_MODE*/ + + + _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); + ndis_ssid.SsidLength = params->ssid_len; + _rtw_memcpy(ndis_ssid.Ssid, (u8 *)params->ssid, params->ssid_len); + + /* RTW_INFO("ssid=%s, len=%zu\n", ndis_ssid.Ssid, params->ssid_len); */ + + psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + + ret = rtw_cfg80211_set_auth_type(psecuritypriv, NL80211_AUTHTYPE_OPEN_SYSTEM); + rtw_set_802_11_authentication_mode(padapter, psecuritypriv->ndisauthtype); + + RTW_INFO("%s: center_freq = %d\n", __func__, pch->center_freq); + pmlmeext->cur_channel = rtw_freq2ch(pch->center_freq); + + if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) { + ret = -1; + goto cancel_ps_deny; + } + +cancel_ps_deny: + rtw_ps_deny_cancel(padapter, PS_DENY_JOIN); +exit: + return ret; +} + +static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct wireless_dev *rtw_wdev = padapter->rtw_wdev; + enum nl80211_iftype old_type; + int ret = 0; + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + +#if (RTW_CFG80211_BLOCK_STA_DISCON_EVENT & RTW_CFG80211_BLOCK_DISCON_WHEN_DISCONNECT) + rtw_wdev_set_not_indic_disco(adapter_wdev_data(padapter), 1); +#endif + + old_type = rtw_wdev->iftype; + + rtw_set_to_roam(padapter, 0); + + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { + rtw_scan_abort(padapter); + LeaveAllPowerSaveMode(padapter); + + rtw_wdev->iftype = NL80211_IFTYPE_STATION; + + if (rtw_set_802_11_infrastructure_mode(padapter, Ndis802_11Infrastructure, 0) == _FALSE) { + rtw_wdev->iftype = old_type; + ret = -EPERM; + goto leave_ibss; + } + rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure, RTW_CMDF_WAIT_ACK); + } + +leave_ibss: +#if (RTW_CFG80211_BLOCK_STA_DISCON_EVENT & RTW_CFG80211_BLOCK_DISCON_WHEN_DISCONNECT) + rtw_wdev_set_not_indic_disco(adapter_wdev_data(padapter), 0); +#endif + + return 0; +} + +bool rtw_cfg80211_is_connect_requested(_adapter *adapter) +{ + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter); + _irqL irqL; + bool requested; + + _enter_critical_bh(&pwdev_priv->connect_req_lock, &irqL); + requested = pwdev_priv->connect_req ? 1 : 0; + _exit_critical_bh(&pwdev_priv->connect_req_lock, &irqL); + + return requested; +} + +static int _rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + + + /* if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) */ + { + rtw_scan_abort(padapter); + rtw_join_abort_timeout(padapter, 300); + LeaveAllPowerSaveMode(padapter); + rtw_disassoc_cmd(padapter, 500, RTW_CMDF_WAIT_ACK); +#ifdef CONFIG_RTW_REPEATER_SON + rtw_rson_do_disconnect(padapter); +#endif + RTW_INFO("%s...call rtw_indicate_disconnect\n", __func__); + + rtw_free_assoc_resources_cmd(padapter, _TRUE, RTW_CMDF_WAIT_ACK); + + /* indicate locally_generated = 0 when suspend */ + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) + rtw_indicate_disconnect(padapter, 0, wiphy->dev.power.is_prepared ? _FALSE : _TRUE); + #else + /* + * for kernel < 4.2, DISCONNECT event is hardcoded with + * NL80211_ATTR_DISCONNECTED_BY_AP=1 in NL80211 layer + * no need to judge if under suspend + */ + rtw_indicate_disconnect(padapter, 0, _TRUE); + #endif + + rtw_pwr_wakeup(padapter); + } + return 0; +} + +#if (KERNEL_VERSION(4, 17, 0) > LINUX_VERSION_CODE) +static bool rtw_check_connect_sae_compat(struct cfg80211_connect_params *sme) +{ + struct rtw_ieee802_11_elems elems; + struct rsne_info info; + u8 AKM_SUITE_SAE[] = { 0x00, 0x0f, 0xac, 8 }; + int i; + + if (sme->auth_type != 1) + return false; + + if (rtw_ieee802_11_parse_elems((u8 *)sme->ie, sme->ie_len, &elems, 0) + == ParseFailed) + return false; + + if (!elems.rsn_ie) + return false; + + if (rtw_rsne_info_parse(elems.rsn_ie - 2, elems.rsn_ie_len + 2, &info) == _FAIL) + return false; + + for (i = 0; i < info.akm_cnt; i++) + if (memcmp(info.akm_list + i * RSN_SELECTOR_LEN, + AKM_SUITE_SAE, RSN_SELECTOR_LEN) == 0) + return true; + + return false; +} +#else +#define rtw_check_connect_sae_compat(sme) false +#endif + +static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_connect_params *sme) +{ + int ret = 0; + NDIS_802_11_AUTHENTICATION_MODE authmode; + NDIS_802_11_SSID ndis_ssid; + /* u8 matched_by_bssid=_FALSE; */ + /* u8 matched_by_ssid=_FALSE; */ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + _irqL irqL; + +#if (RTW_CFG80211_BLOCK_STA_DISCON_EVENT & RTW_CFG80211_BLOCK_DISCON_WHEN_CONNECT) + rtw_wdev_set_not_indic_disco(pwdev_priv, 1); +#endif + + RTW_INFO("=>"FUNC_NDEV_FMT" - Start to Connection\n", FUNC_NDEV_ARG(ndev)); + RTW_INFO("privacy=%d, key=%p, key_len=%d, key_idx=%d, auth_type=%d\n", + sme->privacy, sme->key, sme->key_len, sme->key_idx, sme->auth_type); + + if (rtw_check_connect_sae_compat(sme)) { + sme->auth_type = NL80211_AUTHTYPE_SAE; + RTW_INFO("%s set sme->auth_type=4 for SAE compat\n", __FUNCTION__); + } + + if (pwdev_priv->block == _TRUE) { + ret = -EBUSY; + RTW_INFO("%s wdev_priv.block is set\n", __FUNCTION__); + goto exit; + } + + if (check_fwstate(pmlmepriv, _FW_LINKED | _FW_UNDER_LINKING) == _TRUE) { + + _rtw_disconnect(wiphy, ndev); + RTW_INFO("%s disconnect before connecting! fw_state=0x%x\n", + __FUNCTION__, pmlmepriv->fw_state); + } + +#ifdef CONFIG_PLATFORM_MSTAR_SCAN_BEFORE_CONNECT + printk("MStar Android!\n"); + if (pwdev_priv->bandroid_scan == _FALSE) { +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) +#endif /* CONFIG_P2P */ + { + ret = -EBUSY; + printk("Android hasn't attached yet!\n"); + goto exit; + } + } +#endif + + if (!sme->ssid || !sme->ssid_len) { + ret = -EINVAL; + goto exit; + } + + if (sme->ssid_len > IW_ESSID_MAX_SIZE) { + ret = -E2BIG; + goto exit; + } + + rtw_ps_deny(padapter, PS_DENY_JOIN); + if (_FAIL == rtw_pwr_wakeup(padapter)) { + ret = -EPERM; + goto cancel_ps_deny; + } + + rtw_mi_scan_abort(padapter, _TRUE); + + rtw_join_abort_timeout(padapter, 300); +#ifdef CONFIG_CONCURRENT_MODE + if (rtw_mi_buddy_check_fwstate(padapter, _FW_UNDER_LINKING)) { + ret = -EINVAL; + goto cancel_ps_deny; + } +#endif + + _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID)); + ndis_ssid.SsidLength = sme->ssid_len; + _rtw_memcpy(ndis_ssid.Ssid, (u8 *)sme->ssid, sme->ssid_len); + + RTW_INFO("ssid=%s, len=%zu\n", ndis_ssid.Ssid, sme->ssid_len); + + + if (sme->bssid) + RTW_INFO("bssid="MAC_FMT"\n", MAC_ARG(sme->bssid)); + + + psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; /* open system */ + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + psecuritypriv->auth_alg = WLAN_AUTH_OPEN; + psecuritypriv->extauth_status = WLAN_STATUS_UNSPECIFIED_FAILURE; + +#ifdef CONFIG_WAPI_SUPPORT + padapter->wapiInfo.bWapiEnable = false; +#endif + + ret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions); + if (ret < 0) + goto cancel_ps_deny; + +#ifdef CONFIG_WAPI_SUPPORT + if (sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1) { + padapter->wapiInfo.bWapiEnable = true; + padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN; + padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN; + } +#endif + + ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); + +#ifdef CONFIG_WAPI_SUPPORT + if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_WAPI) + padapter->mlmeextpriv.mlmext_info.auth_algo = psecuritypriv->dot11AuthAlgrthm; +#endif + + + if (ret < 0) + goto cancel_ps_deny; + + RTW_INFO("%s, ie_len=%zu\n", __func__, sme->ie_len); + + ret = rtw_cfg80211_set_wpa_ie(padapter, (u8 *)sme->ie, sme->ie_len); + if (ret < 0) + goto cancel_ps_deny; + + if (sme->crypto.n_ciphers_pairwise) { + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE); + if (ret < 0) + goto cancel_ps_deny; + } + + /* For WEP Shared auth */ + if (sme->key_len > 0 && sme->key) { + u32 wep_key_idx, wep_key_len, wep_total_len; + NDIS_802_11_WEP *pwep = NULL; + RTW_INFO("%s(): Shared/Auto WEP\n", __FUNCTION__); + + wep_key_idx = sme->key_idx; + wep_key_len = sme->key_len; + + if (sme->key_idx > WEP_KEYS) { + ret = -EINVAL; + goto cancel_ps_deny; + } + + if (wep_key_len > 0) { + wep_key_len = wep_key_len <= 5 ? 5 : 13; + wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial); + pwep = (NDIS_802_11_WEP *) rtw_malloc(wep_total_len); + if (pwep == NULL) { + RTW_INFO(" wpa_set_encryption: pwep allocate fail !!!\n"); + ret = -ENOMEM; + goto cancel_ps_deny; + } + + _rtw_memset(pwep, 0, wep_total_len); + + pwep->KeyLength = wep_key_len; + pwep->Length = wep_total_len; + + if (wep_key_len == 13) { + padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; + padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_; + } + } else { + ret = -EINVAL; + goto cancel_ps_deny; + } + + pwep->KeyIndex = wep_key_idx; + pwep->KeyIndex |= 0x80000000; + + _rtw_memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); + + if (rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL) + ret = -EOPNOTSUPP ; + + if (pwep) + rtw_mfree((u8 *)pwep, wep_total_len); + + if (ret < 0) + goto cancel_ps_deny; + } + + ret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE); + if (ret < 0) + return ret; + + if (sme->crypto.n_akm_suites) { + ret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]); + if (ret < 0) + goto cancel_ps_deny; + } +#ifdef CONFIG_8011R + else { + /*It could be a connection without RSN IEs*/ + psecuritypriv->rsn_akm_suite_type = 0; + } +#endif + +#ifdef CONFIG_WAPI_SUPPORT + if (sme->crypto.akm_suites[0] == WLAN_AKM_SUITE_WAPI_PSK) + padapter->wapiInfo.bWapiPSK = true; + else if (sme->crypto.akm_suites[0] == WLAN_AKM_SUITE_WAPI_CERT) + padapter->wapiInfo.bWapiPSK = false; +#endif + + authmode = psecuritypriv->ndisauthtype; + rtw_set_802_11_authentication_mode(padapter, authmode); + + /* rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus); */ + + if (rtw_set_802_11_connect(padapter, (u8 *)sme->bssid, &ndis_ssid) == _FALSE) { + ret = -1; + goto cancel_ps_deny; + } + + + _enter_critical_bh(&pwdev_priv->connect_req_lock, &irqL); + + if (pwdev_priv->connect_req) { + rtw_wdev_free_connect_req(pwdev_priv); + RTW_INFO(FUNC_NDEV_FMT" free existing connect_req\n", FUNC_NDEV_ARG(ndev)); + } + + pwdev_priv->connect_req = (struct cfg80211_connect_params *)rtw_malloc(sizeof(*pwdev_priv->connect_req)); + if (pwdev_priv->connect_req) + _rtw_memcpy(pwdev_priv->connect_req, sme, sizeof(*pwdev_priv->connect_req)); + else + RTW_WARN(FUNC_NDEV_FMT" alloc connect_req fail\n", FUNC_NDEV_ARG(ndev)); + + _exit_critical_bh(&pwdev_priv->connect_req_lock, &irqL); + + RTW_INFO("set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\n", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, + psecuritypriv->dot118021XGrpPrivacy); + +cancel_ps_deny: + rtw_ps_deny_cancel(padapter, PS_DENY_JOIN); + +exit: + RTW_INFO("<=%s, ret %d\n", __FUNCTION__, ret); + +#if (RTW_CFG80211_BLOCK_STA_DISCON_EVENT & RTW_CFG80211_BLOCK_DISCON_WHEN_CONNECT) + rtw_wdev_set_not_indic_disco(pwdev_priv, 0); +#endif + + return ret; +} + +static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, + u16 reason_code) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + + RTW_INFO(FUNC_NDEV_FMT" - Start to Disconnect\n", FUNC_NDEV_ARG(ndev)); + +#if (RTW_CFG80211_BLOCK_STA_DISCON_EVENT & RTW_CFG80211_BLOCK_DISCON_WHEN_DISCONNECT) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + if (!wiphy->dev.power.is_prepared) + #endif + rtw_wdev_set_not_indic_disco(adapter_wdev_data(padapter), 1); +#endif + + rtw_set_to_roam(padapter, 0); + + /* if(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) */ + { + _rtw_disconnect(wiphy, ndev); + } + +#if (RTW_CFG80211_BLOCK_STA_DISCON_EVENT & RTW_CFG80211_BLOCK_DISCON_WHEN_DISCONNECT) + rtw_wdev_set_not_indic_disco(adapter_wdev_data(padapter), 0); +#endif + + RTW_INFO(FUNC_NDEV_FMT" return 0\n", FUNC_NDEV_ARG(ndev)); + return 0; +} + +static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct wireless_dev *wdev, +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)) || defined(COMPAT_KERNEL_RELEASE) + enum nl80211_tx_power_setting type, int mbm) +#else + enum tx_power_setting type, int dbm) +#endif +{ +#if 0 + struct iwm_priv *iwm = wiphy_to_iwm(wiphy); + int ret; + + switch (type) { + case NL80211_TX_POWER_AUTOMATIC: + return 0; + case NL80211_TX_POWER_FIXED: + if (mbm < 0 || (mbm % 100)) + return -EOPNOTSUPP; + + if (!test_bit(IWM_STATUS_READY, &iwm->status)) + return 0; + + ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, + CFG_TX_PWR_LIMIT_USR, + MBM_TO_DBM(mbm) * 2); + if (ret < 0) + return ret; + + return iwm_tx_power_trigger(iwm); + default: + IWM_ERR(iwm, "Unsupported power type: %d\n", type); + return -EOPNOTSUPP; + } +#endif + RTW_INFO("%s\n", __func__); + return 0; +} + +static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct wireless_dev *wdev, +#endif + int *dbm) +{ + RTW_INFO("%s\n", __func__); + + *dbm = (12); + + return 0; +} + +inline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter) +{ + struct rtw_wdev_priv *rtw_wdev_priv = adapter_wdev_data(adapter); + return rtw_wdev_priv->power_mgmt; +} + +static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, + struct net_device *ndev, + bool enabled, int timeout) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct rtw_wdev_priv *rtw_wdev_priv = adapter_wdev_data(padapter); + + RTW_INFO(FUNC_NDEV_FMT" enabled:%u, timeout:%d\n", FUNC_NDEV_ARG(ndev), + enabled, timeout); + + rtw_wdev_priv->power_mgmt = enabled; + +#ifdef CONFIG_LPS + if (!enabled) + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE_CFG80211_PWRMGMT, 1); +#endif + + return 0; +} + +static void _rtw_set_pmksa(struct net_device *ndev, + u8 *bssid, u8 *pmkid) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + u8 index, blInserted = _FALSE; + + /* overwrite PMKID */ + for (index = 0 ; index < NUM_PMKID_CACHE; index++) { + if (_rtw_memcmp(psecuritypriv->PMKIDList[index].Bssid, bssid, ETH_ALEN) == _TRUE) { + /* BSSID is matched, the same AP => rewrite with new PMKID. */ + RTW_INFO("BSSID("MAC_FMT") exists in the PMKList.\n", MAC_ARG(bssid)); + + _rtw_memcpy(psecuritypriv->PMKIDList[index].PMKID, pmkid, WLAN_PMKID_LEN); + psecuritypriv->PMKIDList[index].bUsed = _TRUE; + psecuritypriv->PMKIDIndex = index + 1; + blInserted = _TRUE; + break; + } + } + + if (!blInserted) { + /* Find a new entry */ + RTW_INFO("Use the new entry index = %d for this PMKID.\n", + psecuritypriv->PMKIDIndex); + + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, bssid, ETH_ALEN); + _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pmkid, WLAN_PMKID_LEN); + + psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE; + psecuritypriv->PMKIDIndex++ ; + if (psecuritypriv->PMKIDIndex == 16) + psecuritypriv->PMKIDIndex = 0; + } +} + +static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, + struct net_device *ndev, + struct cfg80211_pmksa *pmksa) +{ + u8 index, blInserted = _FALSE; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *mlme = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + u8 strZeroMacAddress[ETH_ALEN] = { 0x00 }; + bool sae_auth = rtw_sec_chk_auth_type(padapter, NL80211_AUTHTYPE_SAE); + + RTW_INFO(FUNC_NDEV_FMT" "MAC_FMT" "KEY_FMT"\n", FUNC_NDEV_ARG(ndev) + , MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid)); + + if (_rtw_memcmp((u8 *)pmksa->bssid, strZeroMacAddress, ETH_ALEN) == _TRUE) + return -EINVAL; + + if (check_fwstate(mlme, _FW_LINKED) == _FALSE && !sae_auth) { + RTW_INFO(FUNC_NDEV_FMT" not set pmksa cause not in linked state\n", FUNC_NDEV_ARG(ndev)); + return -EINVAL; + } + + _rtw_set_pmksa(ndev, (u8 *)pmksa->bssid, (u8 *)pmksa->pmkid); + + if (sae_auth && + (psecuritypriv->extauth_status == WLAN_STATUS_SUCCESS)) { + RTW_PRINT("SAE: auth success, start assoc\n"); + start_clnt_assoc(padapter); + } + + return 0; +} + +static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, + struct net_device *ndev, + struct cfg80211_pmksa *pmksa) +{ + u8 index, bMatched = _FALSE; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + RTW_INFO(FUNC_NDEV_FMT" "MAC_FMT" "KEY_FMT"\n", FUNC_NDEV_ARG(ndev) + , MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid)); + + for (index = 0 ; index < NUM_PMKID_CACHE; index++) { + if (_rtw_memcmp(psecuritypriv->PMKIDList[index].Bssid, (u8 *)pmksa->bssid, ETH_ALEN) == _TRUE) { + /* BSSID is matched, the same AP => Remove this PMKID information and reset it. */ + _rtw_memset(psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN); + _rtw_memset(psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN); + psecuritypriv->PMKIDList[index].bUsed = _FALSE; + bMatched = _TRUE; + RTW_INFO(FUNC_NDEV_FMT" clear id:%hhu\n", FUNC_NDEV_ARG(ndev), index); + break; + } + } + + if (_FALSE == bMatched) { + RTW_INFO(FUNC_NDEV_FMT" do not have matched BSSID\n" + , FUNC_NDEV_ARG(ndev)); + return -EINVAL; + } + + return 0; +} + +static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, + struct net_device *ndev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + _rtw_memset(&psecuritypriv->PMKIDList[0], 0x00, sizeof(RT_PMKID_LIST) * NUM_PMKID_CACHE); + psecuritypriv->PMKIDIndex = 0; + + return 0; +} + +#ifdef CONFIG_AP_MODE +void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len) +{ +#if !defined(RTW_USE_CFG80211_STA_EVENT) && !defined(COMPAT_KERNEL_RELEASE) + s32 freq; + int channel; + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); +#endif + struct net_device *ndev = padapter->pnetdev; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) + { + struct station_info sinfo; + u8 ie_offset; + if (get_frame_sub_type(pmgmt_frame) == WIFI_ASSOCREQ) + ie_offset = _ASOCREQ_IE_OFFSET_; + else /* WIFI_REASSOCREQ */ + ie_offset = _REASOCREQ_IE_OFFSET_; + + memset(&sinfo, 0, sizeof(sinfo)); + sinfo.filled = STATION_INFO_ASSOC_REQ_IES; + sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset; + sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset; + cfg80211_new_sta(ndev, get_addr2_ptr(pmgmt_frame), &sinfo, GFP_ATOMIC); + } +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ + channel = pmlmeext->cur_channel; + freq = rtw_ch2freq(channel); + + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_rx_mgmt(pwdev, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_rx_mgmt(pwdev, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC); + #else /* COMPAT_KERNEL_RELEASE */ + { + /* to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION) when calling cfg80211_send_rx_assoc() */ + #ifndef CONFIG_PLATFORM_MSTAR + pwdev->iftype = NL80211_IFTYPE_STATION; + #endif /* CONFIG_PLATFORM_MSTAR */ + RTW_INFO("iftype=%d before call cfg80211_send_rx_assoc()\n", pwdev->iftype); + rtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len); + RTW_INFO("iftype=%d after call cfg80211_send_rx_assoc()\n", pwdev->iftype); + pwdev->iftype = NL80211_IFTYPE_AP; + /* cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC); */ + } + #endif /* COMPAT_KERNEL_RELEASE */ +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ + +} + +void rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, const u8 *da, unsigned short reason) +{ +#if !defined(RTW_USE_CFG80211_STA_EVENT) && !defined(COMPAT_KERNEL_RELEASE) + s32 freq; + int channel; + u8 *pmgmt_frame; + uint frame_len; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + u8 mgmt_buf[128] = {0}; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wireless_dev *wdev = padapter->rtw_wdev; +#endif + struct net_device *ndev = padapter->pnetdev; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); + +#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE) + cfg80211_del_sta(ndev, da, GFP_ATOMIC); +#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ + channel = pmlmeext->cur_channel; + freq = rtw_ch2freq(channel); + + pmgmt_frame = mgmt_buf; + pwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + set_frame_sub_type(pmgmt_frame, WIFI_DEAUTH); + + pmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr); + frame_len = sizeof(struct rtw_ieee80211_hdr_3addr); + + reason = cpu_to_le16(reason); + pmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len); + + #ifdef COMPAT_KERNEL_RELEASE + rtw_cfg80211_rx_mgmt(wdev, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC); + #else /* COMPAT_KERNEL_RELEASE */ + cfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len); + /* cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC); */ + #endif /* COMPAT_KERNEL_RELEASE */ +#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ +} + +static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) +{ + int ret = 0; + + RTW_INFO("%s\n", __func__); + + return ret; +} + +static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) +{ + int ret = 0; + + RTW_INFO("%s\n", __func__); + + return ret; +} + +static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev) +{ + int ret = 0; + int rtap_len; + int qos_len = 0; + int dot11_hdr_len = 24; + int snap_len = 6; + unsigned char *pdata; + u16 frame_ctl; + unsigned char src_mac_addr[ETH_ALEN]; + unsigned char dst_mac_addr[ETH_ALEN]; + struct rtw_ieee80211_hdr *dot11_hdr; + struct ieee80211_radiotap_header *rtap_hdr; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); +#ifdef CONFIG_DFS_MASTER + struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); +#endif + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if (skb) + rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize); + + if (IS_CH_WAITING(rfctl)) { + #ifdef CONFIG_DFS_MASTER + if (rtw_rfctl_overlap_radar_detect_ch(rfctl)) + goto fail; + #endif + } + + if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) + goto fail; + + rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; + if (unlikely(rtap_hdr->it_version)) + goto fail; + + rtap_len = ieee80211_get_radiotap_len(skb->data); + if (unlikely(skb->len < rtap_len)) + goto fail; + + if (rtap_len != 14) { + RTW_INFO("radiotap len (should be 14): %d\n", rtap_len); + goto fail; + } + + /* Skip the ratio tap header */ + skb_pull(skb, rtap_len); + + dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data; + frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl); + /* Check if the QoS bit is set */ + if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { + /* Check if this ia a Wireless Distribution System (WDS) frame + * which has 4 MAC addresses + */ + if (dot11_hdr->frame_ctl & 0x0080) + qos_len = 2; + if ((dot11_hdr->frame_ctl & 0x0300) == 0x0300) + dot11_hdr_len += 6; + + memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); + memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); + + /* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for + * for two MAC addresses + */ + skb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2); + pdata = (unsigned char *)skb->data; + memcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr)); + memcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr)); + + RTW_INFO("should be eapol packet\n"); + + /* Use the real net device to transmit the packet */ + ret = _rtw_xmit_entry(skb, padapter->pnetdev); + + return ret; + + } else if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE | RTW_IEEE80211_FCTL_STYPE)) + == (RTW_IEEE80211_FTYPE_MGMT | RTW_IEEE80211_STYPE_ACTION) + ) { + /* only for action frames */ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + /* u8 category, action, OUI_Subtype, dialogToken=0; */ + /* unsigned char *frame_body; */ + struct rtw_ieee80211_hdr *pwlanhdr; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 *buf = skb->data; + u32 len = skb->len; + u8 category, action; + int type = -1; + + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { + RTW_INFO(FUNC_NDEV_FMT" frame_control:0x%x\n", FUNC_NDEV_ARG(ndev), + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); + goto fail; + } + + RTW_INFO("RTW_Tx:da="MAC_FMT" via "FUNC_NDEV_FMT"\n", + MAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev)); + #ifdef CONFIG_P2P + type = rtw_p2p_check_frames(padapter, buf, len, _TRUE); + if (type >= 0) + goto dump; + #endif + if (category == RTW_WLAN_CATEGORY_PUBLIC) + RTW_INFO("RTW_Tx:%s\n", action_public_str(action)); + else + RTW_INFO("RTW_Tx:category(%u), action(%u)\n", category, action); + +dump: + /* starting alloc mgmt frame to dump it */ + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + goto fail; + + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->retry_ctrl = _FALSE; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + _rtw_memcpy(pframe, (void *)buf, len); + pattrib->pktlen = len; + +#ifdef CONFIG_P2P + if (type >= 0) + rtw_xframe_chk_wfd_ie(pmgntframe); +#endif /* CONFIG_P2P */ + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + /* update seq number */ + pmlmeext->mgnt_seq = GetSequence(pwlanhdr); + pattrib->seqnum = pmlmeext->mgnt_seq; + pmlmeext->mgnt_seq++; + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + } else + RTW_INFO("frame_ctl=0x%x\n", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE | RTW_IEEE80211_FCTL_STYPE)); + + +fail: + + rtw_skb_free(skb); + + return 0; + +} + +static void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev) +{ + RTW_INFO("%s\n", __func__); +} + +static int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) +{ + int ret = 0; + + RTW_INFO("%s\n", __func__); + + return ret; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) +static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { + .ndo_open = rtw_cfg80211_monitor_if_open, + .ndo_stop = rtw_cfg80211_monitor_if_close, + .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) + .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list, + #endif + .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, +}; +#endif + +static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev) +{ + int ret = 0; + struct net_device *mon_ndev = NULL; + struct wireless_dev *mon_wdev = NULL; + struct rtw_netdev_priv_indicator *pnpi; + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + + if (!name) { + RTW_INFO(FUNC_ADPT_FMT" without specific name\n", FUNC_ADPT_ARG(padapter)); + ret = -EINVAL; + goto out; + } + + if (pwdev_priv->pmon_ndev) { + RTW_INFO(FUNC_ADPT_FMT" monitor interface exist: "NDEV_FMT"\n", + FUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev)); + ret = -EBUSY; + goto out; + } + + mon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!mon_ndev) { + RTW_INFO(FUNC_ADPT_FMT" allocate ndev fail\n", FUNC_ADPT_ARG(padapter)); + ret = -ENOMEM; + goto out; + } + + mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP; + strncpy(mon_ndev->name, name, IFNAMSIZ); + mon_ndev->name[IFNAMSIZ - 1] = 0; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 11, 8)) + mon_ndev->priv_destructor = rtw_ndev_destructor; +#else + mon_ndev->destructor = rtw_ndev_destructor; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) + mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; +#else + mon_ndev->open = rtw_cfg80211_monitor_if_open; + mon_ndev->stop = rtw_cfg80211_monitor_if_close; + mon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry; + mon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address; +#endif + + pnpi = netdev_priv(mon_ndev); + pnpi->priv = padapter; + pnpi->sizeof_priv = sizeof(_adapter); + + /* wdev */ + mon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!mon_wdev) { + RTW_INFO(FUNC_ADPT_FMT" allocate mon_wdev fail\n", FUNC_ADPT_ARG(padapter)); + ret = -ENOMEM; + goto out; + } + + mon_wdev->wiphy = padapter->rtw_wdev->wiphy; + mon_wdev->netdev = mon_ndev; + mon_wdev->iftype = NL80211_IFTYPE_MONITOR; + mon_ndev->ieee80211_ptr = mon_wdev; + + ret = register_netdevice(mon_ndev); + if (ret) + goto out; + + *ndev = pwdev_priv->pmon_ndev = mon_ndev; + _rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ + 1); + +out: + if (ret && mon_wdev) { + rtw_mfree((u8 *)mon_wdev, sizeof(struct wireless_dev)); + mon_wdev = NULL; + } + + if (ret && mon_ndev) { + free_netdev(mon_ndev); + *ndev = mon_ndev = NULL; + } + + return ret; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +static struct wireless_dev * +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) +static struct net_device * +#else +static int +#endif + cfg80211_rtw_add_virtual_intf( + struct wiphy *wiphy, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)) + const char *name, + #else + char *name, + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) + unsigned char name_assign_type, + #endif + enum nl80211_iftype type, + #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)) + u32 *flags, + #endif + struct vif_params *params) +{ + int ret = 0; + struct wireless_dev *wdev = NULL; + struct net_device *ndev = NULL; + _adapter *padapter; + struct dvobj_priv *dvobj = wiphy_to_dvobj(wiphy); + + rtw_set_rtnl_lock_holder(dvobj, current); + + RTW_INFO(FUNC_WIPHY_FMT" name:%s, type:%d\n", FUNC_WIPHY_ARG(wiphy), name, type); + + switch (type) { + case NL80211_IFTYPE_MONITOR: + padapter = wiphy_to_adapter(wiphy); /* TODO: get ap iface ? */ + ret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev); + if (ret == 0) + wdev = ndev->ieee80211_ptr; + break; + +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + case NL80211_IFTYPE_P2P_CLIENT: + case NL80211_IFTYPE_P2P_GO: +#endif + case NL80211_IFTYPE_STATION: + case NL80211_IFTYPE_AP: +#ifdef CONFIG_RTW_MESH + case NL80211_IFTYPE_MESH_POINT: +#endif + padapter = dvobj_get_unregisterd_adapter(dvobj); + if (!padapter) { + RTW_WARN("adapter pool empty!\n"); + ret = -ENODEV; + break; + } + if (rtw_os_ndev_init(padapter, name) != _SUCCESS) { + RTW_WARN("ndev init fail!\n"); + ret = -ENODEV; + break; + } + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + if (type == NL80211_IFTYPE_P2P_CLIENT || type == NL80211_IFTYPE_P2P_GO) + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + #endif + ndev = padapter->pnetdev; + wdev = ndev->ieee80211_ptr; + break; + +#if defined(CONFIG_P2P) && defined(RTW_DEDICATED_P2P_DEVICE) + case NL80211_IFTYPE_P2P_DEVICE: + ret = rtw_pd_iface_alloc(wiphy, name, &wdev); + break; +#endif + + case NL80211_IFTYPE_ADHOC: + case NL80211_IFTYPE_AP_VLAN: + case NL80211_IFTYPE_WDS: + default: + ret = -ENODEV; + RTW_INFO("Unsupported interface type\n"); + break; + } + + if (ndev) + RTW_INFO(FUNC_WIPHY_FMT" ndev:%p, ret:%d\n", FUNC_WIPHY_ARG(wiphy), ndev, ret); + else + RTW_INFO(FUNC_WIPHY_FMT" wdev:%p, ret:%d\n", FUNC_WIPHY_ARG(wiphy), wdev, ret); + + rtw_set_rtnl_lock_holder(dvobj, NULL); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + return wdev ? wdev : ERR_PTR(ret); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + return ndev ? ndev : ERR_PTR(ret); +#else + return ret; +#endif +} + +static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev +#else + struct net_device *ndev +#endif +) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct net_device *ndev = wdev_to_ndev(wdev); +#endif + int ret = 0; + struct dvobj_priv *dvobj = wiphy_to_dvobj(wiphy); + _adapter *adapter; + struct rtw_wdev_priv *pwdev_priv; + + rtw_set_rtnl_lock_holder(dvobj, current); + + if (ndev) { + adapter = (_adapter *)rtw_netdev_priv(ndev); + pwdev_priv = adapter_wdev_data(adapter); + + if (ndev == pwdev_priv->pmon_ndev) { + unregister_netdevice(ndev); + pwdev_priv->pmon_ndev = NULL; + pwdev_priv->ifname_mon[0] = '\0'; + RTW_INFO(FUNC_NDEV_FMT" remove monitor ndev\n", FUNC_NDEV_ARG(ndev)); + } else { + RTW_INFO(FUNC_NDEV_FMT" unregister ndev\n", FUNC_NDEV_ARG(ndev)); + rtw_os_ndev_unregister(adapter); + } + } else +#if defined(CONFIG_P2P) && defined(RTW_DEDICATED_P2P_DEVICE) + if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE) { + if (wdev == wiphy_to_pd_wdev(wiphy)) + rtw_pd_iface_free(wiphy); + else { + RTW_ERR(FUNC_WIPHY_FMT" unknown P2P Device wdev:%p\n", FUNC_WIPHY_ARG(wiphy), wdev); + rtw_warn_on(1); + } + } else +#endif + { + ret = -EINVAL; + goto exit; + } + +exit: + rtw_set_rtnl_lock_holder(dvobj, NULL); + return ret; +} + +static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len) +{ + int ret = 0; + u8 *pbuf = NULL; + uint len, wps_ielen = 0; + uint p2p_ielen = 0; + u8 got_p2p_ie = _FALSE; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + /* struct sta_priv *pstapriv = &padapter->stapriv; */ + + + RTW_INFO("%s beacon_head_len=%zu, beacon_tail_len=%zu\n", __FUNCTION__, head_len, tail_len); + + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return -EINVAL; + + if (head_len < 24) + return -EINVAL; + + #ifdef CONFIG_FW_HANDLE_TXBCN + if (!rtw_ap_nums_check(adapter)) { + RTW_ERR(FUNC_ADPT_FMT"failed, con't support over %d BCN\n", FUNC_ADPT_ARG(adapter), CONFIG_LIMITED_AP_NUM); + return -EINVAL; + } + #endif /*CONFIG_FW_HANDLE_TXBCN*/ + + pbuf = rtw_zmalloc(head_len + tail_len); + if (!pbuf) + return -ENOMEM; + + + /* _rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2); */ + + /* if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0)) */ + /* pstapriv->max_num_sta = NUM_STA; */ + + + _rtw_memcpy(pbuf, (void *)head + 24, head_len - 24); /* 24=beacon header len. */ + _rtw_memcpy(pbuf + head_len - 24, (void *)tail, tail_len); + + len = head_len + tail_len - 24; + + /* check wps ie if inclued */ + if (rtw_get_wps_ie(pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL, &wps_ielen)) + RTW_INFO("add bcn, wps_ielen=%d\n", wps_ielen); + +#ifdef CONFIG_P2P + if (adapter->wdinfo.driver_interface == DRIVER_CFG80211) { + /* check p2p if enable */ + if (rtw_get_p2p_ie(pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL, &p2p_ielen)) { + struct wifidirect_info *pwdinfo = &(adapter->wdinfo); + + RTW_INFO("got p2p_ie, len=%d\n", p2p_ielen); + + got_p2p_ie = _TRUE; + + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + RTW_INFO("Enable P2P function for the first time\n"); + rtw_p2p_enable(adapter, P2P_ROLE_GO); + + adapter->stapriv.expire_to = 3; /* 3x2 = 6 sec in p2p mode */ + } else { + RTW_INFO("enter GO Mode, p2p_ielen=%d\n", p2p_ielen); + + rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); + rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); + pwdinfo->intent = 15; + } + } + } +#endif /* CONFIG_P2P */ + + /* pbss_network->IEs will not include p2p_ie, wfd ie */ + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4); + rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4); + + if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) { +#ifdef CONFIG_P2P + /* check p2p if enable */ + if (got_p2p_ie == _TRUE) { + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct wifidirect_info *pwdinfo = &(adapter->wdinfo); + pwdinfo->operating_channel = pmlmeext->cur_channel; + } +#endif /* CONFIG_P2P */ + ret = 0; + } else + ret = -EINVAL; + + + rtw_mfree(pbuf, head_len + tail_len); + + return ret; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) +static int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct beacon_parameters *info) +{ + int ret = 0; + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + if (rtw_cfg80211_sync_iftype(adapter) != _SUCCESS) { + ret = -ENOTSUPP; + goto exit; + } + rtw_mi_scan_abort(adapter, _TRUE); + rtw_mi_buddy_set_scan_deny(adapter, 300); + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); + +exit: + return ret; +} + +static int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct beacon_parameters *info) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + pmlmeext->bstart_bss = _TRUE; + + cfg80211_rtw_add_beacon(wiphy, ndev, info); + + return 0; +} + +static int cfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + rtw_stop_ap_cmd(adapter, RTW_CMDF_WAIT_ACK); + return 0; +} +#else +static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_ap_settings *settings) +{ + int ret = 0; + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + + RTW_INFO(FUNC_NDEV_FMT" hidden_ssid:%d, auth_type:%d\n", FUNC_NDEV_ARG(ndev), + settings->hidden_ssid, settings->auth_type); + + if (rtw_cfg80211_sync_iftype(adapter) != _SUCCESS) { + ret = -ENOTSUPP; + goto exit; + } + + /* + Kernel < v5.1, the auth_type set as NL80211_AUTHTYPE_AUTOMATIC. + if the AKM SAE in the RSN IE, we have to update the auth_type for SAE + in rtw_check_beacon_data(). + */ + rtw_cfg80211_set_auth_type(&adapter->securitypriv, settings->auth_type); + + rtw_mi_scan_abort(adapter, _TRUE); + rtw_mi_buddy_set_scan_deny(adapter, 300); + ret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len, + settings->beacon.tail, settings->beacon.tail_len); + + adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid; + + if (settings->ssid && settings->ssid_len) { + WLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network; + WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; + + if (0) + RTW_INFO(FUNC_ADPT_FMT" ssid:(%s,%zu), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter), + settings->ssid, settings->ssid_len, + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength); + + _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); + pbss_network->Ssid.SsidLength = settings->ssid_len; + _rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len); + pbss_network_ext->Ssid.SsidLength = settings->ssid_len; + + if (0) + RTW_INFO(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter), + pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength, + pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength); + } + +exit: + return ret; +} + +static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_beacon_data *info) +{ + int ret = 0; + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); + + return ret; +} + +static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + rtw_stop_ap_cmd(adapter, RTW_CMDF_WAIT_ACK); + return 0; +} +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) */ + +#if CONFIG_RTW_MACADDR_ACL && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) +static int cfg80211_rtw_set_mac_acl(struct wiphy *wiphy, struct net_device *ndev, + const struct cfg80211_acl_data *params) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + u8 acl_mode = RTW_ACL_MODE_DISABLED; + int ret = -1; + int i; + + if (!params) { + RTW_WARN(FUNC_ADPT_FMT" params NULL\n", FUNC_ADPT_ARG(adapter)); + rtw_macaddr_acl_clear(adapter, RTW_ACL_PERIOD_BSS); + goto exit; + } + + RTW_INFO(FUNC_ADPT_FMT" acl_policy:%d, entry_num:%d\n" + , FUNC_ADPT_ARG(adapter), params->acl_policy, params->n_acl_entries); + + if (params->acl_policy == NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED) + acl_mode = RTW_ACL_MODE_ACCEPT_UNLESS_LISTED; + else if (params->acl_policy == NL80211_ACL_POLICY_DENY_UNLESS_LISTED) + acl_mode = RTW_ACL_MODE_DENY_UNLESS_LISTED; + + rtw_macaddr_acl_clear(adapter, RTW_ACL_PERIOD_BSS); + + rtw_set_macaddr_acl(adapter, RTW_ACL_PERIOD_BSS, acl_mode); + + for (i = 0; i < params->n_acl_entries; i++) + rtw_acl_add_sta(adapter, RTW_ACL_PERIOD_BSS, params->mac_addrs[i].addr); + + ret = 0; + +exit: + return ret; +} +#endif /* CONFIG_RTW_MACADDR_ACL && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) */ + +const char *_nl80211_sta_flags_str[] = { + "INVALID", + "AUTHORIZED", + "SHORT_PREAMBLE", + "WME", + "MFP", + "AUTHENTICATED", + "TDLS_PEER", + "ASSOCIATED", +}; + +#define nl80211_sta_flags_str(_f) ((_f <= NL80211_STA_FLAG_MAX) ? _nl80211_sta_flags_str[_f] : _nl80211_sta_flags_str[0]) + +const char *_nl80211_plink_state_str[] = { + "LISTEN", + "OPN_SNT", + "OPN_RCVD", + "CNF_RCVD", + "ESTAB", + "HOLDING", + "BLOCKED", + "UNKNOWN", +}; + +#define nl80211_plink_state_str(_s) ((_s < NUM_NL80211_PLINK_STATES) ? _nl80211_plink_state_str[_s] : _nl80211_plink_state_str[NUM_NL80211_PLINK_STATES]) + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) +#define NL80211_PLINK_ACTION_NO_ACTION PLINK_ACTION_INVALID +#define NL80211_PLINK_ACTION_OPEN PLINK_ACTION_OPEN +#define NL80211_PLINK_ACTION_BLOCK PLINK_ACTION_BLOCK +#define NUM_NL80211_PLINK_ACTIONS 3 +#endif + +const char *_nl80211_plink_actions_str[] = { + "NO_ACTION", + "OPEN", + "BLOCK", + "UNKNOWN", +}; + +#define nl80211_plink_actions_str(_a) ((_a < NUM_NL80211_PLINK_ACTIONS) ? _nl80211_plink_actions_str[_a] : _nl80211_plink_actions_str[NUM_NL80211_PLINK_ACTIONS]) + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) +const char *_nl80211_mesh_power_mode_str[] = { + "UNKNOWN", + "ACTIVE", + "LIGHT_SLEEP", + "DEEP_SLEEP", +}; + +#define nl80211_mesh_power_mode_str(_p) ((_p <= NL80211_MESH_POWER_MAX) ? _nl80211_mesh_power_mode_str[_p] : _nl80211_mesh_power_mode_str[0]) +#endif + +void dump_station_parameters(void *sel, struct wiphy *wiphy, const struct station_parameters *params) +{ +#if DBG_RTW_CFG80211_STA_PARAM + if (params->supported_rates_len) { + #define SUPP_RATES_BUF_LEN (3 * RTW_G_RATES_NUM + 1) + int i; + char supp_rates_buf[SUPP_RATES_BUF_LEN] = {0}; + u8 cnt = 0; + + rtw_warn_on(params->supported_rates_len > RTW_G_RATES_NUM); + + for (i = 0; i < params->supported_rates_len; i++) { + if (i >= RTW_G_RATES_NUM) + break; + cnt += snprintf(supp_rates_buf + cnt, SUPP_RATES_BUF_LEN - cnt -1 + , "%02X ", params->supported_rates[i]); + if (cnt >= SUPP_RATES_BUF_LEN - 1) + break; + } + + RTW_PRINT_SEL(sel, "supported_rates:%s\n", supp_rates_buf); + } + + if (params->vlan) + RTW_PRINT_SEL(sel, "vlan:"NDEV_FMT"\n", NDEV_ARG(params->vlan)); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31)) + if (params->sta_flags_mask) { + #define STA_FLAGS_BUF_LEN 128 + int i = 0; + char sta_flags_buf[STA_FLAGS_BUF_LEN] = {0}; + u8 cnt = 0; + + for (i = 1; i <= NL80211_STA_FLAG_MAX; i++) { + if (params->sta_flags_mask & BIT(i)) { + cnt += snprintf(sta_flags_buf + cnt, STA_FLAGS_BUF_LEN - cnt -1, "%s=%u " + , nl80211_sta_flags_str(i), (params->sta_flags_set & BIT(i)) ? 1 : 0); + if (cnt >= STA_FLAGS_BUF_LEN - 1) + break; + } + } + + RTW_PRINT_SEL(sel, "sta_flags:%s\n", sta_flags_buf); + } +#else + u32 station_flags; + #error "TBD\n" +#endif + + if (params->listen_interval != -1) + RTW_PRINT_SEL(sel, "listen_interval:%d\n", params->listen_interval); + + if (params->aid) + RTW_PRINT_SEL(sel, "aid:%u\n", params->aid); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0)) + if (params->peer_aid) + RTW_PRINT_SEL(sel, "peer_aid:%u\n", params->peer_aid); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)) + if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) + RTW_PRINT_SEL(sel, "plink_action:%s\n", nl80211_plink_actions_str(params->plink_action)); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) + #endif + RTW_PRINT_SEL(sel, "plink_state:%s\n" + , nl80211_plink_state_str(params->plink_state)); +#endif + +#if 0 /* TODO */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) + const struct ieee80211_ht_cap *ht_capa; +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + const struct ieee80211_vht_cap *vht_capa; +#endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) + RTW_PRINT_SEL(sel, "uapsd_queues:0x%02x\n", params->uapsd_queues); + if (params->max_sp) + RTW_PRINT_SEL(sel, "max_sp:%u\n", params->max_sp); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + if (params->local_pm != NL80211_MESH_POWER_UNKNOWN) { + RTW_PRINT_SEL(sel, "local_pm:%s\n" + , nl80211_mesh_power_mode_str(params->local_pm)); + } + + if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) + RTW_PRINT_SEL(sel, "capability:0x%04x\n", params->capability); + +#if 0 /* TODO */ + const u8 *ext_capab; + u8 ext_capab_len; +#endif +#endif + +#if 0 /* TODO */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)) + const u8 *supported_channels; + u8 supported_channels_len; + const u8 *supported_oper_classes; + u8 supported_oper_classes_len; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) + u8 opmode_notif; + bool opmode_notif_used; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) + int support_p2p_ps; +#endif +#endif +#endif /* DBG_RTW_CFG80211_STA_PARAM */ +} + +static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)) + u8 *mac, +#else + const u8 *mac, +#endif + struct station_parameters *params) +{ + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); +#if defined(CONFIG_TDLS) || defined(CONFIG_RTW_MESH) + struct sta_priv *pstapriv = &padapter->stapriv; +#endif +#ifdef CONFIG_TDLS + struct sta_info *psta; +#endif /* CONFIG_TDLS */ + + RTW_INFO(FUNC_NDEV_FMT" mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); + +#if CONFIG_RTW_MACADDR_ACL + if (rtw_access_ctrl(padapter, mac) == _FALSE) { + RTW_INFO(FUNC_NDEV_FMT" deny by macaddr ACL\n", FUNC_NDEV_ARG(ndev)); + ret = -EINVAL; + goto exit; + } +#endif + + dump_station_parameters(RTW_DBGDUMP, wiphy, params); + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) { + struct rtw_mesh_cfg *mcfg = &padapter->mesh_cfg; + struct rtw_mesh_info *minfo = &padapter->mesh_info; + struct mesh_plink_pool *plink_ctl = &minfo->plink_ctl; + struct mesh_plink_ent *plink = NULL; + struct wlan_network *scanned = NULL; + bool acnode = 0; + u8 add_new_sta = 0, probe_req = 0; + _irqL irqL; + + if (params->plink_state != NL80211_PLINK_LISTEN) { + RTW_WARN(FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(ndev), nl80211_plink_state_str(params->plink_state)); + rtw_warn_on(1); + } + if (!params->aid || params->aid > pstapriv->max_aid) { + RTW_WARN(FUNC_NDEV_FMT" invalid aid:%u\n", FUNC_NDEV_ARG(ndev), params->aid); + rtw_warn_on(1); + ret = -EINVAL; + goto exit; + } + + _enter_critical_bh(&(plink_ctl->lock), &irqL); + + plink = _rtw_mesh_plink_get(padapter, mac); + if (plink) + goto release_plink_ctl; + + #if CONFIG_RTW_MESH_PEER_BLACKLIST + if (rtw_mesh_peer_blacklist_search(padapter, mac)) { + RTW_INFO(FUNC_NDEV_FMT" deny by peer blacklist\n" + , FUNC_NDEV_ARG(ndev)); + ret = -EINVAL; + goto release_plink_ctl; + } + #endif + + scanned = rtw_find_network(&padapter->mlmepriv.scanned_queue, mac); + if (!scanned + || rtw_get_passing_time_ms(scanned->last_scanned) >= mcfg->peer_sel_policy.scanr_exp_ms + ) { + if (!scanned) + RTW_INFO(FUNC_NDEV_FMT" corresponding network not found\n", FUNC_NDEV_ARG(ndev)); + else + RTW_INFO(FUNC_NDEV_FMT" corresponding network too old\n", FUNC_NDEV_ARG(ndev)); + + if (adapter_to_rfctl(padapter)->offch_state == OFFCHS_NONE) + probe_req = 1; + + ret = -EINVAL; + goto release_plink_ctl; + } + + #if CONFIG_RTW_MESH_ACNODE_PREVENT + if (plink_ctl->acnode_rsvd) + acnode = rtw_mesh_scanned_is_acnode_confirmed(padapter, scanned); + #endif + + /* wpa_supplicant's auto peer will initiate peering when candidate peer is reported without max_peer_links consideration */ + if (plink_ctl->num >= mcfg->max_peer_links + acnode ? 1 : 0) { + RTW_INFO(FUNC_NDEV_FMT" exceed max_peer_links:%u%s\n" + , FUNC_NDEV_ARG(ndev), mcfg->max_peer_links, acnode ? " acn" : ""); + ret = -EINVAL; + goto release_plink_ctl; + } + + if (!rtw_bss_is_candidate_mesh_peer(&padapter->mlmepriv.cur_network.network, &scanned->network, 1, 1)) { + RTW_WARN(FUNC_NDEV_FMT" corresponding network is not candidate with same ch\n" + , FUNC_NDEV_ARG(ndev)); + ret = -EINVAL; + goto release_plink_ctl; + } + + #if CONFIG_RTW_MESH_CTO_MGATE_BLACKLIST + if (!rtw_mesh_cto_mgate_network_filter(padapter, scanned)) { + RTW_INFO(FUNC_NDEV_FMT" peer filtered out by cto_mgate check\n" + , FUNC_NDEV_ARG(ndev)); + ret = -EINVAL; + goto release_plink_ctl; + } + #endif + + if (_rtw_mesh_plink_add(padapter, mac) == _SUCCESS) { + /* hook corresponding network in scan queue */ + plink = _rtw_mesh_plink_get(padapter, mac); + plink->aid = params->aid; + plink->scanned = scanned; + + #if CONFIG_RTW_MESH_ACNODE_PREVENT + if (acnode) { + RTW_INFO(FUNC_ADPT_FMT" acnode "MAC_FMT"\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(scanned->network.MacAddress)); + } + #endif + + add_new_sta = 1; + } else { + RTW_WARN(FUNC_NDEV_FMT" rtw_mesh_plink_add not success\n" + , FUNC_NDEV_ARG(ndev)); + ret = -EINVAL; + } +release_plink_ctl: + _exit_critical_bh(&(plink_ctl->lock), &irqL); + + if (probe_req) + issue_probereq(padapter, &padapter->mlmepriv.cur_network.network.mesh_id, mac); + + if (add_new_sta) { + struct station_info sinfo; + + #ifdef CONFIG_DFS_MASTER + if (IS_UNDER_CAC(adapter_to_rfctl(padapter))) + rtw_force_stop_cac(adapter_to_rfctl(padapter), 300); + #endif + + /* indicate new sta */ + _rtw_memset(&sinfo, 0, sizeof(sinfo)); + cfg80211_new_sta(ndev, mac, &sinfo, GFP_ATOMIC); + } + goto exit; + } +#endif /* CONFIG_RTW_MESH */ + +#ifdef CONFIG_TDLS + psta = rtw_get_stainfo(pstapriv, (u8 *)mac); + if (psta == NULL) { + psta = rtw_alloc_stainfo(pstapriv, (u8 *)mac); + if (psta == NULL) { + RTW_INFO("[%s] Alloc station for "MAC_FMT" fail\n", __FUNCTION__, MAC_ARG(mac)); + ret = -EOPNOTSUPP; + goto exit; + } + } +#endif /* CONFIG_TDLS */ + +exit: + return ret; +} + +static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)) + u8 *mac +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)) + const u8 *mac +#else + struct station_del_parameters *params +#endif +) +{ + int ret = 0; + _irqL irqL; + _list *phead, *plist; + u8 updated = _FALSE; + const u8 *target_mac; + struct sta_info *psta = NULL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)) + target_mac = mac; +#else + target_mac = params->mac; +#endif + + RTW_INFO("+"FUNC_NDEV_FMT" mac=%pM\n", FUNC_NDEV_ARG(ndev), target_mac); + + if (check_fwstate(pmlmepriv, (_FW_LINKED | WIFI_AP_STATE | WIFI_MESH_STATE)) != _TRUE) { + RTW_INFO("%s, fw_state != FW_LINKED|WIFI_AP_STATE|WIFI_MESH_STATE\n", __func__); + return -EINVAL; + } + + + if (!target_mac) { + RTW_INFO("flush all sta, and cam_entry\n"); + + flush_all_cam_entry(padapter); /* clear CAM */ + +#ifdef CONFIG_AP_MODE + ret = rtw_sta_flush(padapter, _TRUE); +#endif + return ret; + } + + + RTW_INFO("free sta macaddr =" MAC_FMT "\n", MAC_ARG(target_mac)); + + if (target_mac[0] == 0xff && target_mac[1] == 0xff && + target_mac[2] == 0xff && target_mac[3] == 0xff && + target_mac[4] == 0xff && target_mac[5] == 0xff) + return -EINVAL; + + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* check asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if (_rtw_memcmp((u8 *)target_mac, psta->cmn.mac_addr, ETH_ALEN)) { + if (psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE) + RTW_INFO("%s, sta's dot8021xalg = 1 and key_installed = _FALSE\n", __func__); + else { + RTW_INFO("free psta=%p, aid=%d\n", psta, psta->cmn.aid); + + rtw_list_delete(&psta->asoc_list); + pstapriv->asoc_list_cnt--; + STA_SET_MESH_PLINK(psta, NULL); + + /* _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); */ + if (MLME_IS_AP(padapter)) + updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE); + else + updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, _TRUE); + /* _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); */ + + psta = NULL; + + break; + } + + } + + } + + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + + associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL); + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) + rtw_mesh_plink_del(padapter, target_mac); +#endif + + RTW_INFO("-"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return ret; + +} + +static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)) + u8 *mac, +#else + const u8 *mac, +#endif + struct station_parameters *params) +{ +#ifdef CONFIG_RTW_MESH + _adapter *adapter = (_adapter *)rtw_netdev_priv(ndev); + struct sta_priv *stapriv = &adapter->stapriv; + struct sta_info *sta = NULL; + _irqL irqL; +#endif + int ret = 0; + + RTW_INFO(FUNC_NDEV_FMT" mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(mac)); + + dump_station_parameters(RTW_DBGDUMP, wiphy, params); + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(adapter)) { + enum cfg80211_station_type sta_type = CFG80211_STA_MESH_PEER_USER; + struct rtw_mesh_info *minfo = &adapter->mesh_info; + struct mesh_plink_pool *plink_ctl = &minfo->plink_ctl; + struct mesh_plink_ent *plink = NULL; + _irqL irqL2; + struct sta_info *del_sta = NULL; + + ret = cfg80211_check_station_change(wiphy, params, sta_type); + if (ret) { + RTW_INFO("cfg80211_check_station_change return %d\n", ret); + goto exit; + } + + _enter_critical_bh(&(plink_ctl->lock), &irqL2); + + plink = _rtw_mesh_plink_get(adapter, mac); + if (!plink) { + ret = -ENOENT; + goto release_plink_ctl; + } + + plink->plink_state = nl80211_plink_state_to_rtw_plink_state(params->plink_state); + + #if CONFIG_RTW_MESH_ACNODE_PREVENT + if (params->plink_state == NL80211_PLINK_OPN_SNT + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + && (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) + #endif + ) { + if (rtw_mesh_scanned_is_acnode_confirmed(adapter, plink->scanned) + && rtw_mesh_acnode_prevent_allow_sacrifice(adapter) + ) { + struct sta_info *sac = rtw_mesh_acnode_prevent_pick_sacrifice(adapter); + + if (sac) { + del_sta = sac; + _enter_critical_bh(&stapriv->asoc_list_lock, &irqL); + if (!rtw_is_list_empty(&del_sta->asoc_list)) { + rtw_list_delete(&del_sta->asoc_list); + stapriv->asoc_list_cnt--; + STA_SET_MESH_PLINK(del_sta, NULL); + } + _exit_critical_bh(&stapriv->asoc_list_lock, &irqL); + RTW_INFO(FUNC_ADPT_FMT" sacrifice "MAC_FMT" for acnode\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(del_sta->cmn.mac_addr)); + } + } + } else + #endif + if ((params->plink_state == NL80211_PLINK_OPN_RCVD + || params->plink_state == NL80211_PLINK_CNF_RCVD + || params->plink_state == NL80211_PLINK_ESTAB) + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + && (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) + #endif + ) { + sta = rtw_get_stainfo(stapriv, mac); + if (!sta) { + sta = rtw_alloc_stainfo(stapriv, mac); + if (!sta) + goto release_plink_ctl; + } + + if (params->plink_state == NL80211_PLINK_ESTAB) { + if (rtw_mesh_peer_establish(adapter, plink, sta) != _SUCCESS) { + rtw_free_stainfo(adapter, sta); + ret = -ENOENT; + goto release_plink_ctl; + } + } + } + else if (params->plink_state == NL80211_PLINK_HOLDING + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + && (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) + #endif + ) { + del_sta = rtw_get_stainfo(stapriv, mac); + if (!del_sta) + goto release_plink_ctl; + + _enter_critical_bh(&stapriv->asoc_list_lock, &irqL); + if (!rtw_is_list_empty(&del_sta->asoc_list)) { + rtw_list_delete(&del_sta->asoc_list); + stapriv->asoc_list_cnt--; + STA_SET_MESH_PLINK(del_sta, NULL); + } + _exit_critical_bh(&stapriv->asoc_list_lock, &irqL); + } + +release_plink_ctl: + _exit_critical_bh(&(plink_ctl->lock), &irqL2); + + if (del_sta) { + u8 sta_addr[ETH_ALEN]; + u8 updated = _FALSE; + + _rtw_memcpy(sta_addr, del_sta->cmn.mac_addr, ETH_ALEN); + updated = ap_free_sta(adapter, del_sta, 0, 0, 1); + rtw_mesh_expire_peer(stapriv->padapter, sta_addr); + + associated_clients_update(adapter, updated, STA_INFO_UPDATE_ALL); + } + } +#endif /* CONFIG_RTW_MESH */ + +exit: + return ret; +} + +struct sta_info *rtw_sta_info_get_by_idx(struct sta_priv *pstapriv, const int idx, u8 *asoc_list_num) +{ + _list *phead, *plist; + struct sta_info *psta = NULL; + int i = 0; + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + /* check asoc_queue */ + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + if (idx == i) + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + plist = get_next(plist); + i++; + } + + if (asoc_list_num) + *asoc_list_num = i; + + return psta; +} + +static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, + int idx, u8 *mac, struct station_info *sinfo) +{ +#define DBG_DUMP_STATION 0 + + int ret = 0; + _irqL irqL; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta = NULL; +#ifdef CONFIG_RTW_MESH + struct mesh_plink_ent *plink = NULL; +#endif + u8 asoc_list_num; + + if (DBG_DUMP_STATION) + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); + psta = rtw_sta_info_get_by_idx(pstapriv, idx, &asoc_list_num); + _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) { + if (psta) + plink = psta->plink; + if (!plink) + plink = rtw_mesh_plink_get_no_estab_by_idx(padapter, idx - asoc_list_num); + } +#endif /* CONFIG_RTW_MESH */ + + if ((!MLME_IS_MESH(padapter) && !psta) + #ifdef CONFIG_RTW_MESH + || (MLME_IS_MESH(padapter) && !plink) + #endif + ) { + if (DBG_DUMP_STATION) + RTW_INFO(FUNC_NDEV_FMT" end with idx:%d\n", FUNC_NDEV_ARG(ndev), idx); + ret = -ENOENT; + goto exit; + } + + if (psta) + _rtw_memcpy(mac, psta->cmn.mac_addr, ETH_ALEN); + #ifdef CONFIG_RTW_MESH + else + _rtw_memcpy(mac, plink->addr, ETH_ALEN); + #endif + + sinfo->filled = 0; + + if (psta) { + sinfo->filled |= STATION_INFO_SIGNAL; + sinfo->signal = translate_percentage_to_dbm(psta->cmn.rssi_stat.rssi); + sinfo->filled |= STATION_INFO_INACTIVE_TIME; + sinfo->inactive_time = rtw_get_passing_time_ms(psta->sta_stats.last_rx_time); + } + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) + rtw_cfg80211_fill_mesh_only_sta_info(plink, psta, sinfo); +#endif + +exit: + return ret; +} + +static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, + struct bss_parameters *params) +{ + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); +/* + RTW_INFO("use_cts_prot=%d\n", params->use_cts_prot); + RTW_INFO("use_short_preamble=%d\n", params->use_short_preamble); + RTW_INFO("use_short_slot_time=%d\n", params->use_short_slot_time); + RTW_INFO("ap_isolate=%d\n", params->ap_isolate); + + RTW_INFO("basic_rates_len=%d\n", params->basic_rates_len); + for(i = 0; i < params->basic_rates_len; i++) + RTW_INFO("basic_rates=%d\n", params->basic_rates[i]); +*/ + return 0; + +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) +static int cfg80211_rtw_set_txq_params(struct wiphy *wiphy +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + , struct net_device *ndev +#endif + , struct ieee80211_txq_params *params) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + _adapter *padapter = rtw_netdev_priv(ndev); +#else + _adapter *padapter = wiphy_to_adapter(wiphy); +#endif + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 ac, AIFS, ECWMin, ECWMax, aSifsTime; + u16 TXOP; + u8 shift_count = 0; + u32 acParm; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + ac = params->ac; +#else + ac = params->queue; +#endif + +#if 0 + RTW_INFO("ac=%d\n", ac); + RTW_INFO("txop=%u\n", params->txop); + RTW_INFO("cwmin=%u\n", params->cwmin); + RTW_INFO("cwmax=%u\n", params->cwmax); + RTW_INFO("aifs=%u\n", params->aifs); +#endif + + if (is_supported_5g(pmlmeext->cur_wireless_mode) || + (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) + aSifsTime = 16; + else + aSifsTime = 10; + + AIFS = params->aifs * pmlmeinfo->slotTime + aSifsTime; + + while ((params->cwmin + 1) >> shift_count != 1) { + shift_count++; + if (shift_count == 15) + break; + } + + ECWMin = shift_count; + + shift_count = 0; + while ((params->cwmax + 1) >> shift_count != 1) { + shift_count++; + if (shift_count == 15) + break; + } + + ECWMax = shift_count; + + TXOP = le16_to_cpu(params->txop); + + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + + switch (ac) { + case NL80211_TXQ_Q_VO: + RTW_INFO(FUNC_NDEV_FMT" AC_VO = 0x%08x\n", FUNC_ADPT_ARG(padapter), acParm); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); + break; + + case NL80211_TXQ_Q_VI: + RTW_INFO(FUNC_NDEV_FMT" AC_VI = 0x%08x\n", FUNC_ADPT_ARG(padapter), acParm); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); + break; + + case NL80211_TXQ_Q_BE: + RTW_INFO(FUNC_NDEV_FMT" AC_BE = 0x%08x\n", FUNC_ADPT_ARG(padapter), acParm); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + break; + + case NL80211_TXQ_Q_BK: + RTW_INFO(FUNC_NDEV_FMT" AC_BK = 0x%08x\n", FUNC_ADPT_ARG(padapter), acParm); + rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); + break; + + default: + break; + } + + return 0; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) */ + +static int cfg80211_rtw_set_channel(struct wiphy *wiphy + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) + , struct net_device *ndev + #endif + , struct ieee80211_channel *chan, enum nl80211_channel_type channel_type) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); +#else + _adapter *padapter = wiphy_to_adapter(wiphy); +#endif + int chan_target = (u8) ieee80211_frequency_to_channel(chan->center_freq); + int chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + int chan_width = CHANNEL_WIDTH_20; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); +#endif + + switch (channel_type) { + case NL80211_CHAN_NO_HT: + case NL80211_CHAN_HT20: + chan_width = CHANNEL_WIDTH_20; + chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_HT40MINUS: + chan_width = CHANNEL_WIDTH_40; + chan_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + case NL80211_CHAN_HT40PLUS: + chan_width = CHANNEL_WIDTH_40; + chan_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + default: + chan_width = CHANNEL_WIDTH_20; + chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + RTW_INFO(FUNC_ADPT_FMT" ch:%d bw:%d, offset:%d\n" + , FUNC_ADPT_ARG(padapter), chan_target, chan_width, chan_offset); + + rtw_set_chbw_cmd(padapter, chan_target, chan_width, chan_offset, RTW_CMDF_WAIT_ACK); + + return 0; +} + +static int cfg80211_rtw_set_monitor_channel(struct wiphy *wiphy +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + , struct cfg80211_chan_def *chandef +#else + , struct ieee80211_channel *chan + , enum nl80211_channel_type channel_type +#endif +) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct ieee80211_channel *chan = chandef->chan; +#endif + + _adapter *padapter = wiphy_to_adapter(wiphy); + int target_channal = chan->hw_value; + int target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + int target_width = CHANNEL_WIDTH_20; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("center_freq %u Mhz ch %u width %u freq1 %u freq2 %u\n" + , chan->center_freq + , chan->hw_value + , chandef->width + , chandef->center_freq1 + , chandef->center_freq2); +#endif /* CONFIG_DEBUG_CFG80211 */ + + switch (chandef->width) { + case NL80211_CHAN_WIDTH_20_NOHT: + case NL80211_CHAN_WIDTH_20: + target_width = CHANNEL_WIDTH_20; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_WIDTH_40: + target_width = CHANNEL_WIDTH_40; + if (chandef->center_freq1 > chan->center_freq) + target_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + else + target_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + case NL80211_CHAN_WIDTH_80: + target_width = CHANNEL_WIDTH_80; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_WIDTH_80P80: + target_width = CHANNEL_WIDTH_80_80; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_WIDTH_160: + target_width = CHANNEL_WIDTH_160; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + case NL80211_CHAN_WIDTH_5: + case NL80211_CHAN_WIDTH_10: +#endif + default: + target_width = CHANNEL_WIDTH_20; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } +#else +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("center_freq %u Mhz ch %u channel_type %u\n" + , chan->center_freq + , chan->hw_value + , channel_type); +#endif /* CONFIG_DEBUG_CFG80211 */ + + switch (channel_type) { + case NL80211_CHAN_NO_HT: + case NL80211_CHAN_HT20: + target_width = CHANNEL_WIDTH_20; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + case NL80211_CHAN_HT40MINUS: + target_width = CHANNEL_WIDTH_40; + target_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + case NL80211_CHAN_HT40PLUS: + target_width = CHANNEL_WIDTH_40; + target_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + default: + target_width = CHANNEL_WIDTH_20; + target_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } +#endif + RTW_INFO(FUNC_ADPT_FMT" ch:%d bw:%d, offset:%d\n" + , FUNC_ADPT_ARG(padapter), target_channal, target_width, target_offset); + + rtw_set_chbw_cmd(padapter, target_channal, target_width, target_offset, RTW_CMDF_WAIT_ACK); + + return 0; +} + +static int cfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_auth_request *req) +{ + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} + +static int cfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev, + struct cfg80211_assoc_request *req) +{ + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev)); + + return 0; +} +#endif /* CONFIG_AP_MODE */ + +void rtw_cfg80211_rx_probe_request(_adapter *adapter, union recv_frame *rframe) +{ + struct wireless_dev *wdev = adapter->rtw_wdev; + u8 *frame = get_recvframe_data(rframe); + uint frame_len = rframe->u.hdr.len; + s32 freq; + u8 ch, sch = rtw_get_oper_ch(adapter); + + ch = rframe->u.hdr.attrib.ch ? rframe->u.hdr.attrib.ch : sch; + freq = rtw_ch2freq(ch); + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("RTW_Rx: probe request, ch=%d(%d), ta="MAC_FMT"\n" + , ch, sch, MAC_ARG(get_addr2_ptr(frame))); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_action_p2p(_adapter *adapter, union recv_frame *rframe) +{ + struct wireless_dev *wdev = adapter->rtw_wdev; + u8 *frame = get_recvframe_data(rframe); + uint frame_len = rframe->u.hdr.len; + s32 freq; + u8 ch, sch = rtw_get_oper_ch(adapter); + u8 category, action; + int type; + + ch = rframe->u.hdr.attrib.ch ? rframe->u.hdr.attrib.ch : sch; + freq = rtw_ch2freq(ch); + + RTW_INFO("RTW_Rx:ch=%d(%d), ta="MAC_FMT"\n" + , ch, sch, MAC_ARG(get_addr2_ptr(frame))); +#ifdef CONFIG_P2P + type = rtw_p2p_check_frames(adapter, frame, frame_len, _FALSE); + if (type >= 0) + goto indicate; +#endif + rtw_action_frame_parse(frame, frame_len, &category, &action); + RTW_INFO("RTW_Rx:category(%u), action(%u)\n", category, action); + +indicate: + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_p2p_action_public(_adapter *adapter, union recv_frame *rframe) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct wireless_dev *wdev = adapter->rtw_wdev; + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter); + u8 *frame = get_recvframe_data(rframe); + uint frame_len = rframe->u.hdr.len; + s32 freq; + u8 ch, sch = rtw_get_oper_ch(adapter); + u8 category, action; + int type; + + ch = rframe->u.hdr.attrib.ch ? rframe->u.hdr.attrib.ch : sch; + freq = rtw_ch2freq(ch); + + RTW_INFO("RTW_Rx:ch=%d(%d), ta="MAC_FMT"\n" + , ch, sch, MAC_ARG(get_addr2_ptr(frame))); + #ifdef CONFIG_P2P + type = rtw_p2p_check_frames(adapter, frame, frame_len, _FALSE); + if (type >= 0) { + switch (type) { + case P2P_GO_NEGO_CONF: + if (0) { + RTW_INFO(FUNC_ADPT_FMT" Nego confirm. state=%u, status=%u, iaddr="MAC_FMT"\n" + , FUNC_ADPT_ARG(adapter), pwdev_priv->nego_info.state, pwdev_priv->nego_info.status + , MAC_ARG(pwdev_priv->nego_info.iface_addr)); + } + if (pwdev_priv->nego_info.state == 2 + && pwdev_priv->nego_info.status == 0 + && rtw_check_invalid_mac_address(pwdev_priv->nego_info.iface_addr, _FALSE) == _FALSE + ) { + _adapter *intended_iface = dvobj_get_adapter_by_addr(dvobj, pwdev_priv->nego_info.iface_addr); + + if (intended_iface) { + RTW_INFO(FUNC_ADPT_FMT" Nego confirm. Allow only "ADPT_FMT" to scan for 2000 ms\n" + , FUNC_ADPT_ARG(adapter), ADPT_ARG(intended_iface)); + /* allow only intended_iface to do scan for 2000 ms */ + rtw_mi_set_scan_deny(adapter, 2000); + rtw_clear_scan_deny(intended_iface); + } + } + break; + case P2P_PROVISION_DISC_RESP: + case P2P_INVIT_RESP: + rtw_clear_scan_deny(adapter); + #if !RTW_P2P_GROUP_INTERFACE + rtw_mi_buddy_set_scan_deny(adapter, 2000); + #endif + break; + } + goto indicate; + } + #endif + rtw_action_frame_parse(frame, frame_len, &category, &action); + RTW_INFO("RTW_Rx:category(%u), action(%u)\n", category, action); + +indicate: + #if defined(RTW_DEDICATED_P2P_DEVICE) + if (rtw_cfg80211_redirect_pd_wdev(dvobj_to_wiphy(dvobj), get_ra(frame), &wdev)) + if (0) + RTW_INFO("redirect to pd_wdev:%p\n", wdev); + #endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif +} + +void rtw_cfg80211_rx_action(_adapter *adapter, union recv_frame *rframe, const char *msg) +{ + struct wireless_dev *wdev = adapter->rtw_wdev; + u8 *frame = get_recvframe_data(rframe); + uint frame_len = rframe->u.hdr.len; + s32 freq; + u8 ch, sch = rtw_get_oper_ch(adapter); + u8 category, action; + int type = -1; + + ch = rframe->u.hdr.attrib.ch ? rframe->u.hdr.attrib.ch : sch; + freq = rtw_ch2freq(ch); + + RTW_INFO("RTW_Rx:ch=%d(%d), ta="MAC_FMT"\n" + , ch, sch, MAC_ARG(get_addr2_ptr(frame))); + +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(adapter)) { + type = rtw_mesh_check_frames_rx(adapter, frame, frame_len); + if (type >= 0) + goto indicate; + } +#endif + rtw_action_frame_parse(frame, frame_len, &category, &action); + if (category == RTW_WLAN_CATEGORY_PUBLIC) { + if (action == ACT_PUBLIC_GAS_INITIAL_REQ) { + rtw_mi_set_scan_deny(adapter, 200); + rtw_mi_scan_abort(adapter, _FALSE); /*rtw_scan_abort_no_wait*/ + } + } + +indicate: +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif + + if (type == -1) { + if (msg) + RTW_INFO("RTW_Rx:%s\n", msg); + else + RTW_INFO("RTW_Rx:category(%u), action(%u)\n", category, action); + } +} + +#ifdef CONFIG_RTW_80211K +void rtw_cfg80211_rx_rrm_action(_adapter *adapter, union recv_frame *rframe) +{ + struct wireless_dev *wdev = adapter->rtw_wdev; + u8 *frame = get_recvframe_data(rframe); + uint frame_len = rframe->u.hdr.len; + s32 freq; + u8 ch, sch = rtw_get_oper_ch(adapter); + + ch = rframe->u.hdr.attrib.ch ? rframe->u.hdr.attrib.ch : sch; + freq = rtw_ch2freq(ch); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif + RTW_INFO("RTW_Rx:ch=%d(%d), ta="MAC_FMT"\n" + , ch, sch, MAC_ARG(get_addr2_ptr(frame))); +} +#endif /* CONFIG_RTW_80211K */ + +void rtw_cfg80211_rx_mframe(_adapter *adapter, union recv_frame *rframe, const char *msg) +{ + struct wireless_dev *wdev = adapter->rtw_wdev; + u8 *frame = get_recvframe_data(rframe); + uint frame_len = rframe->u.hdr.len; + s32 freq; + u8 ch, sch = rtw_get_oper_ch(adapter); + + ch = rframe->u.hdr.attrib.ch ? rframe->u.hdr.attrib.ch : sch; + freq = rtw_ch2freq(ch); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#else + cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC); +#endif + + RTW_INFO("RTW_Rx:ch=%d(%d), ta="MAC_FMT"\n", ch, sch, MAC_ARG(get_addr2_ptr(frame))); + if (!rtw_sae_preprocess(adapter, frame, frame_len, _FALSE)) { + if (msg) + RTW_INFO("RTW_Rx:%s\n", msg); + else + RTW_INFO("RTW_Rx:frame_control:0x%02x\n", le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)rframe)->frame_ctl)); + } +} + +#ifdef CONFIG_P2P +void rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len) +{ + u16 wps_devicepassword_id = 0x0000; + uint wps_devicepassword_id_len = 0; + u8 wpsie[255] = { 0x00 }, p2p_ie[255] = { 0x00 }; + uint p2p_ielen = 0; + uint wpsielen = 0; + u32 devinfo_contentlen = 0; + u8 devinfo_content[64] = { 0x00 }; + u16 capability = 0; + uint capability_len = 0; + + unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = 1; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_REQ; + u32 p2pielen = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct rtw_ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr)); + size_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr); + + + RTW_INFO("[%s] In\n", __FUNCTION__); + + /* prepare for building provision_request frame */ + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN); + _rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN); + + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; + + rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); + rtw_get_wps_attr_content(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8 *) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id); + + switch (wps_devicepassword_id) { + case WPS_DPID_PIN: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL; + break; + case WPS_DPID_USER_SPEC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; + break; + case WPS_DPID_MACHINE_SPEC: + break; + case WPS_DPID_REKEY: + break; + case WPS_DPID_PBC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON; + break; + case WPS_DPID_REGISTRAR_SPEC: + pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD; + break; + default: + break; + } + + + if (rtw_get_p2p_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen)) { + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen); + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8 *)&capability, &capability_len); + + } + + + /* start to build provision_request frame */ + _rtw_memset(wpsie, 0, sizeof(wpsie)); + _rtw_memset(p2p_ie, 0, sizeof(p2p_ie)); + p2p_ielen = 0; + + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) + return; + + + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + set_frame_sub_type(pframe, WIFI_ACTION); + + pframe += sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + /* build_prov_disc_request_p2p_ie */ + /* P2P OUI */ + p2pielen = 0; + p2p_ie[p2pielen++] = 0x50; + p2p_ie[p2pielen++] = 0x6F; + p2p_ie[p2pielen++] = 0x9A; + p2p_ie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ + + /* Commented by Albert 20110301 */ + /* According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */ + /* 1. P2P Capability */ + /* 2. Device Info */ + /* 3. Group ID ( When joining an operating P2P Group ) */ + + /* P2P Capability ATTR */ + /* Type: */ + p2p_ie[p2pielen++] = P2P_ATTR_CAPABILITY; + + /* Length: */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); */ + RTW_PUT_LE16(p2p_ie + p2pielen, 0x0002); + p2pielen += 2; + + /* Value: */ + /* Device Capability Bitmap, 1 byte */ + /* Group Capability Bitmap, 1 byte */ + _rtw_memcpy(p2p_ie + p2pielen, &capability, 2); + p2pielen += 2; + + + /* Device Info ATTR */ + /* Type: */ + p2p_ie[p2pielen++] = P2P_ATTR_DEVICE_INFO; + + /* Length: */ + /* 21->P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */ + /* + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */ + /* *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); */ + RTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen); + p2pielen += 2; + + /* Value: */ + _rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); + p2pielen += devinfo_contentlen; + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen); + /* p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr); */ + /* pframe += p2pielen; */ + pattrib->pktlen += p2p_ielen; + + wpsielen = 0; + /* WPS OUI */ + *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); + wpsielen += 4; + + /* WPS version */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); + wpsielen += 2; + + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); + wpsielen += 2; + + /* Value: */ + wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ + + /* Config Method */ + /* Type: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); + wpsielen += 2; + + /* Length: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); + wpsielen += 2; + + /* Value: */ + *(u16 *)(wpsie + wpsielen) = cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen); + + +#ifdef CONFIG_WFD + wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif + + pattrib->last_txcmdsz = pattrib->pktlen; + + /* dump_mgntframe(padapter, pmgntframe); */ + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) + RTW_INFO("%s, ack to\n", __func__); + + #if 0 + if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) { + RTW_INFO("waiting for p2p peer key-in PIN CODE\n"); + rtw_msleep_os(15000); /* 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req. */ + } + #endif + +} + +#ifdef CONFIG_RTW_80211R +static s32 cfg80211_rtw_update_ft_ies(struct wiphy *wiphy, + struct net_device *ndev, + struct cfg80211_update_ft_ies_params *ftie) +{ + _adapter *padapter = NULL; + struct mlme_priv *pmlmepriv = NULL; + struct ft_roam_info *pft_roam = NULL; + _irqL irqL; + u8 *p; + u8 *pie = NULL; + u32 ie_len = 0; + + if (ndev == NULL) + return -EINVAL; + + padapter = (_adapter *)rtw_netdev_priv(ndev); + pmlmepriv = &(padapter->mlmepriv); + pft_roam = &(pmlmepriv->ft_roam); + + p = (u8 *)ftie->ie; + if (ftie->ie_len <= sizeof(pft_roam->updated_ft_ies)) { + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _rtw_memcpy(pft_roam->updated_ft_ies, ftie->ie, ftie->ie_len); + pft_roam->updated_ft_ies_len = ftie->ie_len; + _exit_critical_bh(&pmlmepriv->lock, &irqL); + } else { + RTW_ERR("FTIEs parsing fail!\n"); + return -EINVAL; + } + + if (rtw_ft_roam_status(padapter, RTW_FT_AUTHENTICATED_STA)) { + RTW_PRINT("auth success, start reassoc\n"); + rtw_ft_lock_set_status(padapter, RTW_FT_ASSOCIATING_STA, &irqL); + start_clnt_assoc(padapter); + } + + return 0; +} +#endif + +void rtw_cfg80211_external_auth_request(_adapter *padapter, union recv_frame *rframe) +{ + struct rtw_external_auth_params params; + struct wireless_dev *wdev = padapter->rtw_wdev; + struct net_device *netdev = wdev_to_ndev(wdev); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + u8 frame[256] = { 0 }; + uint frame_len = 24; + s32 freq = 0; + + /* rframe, in this case is null point */ + + freq = rtw_ch2freq(pmlmeext->cur_channel); + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO(FUNC_ADPT_FMT": freq(%d, %d)\n", FUNC_ADPT_ARG(padapter), freq); +#endif + +#if (KERNEL_VERSION(4, 17, 0) <= LINUX_VERSION_CODE) + params.action = EXTERNAL_AUTH_START; + _rtw_memcpy(params.bssid, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + params.ssid.ssid_len = pmlmeinfo->network.Ssid.SsidLength; + _rtw_memcpy(params.ssid.ssid, pmlmeinfo->network.Ssid.Ssid, + pmlmeinfo->network.Ssid.SsidLength); + params.key_mgmt_suite = 0x8ac0f00; + + cfg80211_external_auth_request(netdev, + (struct cfg80211_external_auth_params *)¶ms, GFP_ATOMIC); +#elif (KERNEL_VERSION(2, 6, 37) <= LINUX_VERSION_CODE) + set_frame_sub_type(frame, WIFI_AUTH); + + _rtw_memcpy(frame + 4, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + _rtw_memcpy(frame + 10, adapter_mac_addr(padapter), ETH_ALEN); + _rtw_memcpy(frame + 16, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + RTW_PUT_LE32((frame + 18), 0x8ac0f00); + + if (pmlmeinfo->network.Ssid.SsidLength) { + *(frame + 23) = pmlmeinfo->network.Ssid.SsidLength; + _rtw_memcpy(frame + 24, pmlmeinfo->network.Ssid.Ssid, + pmlmeinfo->network.Ssid.SsidLength); + frame_len = 24 + pmlmeinfo->network.Ssid.SsidLength; + } + rtw_cfg80211_rx_mgmt(wdev, freq, 0, frame, frame_len, GFP_ATOMIC); +#endif +} + +inline void rtw_cfg80211_set_is_roch(_adapter *adapter, bool val) +{ + adapter->cfg80211_wdinfo.is_ro_ch = val; + rtw_mi_update_iface_status(&(adapter->mlmepriv), 0); +} + +inline bool rtw_cfg80211_get_is_roch(_adapter *adapter) +{ + return adapter->cfg80211_wdinfo.is_ro_ch; +} + +inline bool rtw_cfg80211_is_ro_ch_once(_adapter *adapter) +{ + return adapter->cfg80211_wdinfo.last_ro_ch_time ? 1 : 0; +} + +inline void rtw_cfg80211_set_last_ro_ch_time(_adapter *adapter) +{ + adapter->cfg80211_wdinfo.last_ro_ch_time = rtw_get_current_time(); + + if (!adapter->cfg80211_wdinfo.last_ro_ch_time) + adapter->cfg80211_wdinfo.last_ro_ch_time++; +} + +inline s32 rtw_cfg80211_get_last_ro_ch_passing_ms(_adapter *adapter) +{ + return rtw_get_passing_time_ms(adapter->cfg80211_wdinfo.last_ro_ch_time); +} + +static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + struct ieee80211_channel *channel, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + enum nl80211_channel_type channel_type, +#endif + unsigned int duration, u64 *cookie) +{ + s32 err = 0; + u8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq); + _adapter *padapter = NULL; + struct rtw_wdev_priv *pwdev_priv; + struct wifidirect_info *pwdinfo; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo; +#ifdef CONFIG_CONCURRENT_MODE + u8 is_p2p_find = _FALSE; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + #if defined(RTW_DEDICATED_P2P_DEVICE) + if (wdev == wiphy_to_pd_wdev(wiphy)) + padapter = wiphy_to_adapter(wiphy); + else + #endif + if (wdev_to_ndev(wdev)) + padapter = (_adapter *)rtw_netdev_priv(wdev_to_ndev(wdev)); + else { + err = -EINVAL; + goto exit; + } +#else + struct wireless_dev *wdev; + + if (ndev == NULL) { + err = -EINVAL; + goto exit; + } + padapter = (_adapter *)rtw_netdev_priv(ndev); + wdev = ndev_to_wdev(ndev); +#endif + + pwdev_priv = adapter_wdev_data(padapter); + pwdinfo = &padapter->wdinfo; + pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; +#ifdef CONFIG_CONCURRENT_MODE + is_p2p_find = (duration < (pwdinfo->ext_listen_interval)) ? _TRUE : _FALSE; +#endif + + *cookie = ATOMIC_INC_RETURN(&pcfg80211_wdinfo->ro_ch_cookie_gen); + + RTW_INFO(FUNC_ADPT_FMT"%s ch:%u duration:%d, cookie:0x%llx\n" + , FUNC_ADPT_ARG(padapter), wdev == wiphy_to_pd_wdev(wiphy) ? " PD" : "" + , remain_ch, duration, *cookie); + + if (rtw_chset_search_ch(adapter_to_chset(padapter), remain_ch) < 0) { + RTW_WARN(FUNC_ADPT_FMT" invalid ch:%u\n", FUNC_ADPT_ARG(padapter), remain_ch); + err = -EFAULT; + goto exit; + } + +#ifdef CONFIG_MP_INCLUDED + if (rtw_mp_mode_check(padapter)) { + RTW_INFO("MP mode block remain_on_channel request\n"); + err = -EFAULT; + goto exit; + } +#endif + + if (_FAIL == rtw_pwr_wakeup(padapter)) { + err = -EFAULT; + goto exit; + } + + rtw_scan_abort(padapter); +#ifdef CONFIG_CONCURRENT_MODE + /*don't scan_abort during p2p_listen.*/ + if (is_p2p_find) + rtw_mi_buddy_scan_abort(padapter, _TRUE); +#endif /*CONFIG_CONCURRENT_MODE*/ + + if (rtw_cfg80211_get_is_roch(padapter) == _TRUE) { + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + p2p_cancel_roch_cmd(padapter, 0, NULL, RTW_CMDF_WAIT_ACK); + } + + /* if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) */ + if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { + rtw_p2p_enable(padapter, P2P_ROLE_DEVICE); + padapter->wdinfo.listen_channel = remain_ch; + RTW_INFO(FUNC_ADPT_FMT" init listen_channel %u\n" + , FUNC_ADPT_ARG(padapter), padapter->wdinfo.listen_channel); + } else if (rtw_p2p_chk_state(pwdinfo , P2P_STATE_LISTEN) + && (time_after_eq(rtw_get_current_time(), pwdev_priv->probe_resp_ie_update_time) + && rtw_get_passing_time_ms(pwdev_priv->probe_resp_ie_update_time) < 50) + ) { + if (padapter->wdinfo.listen_channel != remain_ch) { + padapter->wdinfo.listen_channel = remain_ch; + RTW_INFO(FUNC_ADPT_FMT" update listen_channel %u\n" + , FUNC_ADPT_ARG(padapter), padapter->wdinfo.listen_channel); + } + } else { + rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); +#endif + } + + rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); + + #ifdef RTW_ROCH_DURATION_ENLARGE + if (duration < 400) + duration = duration * 3; /* extend from exper */ + #endif + +#if defined(RTW_ROCH_BACK_OP) && defined(CONFIG_CONCURRENT_MODE) + if (rtw_mi_check_status(padapter, MI_LINKED)) { + if (is_p2p_find) /* p2p_find , duration<1000 */ + duration = duration + pwdinfo->ext_listen_interval; + else /* p2p_listen, duration=5000 */ + duration = pwdinfo->ext_listen_interval + (pwdinfo->ext_listen_interval / 4); + } +#endif /*defined (RTW_ROCH_BACK_OP) && defined(CONFIG_CONCURRENT_MODE) */ + + rtw_cfg80211_set_is_roch(padapter, _TRUE); + pcfg80211_wdinfo->ro_ch_wdev = wdev; + pcfg80211_wdinfo->remain_on_ch_cookie = *cookie; + rtw_cfg80211_set_last_ro_ch_time(padapter); + _rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel)); + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + pcfg80211_wdinfo->remain_on_ch_type = channel_type; + #endif + pcfg80211_wdinfo->restore_channel = rtw_get_oper_ch(padapter); + + p2p_roch_cmd(padapter, *cookie, wdev, channel, pcfg80211_wdinfo->remain_on_ch_type, + duration, RTW_CMDF_WAIT_ACK); + + rtw_cfg80211_ready_on_channel(wdev, *cookie, channel, channel_type, duration, GFP_KERNEL); +exit: + return err; +} + +static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + u64 cookie) +{ + s32 err = 0; + _adapter *padapter; + struct rtw_wdev_priv *pwdev_priv; + struct wifidirect_info *pwdinfo; + struct cfg80211_wifidirect_info *pcfg80211_wdinfo; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + #if defined(RTW_DEDICATED_P2P_DEVICE) + if (wdev == wiphy_to_pd_wdev(wiphy)) + padapter = wiphy_to_adapter(wiphy); + else + #endif + if (wdev_to_ndev(wdev)) + padapter = (_adapter *)rtw_netdev_priv(wdev_to_ndev(wdev)); + else { + err = -EINVAL; + goto exit; + } +#else + struct wireless_dev *wdev; + + if (ndev == NULL) { + err = -EINVAL; + goto exit; + } + padapter = (_adapter *)rtw_netdev_priv(ndev); + wdev = ndev_to_wdev(ndev); +#endif + + pwdev_priv = adapter_wdev_data(padapter); + pwdinfo = &padapter->wdinfo; + pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + + RTW_INFO(FUNC_ADPT_FMT"%s cookie:0x%llx\n" + , FUNC_ADPT_ARG(padapter), wdev == wiphy_to_pd_wdev(wiphy) ? " PD" : "" + , cookie); + + if (rtw_cfg80211_get_is_roch(padapter) == _TRUE) { + _cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer); + p2p_cancel_roch_cmd(padapter, cookie, wdev, RTW_CMDF_WAIT_ACK); + } + +exit: + return err; +} + +inline int rtw_cfg80211_iface_has_p2p_group_cap(_adapter *adapter) +{ +#if RTW_P2P_GROUP_INTERFACE + if (is_primary_adapter(adapter)) + return 0; +#endif + return 1; +} + +inline int rtw_cfg80211_is_p2p_scan(_adapter *adapter) +{ +#if RTW_P2P_GROUP_INTERFACE + if (rtw_cfg80211_iface_has_p2p_group_cap(adapter)) +#endif + { + struct wifidirect_info *wdinfo = &adapter->wdinfo; + + return rtw_p2p_chk_state(wdinfo, P2P_STATE_SCAN) + || rtw_p2p_chk_state(wdinfo, P2P_STATE_FIND_PHASE_SEARCH); + } + +#if RTW_P2P_GROUP_INTERFACE + #if defined(RTW_DEDICATED_P2P_DEVICE) + if (wiphy_to_pd_wdev(adapter_to_wiphy(adapter))) /* pd_wdev exist */ + return rtw_cfg80211_is_scan_by_pd_wdev(adapter); + #endif + { + /* + * For 2 RTW_P2P_GROUP_INTERFACE cases: + * 1. RTW_DEDICATED_P2P_DEVICE defined but upper layer don't use pd_wdev or + * 2. RTW_DEDICATED_P2P_DEVICE not defined + */ + struct rtw_wdev_priv *wdev_data = adapter_wdev_data(adapter); + _irqL irqL; + int is_p2p_scan = 0; + + _enter_critical_bh(&wdev_data->scan_req_lock, &irqL); + if (wdev_data->scan_request + && wdev_data->scan_request->ssids + && wdev_data->scan_request->ie + ) { + if (_rtw_memcmp(wdev_data->scan_request->ssids->ssid, "DIRECT-", 7) + && rtw_get_p2p_ie((u8 *)wdev_data->scan_request->ie, wdev_data->scan_request->ie_len, NULL, NULL)) + is_p2p_scan = 1; + } + _exit_critical_bh(&wdev_data->scan_req_lock, &irqL); + + return is_p2p_scan; + } +#endif +} + +#if defined(RTW_DEDICATED_P2P_DEVICE) +int rtw_pd_iface_alloc(struct wiphy *wiphy, const char *name, struct wireless_dev **pd_wdev) +{ + struct rtw_wiphy_data *wiphy_data = rtw_wiphy_priv(wiphy); + struct wireless_dev *wdev = NULL; + struct rtw_netdev_priv_indicator *npi; + _adapter *primary_adpt = wiphy_to_adapter(wiphy); + int ret = 0; + + if (wiphy_data->pd_wdev) { + RTW_WARN(FUNC_WIPHY_FMT" pd_wdev already exists\n", FUNC_WIPHY_ARG(wiphy)); + ret = -EBUSY; + goto exit; + } + + wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!wdev) { + RTW_WARN(FUNC_WIPHY_FMT" allocate wdev fail\n", FUNC_WIPHY_ARG(wiphy)); + ret = -ENOMEM; + goto exit; + } + + wdev->wiphy = wiphy; + wdev->iftype = NL80211_IFTYPE_P2P_DEVICE; + _rtw_memcpy(wdev->address, adapter_mac_addr(primary_adpt), ETH_ALEN); + + wiphy_data->pd_wdev = wdev; + *pd_wdev = wdev; + + RTW_INFO(FUNC_WIPHY_FMT" pd_wdev:%p, addr="MAC_FMT" added\n" + , FUNC_WIPHY_ARG(wiphy), wdev, MAC_ARG(wdev_address(wdev))); + +exit: + if (ret && wdev) { + rtw_mfree((u8 *)wdev, sizeof(struct wireless_dev)); + wdev = NULL; + } + + return ret; +} + +void rtw_pd_iface_free(struct wiphy *wiphy) +{ + struct dvobj_priv *dvobj = wiphy_to_dvobj(wiphy); + struct rtw_wiphy_data *wiphy_data = rtw_wiphy_priv(wiphy); + u8 rtnl_lock_needed; + + if (!wiphy_data->pd_wdev) + goto exit; + + RTW_INFO(FUNC_WIPHY_FMT" pd_wdev:%p, addr="MAC_FMT"\n" + , FUNC_WIPHY_ARG(wiphy), wiphy_data->pd_wdev + , MAC_ARG(wdev_address(wiphy_data->pd_wdev))); + + rtnl_lock_needed = rtw_rtnl_lock_needed(dvobj); + if (rtnl_lock_needed) + rtnl_lock(); + cfg80211_unregister_wdev(wiphy_data->pd_wdev); + if (rtnl_lock_needed) + rtnl_unlock(); + + rtw_mfree((u8 *)wiphy_data->pd_wdev, sizeof(struct wireless_dev)); + wiphy_data->pd_wdev = NULL; + +exit: + return; +} + +static int cfg80211_rtw_start_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev) +{ + _adapter *adapter = wiphy_to_adapter(wiphy); + + RTW_INFO(FUNC_WIPHY_FMT" wdev=%p\n", FUNC_WIPHY_ARG(wiphy), wdev); + + rtw_p2p_enable(adapter, P2P_ROLE_DEVICE); + return 0; +} + +static void cfg80211_rtw_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev *wdev) +{ + _adapter *adapter = wiphy_to_adapter(wiphy); + + RTW_INFO(FUNC_WIPHY_FMT" wdev=%p\n", FUNC_WIPHY_ARG(wiphy), wdev); + + if (rtw_cfg80211_is_p2p_scan(adapter)) + rtw_scan_abort(adapter); + + rtw_p2p_enable(adapter, P2P_ROLE_DISABLE); +} + +inline int rtw_cfg80211_redirect_pd_wdev(struct wiphy *wiphy, u8 *ra, struct wireless_dev **wdev) +{ + struct wireless_dev *pd_wdev = wiphy_to_pd_wdev(wiphy); + + if (pd_wdev && pd_wdev != *wdev + && _rtw_memcmp(wdev_address(pd_wdev), ra, ETH_ALEN) == _TRUE + ) { + *wdev = pd_wdev; + return 1; + } + return 0; +} + +inline int rtw_cfg80211_is_scan_by_pd_wdev(_adapter *adapter) +{ + struct wiphy *wiphy = adapter_to_wiphy(adapter); + struct rtw_wdev_priv *wdev_data = adapter_wdev_data(adapter); + struct wireless_dev *wdev = NULL; + _irqL irqL; + + _enter_critical_bh(&wdev_data->scan_req_lock, &irqL); + if (wdev_data->scan_request) + wdev = wdev_data->scan_request->wdev; + _exit_critical_bh(&wdev_data->scan_req_lock, &irqL); + + if (wdev && wdev == wiphy_to_pd_wdev(wiphy)) + return 1; + + return 0; +} +#endif /* RTW_DEDICATED_P2P_DEVICE */ +#endif /* CONFIG_P2P */ + +inline void rtw_cfg80211_set_is_mgmt_tx(_adapter *adapter, u8 val) +{ + struct rtw_wdev_priv *wdev_priv = adapter_wdev_data(adapter); + + wdev_priv->is_mgmt_tx = val; + rtw_mi_update_iface_status(&(adapter->mlmepriv), 0); +} + +inline u8 rtw_cfg80211_get_is_mgmt_tx(_adapter *adapter) +{ + struct rtw_wdev_priv *wdev_priv = adapter_wdev_data(adapter); + + return wdev_priv->is_mgmt_tx; +} + +static int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, u8 no_cck, const u8 *buf, size_t len, int wait_ack) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + int ret = _FAIL; + bool ack = _TRUE; + struct rtw_ieee80211_hdr *pwlanhdr; +#if defined(RTW_ROCH_BACK_OP) && defined(CONFIG_P2P) && defined(CONFIG_CONCURRENT_MODE) + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); +#endif + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + u8 u_ch = rtw_mi_get_union_chan(padapter); + u8 leave_op = 0; +#ifdef CONFIG_P2P + struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; + #ifdef CONFIG_CONCURRENT_MODE + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + #endif +#endif + + rtw_cfg80211_set_is_mgmt_tx(padapter, 1); + +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_ScanNotify(padapter, _TRUE); +#endif + +#ifdef CONFIG_P2P + if (rtw_cfg80211_get_is_roch(padapter) == _TRUE) { + #ifdef CONFIG_CONCURRENT_MODE + if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { + RTW_INFO("%s, extend ro ch time\n", __func__); + _set_timer(&padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period); + } + #endif /* CONFIG_CONCURRENT_MODE */ + } +#endif /* CONFIG_P2P */ + +#ifdef CONFIG_MCC_MODE + if (MCC_EN(padapter)) { + if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_DOING_MCC)) + /* don't set channel, issue frame directly */ + goto issue_mgmt_frame; + } +#endif /* CONFIG_MCC_MODE */ + + if (rtw_mi_check_status(padapter, MI_LINKED) + && tx_ch != u_ch + ) { + rtw_leave_opch(padapter); + leave_op = 1; + + #if defined(RTW_ROCH_BACK_OP) && defined(CONFIG_P2P) && defined(CONFIG_CONCURRENT_MODE) + if (rtw_cfg80211_get_is_roch(padapter) + && ATOMIC_READ(&pwdev_priv->switch_ch_to) == 1 + ) { + u16 ext_listen_period; + + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) + ext_listen_period = 500; + else + ext_listen_period = pwdinfo->ext_listen_period; + ATOMIC_SET(&pwdev_priv->switch_ch_to, 0); + _set_timer(&pwdinfo->ap_p2p_switch_timer, ext_listen_period); + RTW_INFO("%s, set switch ch timer, period=%d\n", __func__, ext_listen_period); + } + #endif /* RTW_ROCH_BACK_OP && CONFIG_P2P && CONFIG_CONCURRENT_MODE */ + } + + if (tx_ch != rtw_get_oper_ch(padapter)) + set_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + +issue_mgmt_frame: + /* starting alloc mgmt frame to dump it */ + pmgntframe = alloc_mgtxmitframe(pxmitpriv); + if (pmgntframe == NULL) { + /* ret = -ENOMEM; */ + ret = _FAIL; + goto exit; + } + + /* update attribute */ + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + if (no_cck && IS_CCK_RATE(pattrib->rate)) { + /* force OFDM 6M rate*/ + pattrib->rate = MGN_6M; + pattrib->raid = rtw_get_mgntframe_raid(padapter, WIRELESS_11G); + } + + pattrib->retry_ctrl = _FALSE; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + + _rtw_memcpy(pframe, (void *)buf, len); + pattrib->pktlen = len; + + pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + /* update seq number */ + pmlmeext->mgnt_seq = GetSequence(pwlanhdr); + pattrib->seqnum = pmlmeext->mgnt_seq; + pmlmeext->mgnt_seq++; + +#ifdef CONFIG_P2P + rtw_xframe_chk_wfd_ie(pmgntframe); +#endif /* CONFIG_P2P */ + + pattrib->last_txcmdsz = pattrib->pktlen; + + if (wait_ack) { + if (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) { + ack = _FALSE; + ret = _FAIL; + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, ack == _FAIL\n", __func__); +#endif + } else { + +#ifdef CONFIG_XMIT_ACK + if (!MLME_IS_MESH(padapter)) /* TODO: remove this sleep for all mode */ + rtw_msleep_os(50); +#endif +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, ack=%d, ok!\n", __func__, ack); +#endif + ret = _SUCCESS; + } + } else { + dump_mgntframe(padapter, pmgntframe); + ret = _SUCCESS; + } + +exit: + #ifdef CONFIG_P2P + if (rtw_cfg80211_get_is_roch(padapter) + && !roch_stay_in_cur_chan(padapter) + && pcfg80211_wdinfo->remain_on_ch_channel.hw_value != u_ch + ) { + /* roch is ongoing, switch back to rch */ + if (pcfg80211_wdinfo->remain_on_ch_channel.hw_value != tx_ch) + set_channel_bwmode(padapter, pcfg80211_wdinfo->remain_on_ch_channel.hw_value + , HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20); + } else + #endif + if (leave_op) { + if (rtw_mi_check_status(padapter, MI_LINKED)) { + u8 u_bw = rtw_mi_get_union_bw(padapter); + u8 u_offset = rtw_mi_get_union_offset(padapter); + + set_channel_bwmode(padapter, u_ch, u_offset, u_bw); + } + rtw_back_opch(padapter); + } + + rtw_cfg80211_set_is_mgmt_tx(padapter, 0); + +#ifdef CONFIG_BT_COEXIST + rtw_btcoex_ScanNotify(padapter, _FALSE); +#endif + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, ret=%d\n", __func__, ret); +#endif + + return ret; + +} + +u8 rtw_mgnt_tx_handler(_adapter *adapter, u8 *buf) +{ + u8 rst = H2C_CMD_FAIL; + struct mgnt_tx_parm *mgnt_parm = (struct mgnt_tx_parm *)buf; + + if (_cfg80211_rtw_mgmt_tx(adapter, mgnt_parm->tx_ch, mgnt_parm->no_cck, + mgnt_parm->buf, mgnt_parm->len, mgnt_parm->wait_ack) == _SUCCESS) + rst = H2C_SUCCESS; + + return rst; +} + +static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) || defined(COMPAT_KERNEL_RELEASE) + struct ieee80211_channel *chan, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + bool offchan, + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + enum nl80211_channel_type channel_type, + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + bool channel_type_valid, + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + unsigned int wait, + #endif + const u8 *buf, size_t len, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + bool no_cck, + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + bool dont_wait_for_ack, + #endif +#else + struct cfg80211_mgmt_tx_params *params, +#endif + u64 *cookie) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(COMPAT_KERNEL_RELEASE) + struct ieee80211_channel *chan = params->chan; + const u8 *buf = params->buf; + size_t len = params->len; + bool no_cck = params->no_cck; +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)) + bool no_cck = 0; +#endif + int ret = 0; + u8 tx_ret; + int wait_ack = 1; + const u8 *dump_buf = buf; + size_t dump_len = len; + u32 dump_limit = RTW_MAX_MGMT_TX_CNT; + u32 dump_cnt = 0; + u32 sleep_ms = 0; + u32 retry_guarantee_ms = 0; + bool ack = _TRUE; + u8 tx_ch; + u8 category, action; + u8 frame_styp; +#ifdef CONFIG_P2P + u8 is_p2p = 0; +#endif + int type = (-1); + systime start = rtw_get_current_time(); + _adapter *padapter; + struct dvobj_priv *dvobj; + struct rtw_wdev_priv *pwdev_priv; + struct rf_ctl_t *rfctl; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + #if defined(RTW_DEDICATED_P2P_DEVICE) + if (wdev == wiphy_to_pd_wdev(wiphy)) + padapter = wiphy_to_adapter(wiphy); + else + #endif + if (wdev_to_ndev(wdev)) + padapter = (_adapter *)rtw_netdev_priv(wdev_to_ndev(wdev)); + else { + ret = -EINVAL; + goto exit; + } +#else + struct wireless_dev *wdev; + + if (ndev == NULL) { + ret = -EINVAL; + goto exit; + } + padapter = (_adapter *)rtw_netdev_priv(ndev); + wdev = ndev_to_wdev(ndev); +#endif + + if (chan == NULL) { + ret = -EINVAL; + goto exit; + } + + rfctl = adapter_to_rfctl(padapter); + tx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq); + if (IS_CH_WAITING(rfctl)) { + #ifdef CONFIG_DFS_MASTER + if (_rtw_rfctl_overlap_radar_detect_ch(rfctl, tx_ch, CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE)) { + ret = -EINVAL; + goto exit; + } + #endif + } + + dvobj = adapter_to_dvobj(padapter); + pwdev_priv = adapter_wdev_data(padapter); + + /* cookie generation */ + *cookie = pwdev_priv->mgmt_tx_cookie++; + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO(FUNC_ADPT_FMT"%s len=%zu, ch=%d" + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + ", ch_type=%d" + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + ", channel_type_valid=%d" + #endif + "\n", FUNC_ADPT_ARG(padapter), wdev == wiphy_to_pd_wdev(wiphy) ? " PD" : "" + , len, tx_ch + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + , channel_type + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34)) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)) + , channel_type_valid + #endif + ); +#endif /* CONFIG_DEBUG_CFG80211 */ + + /* indicate ack before issue frame to avoid racing with rsp frame */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + rtw_cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack, GFP_KERNEL); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 36)) + cfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL); +#endif + + frame_styp = le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl) & IEEE80211_FCTL_STYPE; + if (IEEE80211_STYPE_PROBE_RESP == frame_styp) { +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("RTW_Tx: probe_resp tx_ch=%d, no_cck=%u, da="MAC_FMT"\n", tx_ch, no_cck, MAC_ARG(GetAddr1Ptr(buf))); +#endif /* CONFIG_DEBUG_CFG80211 */ + wait_ack = 0; + goto dump; + } + else if (frame_styp == RTW_IEEE80211_STYPE_AUTH) { + int retval = 0; + + RTW_INFO("RTW_Tx:tx_ch=%d, no_cck=%u, da="MAC_FMT"\n", tx_ch, no_cck, MAC_ARG(GetAddr1Ptr(buf))); + + retval = rtw_sae_preprocess(padapter, buf, len, _TRUE); + if (retval == 2) + goto exit; + if (retval == 0) + RTW_INFO("RTW_Tx:AUTH\n"); + dump_limit = 1; + goto dump; + } + + if (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) { + RTW_INFO(FUNC_ADPT_FMT" frame_control:0x%02x\n", FUNC_ADPT_ARG(padapter), + le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl)); + goto exit; + } + + RTW_INFO("RTW_Tx:tx_ch=%d, no_cck=%u, da="MAC_FMT"\n", tx_ch, no_cck, MAC_ARG(GetAddr1Ptr(buf))); +#ifdef CONFIG_P2P + type = rtw_p2p_check_frames(padapter, buf, len, _TRUE); + if (type >= 0) { + is_p2p = 1; + no_cck = 1; /* force no CCK for P2P frames */ + goto dump; + } +#endif +#ifdef CONFIG_RTW_MESH + if (MLME_IS_MESH(padapter)) { + type = rtw_mesh_check_frames_tx(padapter, &dump_buf, &dump_len); + if (type >= 0) { + dump_limit = 1; + goto dump; + } + } +#endif + if (category == RTW_WLAN_CATEGORY_PUBLIC) { + RTW_INFO("RTW_Tx:%s\n", action_public_str(action)); + switch (action) { + case ACT_PUBLIC_GAS_INITIAL_REQ: + case ACT_PUBLIC_GAS_INITIAL_RSP: + sleep_ms = 50; + retry_guarantee_ms = RTW_MAX_MGMT_TX_MS_GAS; + break; + } + } +#ifdef CONFIG_RTW_80211K + else if (category == RTW_WLAN_CATEGORY_RADIO_MEAS) + RTW_INFO("RTW_Tx: RRM Action\n"); +#endif + else + RTW_INFO("RTW_Tx:category(%u), action(%u)\n", category, action); + +dump: + + rtw_ps_deny(padapter, PS_DENY_MGNT_TX); + if (_FAIL == rtw_pwr_wakeup(padapter)) { + ret = -EFAULT; + goto cancel_ps_deny; + } + + while (1) { + dump_cnt++; + + rtw_mi_set_scan_deny(padapter, 1000); + rtw_mi_scan_abort(padapter, _TRUE); + tx_ret = rtw_mgnt_tx_cmd(padapter, tx_ch, no_cck, dump_buf, dump_len, wait_ack, RTW_CMDF_WAIT_ACK); + if (tx_ret == _SUCCESS + || (dump_cnt >= dump_limit && rtw_get_passing_time_ms(start) >= retry_guarantee_ms)) + break; + + if (sleep_ms > 0) + rtw_msleep_os(sleep_ms); + } + + if (tx_ret != _SUCCESS || dump_cnt > 1) { + RTW_INFO(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter), + tx_ret == _SUCCESS ? "OK" : "FAIL", dump_cnt, dump_limit, rtw_get_passing_time_ms(start)); + } + +#ifdef CONFIG_P2P + if (is_p2p) { + switch (type) { + case P2P_GO_NEGO_CONF: + if (0) { + RTW_INFO(FUNC_ADPT_FMT" Nego confirm. state=%u, status=%u, iaddr="MAC_FMT"\n" + , FUNC_ADPT_ARG(padapter), pwdev_priv->nego_info.state, pwdev_priv->nego_info.status + , MAC_ARG(pwdev_priv->nego_info.iface_addr)); + } + if (pwdev_priv->nego_info.state == 2 + && pwdev_priv->nego_info.status == 0 + && rtw_check_invalid_mac_address(pwdev_priv->nego_info.iface_addr, _FALSE) == _FALSE + ) { + _adapter *intended_iface = dvobj_get_adapter_by_addr(dvobj, pwdev_priv->nego_info.iface_addr); + + if (intended_iface) { + RTW_INFO(FUNC_ADPT_FMT" Nego confirm. Allow only "ADPT_FMT" to scan for 2000 ms\n" + , FUNC_ADPT_ARG(padapter), ADPT_ARG(intended_iface)); + /* allow only intended_iface to do scan for 2000 ms */ + rtw_mi_set_scan_deny(padapter, 2000); + rtw_clear_scan_deny(intended_iface); + } + } + break; + case P2P_INVIT_RESP: + if (pwdev_priv->invit_info.flags & BIT(0) + && pwdev_priv->invit_info.status == 0 + ) { + rtw_clear_scan_deny(padapter); + RTW_INFO(FUNC_ADPT_FMT" agree with invitation of persistent group\n", + FUNC_ADPT_ARG(padapter)); + #if !RTW_P2P_GROUP_INTERFACE + rtw_mi_buddy_set_scan_deny(padapter, 5000); + #endif + rtw_pwr_wakeup_ex(padapter, 5000); + } + break; + } + } +#endif /* CONFIG_P2P */ + +cancel_ps_deny: + rtw_ps_deny_cancel(padapter, PS_DENY_MGNT_TX); + + if (dump_buf != buf) + rtw_mfree((u8 *)dump_buf, dump_len); +exit: + return ret; +} + +static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct wireless_dev *wdev, +#else + struct net_device *ndev, +#endif + u16 frame_type, bool reg) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + struct net_device *ndev = wdev_to_ndev(wdev); +#endif + _adapter *adapter; + + struct rtw_wdev_priv *pwdev_priv; + + if (ndev == NULL) + goto exit; + + adapter = (_adapter *)rtw_netdev_priv(ndev); + pwdev_priv = adapter_wdev_data(adapter); + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO(FUNC_ADPT_FMT" frame_type:%x, reg:%d\n", FUNC_ADPT_ARG(adapter), + frame_type, reg); +#endif + + switch (frame_type) { + case IEEE80211_STYPE_AUTH: /* 0x00B0 */ + if (reg > 0) + SET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_AUTH, reg); + else + CLR_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_AUTH, reg); + break; +#ifdef not_yet + case IEEE80211_STYPE_PROBE_REQ: /* 0x0040 */ + if (reg > 0) + SET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_PROBE_REQ, reg); + else + CLR_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_PROBE_REQ, reg); + break; + case IEEE80211_STYPE_ACTION: /* 0x00D0 */ + if (reg > 0) + SET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_ACTION, reg); + else + CLR_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_ACTION, reg); + break; +#endif + default: + break; + } + +exit: + return; +} + +#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) +static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy, + struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) + const u8 *peer, +#else + u8 *peer, +#endif + u8 action_code, + u8 dialog_token, + u16 status_code, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) + u32 peer_capability, +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) + bool initiator, +#endif + const u8 *buf, + size_t len) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + int ret = 0; + struct tdls_txmgmt txmgmt; + + if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _FALSE) { + RTW_INFO("Discard tdls action:%d, since hal doesn't support tdls\n", action_code); + goto discard; + } + + if (rtw_is_tdls_enabled(padapter) == _FALSE) { + RTW_INFO("TDLS is not enabled\n"); + goto discard; + } + + if (rtw_tdls_is_driver_setup(padapter)) { + RTW_INFO("Discard tdls action:%d, let driver to set up direct link\n", action_code); + goto discard; + } + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + _rtw_memcpy(txmgmt.peer, peer, ETH_ALEN); + txmgmt.action_code = action_code; + txmgmt.dialog_token = dialog_token; + txmgmt.status_code = status_code; + txmgmt.len = len; + txmgmt.buf = (u8 *)rtw_malloc(txmgmt.len); + if (txmgmt.buf == NULL) { + ret = -ENOMEM; + goto bad; + } + _rtw_memcpy(txmgmt.buf, (void *)buf, txmgmt.len); + + /* Debug purpose */ +#if 1 + RTW_INFO("%s %d\n", __FUNCTION__, __LINE__); + RTW_INFO("peer:"MAC_FMT", action code:%d, dialog:%d, status code:%d\n", + MAC_ARG(txmgmt.peer), txmgmt.action_code, + txmgmt.dialog_token, txmgmt.status_code); + if (txmgmt.len > 0) { + int i = 0; + for (; i < len; i++) + printk("%02x ", *(txmgmt.buf + i)); + RTW_INFO("len:%d\n", (u32)txmgmt.len); + } +#endif + + switch (txmgmt.action_code) { + case TDLS_SETUP_REQUEST: + issue_tdls_setup_req(padapter, &txmgmt, _TRUE); + break; + case TDLS_SETUP_RESPONSE: + issue_tdls_setup_rsp(padapter, &txmgmt); + break; + case TDLS_SETUP_CONFIRM: + issue_tdls_setup_cfm(padapter, &txmgmt); + break; + case TDLS_TEARDOWN: + issue_tdls_teardown(padapter, &txmgmt, _TRUE); + break; + case TDLS_DISCOVERY_REQUEST: + issue_tdls_dis_req(padapter, &txmgmt); + break; + case TDLS_DISCOVERY_RESPONSE: + issue_tdls_dis_rsp(padapter, &txmgmt, pmlmeinfo->enc_algo ? _TRUE : _FALSE); + break; + } + +bad: + if (txmgmt.buf) + rtw_mfree(txmgmt.buf, txmgmt.len); + +discard: + return ret; +} + +static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy, + struct net_device *ndev, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) + const u8 *peer, +#else + u8 *peer, +#endif + enum nl80211_tdls_operation oper) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; + struct tdls_txmgmt txmgmt; + struct sta_info *ptdls_sta = NULL; + + RTW_INFO(FUNC_NDEV_FMT", nl80211_tdls_operation:%d\n", FUNC_NDEV_ARG(ndev), oper); + + if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _FALSE) { + RTW_INFO("Discard tdls oper:%d, since hal doesn't support tdls\n", oper); + return 0; + } + + if (rtw_is_tdls_enabled(padapter) == _FALSE) { + RTW_INFO("TDLS is not enabled\n"); + return 0; + } + +#ifdef CONFIG_LPS + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1); +#endif /* CONFIG_LPS */ + + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + if (peer) + _rtw_memcpy(txmgmt.peer, peer, ETH_ALEN); + + if (rtw_tdls_is_driver_setup(padapter)) { + /* these two cases are done by driver itself */ + if (oper == NL80211_TDLS_ENABLE_LINK || oper == NL80211_TDLS_DISABLE_LINK) + return 0; + } + + switch (oper) { + case NL80211_TDLS_DISCOVERY_REQ: + issue_tdls_dis_req(padapter, &txmgmt); + break; + case NL80211_TDLS_SETUP: +#ifdef CONFIG_WFD + if (_AES_ != padapter->securitypriv.dot11PrivacyAlgrthm) { + if (padapter->wdinfo.wfd_tdls_weaksec == _TRUE) + issue_tdls_setup_req(padapter, &txmgmt, _TRUE); + else + RTW_INFO("[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__); + } else +#endif /* CONFIG_WFD */ + { + issue_tdls_setup_req(padapter, &txmgmt, _TRUE); + } + break; + case NL80211_TDLS_TEARDOWN: + ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), txmgmt.peer); + if (ptdls_sta != NULL) { + txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_; + issue_tdls_teardown(padapter, &txmgmt, _TRUE); + } else + RTW_INFO("TDLS peer not found\n"); + break; + case NL80211_TDLS_ENABLE_LINK: + RTW_INFO(FUNC_NDEV_FMT", NL80211_TDLS_ENABLE_LINK;mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(peer)); + ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), (u8 *)peer); + if (ptdls_sta != NULL) { + rtw_tdls_set_link_established(padapter, _TRUE); + ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE; + ptdls_sta->state |= _FW_LINKED; + rtw_tdls_cmd(padapter, txmgmt.peer, TDLS_ESTABLISHED); + } + break; + case NL80211_TDLS_DISABLE_LINK: + RTW_INFO(FUNC_NDEV_FMT", NL80211_TDLS_DISABLE_LINK;mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(peer)); + ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), (u8 *)peer); + if (ptdls_sta != NULL) { + rtw_tdls_teardown_pre_hdl(padapter, ptdls_sta); + rtw_tdls_cmd(padapter, (u8 *)peer, TDLS_TEARDOWN_STA_LOCALLY_POST); + } + break; + } + return 0; +} +#endif /* CONFIG_TDLS */ + +#if defined(CONFIG_RTW_MESH) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) + +#if DBG_RTW_CFG80211_MESH_CONF +#define LEGACY_RATES_STR_LEN (RTW_G_RATES_NUM * 5 + 1) +int get_legacy_rates_str(struct wiphy *wiphy, enum nl80211_band band, u32 mask, char *buf) +{ + int i; + int cnt = 0; + + for (i = 0; i < wiphy->bands[band]->n_bitrates; i++) { + if (mask & BIT(i)) { + cnt += snprintf(buf + cnt, LEGACY_RATES_STR_LEN - cnt -1, "%d.%d " + , wiphy->bands[band]->bitrates[i].bitrate / 10 + , wiphy->bands[band]->bitrates[i].bitrate % 10); + if (cnt >= LEGACY_RATES_STR_LEN - 1) + break; + } + } + + return cnt; +} + +void dump_mesh_setup(void *sel, struct wiphy *wiphy, const struct mesh_setup *setup) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct cfg80211_chan_def *chdef = (struct cfg80211_chan_def *)(&setup->chandef); +#endif + struct ieee80211_channel *chan; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + chan = (struct ieee80211_channel *)chdef->chan; +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + chan = (struct ieee80211_channel *)setup->channel; +#endif + + RTW_PRINT_SEL(sel, "mesh_id:\"%s\", len:%u\n", setup->mesh_id, setup->mesh_id_len); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + RTW_PRINT_SEL(sel, "sync_method:%u\n", setup->sync_method); +#endif + RTW_PRINT_SEL(sel, "path_sel_proto:%u, path_metric:%u\n", setup->path_sel_proto, setup->path_metric); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + RTW_PRINT_SEL(sel, "auth_id:%u\n", setup->auth_id); +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + if (setup->ie && setup->ie_len) { + RTW_PRINT_SEL(sel, "ie:%p, len:%u\n", setup->ie, setup->ie_len); + dump_ies(RTW_DBGDUMP, setup->ie, setup->ie_len); + } +#else + if (setup->vendor_ie && setup->vendor_ie_len) { + RTW_PRINT_SEL(sel, "ie:%p, len:%u\n", setup->vendor_ie, setup->vendor_ie_len); + dump_ies(RTW_DBGDUMP, setup->vendor_ie, setup->vendor_ie_len); + } +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + RTW_PRINT_SEL(sel, "is_authenticated:%d, is_secure:%d\n", setup->is_authenticated, setup->is_secure); +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + RTW_PRINT_SEL(sel, "user_mpm:%d\n", setup->user_mpm); +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + RTW_PRINT_SEL(sel, "dtim_period:%u, beacon_interval:%u\n", setup->dtim_period, setup->beacon_interval); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + RTW_PRINT_SEL(sel, "center_freq:%u, ch:%u, width:%s, cfreq1:%u, cfreq2:%u\n" + , chan->center_freq, chan->hw_value, nl80211_chan_width_str(chdef->width), chdef->center_freq1, chdef->center_freq2); +#else + RTW_PRINT_SEL(sel, "center_freq:%u, ch:%u, channel_type:%s\n" + , chan->center_freq, chan->hw_value, nl80211_channel_type_str(setup->channel_type)); +#endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + if (setup->mcast_rate[chan->band]) { + RTW_PRINT_SEL(sel, "mcast_rate:%d.%d\n" + , wiphy->bands[chan->band]->bitrates[setup->mcast_rate[chan->band] - 1].bitrate / 10 + , wiphy->bands[chan->band]->bitrates[setup->mcast_rate[chan->band] - 1].bitrate % 10 + ); + } +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + if (setup->basic_rates) { + char buf[LEGACY_RATES_STR_LEN] = {0}; + + get_legacy_rates_str(wiphy, chan->band, setup->basic_rates, buf); + RTW_PRINT_SEL(sel, "basic_rates:%s\n", buf); + } +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)) + if (setup->beacon_rate.control[chan->band].legacy) { + char buf[LEGACY_RATES_STR_LEN] = {0}; + + get_legacy_rates_str(wiphy, chan->band, setup->beacon_rate.control[chan->band].legacy, buf); + RTW_PRINT_SEL(sel, "beacon_rate.legacy:%s\n", buf); + } + if (*((u32 *)&(setup->beacon_rate.control[chan->band].ht_mcs[0])) + || *((u32 *)&(setup->beacon_rate.control[chan->band].ht_mcs[4])) + || *((u16 *)&(setup->beacon_rate.control[chan->band].ht_mcs[8])) + ) { + RTW_PRINT_SEL(sel, "beacon_rate.ht_mcs:"HT_RX_MCS_BMP_FMT"\n" + , HT_RX_MCS_BMP_ARG(setup->beacon_rate.control[chan->band].ht_mcs)); + } + + if (setup->beacon_rate.control[chan->band].vht_mcs[0] + || setup->beacon_rate.control[chan->band].vht_mcs[1] + || setup->beacon_rate.control[chan->band].vht_mcs[2] + || setup->beacon_rate.control[chan->band].vht_mcs[3] + ) { + int i; + + for (i = 0; i < 4; i++) {/* parsing up to 4SS */ + u16 mcs_mask = setup->beacon_rate.control[chan->band].vht_mcs[i]; + + RTW_PRINT_SEL(sel, "beacon_rate.vht_mcs[%d]:%s\n", i + , mcs_mask == 0x00FF ? "0~7" : mcs_mask == 0x01FF ? "0~8" : mcs_mask == 0x03FF ? "0~9" : "invalid"); + } + } + + if (setup->beacon_rate.control[chan->band].gi) { + RTW_PRINT_SEL(sel, "beacon_rate.gi:%s\n" + , setup->beacon_rate.control[chan->band].gi == NL80211_TXRATE_FORCE_SGI ? "SGI" : + setup->beacon_rate.control[chan->band].gi == NL80211_TXRATE_FORCE_LGI ? "LGI" : "invalid" + ); + } +#endif +} + +void dump_mesh_config(void *sel, const struct mesh_config *conf) +{ + RTW_PRINT_SEL(sel, "dot11MeshRetryTimeout:%u\n", conf->dot11MeshRetryTimeout); + RTW_PRINT_SEL(sel, "dot11MeshConfirmTimeout:%u\n", conf->dot11MeshConfirmTimeout); + RTW_PRINT_SEL(sel, "dot11MeshHoldingTimeout:%u\n", conf->dot11MeshHoldingTimeout); + RTW_PRINT_SEL(sel, "dot11MeshMaxPeerLinks:%u\n", conf->dot11MeshMaxPeerLinks); + RTW_PRINT_SEL(sel, "dot11MeshMaxRetries:%u\n", conf->dot11MeshMaxRetries); + RTW_PRINT_SEL(sel, "dot11MeshTTL:%u\n", conf->dot11MeshTTL); + RTW_PRINT_SEL(sel, "element_ttl:%u\n", conf->element_ttl); + RTW_PRINT_SEL(sel, "auto_open_plinks:%d\n", conf->auto_open_plinks); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + RTW_PRINT_SEL(sel, "dot11MeshNbrOffsetMaxNeighbor:%u\n", conf->dot11MeshNbrOffsetMaxNeighbor); +#endif + + RTW_PRINT_SEL(sel, "dot11MeshHWMPmaxPREQretries:%u\n", conf->dot11MeshHWMPmaxPREQretries); + RTW_PRINT_SEL(sel, "path_refresh_time:%u\n", conf->path_refresh_time); + RTW_PRINT_SEL(sel, "min_discovery_timeout:%u\n", conf->min_discovery_timeout); + RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathTimeout:%u\n", conf->dot11MeshHWMPactivePathTimeout); + RTW_PRINT_SEL(sel, "dot11MeshHWMPpreqMinInterval:%u\n", conf->dot11MeshHWMPpreqMinInterval); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + RTW_PRINT_SEL(sel, "dot11MeshHWMPperrMinInterval:%u\n", conf->dot11MeshHWMPperrMinInterval); +#endif + RTW_PRINT_SEL(sel, "dot11MeshHWMPnetDiameterTraversalTime:%u\n", conf->dot11MeshHWMPnetDiameterTraversalTime); + RTW_PRINT_SEL(sel, "dot11MeshHWMPRootMode:%u\n", conf->dot11MeshHWMPRootMode); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + RTW_PRINT_SEL(sel, "dot11MeshHWMPRannInterval:%u\n", conf->dot11MeshHWMPRannInterval); + RTW_PRINT_SEL(sel, "dot11MeshGateAnnouncementProtocol:%d\n", conf->dot11MeshGateAnnouncementProtocol); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) + RTW_PRINT_SEL(sel, "dot11MeshForwarding:%d\n", conf->dot11MeshForwarding); + RTW_PRINT_SEL(sel, "rssi_threshold:%d\n", conf->rssi_threshold); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + RTW_PRINT_SEL(sel, "ht_opmode:0x%04x\n", conf->ht_opmode); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + RTW_PRINT_SEL(sel, "dot11MeshHWMPactivePathToRootTimeout:%u\n", conf->dot11MeshHWMPactivePathToRootTimeout); + RTW_PRINT_SEL(sel, "dot11MeshHWMProotInterval:%u\n", conf->dot11MeshHWMProotInterval); + RTW_PRINT_SEL(sel, "dot11MeshHWMPconfirmationInterval:%u\n", conf->dot11MeshHWMPconfirmationInterval); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + RTW_PRINT_SEL(sel, "power_mode:%s\n", nl80211_mesh_power_mode_str(conf->power_mode)); + RTW_PRINT_SEL(sel, "dot11MeshAwakeWindowDuration:%u\n", conf->dot11MeshAwakeWindowDuration); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + RTW_PRINT_SEL(sel, "plink_timeout:%u\n", conf->plink_timeout); +#endif +} +#endif /* DBG_RTW_CFG80211_MESH_CONF */ + +static void rtw_cfg80211_mesh_info_set_profile(struct rtw_mesh_info *minfo, const struct mesh_setup *setup) +{ + _rtw_memcpy(minfo->mesh_id, setup->mesh_id, setup->mesh_id_len); + minfo->mesh_id_len = setup->mesh_id_len; + minfo->mesh_pp_id = setup->path_sel_proto; + minfo->mesh_pm_id = setup->path_metric; + minfo->mesh_cc_id = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + minfo->mesh_sp_id = setup->sync_method; +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + minfo->mesh_auth_id = setup->auth_id; +#else + if (setup->is_authenticated) { + u8 *rsn_ie; + sint rsn_ie_len; + struct rsne_info info; + u8 *akm; + u8 AKM_SUITE_SAE[4] = {0x00, 0x0F, 0xAC, 0x08}; + + rsn_ie = rtw_get_ie(setup->ie, WLAN_EID_RSN, &rsn_ie_len, setup->ie_len); + if (!rsn_ie || !rsn_ie_len) { + rtw_warn_on(1); + return; + } + + if (rtw_rsne_info_parse(rsn_ie, rsn_ie_len + 2, &info) != _SUCCESS) { + rtw_warn_on(1); + return; + } + + if (!info.akm_list || !info.akm_cnt) { + rtw_warn_on(1); + return; + } + + akm = info.akm_list; + while (akm < info.akm_list + info.akm_cnt * 4) { + if (_rtw_memcmp(akm, AKM_SUITE_SAE, 4) == _TRUE) { + minfo->mesh_auth_id = 0x01; + break; + } + } + + if (!minfo->mesh_auth_id) { + rtw_warn_on(1); + return; + } + } +#endif +} + +static inline bool chk_mesh_attr(enum nl80211_meshconf_params parm, u32 mask) +{ + return (mask >> (parm - 1)) & 0x1; +} + +static void rtw_cfg80211_mesh_cfg_set(_adapter *adapter, const struct mesh_config *conf, u32 mask) +{ + struct rtw_mesh_cfg *mcfg = &adapter->mesh_cfg; + +#if 0 /* driver MPM */ + if (chk_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask)); + if (chk_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask)); + if (chk_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask)); + if (chk_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask)); + if (chk_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask)); +#endif + + if (chk_mesh_attr(NL80211_MESHCONF_TTL, mask)) + mcfg->dot11MeshTTL = conf->dot11MeshTTL; + if (chk_mesh_attr(NL80211_MESHCONF_ELEMENT_TTL, mask)) + mcfg->element_ttl = conf->element_ttl; + +#if 0 /* driver MPM */ + if (chk_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask)); +#endif + +#if 0 /* TBD: synchronization */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, mask)); +#endif +#endif + + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask)) + mcfg->dot11MeshHWMPmaxPREQretries = conf->dot11MeshHWMPmaxPREQretries; + if (chk_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask)) + mcfg->path_refresh_time = conf->path_refresh_time; + if (chk_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask)) + mcfg->min_discovery_timeout = conf->min_discovery_timeout; + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask)) + mcfg->dot11MeshHWMPactivePathTimeout = conf->dot11MeshHWMPactivePathTimeout; + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask)) + mcfg->dot11MeshHWMPpreqMinInterval = conf->dot11MeshHWMPpreqMinInterval; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, mask)) + mcfg->dot11MeshHWMPperrMinInterval = conf->dot11MeshHWMPperrMinInterval; +#endif + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, mask)) + mcfg->dot11MeshHWMPnetDiameterTraversalTime = conf->dot11MeshHWMPnetDiameterTraversalTime; + + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) + mcfg->dot11MeshHWMPRootMode = conf->dot11MeshHWMPRootMode; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) + mcfg->dot11MeshGateAnnouncementProtocol = conf->dot11MeshGateAnnouncementProtocol; + /* our current gate annc implementation rides on root annc with gate annc bit in PREQ flags */ + if (mcfg->dot11MeshGateAnnouncementProtocol + && mcfg->dot11MeshHWMPRootMode <= RTW_IEEE80211_ROOTMODE_ROOT + ) { + mcfg->dot11MeshHWMPRootMode = RTW_IEEE80211_PROACTIVE_RANN; + RTW_INFO(ADPT_FMT" enable PROACTIVE_RANN becaue gate annc is needed\n", ADPT_ARG(adapter)); + } + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_RANN_INTERVAL, mask)) + mcfg->dot11MeshHWMPRannInterval = conf->dot11MeshHWMPRannInterval; +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_FORWARDING, mask)) + mcfg->dot11MeshForwarding = conf->dot11MeshForwarding; + + if (chk_mesh_attr(NL80211_MESHCONF_RSSI_THRESHOLD, mask)) + mcfg->rssi_threshold = conf->rssi_threshold; +#endif + +#if 0 /* controlled by driver */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)); +#endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask)) + mcfg->dot11MeshHWMPactivePathToRootTimeout = conf->dot11MeshHWMPactivePathToRootTimeout; + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask)) + mcfg->dot11MeshHWMProotInterval = conf->dot11MeshHWMProotInterval; + if (chk_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask)) + mcfg->dot11MeshHWMPconfirmationInterval = conf->dot11MeshHWMPconfirmationInterval; +#endif + +#if 0 /* TBD */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_POWER_MODE, mask)); + if (chk_mesh_attr(NL80211_MESHCONF_AWAKE_WINDOW, mask)); +#endif +#endif + +#if 0 /* driver MPM */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + if (chk_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask)); +#endif +#endif +} + +u8 *rtw_cfg80211_construct_mesh_beacon_ies(struct wiphy *wiphy, _adapter *adapter + , const struct mesh_config *conf, const struct mesh_setup *setup + , uint *ies_len) +{ + struct rtw_mesh_info *minfo = &adapter->mesh_info; + struct rtw_mesh_cfg *mcfg = &adapter->mesh_cfg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + struct cfg80211_chan_def *chdef = (struct cfg80211_chan_def *)(&setup->chandef); +#endif + struct ieee80211_channel *chan; + u8 ch, bw, offset; +#endif + uint len; + u8 n_bitrates; + u8 ht = 0; + u8 vht = 0; + u8 *rsn_ie = NULL; + sint rsn_ie_len = 0; + u8 *ies = NULL, *c; + u8 supported_rates[RTW_G_RATES_NUM] = {0}; + int i; + + *ies_len = 0; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + chan = (struct ieee80211_channel *)chdef->chan; +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + chan = (struct ieee80211_channel *)setup->channel; +#endif + + n_bitrates = wiphy->bands[chan->band]->n_bitrates; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)) + rtw_get_chbw_from_cfg80211_chan_def(chdef, &ht, &ch, &bw, &offset); +#else + rtw_get_chbw_from_nl80211_channel_type(chan, setup->channel_type, &ht, &ch, &bw, &offset); +#endif + if (!ch) + goto exit; + +#if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + vht = ht && ch > 14 && bw >= CHANNEL_WIDTH_80; /* VHT40/VHT20? */ +#endif + + RTW_INFO(FUNC_ADPT_FMT" => ch:%u,%u,%u, ht:%u, vht:%u\n" + , FUNC_ADPT_ARG(adapter), ch, bw, offset, ht, vht); +#endif + + rsn_ie = rtw_get_ie(setup->ie, WLAN_EID_RSN, &rsn_ie_len, setup->ie_len); + if (rsn_ie && !rsn_ie_len) { + rtw_warn_on(1); + rsn_ie = NULL; + } + + len = _BEACON_IE_OFFSET_ + + 2 /* 0-length SSID */ + + (n_bitrates >= 8 ? 8 : n_bitrates) + 2 /* Supported Rates */ + + 3 /* DS parameter set */ + + 6 /* TIM */ + + (n_bitrates > 8 ? n_bitrates - 8 + 2 : 0) /* Extended Supported Rates */ + + (rsn_ie ? rsn_ie_len + 2 : 0) /* RSN */ + #if defined(CONFIG_80211N_HT) + + (ht ? HT_CAP_IE_LEN + 2 + HT_OP_IE_LEN + 2 : 0) /* HT */ + #endif + #if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + + (vht ? VHT_CAP_IE_LEN + 2 + VHT_OP_IE_LEN + 2 : 0) /* VHT */ + #endif + + minfo->mesh_id_len + 2 /* Mesh ID */ + + 9 /* Mesh configuration */ + ; + + ies = rtw_zmalloc(len); + if (!ies) + goto exit; + + /* timestamp */ + c = ies + 8; + + /* beacon interval */ + RTW_PUT_LE16(c , setup->beacon_interval); + c += 2; + + /* capability */ + if (rsn_ie) + *((u16 *)c) |= cpu_to_le16(cap_Privacy); + c += 2; + + /* SSID */ + c = rtw_set_ie(c, WLAN_EID_SSID, 0, NULL, NULL); + + /* Supported Rates */ + for (i = 0; i < n_bitrates; i++) { + supported_rates[i] = wiphy->bands[chan->band]->bitrates[i].bitrate / 5; + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + if (setup->basic_rates & BIT(i)) + #else + if (rtw_is_basic_rate_mix(supported_rates[i])) + #endif + supported_rates[i] |= IEEE80211_BASIC_RATE_MASK; + } + c = rtw_set_ie(c, WLAN_EID_SUPP_RATES, (n_bitrates >= 8 ? 8 : n_bitrates), supported_rates, NULL); + + /* DS parameter set */ + c = rtw_set_ie(c, WLAN_EID_DS_PARAMS, 1, &ch, NULL); + + /* TIM */ + *c = WLAN_EID_TIM; + *(c + 1) = 4; + c += 6; + //c = rtw_set_ie(c, _TIM_IE_, 4, NULL, NULL); + + /* Extended Supported Rates */ + if (n_bitrates > 8) + c = rtw_set_ie(c, WLAN_EID_EXT_SUPP_RATES, n_bitrates - 8, supported_rates + 8, NULL); + + /* RSN */ + if (rsn_ie) + c = rtw_set_ie(c, WLAN_EID_RSN, rsn_ie_len, rsn_ie + 2, NULL); + +#if defined(CONFIG_80211N_HT) + if (ht) { + struct ieee80211_sta_ht_cap *sta_ht_cap = &wiphy->bands[chan->band]->ht_cap; + u8 ht_cap[HT_CAP_IE_LEN]; + u8 ht_op[HT_OP_IE_LEN]; + + _rtw_memset(ht_cap, 0, HT_CAP_IE_LEN); + _rtw_memset(ht_op, 0, HT_OP_IE_LEN); + + /* WLAN_EID_HT_CAP */ + RTW_PUT_LE16(HT_CAP_ELE_CAP_INFO(ht_cap), sta_ht_cap->cap); + SET_HT_CAP_ELE_MAX_AMPDU_LEN_EXP(ht_cap, sta_ht_cap->ampdu_factor); + SET_HT_CAP_ELE_MIN_MPDU_S_SPACE(ht_cap, sta_ht_cap->ampdu_density); + _rtw_memcpy(HT_CAP_ELE_SUP_MCS_SET(ht_cap), &sta_ht_cap->mcs, 16); + c = rtw_set_ie(c, WLAN_EID_HT_CAP, HT_CAP_IE_LEN, ht_cap, NULL); + + /* WLAN_EID_HT_OPERATION */ + SET_HT_OP_ELE_PRI_CHL(ht_op, ch); + switch (offset) { + case HAL_PRIME_CHNL_OFFSET_LOWER: + SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op, SCA); + break; + case HAL_PRIME_CHNL_OFFSET_UPPER: + SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op, SCB); + break; + case HAL_PRIME_CHNL_OFFSET_DONT_CARE: + default: + SET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op, SCN); + break; + } + if (bw >= CHANNEL_WIDTH_40) + SET_HT_OP_ELE_STA_CHL_WIDTH(ht_op, 1); + else + SET_HT_OP_ELE_STA_CHL_WIDTH(ht_op, 0); + c = rtw_set_ie(c, WLAN_EID_HT_OPERATION, HT_OP_IE_LEN, ht_op, NULL); + } +#endif /* defined(CONFIG_80211N_HT) */ + +#if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + if (vht) { + struct ieee80211_sta_vht_cap *sta_vht_cap = &wiphy->bands[chan->band]->vht_cap; + u8 vht_cap[VHT_CAP_IE_LEN]; + u8 vht_op[VHT_OP_IE_LEN]; + u8 cch = rtw_get_center_ch(ch, bw, offset); + + _rtw_memset(vht_op, 0, VHT_OP_IE_LEN); + + /* WLAN_EID_VHT_CAPABILITY */ + _rtw_memcpy(vht_cap, &sta_vht_cap->cap, 4); + _rtw_memcpy(vht_cap + 4, &sta_vht_cap->vht_mcs, 8); + c = rtw_set_ie(c, WLAN_EID_VHT_CAPABILITY, VHT_CAP_IE_LEN, vht_cap, NULL); + + /* WLAN_EID_VHT_OPERATION */ + if (bw < CHANNEL_WIDTH_80) { + SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op, 0); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op, 0); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op, 0); + } else if (bw == CHANNEL_WIDTH_80) { + SET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op, 1); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op, cch); + SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op, 0); + } else { + RTW_ERR(FUNC_ADPT_FMT" unsupported BW:%u\n", FUNC_ADPT_ARG(adapter), bw); + rtw_warn_on(1); + rtw_mfree(ies, len); + goto exit; + } + + /* Hard code 1 stream, MCS0-7 is a min Basic VHT MCS rates */ + vht_op[3] = 0xfc; + vht_op[4] = 0xff; + c = rtw_set_ie(c, WLAN_EID_VHT_OPERATION, VHT_OP_IE_LEN, vht_op, NULL); + } +#endif /* defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) */ + + /* Mesh ID */ + c = rtw_set_ie_mesh_id(c, NULL, minfo->mesh_id, minfo->mesh_id_len); + + /* Mesh configuration */ + c = rtw_set_ie_mesh_config(c, NULL + , minfo->mesh_pp_id + , minfo->mesh_pm_id + , minfo->mesh_cc_id + , minfo->mesh_sp_id + , minfo->mesh_auth_id + , 0, 0, 0 + , 1 + , 0, 0 + , mcfg->dot11MeshForwarding + , 0, 0, 0 + ); + +#if DBG_RTW_CFG80211_MESH_CONF + RTW_INFO(FUNC_ADPT_FMT" ies_len:%u\n", FUNC_ADPT_ARG(adapter), len); + dump_ies(RTW_DBGDUMP, ies + _BEACON_IE_OFFSET_, len - _BEACON_IE_OFFSET_); +#endif + +exit: + if (ies) + *ies_len = len; + return ies; +} + +static int cfg80211_rtw_get_mesh_config(struct wiphy *wiphy, struct net_device *dev + , struct mesh_config *conf) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct rtw_mesh_cfg *mesh_cfg = &adapter->mesh_cfg; + int ret = 0; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); + + /* driver MPM */ + conf->dot11MeshRetryTimeout = 0; + conf->dot11MeshConfirmTimeout = 0; + conf->dot11MeshHoldingTimeout = 0; + conf->dot11MeshMaxPeerLinks = mesh_cfg->max_peer_links; + conf->dot11MeshMaxRetries = 0; + + conf->dot11MeshTTL = mesh_cfg->dot11MeshTTL; + conf->element_ttl = mesh_cfg->element_ttl; + + /* driver MPM */ + conf->auto_open_plinks = 0; + + /* TBD: synchronization */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + conf->dot11MeshNbrOffsetMaxNeighbor = 0; +#endif + + conf->dot11MeshHWMPmaxPREQretries = mesh_cfg->dot11MeshHWMPmaxPREQretries; + conf->path_refresh_time = mesh_cfg->path_refresh_time; + conf->min_discovery_timeout = mesh_cfg->min_discovery_timeout; + conf->dot11MeshHWMPactivePathTimeout = mesh_cfg->dot11MeshHWMPactivePathTimeout; + conf->dot11MeshHWMPpreqMinInterval = mesh_cfg->dot11MeshHWMPpreqMinInterval; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + conf->dot11MeshHWMPperrMinInterval = mesh_cfg->dot11MeshHWMPperrMinInterval; +#endif + conf->dot11MeshHWMPnetDiameterTraversalTime = mesh_cfg->dot11MeshHWMPnetDiameterTraversalTime; + conf->dot11MeshHWMPRootMode = mesh_cfg->dot11MeshHWMPRootMode; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + conf->dot11MeshHWMPRannInterval = mesh_cfg->dot11MeshHWMPRannInterval; +#endif + conf->dot11MeshGateAnnouncementProtocol = mesh_cfg->dot11MeshGateAnnouncementProtocol; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) + conf->dot11MeshForwarding = mesh_cfg->dot11MeshForwarding; + conf->rssi_threshold = mesh_cfg->rssi_threshold; +#endif + + /* TBD */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) + conf->ht_opmode = 0xffff; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + conf->dot11MeshHWMPactivePathToRootTimeout = mesh_cfg->dot11MeshHWMPactivePathToRootTimeout; + conf->dot11MeshHWMProotInterval = mesh_cfg->dot11MeshHWMProotInterval; + conf->dot11MeshHWMPconfirmationInterval = mesh_cfg->dot11MeshHWMPconfirmationInterval; +#endif + + /* TBD: power save */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + conf->power_mode = NL80211_MESH_POWER_ACTIVE; + conf->dot11MeshAwakeWindowDuration = 0; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + conf->plink_timeout = mesh_cfg->plink_timeout; +#endif + + return ret; +} + +static void rtw_mbss_info_change_notify(_adapter *adapter, bool minfo_changed, bool need_work) +{ + if (need_work) + rtw_mesh_work(&adapter->mesh_work); +} + +static int cfg80211_rtw_update_mesh_config(struct wiphy *wiphy, struct net_device *dev + , u32 mask, const struct mesh_config *nconf) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + int ret = 0; + bool minfo_changed = _FALSE, need_work = _FALSE; + + RTW_INFO(FUNC_ADPT_FMT" mask:0x%08x\n", FUNC_ADPT_ARG(adapter), mask); + + rtw_cfg80211_mesh_cfg_set(adapter, nconf, mask); + update_beacon(adapter, WLAN_EID_MESH_CONFIG, NULL, _TRUE); +#if CONFIG_RTW_MESH_CTO_MGATE_CARRIER + if (rtw_mesh_cto_mgate_required(adapter)) + rtw_netif_carrier_off(adapter->pnetdev); + else + rtw_netif_carrier_on(adapter->pnetdev); +#endif + need_work = rtw_ieee80211_mesh_root_setup(adapter); + + rtw_mbss_info_change_notify(adapter, minfo_changed, need_work); + + return ret; +} + +static int cfg80211_rtw_join_mesh(struct wiphy *wiphy, struct net_device *dev, + const struct mesh_config *conf, const struct mesh_setup *setup) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + u8 *ies = NULL; + uint ies_len; + int ret = 0; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); + +#if DBG_RTW_CFG80211_MESH_CONF + RTW_INFO(FUNC_ADPT_FMT" mesh_setup:\n", FUNC_ADPT_ARG(adapter)); + dump_mesh_setup(RTW_DBGDUMP, wiphy, setup); + RTW_INFO(FUNC_ADPT_FMT" mesh_config:\n", FUNC_ADPT_ARG(adapter)); + dump_mesh_config(RTW_DBGDUMP, conf); +#endif + + if (rtw_cfg80211_sync_iftype(adapter) != _SUCCESS) { + ret = -ENOTSUPP; + goto exit; + } + + /* initialization */ + rtw_mesh_init_mesh_info(adapter); + + /* apply cfg80211 settings*/ + rtw_cfg80211_mesh_info_set_profile(&adapter->mesh_info, setup); + rtw_cfg80211_mesh_cfg_set(adapter, conf, 0xFFFFFFFF); + + /* apply cfg80211 settings (join only) */ + rtw_mesh_cfg_init_max_peer_links(adapter, conf->dot11MeshMaxPeerLinks); + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + rtw_mesh_cfg_init_plink_timeout(adapter, conf->plink_timeout); + #endif + + rtw_ieee80211_mesh_root_setup(adapter); + + ies = rtw_cfg80211_construct_mesh_beacon_ies(wiphy, adapter, conf, setup, &ies_len); + if (!ies) { + ret = -EINVAL; + goto exit; + } + + /* start mbss */ + if (rtw_check_beacon_data(adapter, ies, ies_len) != _SUCCESS) { + ret = -EINVAL; + goto exit; + } + + rtw_mesh_work(&adapter->mesh_work); + +exit: + if (ies) + rtw_mfree(ies, ies_len); + if (ret) + rtw_mesh_deinit_mesh_info(adapter); + + return ret; +} + +static int cfg80211_rtw_leave_mesh(struct wiphy *wiphy, struct net_device *dev) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + int ret = 0; + + RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(adapter)); + + rtw_mesh_deinit_mesh_info(adapter); + + rtw_set_802_11_infrastructure_mode(adapter, Ndis802_11Infrastructure, 0); + rtw_setopmode_cmd(adapter, Ndis802_11Infrastructure, RTW_CMDF_WAIT_ACK); + + return ret; +} + +static int cfg80211_rtw_add_mpath(struct wiphy *wiphy, struct net_device *dev + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) + , const u8 *dst, const u8 *next_hop + #else + , u8 *dst, u8 *next_hop + #endif +) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct sta_priv *stapriv = &adapter->stapriv; + struct sta_info *sta; + struct rtw_mesh_path *mpath; + int ret = 0; + + rtw_rcu_read_lock(); + + sta = rtw_get_stainfo(stapriv, next_hop); + if (!sta) { + ret = -ENOENT; + goto exit; + } + + mpath = rtw_mesh_path_add(adapter, dst); + if (!mpath) { + ret = -ENOENT; + goto exit; + } + + rtw_mesh_path_fix_nexthop(mpath, sta); + +exit: + rtw_rcu_read_unlock(); + + return ret; +} + +static int cfg80211_rtw_del_mpath(struct wiphy *wiphy, struct net_device *dev + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) + , const u8 *dst + #else + , u8 *dst + #endif +) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + int ret = 0; + + if (dst) { + if (rtw_mesh_path_del(adapter, dst)) { + ret = -ENOENT; + goto exit; + } + } else { + rtw_mesh_path_flush_by_iface(adapter); + } + +exit: + return ret; +} + +static int cfg80211_rtw_change_mpath(struct wiphy *wiphy, struct net_device *dev + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) + , const u8 *dst, const u8 *next_hop + #else + , u8 *dst, u8 *next_hop + #endif +) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct sta_priv *stapriv = &adapter->stapriv; + struct sta_info *sta; + struct rtw_mesh_path *mpath; + int ret = 0; + + rtw_rcu_read_lock(); + + sta = rtw_get_stainfo(stapriv, next_hop); + if (!sta) { + ret = -ENOENT; + goto exit; + } + + mpath = rtw_mesh_path_lookup(adapter, dst); + if (!mpath) { + ret = -ENOENT; + goto exit; + } + + rtw_mesh_path_fix_nexthop(mpath, sta); + +exit: + rtw_rcu_read_unlock(); + + return ret; +} + +static void rtw_cfg80211_mpath_set_pinfo(struct rtw_mesh_path *mpath, u8 *next_hop, struct mpath_info *pinfo) +{ + struct sta_info *next_hop_sta = rtw_rcu_dereference(mpath->next_hop); + + if (next_hop_sta) + _rtw_memcpy(next_hop, next_hop_sta->cmn.mac_addr, ETH_ALEN); + else + _rtw_memset(next_hop, 0, ETH_ALEN); + + _rtw_memset(pinfo, 0, sizeof(*pinfo)); + + pinfo->generation = mpath->adapter->mesh_info.mesh_paths_generation; + + pinfo->filled = 0 + | MPATH_INFO_FRAME_QLEN + | MPATH_INFO_SN + | MPATH_INFO_METRIC + | MPATH_INFO_EXPTIME + | MPATH_INFO_DISCOVERY_TIMEOUT + | MPATH_INFO_DISCOVERY_RETRIES + | MPATH_INFO_FLAGS + ; + + pinfo->frame_qlen = mpath->frame_queue_len; + pinfo->sn = mpath->sn; + pinfo->metric = mpath->metric; + if (rtw_time_after(mpath->exp_time, rtw_get_current_time())) + pinfo->exptime = rtw_get_remaining_time_ms(mpath->exp_time); + pinfo->discovery_timeout = rtw_systime_to_ms(mpath->discovery_timeout); + pinfo->discovery_retries = mpath->discovery_retries; + if (mpath->flags & RTW_MESH_PATH_ACTIVE) + pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE; + if (mpath->flags & RTW_MESH_PATH_RESOLVING) + pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING; + if (mpath->flags & RTW_MESH_PATH_SN_VALID) + pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID; + if (mpath->flags & RTW_MESH_PATH_FIXED) + pinfo->flags |= NL80211_MPATH_FLAG_FIXED; + if (mpath->flags & RTW_MESH_PATH_RESOLVED) + pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED; +} + +static int cfg80211_rtw_get_mpath(struct wiphy *wiphy, struct net_device *dev, u8 *dst, u8 *next_hop, struct mpath_info *pinfo) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct rtw_mesh_path *mpath; + int ret = 0; + + rtw_rcu_read_lock(); + + mpath = rtw_mesh_path_lookup(adapter, dst); + if (!mpath) { + ret = -ENOENT; + goto exit; + } + + rtw_cfg80211_mpath_set_pinfo(mpath, next_hop, pinfo); + +exit: + rtw_rcu_read_unlock(); + + return ret; +} + +static int cfg80211_rtw_dump_mpath(struct wiphy *wiphy, struct net_device *dev, int idx, u8 *dst, u8 *next_hop, struct mpath_info *pinfo) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct rtw_mesh_path *mpath; + int ret = 0; + + rtw_rcu_read_lock(); + + mpath = rtw_mesh_path_lookup_by_idx(adapter, idx); + if (!mpath) { + ret = -ENOENT; + goto exit; + } + + _rtw_memcpy(dst, mpath->dst, ETH_ALEN); + rtw_cfg80211_mpath_set_pinfo(mpath, next_hop, pinfo); + +exit: + rtw_rcu_read_unlock(); + + return ret; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) +static void rtw_cfg80211_mpp_set_pinfo(struct rtw_mesh_path *mpath, u8 *mpp, struct mpath_info *pinfo) +{ + _rtw_memcpy(mpp, mpath->mpp, ETH_ALEN); + + _rtw_memset(pinfo, 0, sizeof(*pinfo)); + pinfo->generation = mpath->adapter->mesh_info.mpp_paths_generation; +} + +static int cfg80211_rtw_get_mpp(struct wiphy *wiphy, struct net_device *dev, u8 *dst, u8 *mpp, struct mpath_info *pinfo) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct rtw_mesh_path *mpath; + int ret = 0; + + rtw_rcu_read_lock(); + + mpath = rtw_mpp_path_lookup(adapter, dst); + if (!mpath) { + ret = -ENOENT; + goto exit; + } + + rtw_cfg80211_mpp_set_pinfo(mpath, mpp, pinfo); + +exit: + rtw_rcu_read_unlock(); + + return ret; +} + +static int cfg80211_rtw_dump_mpp(struct wiphy *wiphy, struct net_device *dev, int idx, u8 *dst, u8 *mpp, struct mpath_info *pinfo) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct rtw_mesh_path *mpath; + int ret = 0; + + rtw_rcu_read_lock(); + + mpath = rtw_mpp_path_lookup_by_idx(adapter, idx); + if (!mpath) { + ret = -ENOENT; + goto exit; + } + + _rtw_memcpy(dst, mpath->dst, ETH_ALEN); + rtw_cfg80211_mpp_set_pinfo(mpath, mpp, pinfo); + +exit: + rtw_rcu_read_unlock(); + + return ret; +} +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) */ + +#endif /* defined(CONFIG_RTW_MESH) */ + +#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) +static int cfg80211_rtw_sched_scan_start(struct wiphy *wiphy, + struct net_device *dev, + struct cfg80211_sched_scan_request *request) +{ + + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct cfg80211_ssid *ssids; + int n_ssids = 0; + int interval = 0; + int i = 0; + u8 ret; + + if (padapter->bup == _FALSE) { + RTW_INFO("%s: net device is down.\n", __func__); + return -EIO; + } + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE || + check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE || + check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + RTW_INFO("%s: device is busy.\n", __func__); + rtw_scan_abort(padapter); + } + + if (request == NULL) { + RTW_INFO("%s: invalid cfg80211_requests parameters.\n", __func__); + return -EINVAL; + } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0) + interval = request->scan_plans->interval; +#else + interval = request->interval; +#endif + n_ssids = request->n_match_sets; + ssids = (struct cfg80211_ssid *)rtw_zmalloc(n_ssids * sizeof(struct cfg80211_ssid)); + if(ssids == NULL) { + RTW_ERR("Fail to allocate ssids for PNO\n"); + return -ENOMEM; + } + for (i=0;in_match_sets;i++) { + ssids[i].ssid_len = request->match_sets[i].ssid.ssid_len; + memcpy(ssids[i].ssid, request->match_sets[i].ssid.ssid, + request->match_sets[i].ssid.ssid_len); + } +#else + interval = request->interval; + n_ssids = request->n_ssids; + ssids = request->ssids; +#endif +ret = rtw_android_cfg80211_pno_setup(dev, ssids, + n_ssids, interval); + if (ret < 0) { + RTW_INFO("%s ret: %d\n", __func__, ret); + goto exit; + } + + ret = rtw_android_pno_enable(dev, _TRUE); + if (ret < 0) { + RTW_INFO("%s ret: %d\n", __func__, ret); + goto exit; + } +exit: + return ret; +} + +static int cfg80211_rtw_sched_scan_stop(struct wiphy *wiphy, + struct net_device *dev) +{ + return rtw_android_pno_enable(dev, _FALSE); +} + +int cfg80211_rtw_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow) { + RTW_DBG("==> %s\n",__func__); + RTW_DBG("<== %s\n",__func__); + return 0; +} + +int cfg80211_rtw_resume(struct wiphy *wiphy) { + + _adapter *padapter; + struct pwrctrl_priv *pwrpriv; + struct mlme_priv *pmlmepriv; + padapter = wiphy_to_adapter(wiphy); + pwrpriv = adapter_to_pwrctl(padapter); + pmlmepriv = &padapter->mlmepriv; + struct sitesurvey_parm parm; + int i, len; + + + RTW_DBG("==> %s\n",__func__); + if (pwrpriv->wowlan_last_wake_reason == RX_PNO) { + + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + _irqL irqL; + int PNOWakeupScanWaitCnt = 0; + + rtw_cfg80211_disconnected(padapter->rtw_wdev, 0, NULL, 0, 1, GFP_ATOMIC); + + rtw_init_sitesurvey_parm(padapter, &parm); + for (i=0;ipnlo_info->ssid_num && i < RTW_SSID_SCAN_AMOUNT; i++) { + len = pwrpriv->pno_ssid_list->node[i].SSID_len; + _rtw_memcpy(&parm.ssid[i].Ssid, pwrpriv->pno_ssid_list->node[i].SSID, len); + parm.ssid[i].SsidLength = len; + } + parm.ssid_num = pwrpriv->pnlo_info->ssid_num; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + //This modification fix PNO wakeup reconnect issue with hidden SSID AP. + //rtw_sitesurvey_cmd(padapter, NULL); + rtw_sitesurvey_cmd(padapter, &parm); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + for (PNOWakeupScanWaitCnt = 0; PNOWakeupScanWaitCnt < 10; PNOWakeupScanWaitCnt++) { + if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _FALSE) + break; + rtw_msleep_os(1000); + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + cfg80211_sched_scan_results(padapter->rtw_wdev->wiphy); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + } + RTW_DBG("<== %s\n",__func__); + return 0; + +} +#endif /* CONFIG_PNO_SUPPORT */ + +static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 wps_oui[8] = {0x0, 0x50, 0xf2, 0x04}; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + RTW_INFO(FUNC_NDEV_FMT" ielen=%d\n", FUNC_NDEV_ARG(ndev), len); + + if (len > 0) { + wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen); + if (wps_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("bcn_wps_ielen=%d\n", wps_ielen); + #endif + + if (pmlmepriv->wps_beacon_ie) { + u32 free_len = pmlmepriv->wps_beacon_ie_len; + pmlmepriv->wps_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->wps_beacon_ie, free_len); + pmlmepriv->wps_beacon_ie = NULL; + } + + pmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen); + if (pmlmepriv->wps_beacon_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + _rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); + pmlmepriv->wps_beacon_ie_len = wps_ielen; + + update_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE); + + } + + /* buf += wps_ielen; */ + /* len -= wps_ielen; */ + + #ifdef CONFIG_P2P + p2p_ie = rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen); + if (p2p_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("bcn_p2p_ielen=%d\n", p2p_ielen); + #endif + + if (pmlmepriv->p2p_beacon_ie) { + u32 free_len = pmlmepriv->p2p_beacon_ie_len; + pmlmepriv->p2p_beacon_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_beacon_ie, free_len); + pmlmepriv->p2p_beacon_ie = NULL; + } + + pmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen); + if (pmlmepriv->p2p_beacon_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + _rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_beacon_ie_len = p2p_ielen; + + } + #endif /* CONFIG_P2P */ + + + #ifdef CONFIG_WFD + wfd_ie = rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen); + if (wfd_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("bcn_wfd_ielen=%d\n", wfd_ielen); + #endif + + if (rtw_mlme_update_wfd_ie_data(pmlmepriv, MLME_BEACON_IE, wfd_ie, wfd_ielen) != _SUCCESS) + return -EINVAL; + } + #endif /* CONFIG_WFD */ + + pmlmeext->bstart_bss = _TRUE; + + } + + return ret; + +} + +static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len) +{ + int ret = 0; + uint wps_ielen = 0; + u8 *wps_ie; + u32 p2p_ielen = 0; + u8 *p2p_ie; + u32 wfd_ielen = 0; + u8 *wfd_ie; + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, ielen=%d\n", __func__, len); +#endif + + if (len > 0) { + wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen); + if (wps_ie) { + uint attr_contentlen = 0; + u16 uconfig_method, *puconfig_method = NULL; + + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("probe_resp_wps_ielen=%d\n", wps_ielen); + #endif + + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) { + u8 sr = 0; + rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL); + + if (sr != 0) + RTW_INFO("%s, got sr\n", __func__); + else { + RTW_INFO("GO mode process WPS under site-survey, sr no set\n"); + return ret; + } + } + + if (pmlmepriv->wps_probe_resp_ie) { + u32 free_len = pmlmepriv->wps_probe_resp_ie_len; + pmlmepriv->wps_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len); + pmlmepriv->wps_probe_resp_ie = NULL; + } + + pmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen); + if (pmlmepriv->wps_probe_resp_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + + /* add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode */ + puconfig_method = (u16 *)rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen); + if (puconfig_method != NULL) { + /* struct registry_priv *pregistrypriv = &padapter->registrypriv; */ + struct wireless_dev *wdev = padapter->rtw_wdev; + + #ifdef CONFIG_DEBUG_CFG80211 + /* printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method)); */ + #endif + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + /* for WIFI-DIRECT LOGO 4.2.2, AUTO GO can't set PUSH_BUTTON flags */ + if (wdev->iftype == NL80211_IFTYPE_P2P_GO) { + uconfig_method = WPS_CM_PUSH_BUTTON; + uconfig_method = cpu_to_be16(uconfig_method); + + *puconfig_method &= ~uconfig_method; + } + #endif + } + + _rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); + pmlmepriv->wps_probe_resp_ie_len = wps_ielen; + + } + + /* buf += wps_ielen; */ + /* len -= wps_ielen; */ + + #ifdef CONFIG_P2P + p2p_ie = rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen); + if (p2p_ie) { + u8 is_GO = _FALSE; + u32 attr_contentlen = 0; + u16 cap_attr = 0; + + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("probe_resp_p2p_ielen=%d\n", p2p_ielen); + #endif + + /* Check P2P Capability ATTR */ + if (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8 *)&cap_attr, (uint *) &attr_contentlen)) { + u8 grp_cap = 0; + /* RTW_INFO( "[%s] Got P2P Capability Attr!!\n", __FUNCTION__ ); */ + cap_attr = le16_to_cpu(cap_attr); + grp_cap = (u8)((cap_attr >> 8) & 0xff); + + is_GO = (grp_cap & BIT(0)) ? _TRUE : _FALSE; + + if (is_GO) + RTW_INFO("Got P2P Capability Attr, grp_cap=0x%x, is_GO\n", grp_cap); + } + + + if (is_GO == _FALSE) { + if (pmlmepriv->p2p_probe_resp_ie) { + u32 free_len = pmlmepriv->p2p_probe_resp_ie_len; + pmlmepriv->p2p_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len); + pmlmepriv->p2p_probe_resp_ie = NULL; + } + + pmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen); + if (pmlmepriv->p2p_probe_resp_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; + } else { + if (pmlmepriv->p2p_go_probe_resp_ie) { + u32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len; + pmlmepriv->p2p_go_probe_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len); + pmlmepriv->p2p_go_probe_resp_ie = NULL; + } + + pmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen); + if (pmlmepriv->p2p_go_probe_resp_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + + } + _rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen); + pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; + } + + } + #endif /* CONFIG_P2P */ + + + #ifdef CONFIG_WFD + wfd_ie = rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen); + if (wfd_ie) { + #ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("probe_resp_wfd_ielen=%d\n", wfd_ielen); + #endif + + if (rtw_mlme_update_wfd_ie_data(pmlmepriv, MLME_PROBE_RESP_IE, wfd_ie, wfd_ielen) != _SUCCESS) + return -EINVAL; + } + #endif /* CONFIG_WFD */ + + } + + return ret; + +} + +static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len) +{ + int ret = 0; + _adapter *padapter = (_adapter *)rtw_netdev_priv(net); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 *ie; + u32 ie_len; + + RTW_INFO("%s, ielen=%d\n", __func__, len); + + if (len <= 0) + goto exit; + + ie = rtw_get_wps_ie(buf, len, NULL, &ie_len); + if (ie && ie_len) { + if (pmlmepriv->wps_assoc_resp_ie) { + u32 free_len = pmlmepriv->wps_assoc_resp_ie_len; + + pmlmepriv->wps_assoc_resp_ie_len = 0; + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len); + pmlmepriv->wps_assoc_resp_ie = NULL; + } + + pmlmepriv->wps_assoc_resp_ie = rtw_malloc(ie_len); + if (pmlmepriv->wps_assoc_resp_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + _rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, ie, ie_len); + pmlmepriv->wps_assoc_resp_ie_len = ie_len; + } + + ie = rtw_get_p2p_ie(buf, len, NULL, &ie_len); + if (ie && ie_len) { + if (pmlmepriv->p2p_assoc_resp_ie) { + u32 free_len = pmlmepriv->p2p_assoc_resp_ie_len; + + pmlmepriv->p2p_assoc_resp_ie_len = 0; + rtw_mfree(pmlmepriv->p2p_assoc_resp_ie, free_len); + pmlmepriv->p2p_assoc_resp_ie = NULL; + } + + pmlmepriv->p2p_assoc_resp_ie = rtw_malloc(ie_len); + if (pmlmepriv->p2p_assoc_resp_ie == NULL) { + RTW_INFO("%s()-%d: rtw_malloc() ERROR!\n", __FUNCTION__, __LINE__); + return -EINVAL; + } + _rtw_memcpy(pmlmepriv->p2p_assoc_resp_ie, ie, ie_len); + pmlmepriv->p2p_assoc_resp_ie_len = ie_len; + } + +#ifdef CONFIG_WFD + ie = rtw_get_wfd_ie(buf, len, NULL, &ie_len); + if (rtw_mlme_update_wfd_ie_data(pmlmepriv, MLME_ASSOC_RESP_IE, ie, ie_len) != _SUCCESS) + return -EINVAL; +#endif + +exit: + return ret; +} + +int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, + int type) +{ + int ret = 0; + uint wps_ielen = 0; + u32 p2p_ielen = 0; + +#ifdef CONFIG_DEBUG_CFG80211 + RTW_INFO("%s, ielen=%d\n", __func__, len); +#endif + + if ((rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen > 0)) + #ifdef CONFIG_P2P + || (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen > 0)) + #endif + ) { + if (net != NULL) { + switch (type) { + case 0x1: /* BEACON */ + ret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len); + break; + case 0x2: /* PROBE_RESP */ + ret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len); + #ifdef CONFIG_P2P + if (ret == 0) + adapter_wdev_data((_adapter *)rtw_netdev_priv(net))->probe_resp_ie_update_time = rtw_get_current_time(); + #endif + break; + case 0x4: /* ASSOC_RESP */ + ret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len); + break; + } + } + } + + return ret; + +} + +#ifdef CONFIG_80211N_HT +static void rtw_cfg80211_init_ht_capab_ex(_adapter *padapter + , struct ieee80211_sta_ht_cap *ht_cap, BAND_TYPE band, u8 rf_type) +{ + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 stbc_rx_enable = _FALSE; + + rtw_ht_use_default_setting(padapter); + + /* RX LDPC */ + if (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX)) + ht_cap->cap |= IEEE80211_HT_CAP_LDPC_CODING; + + /* TX STBC */ + if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) + ht_cap->cap |= IEEE80211_HT_CAP_TX_STBC; + + /* RX STBC */ + if (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) { + /*rtw_rx_stbc 0: disable, bit(0):enable 2.4g, bit(1):enable 5g*/ + if (band == BAND_ON_2_4G) + stbc_rx_enable = (pregistrypriv->rx_stbc & BIT(0)) ? _TRUE : _FALSE; + if (band == BAND_ON_5G) + stbc_rx_enable = (pregistrypriv->rx_stbc & BIT(1)) ? _TRUE : _FALSE; + + if (stbc_rx_enable) { + switch (rf_type) { + case RF_1T1R: + ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/*RX STBC One spatial stream*/ + break; + + case RF_2T2R: + case RF_1T2R: + ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/* Only one spatial-stream STBC RX is supported */ + break; + case RF_3T3R: + case RF_3T4R: + case RF_4T4R: + ht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/* Only one spatial-stream STBC RX is supported */ + break; + default: + RTW_INFO("[warning] rf_type %d is not expected\n", rf_type); + break; + } + } + } +} + +static void rtw_cfg80211_init_ht_capab(_adapter *padapter + , struct ieee80211_sta_ht_cap *ht_cap, BAND_TYPE band, u8 rf_type) +{ + struct registry_priv *regsty = &padapter->registrypriv; + struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter); + u8 rx_nss = 0; + + if (!regsty->ht_enable || !is_supported_ht(regsty->wireless_mode)) + return; + + ht_cap->ht_supported = 1; + + ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; + rtw_cfg80211_init_ht_capab_ex(padapter, ht_cap, band, rf_type); + + /* + *Maximum length of AMPDU that the STA can receive. + *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) + */ + ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; + + /*Minimum MPDU start spacing , */ + ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; + + ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; + + rx_nss = rtw_min(rf_type_to_rf_rx_cnt(rf_type), hal_spec->rx_nss_num); + switch (rx_nss) { + case 1: + ht_cap->mcs.rx_mask[0] = 0xFF; + break; + case 2: + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0xFF; + break; + case 3: + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0xFF; + ht_cap->mcs.rx_mask[2] = 0xFF; + break; + case 4: + ht_cap->mcs.rx_mask[0] = 0xFF; + ht_cap->mcs.rx_mask[1] = 0xFF; + ht_cap->mcs.rx_mask[2] = 0xFF; + ht_cap->mcs.rx_mask[3] = 0xFF; + break; + default: + rtw_warn_on(1); + RTW_INFO("%s, error rf_type=%d\n", __func__, rf_type); + }; + + ht_cap->mcs.rx_highest = cpu_to_le16( + rtw_mcs_rate(rf_type + , hal_is_bw_support(padapter, CHANNEL_WIDTH_40) + , hal_is_bw_support(padapter, CHANNEL_WIDTH_40) ? ht_cap->cap & IEEE80211_HT_CAP_SGI_40 : ht_cap->cap & IEEE80211_HT_CAP_SGI_20 + , ht_cap->mcs.rx_mask) / 10); +} +#endif /* CONFIG_80211N_HT */ + +#if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) +static void rtw_cfg80211_init_vht_capab(_adapter *padapter + , struct ieee80211_sta_vht_cap *sta_vht_cap, BAND_TYPE band, u8 rf_type) +{ + struct registry_priv *regsty = &padapter->registrypriv; + u8 vht_cap_ie[2 + 12] = {0}; + + if (!REGSTY_IS_11AC_ENABLE(regsty) || !is_supported_vht(regsty->wireless_mode)) + return; + + rtw_vht_use_default_setting(padapter); + rtw_build_vht_cap_ie(padapter, vht_cap_ie); + + sta_vht_cap->vht_supported = 1; + + _rtw_memcpy(&sta_vht_cap->cap, vht_cap_ie + 2, 4); + _rtw_memcpy(&sta_vht_cap->vht_mcs, vht_cap_ie + 2 + 4, 8); +} +#endif /* defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) */ + +void rtw_cfg80211_init_wdev_data(_adapter *padapter) +{ +#ifdef CONFIG_CONCURRENT_MODE + struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter); + + ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); +#endif +} + +void rtw_cfg80211_init_wiphy(_adapter *padapter) +{ + u8 rf_type; + struct ieee80211_supported_band *band; + struct wireless_dev *pwdev = padapter->rtw_wdev; + struct wiphy *wiphy = pwdev->wiphy; + + rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + RTW_INFO("%s:rf_type=%d\n", __func__, rf_type); + + if (IsSupported24G(padapter->registrypriv.wireless_mode)) { + band = wiphy->bands[NL80211_BAND_2GHZ]; + if (band) { + #if defined(CONFIG_80211N_HT) + rtw_cfg80211_init_ht_capab(padapter, &band->ht_cap, BAND_ON_2_4G, rf_type); + #endif + } + } +#ifdef CONFIG_IEEE80211_BAND_5GHZ + if (is_supported_5g(padapter->registrypriv.wireless_mode)) { + band = wiphy->bands[NL80211_BAND_5GHZ]; + if (band) { + #if defined(CONFIG_80211N_HT) + rtw_cfg80211_init_ht_capab(padapter, &band->ht_cap, BAND_ON_5G, rf_type); + #endif + #if defined(CONFIG_80211AC_VHT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + rtw_cfg80211_init_vht_capab(padapter, &band->vht_cap, BAND_ON_5G, rf_type); + #endif + } + } +#endif + + /* copy mac_addr to wiphy */ + _rtw_memcpy(wiphy->perm_addr, adapter_mac_addr(padapter), ETH_ALEN); + +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) +struct ieee80211_iface_limit rtw_limits[] = { + { + .max = 2, + .types = BIT(NL80211_IFTYPE_STATION) + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + #endif + }, + #ifdef CONFIG_AP_MODE + { + .max = 1, + .types = BIT(NL80211_IFTYPE_AP) + #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_GO) + #endif + }, + #endif + #if defined(RTW_DEDICATED_P2P_DEVICE) + { + .max = 1, + .types = BIT(NL80211_IFTYPE_P2P_DEVICE) + }, + #endif + #if defined(CONFIG_RTW_MESH) + { + .max = 1, + .types = BIT(NL80211_IFTYPE_MESH_POINT) + }, + #endif +}; + +struct ieee80211_iface_combination rtw_combinations[] = { + { + .limits = rtw_limits, + .n_limits = ARRAY_SIZE(rtw_limits), + #if defined(RTW_DEDICATED_P2P_DEVICE) + .max_interfaces = 3, + #else + .max_interfaces = 2, + #endif + .num_different_channels = 1, + }, +}; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) */ + +static void rtw_cfg80211_preinit_wiphy(_adapter *adapter, struct wiphy *wiphy) +{ + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct registry_priv *regsty = dvobj_to_regsty(dvobj); + + wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; + + wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; + wiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX; + wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; + +#if CONFIG_RTW_MACADDR_ACL && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + wiphy->max_acl_mac_addrs = NUM_ACL; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE) + wiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION; +#endif + + wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) + | BIT(NL80211_IFTYPE_ADHOC) +#ifdef CONFIG_AP_MODE + | BIT(NL80211_IFTYPE_AP) + #ifdef CONFIG_WIFI_MONITOR + | BIT(NL80211_IFTYPE_MONITOR) + #endif +#endif +#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE)) + | BIT(NL80211_IFTYPE_P2P_CLIENT) + | BIT(NL80211_IFTYPE_P2P_GO) + #if defined(RTW_DEDICATED_P2P_DEVICE) + | BIT(NL80211_IFTYPE_P2P_DEVICE) + #endif +#endif +#ifdef CONFIG_RTW_MESH + | BIT(NL80211_IFTYPE_MESH_POINT) /* 2.6.26 */ +#endif + ; + +#if defined(CONFIG_ANDROID) && !defined(RTW_SINGLE_WIPHY) + if (is_primary_adapter(adapter)) { + wiphy->interface_modes &= ~(BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_P2P_CLIENT)); + RTW_INFO("%s primary- don't set p2p capability\n", __func__); + } +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) +#ifdef CONFIG_AP_MODE + wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; +#endif /* CONFIG_AP_MODE */ +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + #ifdef CONFIG_WIFI_MONITOR + wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); + #endif +#endif + +#if defined(RTW_SINGLE_WIPHY) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + wiphy->iface_combinations = rtw_combinations; + wiphy->n_iface_combinations = ARRAY_SIZE(rtw_combinations); +#endif + + wiphy->cipher_suites = rtw_cipher_suites; + wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); + + if (IsSupported24G(adapter->registrypriv.wireless_mode)) + wiphy->bands[NL80211_BAND_2GHZ] = rtw_spt_band_alloc(BAND_ON_2_4G); + +#ifdef CONFIG_IEEE80211_BAND_5GHZ + if (is_supported_5g(adapter->registrypriv.wireless_mode)) + wiphy->bands[NL80211_BAND_5GHZ] = rtw_spt_band_alloc(BAND_ON_5G); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38) && LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)) + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; + wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; + /* remove WIPHY_FLAG_OFFCHAN_TX, because we not support this feature */ + /* wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; */ +#endif + +#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)) + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; +#ifdef CONFIG_PNO_SUPPORT + wiphy->max_sched_scan_ssids = MAX_PNO_LIST_COUNT; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) + wiphy->max_match_sets = MAX_PNO_LIST_COUNT; +#endif +#endif +#endif + +#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0)) + wiphy->wowlan = wowlan_stub; +#else + wiphy->wowlan = &wowlan_stub; +#endif +#endif + +#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; +#ifndef CONFIG_TDLS_DRIVER_SETUP + wiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP; /* Driver handles key exchange */ + wiphy->flags |= NL80211_ATTR_HT_CAPABILITY; +#endif /* CONFIG_TDLS_DRIVER_SETUP */ +#endif /* CONFIG_TDLS */ + + if (regsty->power_mgnt != PS_MODE_ACTIVE) + wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; + else + wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + /* wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM; */ +#endif + +#ifdef CONFIG_RTW_MESH + wiphy->flags |= 0 + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) + | WIPHY_FLAG_IBSS_RSN + #endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + | WIPHY_FLAG_MESH_AUTH + #endif + ; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) + wiphy->features |= 0 + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + | NL80211_FEATURE_USERSPACE_MPM + #endif + ; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0)) */ +#endif /* CONFIG_RTW_MESH */ + +#if (KERNEL_VERSION(3, 8, 0) <= LINUX_VERSION_CODE) + wiphy->features |= NL80211_FEATURE_SAE; +#endif +} + +#ifdef CONFIG_RFKILL_POLL +void rtw_cfg80211_init_rfkill(struct wiphy *wiphy) +{ + wiphy_rfkill_set_hw_state(wiphy, 0); + wiphy_rfkill_start_polling(wiphy); +} + +void rtw_cfg80211_deinit_rfkill(struct wiphy *wiphy) +{ + wiphy_rfkill_stop_polling(wiphy); +} + +static void cfg80211_rtw_rfkill_poll(struct wiphy *wiphy) +{ + _adapter *padapter = NULL; + bool blocked = _FALSE; + u8 valid = 0; + + padapter = wiphy_to_adapter(wiphy); + + if (adapter_to_dvobj(padapter)->processing_dev_remove == _TRUE) { + /*RTW_INFO("cfg80211_rtw_rfkill_poll: device is removed!\n");*/ + return; + } + + blocked = rtw_hal_rfkill_poll(padapter, &valid); + /*RTW_INFO("cfg80211_rtw_rfkill_poll: valid=%d, blocked=%d\n", + valid, blocked);*/ + + if (valid) + wiphy_rfkill_set_hw_state(wiphy, blocked); +} +#endif + +#if defined(CONFIG_RTW_HOSTAPD_ACS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)) + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) && (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)) +#define SURVEY_INFO_TIME SURVEY_INFO_CHANNEL_TIME +#define SURVEY_INFO_TIME_BUSY SURVEY_INFO_CHANNEL_TIME_BUSY +#define SURVEY_INFO_TIME_EXT_BUSY SURVEY_INFO_CHANNEL_TIME_EXT_BUSY +#define SURVEY_INFO_TIME_RX SURVEY_INFO_CHANNEL_TIME_RX +#define SURVEY_INFO_TIME_TX SURVEY_INFO_CHANNEL_TIME_TX +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL +static void rtw_cfg80211_set_survey_info_with_find_best_channel(struct wiphy *wiphy + , struct net_device *netdev, int idx, struct survey_info *info) +{ + _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev); + struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); + RT_CHANNEL_INFO *ch_set = rfctl->channel_set; + u8 ch_num = rfctl->max_chan_nums; + u32 total_rx_cnt = 0; + int i; + + s8 noise = -50; /*channel noise in dBm. This and all following fields are optional */ + u64 time = 100; /*amount of time in ms the radio was turn on (on the channel)*/ + u64 time_busy = 0; /*amount of time the primary channel was sensed busy*/ + + info->filled = SURVEY_INFO_NOISE_DBM + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) + | SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY + #endif + ; + + for (i = 0; i < ch_num; i++) + total_rx_cnt += ch_set[i].rx_count; + + time_busy = ch_set[idx].rx_count * time / total_rx_cnt; + noise += ch_set[idx].rx_count * 50 / total_rx_cnt; + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) + #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)) + info->channel_time = time; + info->channel_time_busy = time_busy; + #else + info->time = time; + info->time_busy = time_busy; + #endif +#endif + info->noise = noise; + + /* reset if final channel is got */ + if (idx == ch_num - 1) { + for (i = 0; i < ch_num; i++) + ch_set[i].rx_count = 0; + } +} +#endif /* CONFIG_FIND_BEST_CHANNEL */ + +#if defined(CONFIG_RTW_ACS) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) +static void rtw_cfg80211_set_survey_info_with_clm(PADAPTER padapter, int idx, struct survey_info *pinfo) +{ + s8 noise = -50; /*channel noise in dBm. This and all following fields are optional */ + u64 time = SURVEY_TO; /*amount of time in ms the radio was turn on (on the channel)*/ + u64 time_busy = 0; /*amount of time the primary channel was sensed busy*/ + u8 chan = (u8)idx; + + if ((idx < 0) || (pinfo == NULL)) + return; + + pinfo->filled = SURVEY_INFO_NOISE_DBM + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) + | SURVEY_INFO_TIME | SURVEY_INFO_TIME_BUSY + #endif + ; + + time_busy = rtw_acs_get_clm_ratio_by_ch_idx(padapter, chan); + noise = rtw_noise_query_by_chan_idx(padapter, chan); + /* RTW_INFO("%s: ch-idx:%d time=%llu(ms), time_busy=%llu(ms), noise=%d(dbm)\n", __func__, idx, time, time_busy, noise); */ + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) + #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)) + pinfo->channel_time = time; + pinfo->channel_time_busy = time_busy; + #else + pinfo->time = time; + pinfo->time_busy = time_busy; + #endif +#endif + pinfo->noise = noise; +} +#endif + +int rtw_hostapd_acs_dump_survey(struct wiphy *wiphy, struct net_device *netdev, int idx, struct survey_info *info) +{ + PADAPTER padapter = (_adapter *)rtw_netdev_priv(netdev); + struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); + RT_CHANNEL_INFO *pch_set = rfctl->channel_set; + u8 max_chan_nums = rfctl->max_chan_nums; + u32 freq = 0; + u8 ret = 0; + u16 channel = 0; + + if (!netdev || !info) { + RTW_INFO("%s: invial parameters.\n", __func__); + return -EINVAL; + } + + _rtw_memset(info, 0, sizeof(struct survey_info)); + if (padapter->bup == _FALSE) { + RTW_INFO("%s: net device is down.\n", __func__); + return -EIO; + } + + if (idx >= max_chan_nums) + return -ENOENT; + + channel = pch_set[idx].ChannelNum; + freq = rtw_ch2freq(channel); + info->channel = ieee80211_get_channel(wiphy, freq); + /* RTW_INFO("%s: channel %d, freq %d\n", __func__, channel, freq); */ + + if (!info->channel) + return -EINVAL; + + if (info->channel->flags == IEEE80211_CHAN_DISABLED) + return ret; + +#ifdef CONFIG_FIND_BEST_CHANNEL + rtw_cfg80211_set_survey_info_with_find_best_channel(wiphy, netdev, idx, info); +#elif defined(CONFIG_RTW_ACS) && defined(CONFIG_BACKGROUND_NOISE_MONITOR) + rtw_cfg80211_set_survey_info_with_clm(padapter, idx, info); +#else + RTW_ERR("%s: unknown acs operation!\n", __func__); +#endif + + return ret; +} +#endif /* defined(CONFIG_RTW_HOSTAPD_ACS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)) */ + +#if (KERNEL_VERSION(4, 17, 0) <= LINUX_VERSION_CODE) +int cfg80211_rtw_external_auth(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_external_auth_params *params) +{ + PADAPTER padapter = (_adapter *)rtw_netdev_priv(dev); + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(dev)); + + rtw_cfg80211_external_auth_status(wiphy, dev, + (struct rtw_external_auth_params *)params); + + return 0; +} +#endif + +void rtw_cfg80211_external_auth_status(struct wiphy *wiphy, struct net_device *dev, + struct rtw_external_auth_params *params) +{ + PADAPTER padapter = (_adapter *)rtw_netdev_priv(dev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta = NULL; + u8 *buf = NULL; + u32 len = 0; + _irqL irqL; + + RTW_INFO(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(dev)); + + RTW_INFO("SAE: action: %u, status: %u\n", params->action, params->status); + if (params->status == WLAN_STATUS_SUCCESS) { + RTW_INFO("bssid: "MAC_FMT"\n", MAC_ARG(params->bssid)); + RTW_INFO("SSID: [%s]\n", + ((params->ssid.ssid_len == 0) ? "" : (char *)params->ssid.ssid)); + RTW_INFO("suite: 0x%08x\n", params->key_mgmt_suite); + } + + psta = rtw_get_stainfo(pstapriv, params->bssid); + if (psta && (params->status == WLAN_STATUS_SUCCESS)) { + /* AP mode */ + RTW_INFO("station match\n"); + + psta->state &= ~WIFI_FW_AUTH_NULL; + psta->state |= WIFI_FW_AUTH_SUCCESS; + psta->expire_to = padapter->stapriv.assoc_to; + + if (params->pmkid != NULL) { + /* RTW_INFO_DUMP("PMKID:", params->pmkid, PMKID_LEN); */ + _rtw_set_pmksa(dev, params->bssid, params->pmkid); + } + + _enter_critical_bh(&psta->lock, &irqL); + if ((psta->auth_len != 0) && (psta->pauth_frame != NULL)) { + buf = rtw_zmalloc(psta->auth_len); + if (buf) { + _rtw_memcpy(buf, psta->pauth_frame, psta->auth_len); + len = psta->auth_len; + } + + rtw_mfree(psta->pauth_frame, psta->auth_len); + psta->pauth_frame = NULL; + psta->auth_len = 0; + } + _exit_critical_bh(&psta->lock, &irqL); + + if (buf) { + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + /* send the SAE auth Confirm */ + + rtw_ps_deny(padapter, PS_DENY_MGNT_TX); + if (_SUCCESS == rtw_pwr_wakeup(padapter)) { + rtw_mi_set_scan_deny(padapter, 1000); + rtw_mi_scan_abort(padapter, _TRUE); + + RTW_INFO("SAE: Tx auth Confirm\n"); + rtw_mgnt_tx_cmd(padapter, pmlmeext->cur_channel, 1, buf, len, 0, RTW_CMDF_DIRECTLY); + + rtw_mfree(buf, len); + buf = NULL; + len = 0; + } + rtw_ps_deny_cancel(padapter, PS_DENY_MGNT_TX); + } + } else { + /* STA mode */ + psecuritypriv->extauth_status = params->status; + } +} + +static struct cfg80211_ops rtw_cfg80211_ops = { + .change_virtual_intf = cfg80211_rtw_change_iface, + .add_key = cfg80211_rtw_add_key, + .get_key = cfg80211_rtw_get_key, + .del_key = cfg80211_rtw_del_key, + .set_default_key = cfg80211_rtw_set_default_key, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)) + .set_default_mgmt_key = cfg80211_rtw_set_default_mgmt_key, +#endif +#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) + .set_rekey_data = cfg80211_rtw_set_rekey_data, +#endif /*CONFIG_GTK_OL*/ + .get_station = cfg80211_rtw_get_station, + .scan = cfg80211_rtw_scan, + .set_wiphy_params = cfg80211_rtw_set_wiphy_params, + .connect = cfg80211_rtw_connect, + .disconnect = cfg80211_rtw_disconnect, + .join_ibss = cfg80211_rtw_join_ibss, + .leave_ibss = cfg80211_rtw_leave_ibss, + .set_tx_power = cfg80211_rtw_set_txpower, + .get_tx_power = cfg80211_rtw_get_txpower, + .set_power_mgmt = cfg80211_rtw_set_power_mgmt, + .set_pmksa = cfg80211_rtw_set_pmksa, + .del_pmksa = cfg80211_rtw_del_pmksa, + .flush_pmksa = cfg80211_rtw_flush_pmksa, + +#ifdef CONFIG_AP_MODE + .add_virtual_intf = cfg80211_rtw_add_virtual_intf, + .del_virtual_intf = cfg80211_rtw_del_virtual_intf, + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE) + .add_beacon = cfg80211_rtw_add_beacon, + .set_beacon = cfg80211_rtw_set_beacon, + .del_beacon = cfg80211_rtw_del_beacon, +#else + .start_ap = cfg80211_rtw_start_ap, + .change_beacon = cfg80211_rtw_change_beacon, + .stop_ap = cfg80211_rtw_stop_ap, +#endif + +#if CONFIG_RTW_MACADDR_ACL && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) + .set_mac_acl = cfg80211_rtw_set_mac_acl, +#endif + + .add_station = cfg80211_rtw_add_station, + .del_station = cfg80211_rtw_del_station, + .change_station = cfg80211_rtw_change_station, + .dump_station = cfg80211_rtw_dump_station, + .change_bss = cfg80211_rtw_change_bss, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)) + .set_txq_params = cfg80211_rtw_set_txq_params, +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) + .set_channel = cfg80211_rtw_set_channel, +#endif + /* .auth = cfg80211_rtw_auth, */ + /* .assoc = cfg80211_rtw_assoc, */ +#endif /* CONFIG_AP_MODE */ + +#if defined(CONFIG_RTW_MESH) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) + .get_mesh_config = cfg80211_rtw_get_mesh_config, + .update_mesh_config = cfg80211_rtw_update_mesh_config, + .join_mesh = cfg80211_rtw_join_mesh, + .leave_mesh = cfg80211_rtw_leave_mesh, + .add_mpath = cfg80211_rtw_add_mpath, + .del_mpath = cfg80211_rtw_del_mpath, + .change_mpath = cfg80211_rtw_change_mpath, + .get_mpath = cfg80211_rtw_get_mpath, + .dump_mpath = cfg80211_rtw_dump_mpath, + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) + .get_mpp = cfg80211_rtw_get_mpp, + .dump_mpp = cfg80211_rtw_dump_mpp, + #endif +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) + .set_monitor_channel = cfg80211_rtw_set_monitor_channel, +#endif + +#ifdef CONFIG_P2P + .remain_on_channel = cfg80211_rtw_remain_on_channel, + .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, + #if defined(RTW_DEDICATED_P2P_DEVICE) + .start_p2p_device = cfg80211_rtw_start_p2p_device, + .stop_p2p_device = cfg80211_rtw_stop_p2p_device, + #endif +#endif /* CONFIG_P2P */ + +#ifdef CONFIG_RTW_80211R + .update_ft_ies = cfg80211_rtw_update_ft_ies, +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE) + .mgmt_tx = cfg80211_rtw_mgmt_tx, + .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) + .action = cfg80211_rtw_mgmt_tx, +#endif + +#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) + .tdls_mgmt = cfg80211_rtw_tdls_mgmt, + .tdls_oper = cfg80211_rtw_tdls_oper, +#endif /* CONFIG_TDLS */ + +#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) + .sched_scan_start = cfg80211_rtw_sched_scan_start, + .sched_scan_stop = cfg80211_rtw_sched_scan_stop, + .suspend = cfg80211_rtw_suspend, + .resume = cfg80211_rtw_resume, +#endif /* CONFIG_PNO_SUPPORT */ +#ifdef CONFIG_RFKILL_POLL + .rfkill_poll = cfg80211_rtw_rfkill_poll, +#endif +#if defined(CONFIG_RTW_HOSTAPD_ACS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)) + .dump_survey = rtw_hostapd_acs_dump_survey, +#endif +#if (KERNEL_VERSION(4, 17, 0) <= LINUX_VERSION_CODE) + .external_auth = cfg80211_rtw_external_auth, +#endif +}; + +struct wiphy *rtw_wiphy_alloc(_adapter *padapter, struct device *dev) +{ + struct wiphy *wiphy; + struct rtw_wiphy_data *wiphy_data; + + /* wiphy */ + wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wiphy_data)); + if (!wiphy) { + RTW_INFO("Couldn't allocate wiphy device\n"); + goto exit; + } + set_wiphy_dev(wiphy, dev); + + /* wiphy_data */ + wiphy_data = rtw_wiphy_priv(wiphy); + wiphy_data->dvobj = adapter_to_dvobj(padapter); +#ifndef RTW_SINGLE_WIPHY + wiphy_data->adapter = padapter; +#endif + + rtw_cfg80211_preinit_wiphy(padapter, wiphy); + + RTW_INFO(FUNC_WIPHY_FMT"\n", FUNC_WIPHY_ARG(wiphy)); + +exit: + return wiphy; +} + +void rtw_wiphy_free(struct wiphy *wiphy) +{ + if (!wiphy) + return; + + RTW_INFO(FUNC_WIPHY_FMT"\n", FUNC_WIPHY_ARG(wiphy)); + + if (wiphy->bands[NL80211_BAND_2GHZ]) { + rtw_spt_band_free(wiphy->bands[NL80211_BAND_2GHZ]); + wiphy->bands[NL80211_BAND_2GHZ] = NULL; + } + if (wiphy->bands[NL80211_BAND_5GHZ]) { + rtw_spt_band_free(wiphy->bands[NL80211_BAND_5GHZ]); + wiphy->bands[NL80211_BAND_5GHZ] = NULL; + } + + wiphy_free(wiphy); +} + +int rtw_wiphy_register(struct wiphy *wiphy) +{ + RTW_INFO(FUNC_WIPHY_FMT"\n", FUNC_WIPHY_ARG(wiphy)); + +#if ( ((LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)) && \ + LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) \ + || defined(RTW_VENDOR_EXT_SUPPORT) ) + rtw_cfgvendor_attach(wiphy); +#endif + + rtw_regd_init(wiphy); + + return wiphy_register(wiphy); +} + +void rtw_wiphy_unregister(struct wiphy *wiphy) +{ + RTW_INFO(FUNC_WIPHY_FMT"\n", FUNC_WIPHY_ARG(wiphy)); + +#if ( ((LINUX_VERSION_CODE < KERNEL_VERSION(5, 3, 0)) && \ + LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) \ + || defined(RTW_VENDOR_EXT_SUPPORT) ) + rtw_cfgvendor_detach(wiphy); +#endif + + #if defined(RTW_DEDICATED_P2P_DEVICE) + rtw_pd_iface_free(wiphy); + #endif + + return wiphy_unregister(wiphy); +} + +int rtw_wdev_alloc(_adapter *padapter, struct wiphy *wiphy) +{ + int ret = 0; + struct net_device *pnetdev = padapter->pnetdev; + struct wireless_dev *wdev; + struct rtw_wdev_priv *pwdev_priv; + + RTW_INFO("%s(padapter=%p)\n", __func__, padapter); + + /* wdev */ + wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev)); + if (!wdev) { + RTW_INFO("Couldn't allocate wireless device\n"); + ret = -ENOMEM; + goto exit; + } + wdev->wiphy = wiphy; + wdev->netdev = pnetdev; + wdev->iftype = NL80211_IFTYPE_STATION; + padapter->rtw_wdev = wdev; + pnetdev->ieee80211_ptr = wdev; + + /* init pwdev_priv */ + pwdev_priv = adapter_wdev_data(padapter); + pwdev_priv->rtw_wdev = wdev; + pwdev_priv->pmon_ndev = NULL; + pwdev_priv->ifname_mon[0] = '\0'; + pwdev_priv->padapter = padapter; + pwdev_priv->scan_request = NULL; + _rtw_spinlock_init(&pwdev_priv->scan_req_lock); + pwdev_priv->connect_req = NULL; + _rtw_spinlock_init(&pwdev_priv->connect_req_lock); + + pwdev_priv->p2p_enabled = _FALSE; + pwdev_priv->probe_resp_ie_update_time = rtw_get_current_time(); + pwdev_priv->provdisc_req_issued = _FALSE; + rtw_wdev_invit_info_init(&pwdev_priv->invit_info); + rtw_wdev_nego_info_init(&pwdev_priv->nego_info); + + pwdev_priv->bandroid_scan = _FALSE; + + if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) + pwdev_priv->power_mgmt = _TRUE; + else + pwdev_priv->power_mgmt = _FALSE; + + _rtw_mutex_init(&pwdev_priv->roch_mutex); + +#ifdef CONFIG_CONCURRENT_MODE + ATOMIC_SET(&pwdev_priv->switch_ch_to, 1); +#endif + +#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR + pwdev_priv->rssi_monitor_enable = 0; + pwdev_priv->rssi_monitor_max = 0; + pwdev_priv->rssi_monitor_min = 0; +#endif + + +exit: + return ret; +} + +void rtw_wdev_free(struct wireless_dev *wdev) +{ + if (!wdev) + return; + + RTW_INFO("%s(wdev=%p)\n", __func__, wdev); + + if (wdev_to_ndev(wdev)) { + _adapter *adapter = (_adapter *)rtw_netdev_priv(wdev_to_ndev(wdev)); + struct rtw_wdev_priv *wdev_priv = adapter_wdev_data(adapter); + _irqL irqL; + + _rtw_spinlock_free(&wdev_priv->scan_req_lock); + + _enter_critical_bh(&wdev_priv->connect_req_lock, &irqL); + rtw_wdev_free_connect_req(wdev_priv); + _exit_critical_bh(&wdev_priv->connect_req_lock, &irqL); + _rtw_spinlock_free(&wdev_priv->connect_req_lock); + + _rtw_mutex_free(&wdev_priv->roch_mutex); + } + + rtw_mfree((u8 *)wdev, sizeof(struct wireless_dev)); +} + +void rtw_wdev_unregister(struct wireless_dev *wdev) +{ + struct net_device *ndev; + _adapter *adapter; + struct rtw_wdev_priv *pwdev_priv; + + if (!wdev) + return; + + RTW_INFO("%s(wdev=%p)\n", __func__, wdev); + + ndev = wdev_to_ndev(wdev); + if (!ndev) + return; + + adapter = (_adapter *)rtw_netdev_priv(ndev); + pwdev_priv = adapter_wdev_data(adapter); + + rtw_cfg80211_indicate_scan_done(adapter, _TRUE); + + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE) + if (wdev->current_bss) { + RTW_INFO(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter)); + rtw_cfg80211_indicate_disconnect(adapter, 0, 1); + } + #endif + + if (pwdev_priv->pmon_ndev) { + RTW_INFO("%s, unregister monitor interface\n", __func__); + unregister_netdev(pwdev_priv->pmon_ndev); + } +} + +int rtw_cfg80211_ndev_res_alloc(_adapter *adapter) +{ + int ret = _FAIL; + +#if !defined(RTW_SINGLE_WIPHY) + struct wiphy *wiphy; + struct device *dev = dvobj_to_dev(adapter_to_dvobj(adapter)); + + wiphy = rtw_wiphy_alloc(adapter, dev); + if (wiphy == NULL) + goto exit; + + adapter->wiphy = wiphy; +#endif + + if (rtw_wdev_alloc(adapter, adapter_to_wiphy(adapter)) == 0) + ret = _SUCCESS; + +#if !defined(RTW_SINGLE_WIPHY) + if (ret != _SUCCESS) { + rtw_wiphy_free(wiphy); + adapter->wiphy = NULL; + } +#endif + +exit: + return ret; +} + +void rtw_cfg80211_ndev_res_free(_adapter *adapter) +{ + rtw_wdev_free(adapter->rtw_wdev); + adapter->rtw_wdev = NULL; +#if !defined(RTW_SINGLE_WIPHY) + rtw_wiphy_free(adapter_to_wiphy(adapter)); + adapter->wiphy = NULL; +#endif +} + +int rtw_cfg80211_ndev_res_register(_adapter *adapter) +{ + int ret = _FAIL; + +#if !defined(RTW_SINGLE_WIPHY) + if (rtw_wiphy_register(adapter_to_wiphy(adapter)) < 0) { + RTW_INFO("%s rtw_wiphy_register fail for if%d\n", __func__, (adapter->iface_id + 1)); + goto exit; + } + +#ifdef CONFIG_RFKILL_POLL + rtw_cfg80211_init_rfkill(adapter_to_wiphy(adapter)); +#endif +#endif + + ret = _SUCCESS; + +exit: + return ret; +} + +void rtw_cfg80211_ndev_res_unregister(_adapter *adapter) +{ + rtw_wdev_unregister(adapter->rtw_wdev); +} + +int rtw_cfg80211_dev_res_alloc(struct dvobj_priv *dvobj) +{ + int ret = _FAIL; + +#if defined(RTW_SINGLE_WIPHY) + struct wiphy *wiphy; + struct device *dev = dvobj_to_dev(dvobj); + + wiphy = rtw_wiphy_alloc(dvobj_get_primary_adapter(dvobj), dev); + if (wiphy == NULL) + goto exit; + + dvobj->wiphy = wiphy; +#endif + + ret = _SUCCESS; + +exit: + return ret; +} + +void rtw_cfg80211_dev_res_free(struct dvobj_priv *dvobj) +{ +#if defined(RTW_SINGLE_WIPHY) + rtw_wiphy_free(dvobj_to_wiphy(dvobj)); + dvobj->wiphy = NULL; +#endif +} + +int rtw_cfg80211_dev_res_register(struct dvobj_priv *dvobj) +{ + int ret = _FAIL; + +#if defined(RTW_SINGLE_WIPHY) + if (rtw_wiphy_register(dvobj_to_wiphy(dvobj)) != 0) + goto exit; + +#ifdef CONFIG_RFKILL_POLL + rtw_cfg80211_init_rfkill(dvobj_to_wiphy(dvobj)); +#endif +#endif + + ret = _SUCCESS; + +exit: + return ret; +} + +void rtw_cfg80211_dev_res_unregister(struct dvobj_priv *dvobj) +{ +#if defined(RTW_SINGLE_WIPHY) +#ifdef CONFIG_RFKILL_POLL + rtw_cfg80211_deinit_rfkill(dvobj_to_wiphy(dvobj)); +#endif + rtw_wiphy_unregister(dvobj_to_wiphy(dvobj)); +#endif +} + +#endif /* CONFIG_IOCTL_CFG80211 */