From 7827d00e29334f5801b92ad83924f07c673c2015 Mon Sep 17 00:00:00 2001 From: Paolo Sabatino Date: Sun, 22 Jan 2023 14:13:39 +0000 Subject: [PATCH] adjust uwe5622 driver for rockchip --- drivers/net/wireless/uwe5622/Kconfig | 3 +- drivers/net/wireless/uwe5622/Makefile | 2 +- drivers/net/wireless/uwe5622/tty-sdio/Kconfig | 0 .../net/wireless/uwe5622/tty-sdio/Makefile | 9 +- .../wireless/uwe5622/tty-sdio/Makefile.old | 31 + .../uwe5622/tty-sdio/alignment/sitm.c | 0 .../uwe5622/tty-sdio/alignment/sitm.h | 0 drivers/net/wireless/uwe5622/tty-sdio/dump.c | 4 +- drivers/net/wireless/uwe5622/tty-sdio/dump.h | 0 drivers/net/wireless/uwe5622/tty-sdio/lpm.c | 4 - drivers/net/wireless/uwe5622/tty-sdio/lpm.h | 0 .../net/wireless/uwe5622/tty-sdio/rfkill.c | 0 .../net/wireless/uwe5622/tty-sdio/rfkill.h | 0 drivers/net/wireless/uwe5622/tty-sdio/tty.c | 0 drivers/net/wireless/uwe5622/tty-sdio/tty.h | 0 drivers/net/wireless/uwe5622/tty-sdio/woble.c | 0 drivers/net/wireless/uwe5622/tty-sdio/woble.h | 0 .../net/wireless/uwe5622/unisocwcn/Kconfig | 0 .../net/wireless/uwe5622/unisocwcn/Makefile | 4 +- .../wireless/uwe5622/unisocwcn/boot/Kconfig | 0 .../wireless/uwe5622/unisocwcn/boot/Makefile | 6 +- .../unisocwcn/boot/gnss_firmware_bin.h | 0 .../unisocwcn/boot/marlin_firmware_bin.h | 0 .../uwe5622/unisocwcn/boot/wcn_integrate.c | 52 +- .../uwe5622/unisocwcn/boot/wcn_integrate.h | 0 .../unisocwcn/boot/wcn_integrate_boot.c | 35 +- .../unisocwcn/boot/wcn_integrate_boot.h | 0 .../unisocwcn/boot/wcn_integrate_dev.c | 22 +- .../unisocwcn/boot/wcn_integrate_dev.h | 0 .../wireless/uwe5622/unisocwcn/fw/bin2hex.c | 0 .../uwe5622/unisocwcn/fw/firmware_hex.h | 0 .../uwe5622/unisocwcn/fw/usb_fdl.bin.hex | 0 .../wireless/uwe5622/unisocwcn/fw/version.txt | 0 .../uwe5622/unisocwcn/fw/wcnmodem.bin.hex | 0 .../wireless/uwe5622/unisocwcn/gnss/Kconfig | 0 .../wireless/uwe5622/unisocwcn/gnss/Makefile | 0 .../uwe5622/unisocwcn/include/bus_common.h | 0 .../unisocwcn/include/marlin_platform.h | 3 +- .../wireless/uwe5622/unisocwcn/include/mchn.h | 0 .../uwe5622/unisocwcn/include/uwe5621_glb.h | 0 .../uwe5622/unisocwcn/include/uwe5622_glb.h | 0 .../uwe5622/unisocwcn/include/uwe5623_glb.h | 0 .../uwe5622/unisocwcn/include/uwe562x_glb.h | 5 + .../include/vendor/hisilicon/hi_drv_gpio.h | 0 .../include/vendor/hisilicon/hi_type.h | 0 .../uwe5622/unisocwcn/include/wcn_bus.h | 0 .../uwe5622/unisocwcn/include/wcn_glb.h | 0 .../uwe5622/unisocwcn/include/wcn_glb_reg.h | 0 .../uwe5622/unisocwcn/include/wcn_types.h | 0 .../uwe5622/unisocwcn/include/wcn_wrapper.h | 20 + .../wireless/uwe5622/unisocwcn/log/Kconfig | 0 .../wireless/uwe5622/unisocwcn/log/Makefile | 0 .../wireless/uwe5622/unisocwcn/pcie/Kconfig | 0 .../wireless/uwe5622/unisocwcn/pcie/Makefile | 0 .../uwe5622/unisocwcn/pcie/edma_engine.c | 0 .../uwe5622/unisocwcn/pcie/edma_engine.h | 0 .../uwe5622/unisocwcn/pcie/edma_test.c | 0 .../wireless/uwe5622/unisocwcn/pcie/ioctl.c | 0 .../wireless/uwe5622/unisocwcn/pcie/ioctl.h | 0 .../wireless/uwe5622/unisocwcn/pcie/mchn.c | 0 .../wireless/uwe5622/unisocwcn/pcie/mchn.h | 0 .../wireless/uwe5622/unisocwcn/pcie/pcie.c | 0 .../wireless/uwe5622/unisocwcn/pcie/pcie.h | 0 .../uwe5622/unisocwcn/pcie/pcie_attach_bus.c | 0 .../uwe5622/unisocwcn/pcie/pcie_dbg.c | 0 .../uwe5622/unisocwcn/pcie/pcie_dbg.h | 0 .../uwe5622/unisocwcn/platform/Kconfig | 0 .../uwe5622/unisocwcn/platform/Makefile | 0 .../uwe5622/unisocwcn/platform/bufring.c | 3 +- .../uwe5622/unisocwcn/platform/bufring.h | 0 .../unisocwcn/platform/gnss/gnss_common.h | 0 .../unisocwcn/platform/gnss/gnss_common_ctl.c | 0 .../unisocwcn/platform/gnss/gnss_dbg.c | 0 .../unisocwcn/platform/gnss/gnss_dump.c | 0 .../unisocwcn/platform/gnss/gnss_dump.h | 0 .../platform/gnss/gnss_pmnotify_ctl.c | 0 .../uwe5622/unisocwcn/platform/loopcheck.c | 10 +- .../uwe5622/unisocwcn/platform/loopcheck.h | 0 .../uwe5622/unisocwcn/platform/mdbg_type.h | 0 .../uwe5622/unisocwcn/platform/mem_pd_mgr.c | 21 +- .../uwe5622/unisocwcn/platform/mem_pd_mgr.h | 0 .../uwe5622/unisocwcn/platform/pcie_boot.c | 2 - .../uwe5622/unisocwcn/platform/pcie_boot.h | 0 .../uwe5622/unisocwcn/platform/rdc_debug.c | 0 .../uwe5622/unisocwcn/platform/rdc_debug.h | 0 .../uwe5622/unisocwcn/platform/rf/rf.c | 22 +- .../uwe5622/unisocwcn/platform/rf/rf.h | 0 .../uwe5622/unisocwcn/platform/usb_boot.c | 0 .../uwe5622/unisocwcn/platform/usb_boot.h | 0 .../unisocwcn/platform/wcn_bind_helper.c | 1444 +++++++++++++++++ .../uwe5622/unisocwcn/platform/wcn_boot.c | 62 +- .../uwe5622/unisocwcn/platform/wcn_debugfs.c | 8 +- .../uwe5622/unisocwcn/platform/wcn_dump.c | 112 +- .../uwe5622/unisocwcn/platform/wcn_dump.h | 0 .../unisocwcn/platform/wcn_dump_integrate.c | 2 +- .../unisocwcn/platform/wcn_dump_integrate.h | 0 .../uwe5622/unisocwcn/platform/wcn_gnss.h | 0 .../uwe5622/unisocwcn/platform/wcn_log.c | 0 .../uwe5622/unisocwcn/platform/wcn_log.h | 0 .../uwe5622/unisocwcn/platform/wcn_misc.c | 13 +- .../uwe5622/unisocwcn/platform/wcn_misc.h | 0 .../uwe5622/unisocwcn/platform/wcn_op.c | 0 .../uwe5622/unisocwcn/platform/wcn_op.h | 0 .../unisocwcn/platform/wcn_parn_parser.c | 4 +- .../unisocwcn/platform/wcn_parn_parser.h | 0 .../uwe5622/unisocwcn/platform/wcn_procfs.c | 15 +- .../uwe5622/unisocwcn/platform/wcn_procfs.h | 0 .../uwe5622/unisocwcn/platform/wcn_swd_dp.c | 0 .../uwe5622/unisocwcn/platform/wcn_swd_dp.h | 0 .../uwe5622/unisocwcn/platform/wcn_txrx.c | 0 .../uwe5622/unisocwcn/platform/wcn_txrx.h | 0 .../wireless/uwe5622/unisocwcn/sdio/Kconfig | 0 .../wireless/uwe5622/unisocwcn/sdio/Makefile | 0 .../wireless/uwe5622/unisocwcn/sdio/sdio_v3.c | 16 +- .../wireless/uwe5622/unisocwcn/sdio/sdiohal.h | 2 +- .../uwe5622/unisocwcn/sdio/sdiohal_common.c | 0 .../uwe5622/unisocwcn/sdio/sdiohal_ctl.c | 0 .../uwe5622/unisocwcn/sdio/sdiohal_main.c | 19 +- .../uwe5622/unisocwcn/sdio/sdiohal_rx.c | 2 +- .../uwe5622/unisocwcn/sdio/sdiohal_tx.c | 2 +- .../wireless/uwe5622/unisocwcn/sipc/Kconfig | 0 .../wireless/uwe5622/unisocwcn/sipc/Makefile | 0 .../uwe5622/unisocwcn/sipc/wcn_sipc.c | 0 .../uwe5622/unisocwcn/sipc/wcn_sipc.h | 0 .../wireless/uwe5622/unisocwcn/sleep/Kconfig | 0 .../wireless/uwe5622/unisocwcn/sleep/Makefile | 0 .../uwe5622/unisocwcn/sleep/sdio_int.c | 0 .../uwe5622/unisocwcn/sleep/sdio_int.h | 0 .../uwe5622/unisocwcn/sleep/slp_mgr.c | 0 .../uwe5622/unisocwcn/sleep/slp_mgr.h | 0 .../uwe5622/unisocwcn/sleep/slp_pcie.c | 0 .../uwe5622/unisocwcn/sleep/slp_pcie.h | 0 .../uwe5622/unisocwcn/sleep/slp_sdio.c | 1 + .../uwe5622/unisocwcn/sleep/slp_sdio.h | 1 + .../uwe5622/unisocwcn/sleep/slp_test.c | 0 .../wireless/uwe5622/unisocwcn/tool/Kconfig | 0 .../wireless/uwe5622/unisocwcn/tool/Makefile | 0 .../unisocwcn/tool/cp2log_config/readme.txt | 0 .../cp2log_config/unisoc_cp2log_config.txt | 0 .../wireless/uwe5622/unisocwcn/usb/Kconfig | 0 .../wireless/uwe5622/unisocwcn/usb/Makefile | 0 .../wireless/uwe5622/unisocwcn/usb/wcn_usb.c | 0 .../wireless/uwe5622/unisocwcn/usb/wcn_usb.h | 0 .../uwe5622/unisocwcn/usb/wcn_usb_download.c | 8 +- .../uwe5622/unisocwcn/usb/wcn_usb_io.c | 0 .../uwe5622/unisocwcn/usb/wcn_usb_rx_tx.c | 0 .../uwe5622/unisocwcn/usb/wcn_usb_store.c | 0 .../uwe5622/unisocwcn/usb/wcn_usb_test.c | 4 - .../net/wireless/uwe5622/unisocwcn/vm/Kconfig | 0 .../wireless/uwe5622/unisocwcn/vm/Makefile | 0 .../net/wireless/uwe5622/unisocwcn/wcn_bus.c | 0 drivers/net/wireless/uwe5622/unisocwifi/11h.c | 10 +- drivers/net/wireless/uwe5622/unisocwifi/11h.h | 0 .../wireless/uwe5622/unisocwifi/Android.mk | 0 .../net/wireless/uwe5622/unisocwifi/Kconfig | 0 .../net/wireless/uwe5622/unisocwifi/Makefile | 0 .../wireless/uwe5622/unisocwifi/api_version.c | 4 - .../wireless/uwe5622/unisocwifi/cfg80211.c | 63 +- .../wireless/uwe5622/unisocwifi/cfg80211.h | 0 .../net/wireless/uwe5622/unisocwifi/cmdevt.c | 251 +-- .../net/wireless/uwe5622/unisocwifi/cmdevt.h | 0 .../uwe5622/unisocwifi/dbg_ini_util.c | 0 .../uwe5622/unisocwifi/dbg_ini_util.h | 0 .../net/wireless/uwe5622/unisocwifi/debug.c | 0 .../net/wireless/uwe5622/unisocwifi/debug.h | 0 .../net/wireless/uwe5622/unisocwifi/defrag.c | 0 .../net/wireless/uwe5622/unisocwifi/defrag.h | 0 .../wireless/uwe5622/unisocwifi/edma_test.c | 0 .../wireless/uwe5622/unisocwifi/edma_test.h | 0 .../net/wireless/uwe5622/unisocwifi/ibss.c | 0 .../net/wireless/uwe5622/unisocwifi/ibss.h | 0 .../net/wireless/uwe5622/unisocwifi/intf.h | 20 +- .../wireless/uwe5622/unisocwifi/intf_ops.h | 22 - .../net/wireless/uwe5622/unisocwifi/main.c | 12 +- drivers/net/wireless/uwe5622/unisocwifi/mm.c | 0 drivers/net/wireless/uwe5622/unisocwifi/mm.h | 0 drivers/net/wireless/uwe5622/unisocwifi/msg.c | 2 - drivers/net/wireless/uwe5622/unisocwifi/msg.h | 2 - drivers/net/wireless/uwe5622/unisocwifi/nan.c | 0 drivers/net/wireless/uwe5622/unisocwifi/nan.h | 0 drivers/net/wireless/uwe5622/unisocwifi/npi.c | 18 +- drivers/net/wireless/uwe5622/unisocwifi/npi.h | 0 drivers/net/wireless/uwe5622/unisocwifi/qos.c | 53 +- drivers/net/wireless/uwe5622/unisocwifi/qos.h | 4 +- .../wireless/uwe5622/unisocwifi/reg_domain.c | 0 .../wireless/uwe5622/unisocwifi/reg_domain.h | 0 .../net/wireless/uwe5622/unisocwifi/reorder.c | 0 .../net/wireless/uwe5622/unisocwifi/reorder.h | 0 .../wireless/uwe5622/unisocwifi/rf_marlin3.c | 4 +- .../wireless/uwe5622/unisocwifi/rf_marlin3.h | 0 .../wireless/uwe5622/unisocwifi/rfkill-bt.c | 825 ++++++++++ .../wireless/uwe5622/unisocwifi/rfkill-wlan.c | 971 +++++++++++ .../uwe5622/unisocwifi/rnd_mac_addr.c | 0 .../uwe5622/unisocwifi/rnd_mac_addr.h | 0 drivers/net/wireless/uwe5622/unisocwifi/rtt.c | 0 drivers/net/wireless/uwe5622/unisocwifi/rtt.h | 0 .../net/wireless/uwe5622/unisocwifi/rx_msg.c | 10 - .../net/wireless/uwe5622/unisocwifi/rx_msg.h | 0 .../wireless/uwe5622/unisocwifi/softap_hook.c | 0 .../wireless/uwe5622/unisocwifi/softap_hook.h | 0 .../net/wireless/uwe5622/unisocwifi/sprdwl.h | 2 - .../net/wireless/uwe5622/unisocwifi/tcp_ack.c | 0 .../net/wireless/uwe5622/unisocwifi/tcp_ack.h | 0 .../net/wireless/uwe5622/unisocwifi/tracer.c | 0 .../net/wireless/uwe5622/unisocwifi/tracer.h | 0 .../net/wireless/uwe5622/unisocwifi/tx_msg.c | 10 +- .../net/wireless/uwe5622/unisocwifi/tx_msg.h | 0 .../net/wireless/uwe5622/unisocwifi/txrx.c | 39 +- .../net/wireless/uwe5622/unisocwifi/txrx.h | 0 .../net/wireless/uwe5622/unisocwifi/vendor.c | 14 +- .../net/wireless/uwe5622/unisocwifi/vendor.h | 0 .../net/wireless/uwe5622/unisocwifi/version.h | 0 .../net/wireless/uwe5622/unisocwifi/wl_core.c | 156 +- .../net/wireless/uwe5622/unisocwifi/wl_core.h | 0 .../net/wireless/uwe5622/unisocwifi/wl_intf.c | 112 +- .../net/wireless/uwe5622/unisocwifi/wl_intf.h | 2 - .../net/wireless/uwe5622/unisocwifi/work.c | 0 .../net/wireless/uwe5622/unisocwifi/work.h | 0 218 files changed, 3730 insertions(+), 849 deletions(-) mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/Makefile create mode 100755 drivers/net/wireless/uwe5622/tty-sdio/Makefile.old mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/alignment/sitm.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/alignment/sitm.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/dump.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/dump.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/lpm.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/lpm.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/rfkill.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/rfkill.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/tty.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/tty.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/woble.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/tty-sdio/woble.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/gnss_firmware_bin.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/marlin_firmware_bin.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_boot.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_boot.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_dev.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_dev.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/fw/bin2hex.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/fw/firmware_hex.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/fw/usb_fdl.bin.hex mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/fw/version.txt mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/fw/wcnmodem.bin.hex mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/gnss/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/gnss/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/bus_common.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/mchn.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/uwe5621_glb.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/uwe5622_glb.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/uwe5623_glb.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/uwe562x_glb.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/vendor/hisilicon/hi_drv_gpio.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/vendor/hisilicon/hi_type.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/wcn_bus.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/wcn_glb.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/wcn_glb_reg.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/include/wcn_types.h create mode 100755 drivers/net/wireless/uwe5622/unisocwcn/include/wcn_wrapper.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/log/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/log/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/edma_engine.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/edma_engine.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/edma_test.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/ioctl.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/ioctl.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/mchn.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/mchn.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/pcie.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/pcie.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/pcie_attach_bus.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/pcie_dbg.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/pcie/pcie_dbg.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common_ctl.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dbg.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dump.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dump.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_pmnotify_ctl.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/loopcheck.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/loopcheck.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/mdbg_type.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/mem_pd_mgr.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/mem_pd_mgr.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/pcie_boot.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/pcie_boot.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/rdc_debug.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/rdc_debug.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/rf/rf.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/rf/rf.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/usb_boot.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/usb_boot.h create mode 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_bind_helper.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_debugfs.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_dump.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_dump.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_dump_integrate.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_dump_integrate.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_gnss.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_log.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_log.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_misc.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_misc.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_op.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_op.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_parn_parser.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_parn_parser.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_swd_dp.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_swd_dp.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdio_v3.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_common.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_ctl.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sipc/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sipc/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sipc/wcn_sipc.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sipc/wcn_sipc.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_mgr.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_mgr.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_pcie.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_pcie.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_sdio.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_sdio.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_test.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/tool/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/tool/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/tool/cp2log_config/readme.txt mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/tool/cp2log_config/unisoc_cp2log_config.txt mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_download.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_io.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_rx_tx.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_store.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_test.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/vm/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/vm/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/11h.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/11h.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/Android.mk mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/Kconfig mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/Makefile mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/api_version.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/cfg80211.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/cmdevt.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/dbg_ini_util.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/dbg_ini_util.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/debug.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/debug.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/defrag.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/defrag.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/edma_test.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/edma_test.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/ibss.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/ibss.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/intf.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/main.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/mm.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/mm.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/msg.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/msg.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/nan.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/nan.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/npi.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/npi.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/qos.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/qos.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/reg_domain.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/reg_domain.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/reorder.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/reorder.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.h create mode 100644 drivers/net/wireless/uwe5622/unisocwifi/rfkill-bt.c create mode 100644 drivers/net/wireless/uwe5622/unisocwifi/rfkill-wlan.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rnd_mac_addr.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rnd_mac_addr.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rtt.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rtt.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/rx_msg.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/softap_hook.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/softap_hook.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/tcp_ack.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/tcp_ack.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/tracer.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/tracer.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/tx_msg.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/txrx.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/txrx.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/vendor.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/vendor.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/version.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/wl_core.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/wl_core.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/work.c mode change 100644 => 100755 drivers/net/wireless/uwe5622/unisocwifi/work.h diff --git a/drivers/net/wireless/uwe5622/Kconfig b/drivers/net/wireless/uwe5622/Kconfig index a1e123b039b..fe6c8d115c9 100644 --- a/drivers/net/wireless/uwe5622/Kconfig +++ b/drivers/net/wireless/uwe5622/Kconfig @@ -1,7 +1,6 @@ config SPARD_WLAN_SUPPORT bool "Unisoc wireless Support" - select AW_WIFI_DEVICE_UWE5622 if SPARD_WLAN_SUPPORT - select AW_BIND_VERIFY if SPARD_WLAN_SUPPORT + select RK_WIFI_DEVICE_UWE5622 if SPARD_WLAN_SUPPORT default n help This is support for spreadtrum wireless chip. diff --git a/drivers/net/wireless/uwe5622/Makefile b/drivers/net/wireless/uwe5622/Makefile index a5767f50df8..d2210439f3c 100644 --- a/drivers/net/wireless/uwe5622/Makefile +++ b/drivers/net/wireless/uwe5622/Makefile @@ -1,4 +1,4 @@ -obj-$(CONFIG_AW_WIFI_DEVICE_UWE5622) += unisocwcn/ +obj-$(CONFIG_RK_WIFI_DEVICE_UWE5622) += unisocwcn/ obj-$(CONFIG_WLAN_UWE5622) += unisocwifi/ obj-$(CONFIG_TTY_OVERY_SDIO) += tty-sdio/ diff --git a/drivers/net/wireless/uwe5622/tty-sdio/Makefile b/drivers/net/wireless/uwe5622/tty-sdio/Makefile old mode 100644 new mode 100755 index 9dcb75258df..2f6f89189e8 --- a/drivers/net/wireless/uwe5622/tty-sdio/Makefile +++ b/drivers/net/wireless/uwe5622/tty-sdio/Makefile @@ -1,13 +1,16 @@ # ccflags-y += -DDEBUG # ccflags-y += -DKERNEL_VERSION_414 +ifeq ($(CONFIG_RK_WIFI_DEVICE_UWE5622),y) ccflags-y += -I$(srctree)/drivers/net/wireless/uwe5622/sprdwcn/include -ccflags-y += -DOTT_UWE -ccflags-y += -DWOBLE_FUN +endif +#ccflags-y += -DOTT_UWE +ccflags-y += -Wno-implicit-fallthrough ifneq ($(UNISOC_BSP_INCLUDE),) ccflags-y += -I$(UNISOC_BSP_INCLUDE) endif +ifeq ($(CONFIG_RK_WIFI_DEVICE_UWE5622),y) sprdbt_tty-objs := \ tty.o \ rfkill.o \ @@ -17,4 +20,4 @@ sprdbt_tty-objs := \ dump.o obj-$(CONFIG_TTY_OVERY_SDIO) += sprdbt_tty.o - +endif diff --git a/drivers/net/wireless/uwe5622/unisocwcn/Makefile b/drivers/net/wireless/uwe5622/unisocwcn/Makefile old mode 100644 new mode 100755 index f9c59574754..939acb5c927 --- a/drivers/net/wireless/uwe5622/unisocwcn/Makefile +++ b/drivers/net/wireless/uwe5622/unisocwcn/Makefile @@ -70,8 +70,8 @@ ifeq ($(CONFIG_RK_WIFI_DEVICE_UWE5622),y) export CONFIG_WCN_SDIO = y #export CONFIG_WCN_USB = y # export CONFIG_WCN_GNSS = y -#ccflags-y += -DCONFIG_CHECK_DRIVER_BY_CHIPID -ccflags-y += -DCONFIG_UWE5622 +ccflags-y += -DCONFIG_CHECK_DRIVER_BY_CHIPID +#ccflags-y += -DCONFIG_UWE5622 BSP_CHIP_ID := uwe5622 WCN_HW_TYPE := sdio endif diff --git a/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h b/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h old mode 100644 new mode 100755 index 7a78181a458..ae8daac4664 --- a/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h +++ b/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h @@ -83,8 +83,7 @@ enum marlin_wake_host_en { }; enum marlin_cp2_status { - MARLIN_CP2_STS_READY = 0, - MARLIN_CP2_STS_ASSERTED = 1, + MARLIN_CP2_STS_ASSERTED = 0, }; enum wcn_hw_type wcn_get_hw_if_type(void); diff --git a/drivers/net/wireless/uwe5622/unisocwcn/include/wcn_wrapper.h b/drivers/net/wireless/uwe5622/unisocwcn/include/wcn_wrapper.h new file mode 100755 index 00000000000..909a4c7ecce --- /dev/null +++ b/drivers/net/wireless/uwe5622/unisocwcn/include/wcn_wrapper.h @@ -0,0 +1,20 @@ +#ifndef __WCN_WRAPPER_H__ +#define __WCN_WRAPPER_H__ +#include +#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE +#ifndef timespec +#define timespec timespec64 +#define timespec_to_ns timespec64_to_ns +#define getnstimeofday ktime_get_real_ts64 +#define do_gettimeofday ktime_get_real_ts64 +#define timeval_to_ns timespec64_to_ns +#define timeval timespec64 +#endif + +#elif KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE +#define timeval timespec +#define do_gettimeofday getnstimeofday +#define timeval_to_ns timespec_to_ns + +#endif +#endif//__WCN_WRAPPER_H__ \ No newline at end of file diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c old mode 100644 new mode 100755 index 7cb79f2f2d0..0473748a2a5 --- a/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c @@ -117,6 +117,7 @@ void mdbg_ring_destroy(struct mdbg_ring_t *ring) } MDBG_LOG("to free ring."); kfree(ring); + ring = NULL; } } diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/pcie_boot.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/pcie_boot.c old mode 100644 new mode 100755 index 9ce23ada563..26824b505ba --- a/drivers/net/wireless/uwe5622/unisocwcn/platform/pcie_boot.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/pcie_boot.c @@ -24,8 +24,6 @@ #define FIRMWARE_PATH "/bin/wcnmodem.bin" #define FIRMWARE_SIZE_MAX 0xf0c00 -MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); - static char *load_firmware_data(int size) { int read_len; diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_bind_helper.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_bind_helper.c new file mode 100755 index 00000000000..6454d62766d --- /dev/null +++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_bind_helper.c @@ -0,0 +1,1444 @@ +#include +#include + +static unsigned char wcn_bind_verify_bc[] = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xed, 0xbd, 0x7b, 0x5c, 0x54, 0xe5, + 0xf6, 0x30, 0xfe, 0xec, 0xb9, 0xcf, 0x30, 0x0c, 0xc3, 0x7d, 0x80, 0x01, 0xf7, 0x28, 0x37, 0x15, + 0x61, 0xb8, 0x88, 0xa0, 0xa0, 0x33, 0x0c, 0x1a, 0x21, 0xda, 0x64, 0x96, 0x68, 0xa6, 0x33, 0xdc, + 0x04, 0xe5, 0x32, 0xdc, 0x04, 0xed, 0x36, 0x37, 0x04, 0x15, 0x3b, 0x63, 0x91, 0x51, 0x59, 0x67, + 0x30, 0x2a, 0x3b, 0x59, 0x8d, 0x49, 0x45, 0x27, 0xea, 0xcc, 0x00, 0x12, 0x29, 0xd6, 0xe8, 0xa1, + 0x22, 0x8f, 0x75, 0x06, 0x6f, 0x51, 0xc7, 0x0c, 0xcd, 0xca, 0xce, 0xf1, 0xe4, 0x6f, 0x3d, 0x7b, + 0x2e, 0x80, 0x97, 0xce, 0xf9, 0xe3, 0x7d, 0xdf, 0xef, 0xef, 0xfd, 0xbc, 0xcd, 0x47, 0x66, 0xf6, + 0x7e, 0xf6, 0x7a, 0xd6, 0xed, 0x59, 0xcf, 0x7a, 0xd6, 0xb3, 0xf6, 0xda, 0xdb, 0x86, 0xc2, 0xca, + 0xf5, 0x05, 0x65, 0x95, 0x45, 0xeb, 0x37, 0x17, 0xd7, 0x94, 0x95, 0x6c, 0x89, 0xaf, 0x42, 0xff, + 0xeb, 0x3f, 0x52, 0xf8, 0xa4, 0xa6, 0xa6, 0xe0, 0xdf, 0xc4, 0x79, 0x73, 0x13, 0x5d, 0xbf, 0xc9, + 0x54, 0x3b, 0x5c, 0x49, 0x99, 0x37, 0x4f, 0x8a, 0x12, 0x93, 0xa1, 0x25, 0x31, 0x55, 0x9a, 0x9a, + 0x38, 0x17, 0x49, 0x13, 0xe7, 0x26, 0x27, 0x25, 0x21, 0x52, 0xfa, 0xbf, 0x81, 0x97, 0x9b, 0x3e, + 0xf5, 0xb5, 0x75, 0xea, 0x1a, 0x92, 0x44, 0x5b, 0x4b, 0xd5, 0x55, 0x5b, 0xaa, 0xea, 0xb7, 0x94, + 0xdd, 0x06, 0xee, 0x3f, 0x5d, 0xff, 0xbf, 0xf4, 0x93, 0xa5, 0xb0, 0x7e, 0x35, 0x37, 0x00, 0x21, + 0x26, 0x1c, 0x17, 0xf0, 0xa5, 0x91, 0xcb, 0x56, 0x7f, 0x50, 0xf2, 0xc0, 0xbf, 0xba, 0xaa, 0xc2, + 0x06, 0x23, 0xb3, 0x89, 0x24, 0x26, 0x92, 0xf0, 0x11, 0xfa, 0x63, 0x30, 0x42, 0x5e, 0x34, 0x09, + 0xa2, 0x01, 0x4c, 0x10, 0xfc, 0xb1, 0x75, 0x33, 0x76, 0xcb, 0x07, 0x19, 0x77, 0xb2, 0x84, 0x49, + 0xe9, 0x8f, 0x13, 0x46, 0x7e, 0x14, 0x93, 0x13, 0x12, 0xc1, 0xd8, 0x59, 0xa0, 0x15, 0x2d, 0xa6, + 0x65, 0x3d, 0xee, 0x95, 0xd5, 0x2f, 0x4c, 0x0a, 0x48, 0xe3, 0x88, 0x96, 0xf2, 0x92, 0x0a, 0x5a, + 0x72, 0x34, 0xfd, 0x92, 0x19, 0xd9, 0x7e, 0xcd, 0xad, 0x42, 0xf9, 0xe3, 0xb4, 0xa2, 0x41, 0xce, + 0xc1, 0x00, 0x52, 0xb1, 0xa4, 0x85, 0xfc, 0x88, 0x48, 0x2a, 0x30, 0x8a, 0x66, 0xc5, 0xce, 0x32, + 0x25, 0x3e, 0x64, 0x59, 0xbb, 0x9b, 0x1c, 0x18, 0x04, 0xbc, 0xdb, 0x49, 0x84, 0xa2, 0xe1, 0x37, + 0x69, 0x7a, 0x0b, 0x97, 0x2c, 0x6a, 0x62, 0xf8, 0xcf, 0xe8, 0x34, 0xc2, 0xd7, 0x19, 0x63, 0x87, + 0x29, 0xc0, 0x2f, 0xaf, 0xb5, 0xd5, 0xcb, 0xd8, 0x9f, 0x27, 0xec, 0xb2, 0x89, 0x09, 0x51, 0xa4, + 0x50, 0x06, 0x3f, 0x59, 0x0a, 0x96, 0x70, 0x65, 0x1b, 0x41, 0x72, 0xe6, 0x2f, 0x41, 0x2c, 0x1a, + 0x6f, 0x77, 0xec, 0x8e, 0xac, 0xa3, 0x62, 0x22, 0xb6, 0x4d, 0x52, 0xc6, 0xa9, 0x39, 0xcf, 0xd1, + 0xaf, 0x88, 0xec, 0xb7, 0xcb, 0x02, 0x02, 0x09, 0xb2, 0x74, 0x96, 0x22, 0x4b, 0xb8, 0x32, 0xca, + 0x6e, 0xe2, 0x58, 0x17, 0x9f, 0x08, 0xb8, 0xbb, 0xf7, 0xec, 0x52, 0xb6, 0xea, 0xeb, 0x7f, 0x26, + 0xe4, 0x05, 0x4f, 0x8f, 0x37, 0xdb, 0x62, 0x67, 0x2b, 0xf6, 0xf9, 0x76, 0x3d, 0x49, 0x76, 0xbc, + 0x2e, 0xbc, 0x53, 0x21, 0xbc, 0x12, 0x48, 0x23, 0x5b, 0xb6, 0xf5, 0x32, 0x42, 0x4a, 0xf3, 0x5a, + 0x74, 0xb9, 0xb4, 0x97, 0xd0, 0x79, 0x8e, 0x74, 0xe3, 0xe3, 0x45, 0xe6, 0x40, 0xac, 0xab, 0xbb, + 0x45, 0x08, 0x35, 0x10, 0x08, 0x85, 0x15, 0xc4, 0x5c, 0xbd, 0x0e, 0x1f, 0xc2, 0x84, 0x32, 0x51, + 0x5a, 0x81, 0xf8, 0x2b, 0x79, 0xc4, 0xd9, 0x0e, 0xf1, 0x80, 0x2e, 0x62, 0x44, 0x32, 0xed, 0xa4, + 0x2c, 0xe2, 0xab, 0x8e, 0x88, 0x53, 0x3a, 0xf1, 0x11, 0x9d, 0xf8, 0xa4, 0x56, 0x7c, 0xc2, 0x16, + 0x71, 0x02, 0x8e, 0x3b, 0xbc, 0xcf, 0x4b, 0x22, 0xce, 0xea, 0x22, 0x4e, 0x5a, 0xc5, 0x8e, 0x0e, + 0xef, 0x93, 0x12, 0xf1, 0x18, 0x11, 0x8e, 0x6a, 0x39, 0xec, 0xcd, 0xed, 0xcd, 0x35, 0x88, 0x53, + 0x93, 0xd3, 0xbc, 0x85, 0xc3, 0xae, 0x56, 0x35, 0xd7, 0x94, 0xd2, 0xb7, 0x72, 0x9a, 0xeb, 0x54, + 0xcd, 0xa9, 0xa2, 0x66, 0x8d, 0x0a, 0xae, 0xb2, 0xb5, 0x80, 0x39, 0xe2, 0x08, 0x41, 0x0e, 0xc9, + 0x23, 0x7a, 0x3b, 0xc2, 0x01, 0x8f, 0x63, 0x34, 0xfc, 0x84, 0x2d, 0x7c, 0xac, 0x43, 0x7c, 0x96, + 0xd0, 0x34, 0x37, 0x68, 0x9a, 0x53, 0xa1, 0x17, 0x87, 0x5d, 0x8b, 0x38, 0x9b, 0x63, 0x9b, 0xb7, + 0xb4, 0x37, 0xa7, 0x6a, 0xd9, 0x5b, 0x62, 0x9b, 0xab, 0x01, 0x61, 0x6c, 0x73, 0xaa, 0x94, 0xdd, + 0x58, 0xda, 0xac, 0x21, 0xd9, 0x56, 0x71, 0xaf, 0x2e, 0xfc, 0x7c, 0x87, 0x18, 0xed, 0xc3, 0x7d, + 0x4f, 0x6a, 0xc3, 0x8f, 0x8c, 0xe2, 0x96, 0x93, 0xd6, 0x88, 0x23, 0x6a, 0xf1, 0xd8, 0x68, 0xf8, + 0xd9, 0x0e, 0xef, 0x8b, 0x92, 0xf0, 0x41, 0x5d, 0x84, 0x9d, 0xd0, 0xd2, 0xb5, 0x80, 0xb6, 0xd4, + 0x50, 0xa7, 0x61, 0xd7, 0xb6, 0x3b, 0x31, 0x18, 0x36, 0x73, 0xd8, 0x5b, 0x65, 0x13, 0x48, 0x7a, + 0xc3, 0xbf, 0xea, 0xf0, 0x1e, 0xee, 0x88, 0x38, 0x49, 0x44, 0x9c, 0xd4, 0x46, 0xf4, 0xca, 0xc5, + 0x23, 0x1d, 0xe2, 0xf3, 0x84, 0x14, 0x18, 0x06, 0xa2, 0x6c, 0xaa, 0x3b, 0xbd, 0x81, 0xc3, 0x6e, + 0xf8, 0xad, 0xee, 0xe7, 0x25, 0xe1, 0x1f, 0xdb, 0xc2, 0xb1, 0x8a, 0x64, 0xd3, 0x8e, 0xc8, 0x23, + 0xbe, 0x52, 0xdf, 0x46, 0x33, 0x0d, 0x8d, 0xcd, 0xa9, 0x66, 0x36, 0x28, 0xa7, 0x51, 0xdb, 0x5c, + 0xa7, 0x69, 0xae, 0xbd, 0x05, 0xb6, 0x6f, 0x75, 0xe1, 0x23, 0x93, 0xd5, 0xd2, 0xe1, 0x7d, 0x02, + 0x63, 0x8b, 0x00, 0x00, 0xd0, 0x3c, 0xda, 0x6a, 0x6a, 0xde, 0x0a, 0x5c, 0xb5, 0xb3, 0x41, 0xb1, + 0xd5, 0xf9, 0x94, 0x7e, 0x1a, 0xd9, 0x5b, 0x41, 0x45, 0xe6, 0xe6, 0x06, 0x53, 0x73, 0xaa, 0xb0, + 0x79, 0xab, 0x94, 0x5d, 0x1b, 0xcb, 0xde, 0x52, 0x6a, 0xd8, 0x92, 0xc3, 0x7e, 0x38, 0x96, 0x8d, + 0x7c, 0x90, 0x1e, 0x84, 0x8a, 0xf8, 0xb8, 0x43, 0x3c, 0xd6, 0xe1, 0x3d, 0x40, 0x44, 0x7c, 0x4b, + 0xa4, 0x35, 0xd7, 0x68, 0x9a, 0x6b, 0x4c, 0xcd, 0x75, 0x22, 0xb6, 0xd6, 0xdc, 0xac, 0x31, 0x35, + 0x03, 0xfc, 0xd6, 0x52, 0x7a, 0x6d, 0x6c, 0xb3, 0xc6, 0xdc, 0x0c, 0xf8, 0x6b, 0xda, 0xd9, 0x2a, + 0x6f, 0x30, 0x00, 0xe0, 0xe7, 0xac, 0x2d, 0x02, 0xc6, 0x68, 0x5c, 0x22, 0x18, 0xd7, 0x7a, 0x9f, + 0x24, 0xc5, 0x47, 0xd4, 0x11, 0x23, 0x66, 0xef, 0x01, 0x79, 0xc4, 0x65, 0x22, 0x02, 0xf4, 0x0c, + 0xc7, 0x43, 0xa0, 0x34, 0x12, 0x98, 0x0c, 0xbf, 0x40, 0xf8, 0xc0, 0xe9, 0xa9, 0x0e, 0xf1, 0x57, + 0x36, 0xdc, 0x7e, 0x9e, 0x08, 0xef, 0x95, 0x0b, 0xd0, 0xbe, 0x88, 0x53, 0xea, 0x88, 0x5e, 0x1b, + 0x36, 0x18, 0x0c, 0x69, 0x0e, 0xef, 0xc5, 0x83, 0xe2, 0xd1, 0xed, 0x7e, 0x6a, 0x58, 0xdb, 0x9b, + 0x1b, 0xa4, 0x14, 0x03, 0xaa, 0x66, 0xd0, 0xf3, 0x56, 0x34, 0x24, 0x11, 0x8f, 0xa8, 0xc1, 0x48, + 0x46, 0x54, 0x1c, 0xc2, 0x82, 0x3e, 0x65, 0x15, 0x08, 0xb5, 0xc5, 0x86, 0xac, 0x6b, 0xd8, 0x42, + 0x51, 0x0e, 0x62, 0x0e, 0x13, 0x76, 0x76, 0x98, 0xe9, 0x34, 0x3e, 0x65, 0x9b, 0xbd, 0x11, 0x77, + 0xcc, 0xe0, 0x6d, 0xf4, 0x45, 0x0f, 0x59, 0xe4, 0xe9, 0xbf, 0x42, 0xd3, 0xa3, 0xe8, 0x24, 0x32, + 0x69, 0x17, 0xa2, 0x31, 0x95, 0x41, 0xc7, 0xb0, 0xd2, 0xec, 0x36, 0xd6, 0x74, 0x09, 0x5a, 0x38, + 0x62, 0x49, 0x3e, 0x82, 0x3b, 0xf8, 0xf4, 0xa7, 0xf5, 0x18, 0x32, 0x06, 0x15, 0xe9, 0xad, 0xf4, + 0x4c, 0x8b, 0x62, 0x61, 0x97, 0x2e, 0xa3, 0x47, 0x91, 0xd9, 0x4d, 0x4f, 0x6f, 0xa3, 0xa7, 0x77, + 0x11, 0xe9, 0x9d, 0x86, 0xcc, 0x4e, 0x38, 0x56, 0x84, 0x0d, 0x29, 0x32, 0x06, 0xe9, 0x99, 0x5d, + 0xba, 0x74, 0xab, 0x22, 0xac, 0x4b, 0x91, 0x66, 0xa7, 0xcf, 0x47, 0xe7, 0x85, 0x82, 0x0b, 0x52, + 0x9f, 0x73, 0x48, 0x78, 0xd6, 0x24, 0xf8, 0x41, 0x28, 0x38, 0x6d, 0x15, 0x9c, 0xb3, 0xb3, 0xae, + 0x08, 0x05, 0xdf, 0x58, 0x05, 0x15, 0x52, 0xc1, 0xa8, 0x15, 0x5f, 0x45, 0x99, 0x83, 0x8a, 0xcc, + 0x36, 0xba, 0xac, 0xdd, 0x90, 0x61, 0x54, 0x2c, 0x00, 0x3c, 0xd6, 0xbe, 0x05, 0x9d, 0x86, 0x05, + 0x76, 0x45, 0xfa, 0x20, 0xdd, 0x21, 0xf8, 0xde, 0x21, 0xa8, 0x80, 0x5e, 0x42, 0xc1, 0x79, 0x24, + 0xbc, 0xa0, 0x14, 0xfc, 0x20, 0xf5, 0xa9, 0x40, 0x3e, 0x97, 0x95, 0x82, 0x33, 0x80, 0x50, 0x29, + 0xa8, 0x50, 0x09, 0xc6, 0xed, 0x82, 0x51, 0x99, 0x40, 0x9b, 0x6e, 0xa4, 0x2f, 0x18, 0x52, 0xa4, + 0x23, 0xe3, 0x82, 0x1e, 0x45, 0x18, 0x74, 0x6f, 0xef, 0xcb, 0xb8, 0x35, 0x27, 0x17, 0xc7, 0x05, + 0x15, 0x0e, 0xc1, 0xa8, 0x43, 0xf0, 0x83, 0x9d, 0x75, 0x1e, 0xf9, 0x54, 0xe0, 0xee, 0x3e, 0x63, + 0xa8, 0x5d, 0x91, 0x66, 0xe9, 0xcb, 0x00, 0x36, 0xba, 0xfb, 0x16, 0x74, 0xd9, 0x32, 0x3a, 0xfb, + 0xd2, 0xbb, 0x15, 0xe9, 0x26, 0x45, 0xd8, 0x18, 0xb0, 0xd1, 0x07, 0x98, 0xc3, 0xda, 0xe9, 0x19, + 0x5d, 0xf2, 0x05, 0x46, 0x7a, 0xa6, 0x99, 0xae, 0xc2, 0x9c, 0x03, 0x75, 0x34, 0x2a, 0xf8, 0x1e, + 0xc4, 0x21, 0x7d, 0x46, 0x91, 0xcf, 0xb8, 0x49, 0x70, 0x51, 0x23, 0xb8, 0x19, 0x9b, 0x22, 0xd3, + 0x42, 0x5f, 0xd0, 0x45, 0x80, 0xc6, 0xe6, 0x77, 0xd3, 0x33, 0xdb, 0x0c, 0x80, 0x64, 0x3e, 0x60, + 0x1b, 0x01, 0x00, 0xc5, 0x7c, 0x13, 0x5d, 0x06, 0xb2, 0x60, 0xae, 0x7e, 0x90, 0xf9, 0x8c, 0x4a, + 0x05, 0xff, 0xb0, 0xb3, 0xc6, 0x49, 0x9f, 0xef, 0x65, 0x3e, 0xe7, 0xa4, 0x82, 0x2b, 0xe3, 0x82, + 0xcb, 0x76, 0xd6, 0x69, 0xa5, 0xcf, 0x79, 0x95, 0xe0, 0x1c, 0xe9, 0x53, 0x21, 0xf5, 0xf9, 0xc6, + 0x0c, 0x90, 0x0e, 0x42, 0x66, 0x57, 0xa4, 0x0d, 0xf6, 0x81, 0xf2, 0x33, 0xbb, 0x6c, 0x69, 0x56, + 0x45, 0x26, 0xfa, 0x5a, 0x29, 0xb8, 0xa8, 0x14, 0x5c, 0x36, 0x09, 0xce, 0x20, 0x21, 0xe8, 0xf6, + 0xb2, 0x46, 0x70, 0x4e, 0xe6, 0x03, 0x9a, 0x01, 0xa5, 0x5d, 0x51, 0x62, 0x5d, 0xfd, 0x80, 0x0e, + 0xe8, 0x32, 0xda, 0x80, 0x1f, 0x43, 0xc6, 0x88, 0x02, 0x86, 0x6c, 0x61, 0x3f, 0x11, 0x61, 0x91, + 0x87, 0x19, 0x15, 0xe9, 0x43, 0xf4, 0x30, 0x40, 0x32, 0xa8, 0x58, 0x68, 0xa5, 0x67, 0xf6, 0xc0, + 0x31, 0xa5, 0x31, 0x23, 0x30, 0x69, 0xc8, 0x74, 0x10, 0x70, 0xba, 0xa0, 0xad, 0x6f, 0x41, 0x37, + 0x86, 0xc9, 0x30, 0x03, 0x51, 0x42, 0x36, 0x6c, 0x00, 0x55, 0xa4, 0xb5, 0x03, 0x92, 0x5b, 0xea, + 0xf6, 0x47, 0xf8, 0xb6, 0xb3, 0x7e, 0x18, 0x17, 0x9c, 0xa7, 0x18, 0xb8, 0x30, 0x8e, 0xb5, 0xe1, + 0x19, 0x9a, 0xb0, 0x96, 0x28, 0xb4, 0xc7, 0x9b, 0x35, 0x03, 0x79, 0x29, 0x2b, 0x64, 0xcf, 0x60, + 0xc3, 0x9a, 0x86, 0x92, 0xd0, 0x74, 0xd9, 0x49, 0x6d, 0x1a, 0x3e, 0x59, 0x84, 0x1e, 0x41, 0x39, + 0xb2, 0xb7, 0x74, 0x8d, 0x4e, 0x83, 0xec, 0xf4, 0x66, 0x44, 0xa2, 0x0d, 0x16, 0xf9, 0x76, 0x9a, + 0x83, 0xaf, 0x27, 0x39, 0x27, 0xd0, 0x49, 0x6d, 0x8e, 0x5c, 0xc8, 0x90, 0x87, 0xca, 0xc2, 0x5a, + 0x66, 0xa2, 0x8f, 0x55, 0x0a, 0x39, 0x13, 0x1f, 0x3f, 0x96, 0x8b, 0x3e, 0x26, 0x73, 0xe8, 0xa5, + 0x86, 0x02, 0xa6, 0x35, 0x84, 0x41, 0xf8, 0x75, 0x12, 0xa2, 0x72, 0xe5, 0xeb, 0x28, 0xcd, 0x40, + 0xca, 0xf4, 0x29, 0xa4, 0xc1, 0x9b, 0x17, 0x84, 0x36, 0x08, 0x19, 0x39, 0x26, 0xd6, 0xb8, 0xa5, + 0x63, 0x10, 0xf0, 0xa4, 0xc6, 0xae, 0x41, 0x7b, 0xe5, 0x42, 0x52, 0x1e, 0xea, 0xb0, 0xb1, 0x8a, + 0xbd, 0xb4, 0xc9, 0x1c, 0xda, 0xf4, 0x1c, 0xba, 0xf0, 0x0b, 0x95, 0xc6, 0xc9, 0x83, 0x2f, 0x09, + 0xae, 0x1d, 0xdd, 0x09, 0x3e, 0x1e, 0x96, 0x3b, 0xe4, 0xbf, 0x4d, 0x26, 0x8a, 0x66, 0xf4, 0x1b, + 0x3b, 0xa4, 0xdb, 0xb8, 0x7d, 0xba, 0x48, 0x7f, 0x5a, 0xb1, 0x5e, 0xc8, 0xf1, 0xdf, 0xa6, 0x52, + 0x47, 0x33, 0x6c, 0x46, 0xf3, 0xd3, 0xd2, 0xb4, 0xa3, 0x52, 0x79, 0xa3, 0x99, 0x2b, 0x4f, 0x91, + 0x37, 0x76, 0x72, 0x7b, 0x93, 0x97, 0x71, 0x9e, 0xe7, 0xf6, 0xfa, 0x2f, 0x13, 0x3d, 0xcf, 0x7d, + 0x46, 0x9a, 0xb1, 0x72, 0xae, 0xbc, 0xf1, 0x00, 0xd7, 0x96, 0x22, 0xb1, 0x44, 0x33, 0x3e, 0x37, + 0xa2, 0x67, 0x84, 0x2a, 0x7f, 0x63, 0xcc, 0xb3, 0x64, 0xc6, 0x49, 0xa3, 0xea, 0x59, 0xa1, 0x06, + 0x70, 0xbf, 0xa9, 0xe1, 0xb0, 0xb7, 0x88, 0xd8, 0x75, 0x16, 0xfa, 0xfc, 0x52, 0xc3, 0x56, 0x4d, + 0x73, 0x3d, 0x38, 0xcd, 0x6e, 0x36, 0xf8, 0xcd, 0xcd, 0x39, 0xec, 0x86, 0xfd, 0xec, 0x87, 0x4a, + 0x0d, 0xb5, 0x9a, 0xe6, 0xad, 0x23, 0x52, 0x36, 0xe8, 0xf4, 0x3b, 0x33, 0xfe, 0xfe, 0x46, 0xcb, + 0xde, 0x0a, 0xff, 0xa4, 0xec, 0x1a, 0x38, 0x16, 0xb2, 0x37, 0x9b, 0x61, 0xb9, 0x70, 0x9f, 0xaa, + 0xd8, 0x75, 0x66, 0xf6, 0x66, 0x19, 0xbb, 0xc2, 0x24, 0xa8, 0x26, 0xd9, 0x8d, 0x70, 0x09, 0xbe, + 0xed, 0xac, 0x8b, 0x70, 0xd5, 0xd9, 0x2e, 0xf5, 0xc2, 0x2d, 0x96, 0x7d, 0x6a, 0xf6, 0x66, 0x4b, + 0xf3, 0x66, 0x8d, 0x61, 0x33, 0xf8, 0x2f, 0x0e, 0x1b, 0x96, 0x0d, 0xf8, 0x7e, 0x91, 0x6d, 0xe4, + 0x7c, 0x04, 0x4b, 0xf2, 0x0e, 0x0e, 0x37, 0x54, 0x92, 0xb7, 0xfc, 0x97, 0xd1, 0xa6, 0x47, 0xde, + 0x39, 0x9a, 0x90, 0x39, 0xff, 0xda, 0xc7, 0x7f, 0xf9, 0xc7, 0x2f, 0x57, 0xfe, 0xf1, 0xeb, 0x9e, + 0x37, 0xbe, 0x1e, 0x1f, 0xef, 0xbe, 0xc6, 0x7b, 0xef, 0xa3, 0xcb, 0x0d, 0xcf, 0xc4, 0x3d, 0x7a, + 0xf0, 0xef, 0x17, 0x6b, 0x47, 0xfe, 0xbd, 0xe6, 0xa9, 0x73, 0x17, 0x93, 0xfe, 0x75, 0x78, 0xf9, + 0x7b, 0xff, 0xb8, 0x7a, 0xdf, 0xb1, 0xc5, 0x0f, 0xee, 0x3e, 0x57, 0xf6, 0xe0, 0xea, 0x85, 0x8f, + 0xbe, 0x7b, 0xf4, 0xca, 0xe7, 0x99, 0x73, 0x12, 0x0e, 0x1d, 0xfd, 0xe1, 0x97, 0x57, 0x1f, 0x49, + 0xf8, 0xbc, 0x3c, 0xe9, 0x8b, 0x57, 0x2f, 0x2e, 0xff, 0xe4, 0xef, 0x67, 0xfe, 0x35, 0xf2, 0x6f, + 0xfd, 0xa1, 0xbe, 0xba, 0x1f, 0xee, 0xff, 0xea, 0x91, 0x2f, 0x3f, 0xbc, 0xf8, 0x46, 0xda, 0x77, + 0xd1, 0x8f, 0x7e, 0x57, 0xbc, 0xe5, 0xe4, 0xde, 0x86, 0x5d, 0x0d, 0x39, 0x32, 0x21, 0x5f, 0x23, + 0x85, 0x10, 0x83, 0x01, 0x2a, 0x97, 0x23, 0x29, 0xd9, 0xa1, 0x17, 0x73, 0x04, 0xaf, 0xb4, 0x25, + 0xa5, 0x21, 0xc4, 0x41, 0xce, 0x66, 0x12, 0xd1, 0x54, 0x39, 0x3f, 0xb2, 0xec, 0x34, 0x86, 0xd6, + 0x13, 0xb5, 0x08, 0x91, 0xe2, 0x4f, 0x8b, 0xac, 0x62, 0x12, 0xb1, 0xdc, 0x2d, 0x5a, 0x24, 0x5a, + 0xf1, 0x25, 0x2d, 0x90, 0x20, 0x64, 0x1e, 0x20, 0x86, 0xd5, 0xb4, 0x31, 0x7c, 0x3f, 0x97, 0xf3, + 0x18, 0xc4, 0x2d, 0x54, 0x2b, 0x8d, 0x44, 0xdb, 0x56, 0x5e, 0x77, 0xac, 0xe4, 0x48, 0x31, 0x5e, + 0x82, 0xc2, 0x43, 0x48, 0x3b, 0x37, 0x72, 0x8f, 0x12, 0x34, 0x95, 0xa7, 0x1b, 0x47, 0x2b, 0xf9, + 0x34, 0x3f, 0x2e, 0x90, 0xc6, 0x67, 0xb9, 0xba, 0x31, 0x64, 0x88, 0xff, 0xca, 0x29, 0xda, 0x49, + 0xa1, 0x2a, 0x0d, 0x23, 0x71, 0xb3, 0x74, 0x2e, 0x58, 0xc9, 0x44, 0xbe, 0x34, 0x0a, 0x0f, 0x60, + 0x03, 0x96, 0x66, 0x7d, 0x9e, 0x33, 0x9f, 0x44, 0x7e, 0x53, 0x58, 0x1a, 0xb8, 0x4c, 0x50, 0x52, + 0x60, 0x69, 0x64, 0x98, 0xa5, 0xdc, 0x8c, 0xbd, 0x4c, 0x8e, 0xab, 0x13, 0x85, 0x6a, 0xdb, 0xca, + 0x71, 0xb9, 0x11, 0xba, 0xf3, 0x70, 0x0f, 0x44, 0x81, 0xe5, 0x94, 0x0b, 0x63, 0xf7, 0x6e, 0x21, + 0x90, 0x89, 0x49, 0xc3, 0xf1, 0x78, 0x52, 0x44, 0xbb, 0x28, 0xc4, 0x37, 0xcf, 0xd4, 0xca, 0x8d, + 0xbe, 0x63, 0x80, 0xa1, 0xa0, 0x1d, 0xe9, 0x10, 0xee, 0x30, 0xf3, 0x73, 0x55, 0x0c, 0x15, 0x4b, + 0xbb, 0x2d, 0x44, 0xeb, 0x8b, 0x36, 0xf2, 0xa4, 0x66, 0x21, 0xaf, 0x88, 0x61, 0x3e, 0xbd, 0xa1, + 0x4a, 0xf2, 0xe9, 0x17, 0x6f, 0x79, 0x7f, 0x42, 0xe7, 0xed, 0x37, 0xf1, 0x5e, 0x60, 0x60, 0xb0, + 0x0e, 0xd1, 0x91, 0x0e, 0x32, 0x77, 0x5f, 0xec, 0x91, 0x7d, 0x07, 0xd2, 0xb7, 0xbc, 0x7c, 0x3d, + 0xdc, 0x3f, 0x26, 0x2a, 0xf7, 0xad, 0x2f, 0xa4, 0x96, 0xb7, 0xe6, 0xce, 0x5d, 0x9b, 0x69, 0xde, + 0x4b, 0x57, 0x7f, 0x78, 0xe9, 0xcc, 0xb3, 0x51, 0x77, 0xc5, 0x86, 0x13, 0x66, 0x55, 0x9c, 0xd2, + 0xfa, 0xcb, 0x93, 0x4b, 0xfa, 0xc8, 0xe8, 0xc2, 0x86, 0x01, 0xc3, 0xe7, 0x3f, 0x2b, 0xd6, 0x05, + 0x1f, 0xf9, 0x6a, 0x5d, 0xc3, 0xd6, 0x91, 0xe2, 0xee, 0xd7, 0xde, 0xbd, 0x1a, 0x75, 0xf8, 0x8f, + 0xde, 0x83, 0xa1, 0xd7, 0x3e, 0x5c, 0xb9, 0xff, 0xbb, 0xb0, 0x3f, 0x6c, 0x22, 0x5e, 0xfe, 0x34, + 0xb8, 0xa8, 0x59, 0xf8, 0xce, 0xb2, 0x94, 0x4b, 0x7f, 0xd3, 0x88, 0x5f, 0x3c, 0xfe, 0xef, 0xea, + 0x7c, 0xef, 0xb1, 0x1f, 0xcf, 0x7f, 0x9e, 0x31, 0xbe, 0xfe, 0xed, 0x2a, 0xf9, 0xe8, 0x01, 0x45, + 0x4f, 0x15, 0x73, 0xeb, 0xb9, 0xef, 0xc5, 0xe2, 0xac, 0x55, 0xef, 0xdc, 0xb3, 0x45, 0xfa, 0x4b, + 0xfb, 0xdf, 0xbf, 0xb7, 0xd5, 0x7d, 0xb2, 0x7b, 0x51, 0x7e, 0xf0, 0x31, 0xf9, 0x37, 0xe1, 0xab, + 0xbe, 0x78, 0x67, 0x38, 0x29, 0xef, 0x93, 0x24, 0xc7, 0x03, 0x73, 0xd7, 0x7e, 0x29, 0x9b, 0x77, + 0xf8, 0x97, 0x2f, 0xe9, 0xab, 0x5f, 0xfc, 0x65, 0x77, 0xe0, 0xc9, 0xf4, 0x88, 0x3b, 0xd6, 0xc8, + 0xfe, 0x3d, 0xcc, 0xa8, 0x1e, 0xbd, 0xf2, 0xe8, 0xbb, 0xbf, 0x36, 0xfd, 0x12, 0x2c, 0x6f, 0x10, + 0x2f, 0x7f, 0xf2, 0xa1, 0xfa, 0xfa, 0x96, 0xfa, 0xbd, 0x25, 0xcd, 0xb5, 0xf7, 0x16, 0xdf, 0x3d, + 0xb3, 0xec, 0xf8, 0x97, 0x31, 0x19, 0x8b, 0xbf, 0x1b, 0x3f, 0xfd, 0xf7, 0xf0, 0xa7, 0x8e, 0xa9, + 0x96, 0xdc, 0xd1, 0xb8, 0x9c, 0xbe, 0xe6, 0xeb, 0xb2, 0x7c, 0xc1, 0x4f, 0x6b, 0x3a, 0x8f, 0x65, + 0x6a, 0xee, 0x79, 0xf7, 0xac, 0xbc, 0x23, 0x72, 0xd5, 0xe5, 0xbc, 0x26, 0xcb, 0xf0, 0xf5, 0xb9, + 0x41, 0xf7, 0xa5, 0xbf, 0xac, 0x58, 0xa3, 0x6d, 0xb8, 0x14, 0xdd, 0xa7, 0x2e, 0x2f, 0x3b, 0x15, + 0xd1, 0x2c, 0x1e, 0x3e, 0x2a, 0x0e, 0x1f, 0x4c, 0x6b, 0xfb, 0x6b, 0x7d, 0xec, 0x17, 0x7b, 0xd8, + 0x3f, 0x12, 0x11, 0xc7, 0x4f, 0x66, 0x97, 0x07, 0x2c, 0xaf, 0x67, 0x31, 0x1b, 0x1a, 0x1e, 0xca, + 0x7f, 0xbf, 0xf9, 0x9b, 0x57, 0xe2, 0xff, 0xae, 0xf9, 0xf4, 0x7c, 0x4d, 0x7f, 0xe1, 0xf2, 0x27, + 0x3f, 0xed, 0xce, 0x34, 0xac, 0xda, 0xf3, 0x43, 0x8f, 0xf7, 0xf9, 0x47, 0xbf, 0x5e, 0x3c, 0x5f, + 0x53, 0x35, 0x7e, 0xc7, 0x8f, 0x8e, 0x2f, 0xab, 0xef, 0x3d, 0x47, 0x0f, 0xbd, 0xa2, 0xbe, 0x2f, + 0x40, 0x29, 0xaa, 0x5b, 0x7d, 0x8f, 0xfd, 0xfa, 0x5f, 0xd6, 0xdf, 0xad, 0xce, 0x6c, 0xb0, 0xb4, + 0x35, 0xfd, 0xeb, 0x8e, 0xaf, 0x7f, 0x0e, 0x3e, 0xfb, 0xd7, 0xe0, 0x4f, 0xaa, 0xc9, 0xde, 0xcf, + 0xd6, 0x98, 0x69, 0x74, 0x11, 0x1e, 0xcc, 0x83, 0xf0, 0xdd, 0x0e, 0xbf, 0xc9, 0x1c, 0xad, 0xb8, + 0x7f, 0x54, 0x5c, 0x12, 0x40, 0x64, 0xb6, 0x28, 0xd2, 0x8c, 0x7d, 0xad, 0x59, 0x54, 0x24, 0x52, + 0xdb, 0x5e, 0xcd, 0x87, 0xb5, 0xe8, 0x3b, 0x70, 0xd8, 0x5a, 0x41, 0x32, 0x3f, 0x0b, 0x16, 0xff, + 0x70, 0x08, 0x3d, 0x4a, 0xa4, 0x4c, 0x0a, 0xcc, 0x10, 0x36, 0x44, 0xc7, 0x8b, 0x24, 0x2c, 0xbf, + 0x43, 0x8d, 0xad, 0x10, 0x94, 0x3d, 0x08, 0x8e, 0x23, 0xa7, 0x59, 0xa3, 0x61, 0x6f, 0xd5, 0xd0, + 0x37, 0x37, 0x42, 0x70, 0xd7, 0x1c, 0x32, 0xe4, 0x2b, 0xb8, 0x60, 0x12, 0x8c, 0x4a, 0x7d, 0x2a, + 0xa5, 0x3e, 0x67, 0xc6, 0x05, 0xe3, 0x4a, 0x41, 0xb2, 0xb0, 0x3f, 0xfc, 0x2b, 0x08, 0x0a, 0x24, + 0xe1, 0xbd, 0xea, 0x88, 0x12, 0xe9, 0xf6, 0x05, 0x3d, 0xd4, 0xa2, 0xda, 0x45, 0xcf, 0x80, 0xc5, + 0x1c, 0xbb, 0xe4, 0xf1, 0x80, 0xcd, 0x2a, 0xf6, 0x83, 0xa5, 0xec, 0x79, 0xa5, 0x10, 0x72, 0xb2, + 0xe7, 0x69, 0x71, 0x50, 0x83, 0xe3, 0xcd, 0x58, 0xf6, 0xe6, 0xab, 0x4c, 0x40, 0xdb, 0xa0, 0x6d, + 0x5e, 0x0f, 0xe1, 0x92, 0x08, 0x42, 0x1b, 0x08, 0x2a, 0x75, 0x71, 0xb0, 0x72, 0x5e, 0x74, 0x08, + 0x7e, 0xc4, 0x8b, 0x36, 0xbd, 0x60, 0x10, 0x07, 0x59, 0xe2, 0x21, 0xea, 0xfb, 0x94, 0x5a, 0x7c, + 0x44, 0x22, 0xee, 0xd7, 0x85, 0x1f, 0x51, 0xb3, 0x3e, 0x33, 0xc1, 0x82, 0xa9, 0x48, 0x6f, 0xa7, + 0xbe, 0xbb, 0xfb, 0xd2, 0xda, 0x14, 0x69, 0x2d, 0x74, 0x58, 0x46, 0x12, 0x80, 0xe8, 0x35, 0xfd, + 0x82, 0x61, 0xfa, 0x02, 0x4b, 0x1f, 0xff, 0xc3, 0xb2, 0x66, 0x4d, 0x3e, 0xc4, 0x53, 0x86, 0xba, + 0x52, 0x76, 0xa3, 0x0a, 0x42, 0xaa, 0xe6, 0x3a, 0x73, 0x73, 0xc8, 0xc7, 0xf7, 0xf8, 0x5c, 0xa4, + 0xd6, 0x76, 0x08, 0x16, 0xce, 0xc0, 0x7a, 0x48, 0x0a, 0x60, 0xc1, 0x4f, 0x26, 0x63, 0xc3, 0x4f, + 0xd9, 0x70, 0x2c, 0x76, 0x42, 0x22, 0x3e, 0xa5, 0x8b, 0x38, 0xe5, 0x10, 0x9f, 0x1d, 0x0d, 0xff, + 0x96, 0x88, 0x28, 0x11, 0xdd, 0x8d, 0x97, 0xd0, 0xbd, 0xb0, 0x22, 0x29, 0x23, 0x5d, 0x82, 0x40, + 0x28, 0xd4, 0xc8, 0x6e, 0x6c, 0xbf, 0x3b, 0xef, 0x8a, 0xc9, 0x07, 0x6b, 0x20, 0x62, 0x23, 0x15, + 0xdb, 0x4a, 0xc2, 0x21, 0xbc, 0x7a, 0x84, 0xc0, 0xe1, 0xf9, 0x90, 0x24, 0x7c, 0x5c, 0xcd, 0x5a, + 0xd9, 0x64, 0x48, 0x1b, 0xea, 0x5b, 0x60, 0x51, 0x64, 0x82, 0x42, 0xae, 0xf5, 0x66, 0x9c, 0x55, + 0x2c, 0x68, 0x81, 0xd3, 0xbe, 0xd6, 0xc3, 0x3c, 0x1c, 0x3e, 0x37, 0x00, 0x3f, 0xe0, 0x16, 0x63, + 0xd9, 0x35, 0xed, 0xba, 0xb5, 0x67, 0x60, 0x71, 0x83, 0x00, 0x04, 0x87, 0x1e, 0x33, 0x6c, 0x27, + 0x20, 0xc6, 0x1f, 0x0d, 0x1e, 0x19, 0x0d, 0xff, 0x0a, 0x18, 0xc8, 0x09, 0x59, 0x60, 0x31, 0x64, + 0x76, 0x19, 0xc2, 0x8c, 0x7d, 0x69, 0xad, 0xb0, 0x96, 0xf6, 0x65, 0x74, 0xdb, 0x70, 0xb0, 0x30, + 0x4c, 0xcf, 0x18, 0xca, 0xe9, 0xaa, 0x86, 0xe8, 0x55, 0xc5, 0xae, 0xa6, 0xe2, 0xcd, 0x90, 0xbf, + 0x0d, 0x08, 0x2e, 0xa8, 0x7c, 0xbe, 0x73, 0xe0, 0xe5, 0xfd, 0x1c, 0x2c, 0x92, 0xa4, 0xcf, 0x4f, + 0x4a, 0x41, 0xa5, 0x50, 0x70, 0x46, 0x2a, 0x80, 0xd3, 0x1f, 0x1c, 0xac, 0x6f, 0x1c, 0x82, 0xb3, + 0x4a, 0xc1, 0x55, 0xa9, 0x62, 0xf4, 0xa4, 0x04, 0x87, 0xb4, 0xe3, 0x04, 0xc5, 0xb9, 0x7a, 0xc9, + 0xf0, 0x17, 0x7d, 0x69, 0x46, 0xac, 0xb4, 0x84, 0x11, 0x05, 0x04, 0x0e, 0xf3, 0x5b, 0x14, 0xf3, + 0x41, 0x6a, 0xbb, 0x62, 0xe1, 0x50, 0x7e, 0x06, 0xc4, 0xc5, 0x10, 0x14, 0x37, 0xe4, 0xb0, 0xb7, + 0x3a, 0x83, 0x56, 0x84, 0xb6, 0xc0, 0xde, 0xe9, 0xef, 0xe0, 0x55, 0x6a, 0x22, 0x72, 0x48, 0x45, + 0x0b, 0x3f, 0x84, 0x5b, 0x93, 0x94, 0x43, 0xce, 0xd0, 0xb5, 0xee, 0xde, 0x7d, 0x3c, 0xdb, 0x2c, + 0x8c, 0x2d, 0xca, 0x48, 0x4c, 0xca, 0x7a, 0xcc, 0x24, 0x79, 0x61, 0x84, 0x55, 0xaa, 0x6c, 0x00, + 0xf8, 0x6b, 0x66, 0xf6, 0x02, 0xdf, 0xc1, 0xac, 0xd0, 0x76, 0xe2, 0x32, 0x8b, 0x1e, 0x1e, 0x90, + 0x37, 0x63, 0xe6, 0xb2, 0x68, 0xef, 0x66, 0x59, 0x0a, 0x3d, 0x31, 0xee, 0x73, 0x29, 0x5f, 0xbe, + 0xc2, 0x9b, 0x57, 0x2d, 0x1a, 0x54, 0xe6, 0x33, 0x13, 0x4a, 0xab, 0x2a, 0x8a, 0x13, 0x3c, 0x9b, + 0xdf, 0x84, 0x86, 0xaa, 0x9a, 0x4d, 0xb5, 0x1a, 0x75, 0x61, 0x71, 0x82, 0xba, 0xb2, 0xa8, 0xa6, + 0xaa, 0xac, 0xa8, 0x26, 0xa1, 0xbc, 0xaa, 0x72, 0x83, 0xba, 0x32, 0x61, 0x53, 0x71, 0x4d, 0x65, + 0x71, 0x79, 0x42, 0x79, 0x59, 0x65, 0x7d, 0xe3, 0x9c, 0xb9, 0xf1, 0x29, 0x09, 0x45, 0x35, 0x65, + 0x9b, 0x8b, 0x6b, 0x6a, 0x13, 0x2a, 0x8b, 0xeb, 0x12, 0x1a, 0xca, 0x6a, 0x8a, 0xcb, 0x8b, 0x6b, + 0x6b, 0x13, 0xea, 0x1b, 0x8a, 0xe7, 0xa6, 0x26, 0x25, 0x25, 0xd4, 0x57, 0x96, 0xd5, 0x56, 0x15, + 0x36, 0x14, 0x56, 0x26, 0x68, 0xca, 0xd5, 0x75, 0x25, 0x55, 0x35, 0x15, 0x09, 0x0d, 0x37, 0xa4, + 0x22, 0x0a, 0xff, 0x7b, 0xda, 0x55, 0xf5, 0x75, 0x6e, 0xfa, 0x05, 0xf5, 0x65, 0xe5, 0x45, 0x72, + 0xe7, 0x75, 0x32, 0x36, 0x75, 0xee, 0xbc, 0xe4, 0xb9, 0x49, 0x29, 0x64, 0x81, 0xba, 0xb6, 0xb8, + 0x88, 0xac, 0xaa, 0x24, 0x6b, 0x92, 0xd3, 0x92, 0xd3, 0xa5, 0x49, 0x05, 0x33, 0xc9, 0xc2, 0x72, + 0x75, 0xe5, 0x06, 0x12, 0x73, 0x58, 0x06, 0xed, 0x89, 0x89, 0xf1, 0xd2, 0xf8, 0x24, 0x32, 0xb6, + 0xb4, 0xae, 0x4e, 0x53, 0x3b, 0x3f, 0xc1, 0x4d, 0x21, 0x7e, 0x43, 0x55, 0xd5, 0x06, 0x60, 0xbc, + 0xaa, 0xbe, 0xa6, 0xb0, 0x38, 0xbe, 0xb0, 0xaa, 0x22, 0xa1, 0xae, 0xaa, 0xaa, 0xbc, 0xb0, 0x54, + 0x5d, 0x56, 0x99, 0x50, 0x5e, 0xbe, 0xb9, 0x62, 0x8e, 0xa6, 0xa6, 0x6a, 0x63, 0x71, 0x61, 0x1d, + 0x59, 0x90, 0x9c, 0x3e, 0xaf, 0x24, 0x2d, 0x51, 0x9a, 0x2a, 0x2d, 0x2c, 0x4e, 0x2d, 0x9a, 0x27, + 0x4d, 0x94, 0xa6, 0x24, 0x15, 0xcc, 0x4b, 0x4b, 0x4a, 0x9c, 0x97, 0x54, 0x5c, 0x94, 0x98, 0x5c, + 0x50, 0x5c, 0x9c, 0x96, 0x9e, 0x56, 0x30, 0x2f, 0x7d, 0xe6, 0xa6, 0xff, 0x41, 0x3d, 0xdd, 0x44, + 0xba, 0xac, 0xb2, 0xb0, 0xbc, 0xbe, 0xa8, 0xd8, 0xd9, 0x92, 0x50, 0xb7, 0x45, 0x53, 0x5c, 0x1b, + 0x5f, 0x5a, 0x5f, 0x56, 0x59, 0x97, 0x9c, 0xb4, 0xbe, 0xee, 0xb6, 0xd0, 0xea, 0xda, 0x8a, 0x39, + 0x1b, 0x8a, 0x2b, 0x81, 0x7a, 0x21, 0xb4, 0xd5, 0xcd, 0x29, 0x2f, 0x4f, 0x4d, 0x81, 0x6e, 0xc9, + 0x49, 0xb7, 0xed, 0x51, 0xaf, 0xd6, 0x94, 0xdd, 0xa6, 0xdb, 0xfa, 0xf5, 0xd0, 0xb1, 0xbe, 0xb2, + 0xb6, 0x6c, 0x43, 0x25, 0x8c, 0x10, 0xb4, 0x67, 0x37, 0xa8, 0x6b, 0x4a, 0xc8, 0xfb, 0x9c, 0xe3, + 0x92, 0x5d, 0x5c, 0x50, 0xbf, 0x81, 0xbc, 0xb3, 0xb2, 0xa4, 0xca, 0xdd, 0xd2, 0x00, 0xca, 0xaf, + 0x59, 0x5f, 0x5b, 0xb6, 0xb5, 0x58, 0x51, 0x53, 0x55, 0x5b, 0x3b, 0x27, 0xfb, 0x9e, 0xbb, 0x20, + 0x7c, 0xb9, 0x13, 0xfe, 0x91, 0x0a, 0x75, 0x65, 0x55, 0x65, 0x59, 0xa1, 0xba, 0x9c, 0xcc, 0xad, + 0xaf, 0xd0, 0x90, 0x2b, 0xd5, 0x05, 0xa0, 0xca, 0xc5, 0x95, 0xf8, 0xe7, 0x1e, 0x4d, 0x79, 0x59, + 0x5d, 0xde, 0xca, 0xbb, 0xee, 0xad, 0x2c, 0xab, 0x03, 0x1a, 0x58, 0xc4, 0xb4, 0xf5, 0x75, 0xf5, + 0x69, 0x40, 0x3d, 0xcd, 0x43, 0x1c, 0x63, 0x2e, 0x02, 0xc5, 0x82, 0x35, 0xd5, 0x14, 0xd7, 0xad, + 0x5f, 0xb3, 0xf2, 0x9e, 0x25, 0x65, 0xca, 0xd2, 0x7b, 0xd6, 0x2f, 0x76, 0x1d, 0x6e, 0x86, 0xc3, + 0x78, 0x4a, 0x02, 0x58, 0x4b, 0xb6, 0x16, 0x17, 0xd5, 0x96, 0xaa, 0x0b, 0xea, 0x4b, 0xea, 0x2a, + 0x34, 0x65, 0x6e, 0x58, 0x0f, 0xe4, 0x14, 0xb8, 0xc2, 0xba, 0x46, 0x00, 0x4d, 0x9a, 0x9b, 0xba, + 0x1e, 0x8e, 0x8a, 0xd4, 0x75, 0x6a, 0xfc, 0x57, 0x5e, 0x5c, 0x59, 0x50, 0x56, 0x07, 0xdf, 0x98, + 0x97, 0xd4, 0x14, 0x60, 0x06, 0xbe, 0xd6, 0xc3, 0x17, 0x1e, 0x2a, 0x92, 0xfa, 0x9a, 0xac, 0x95, + 0xda, 0x3a, 0x75, 0x5d, 0x31, 0xcc, 0xdb, 0x25, 0xc5, 0xce, 0xd0, 0x41, 0xaa, 0xb7, 0x17, 0xcd, + 0xe0, 0xa0, 0x14, 0x3d, 0xca, 0x9e, 0xc1, 0xd1, 0xc2, 0x4f, 0x1e, 0x9c, 0xcd, 0xd5, 0xa3, 0x95, + 0x33, 0x38, 0xbb, 0x52, 0xf5, 0x76, 0xcd, 0x0c, 0xce, 0xb2, 0x79, 0x7a, 0x7b, 0xe3, 0x0c, 0xce, + 0xb1, 0x79, 0x7a, 0xe9, 0x5a, 0x38, 0x13, 0xb5, 0x92, 0x29, 0x05, 0xd0, 0xab, 0xd5, 0xc6, 0xe9, + 0xd5, 0xee, 0x22, 0x53, 0x8a, 0xe0, 0xb8, 0xcd, 0xc6, 0xc9, 0x2a, 0x64, 0x01, 0x4c, 0x08, 0x5c, + 0x2c, 0x85, 0x86, 0x4e, 0x68, 0x78, 0x01, 0x37, 0x84, 0x0e, 0x0d, 0x04, 0xec, 0x97, 0xa1, 0x37, + 0x1c, 0x63, 0x59, 0x42, 0x20, 0xb6, 0x32, 0x90, 0xf1, 0x27, 0x1c, 0x34, 0x31, 0x5e, 0x45, 0xe8, + 0x75, 0x2a, 0x48, 0x42, 0xd2, 0x15, 0x29, 0x79, 0xc5, 0xe3, 0x3c, 0x35, 0x84, 0x30, 0x6c, 0x64, + 0xbd, 0x13, 0x37, 0xd2, 0x03, 0x65, 0x24, 0xb2, 0xf2, 0xad, 0x75, 0xba, 0xc4, 0x62, 0x29, 0x7a, + 0xd9, 0xca, 0x4b, 0x66, 0xbc, 0x26, 0x55, 0x12, 0x01, 0x2c, 0xc4, 0x5f, 0x89, 0x9a, 0x09, 0x7c, + 0xbd, 0x00, 0x59, 0x65, 0x4c, 0x8b, 0x08, 0x49, 0x3f, 0x21, 0x4c, 0x72, 0x3a, 0xcb, 0x4a, 0xe4, + 0x0d, 0xa3, 0xa0, 0x19, 0x5e, 0x61, 0x52, 0x2f, 0x4a, 0xa8, 0xbb, 0xe9, 0xf9, 0xb9, 0x71, 0x2b, + 0xd1, 0x1c, 0x7c, 0x62, 0xcd, 0xf6, 0x56, 0x49, 0x2c, 0x76, 0x81, 0xcc, 0x73, 0x86, 0x83, 0xbd, + 0xb7, 0x29, 0xe9, 0xff, 0xca, 0xd7, 0x87, 0xa1, 0x64, 0x46, 0xb7, 0x74, 0x45, 0x24, 0x0e, 0xae, + 0xde, 0x41, 0x7a, 0x08, 0xcb, 0xde, 0xc5, 0x57, 0x86, 0xa4, 0x3d, 0x3a, 0x3a, 0x3b, 0x99, 0x5f, + 0x3d, 0x3e, 0x68, 0xe3, 0xf7, 0x89, 0x65, 0xd5, 0xd2, 0x3e, 0xc4, 0x3e, 0x2e, 0x1e, 0x92, 0x5a, + 0x75, 0xd9, 0xd0, 0x5c, 0x2b, 0x3d, 0x66, 0xe3, 0xdb, 0x30, 0x75, 0x82, 0xc9, 0x92, 0x11, 0x43, + 0xb5, 0xa8, 0x48, 0x2b, 0x41, 0x34, 0xe0, 0xe2, 0xb3, 0x28, 0xaf, 0x40, 0xa9, 0xc0, 0xcd, 0xc5, + 0x7d, 0x71, 0xd9, 0x28, 0xdd, 0x4d, 0xf7, 0x5e, 0x8b, 0x45, 0x20, 0x73, 0x9f, 0x8d, 0xc3, 0x4f, + 0x3b, 0x3d, 0x16, 0x9f, 0x25, 0xf3, 0x4f, 0x6b, 0x04, 0x5f, 0x4b, 0xfd, 0x25, 0x68, 0x0c, 0xe5, + 0x25, 0x73, 0xea, 0xd1, 0x90, 0x70, 0x7f, 0x5f, 0xce, 0x6e, 0x21, 0x05, 0x01, 0xeb, 0xbe, 0x05, + 0xa3, 0xb3, 0xf2, 0xf5, 0xe1, 0x9a, 0x64, 0xce, 0x66, 0xfb, 0x31, 0x72, 0xc4, 0x16, 0x0e, 0x60, + 0x8d, 0x00, 0x66, 0xf5, 0x80, 0xb5, 0x40, 0x10, 0xea, 0x83, 0xc1, 0x52, 0x0c, 0x26, 0xb6, 0x95, + 0x6f, 0xcb, 0x68, 0x0d, 0xe0, 0xc2, 0x08, 0x6b, 0xd3, 0xb5, 0x5c, 0x84, 0xae, 0x50, 0x12, 0x91, + 0x23, 0x3a, 0x11, 0x7c, 0xd9, 0xf0, 0x97, 0x6e, 0x26, 0xb0, 0x5a, 0x02, 0xad, 0x2a, 0x37, 0xab, + 0x19, 0xf0, 0xf3, 0x0b, 0x0e, 0x1e, 0x91, 0xd5, 0x8d, 0x93, 0x03, 0x91, 0xa3, 0x97, 0x93, 0x5b, + 0x7b, 0xbb, 0x6d, 0x76, 0x8b, 0x7c, 0xd6, 0x05, 0xdc, 0x06, 0x1b, 0x8f, 0xb9, 0xb2, 0x5a, 0xd6, + 0x1b, 0x52, 0xd6, 0x2b, 0x2a, 0x2f, 0x15, 0xd2, 0x02, 0xf0, 0x0f, 0x62, 0x14, 0x62, 0x21, 0x62, + 0x11, 0x1b, 0xcb, 0xbc, 0x89, 0xf4, 0x9a, 0xe6, 0xf0, 0x71, 0x6b, 0x60, 0xa3, 0xd0, 0x2b, 0x78, + 0xdc, 0x73, 0x56, 0x86, 0xbc, 0xc6, 0x91, 0x16, 0xeb, 0x1a, 0x01, 0x03, 0xde, 0xa1, 0x3d, 0xb4, + 0x90, 0xce, 0xac, 0x1c, 0x2d, 0x0d, 0xe5, 0x22, 0x2c, 0xfa, 0x3e, 0x90, 0xa9, 0xb5, 0xdf, 0x49, + 0x7f, 0x84, 0x06, 0x32, 0xc9, 0xfc, 0x5c, 0xf4, 0xbb, 0x6c, 0xb3, 0xdb, 0xe4, 0xb3, 0xda, 0x18, + 0x2d, 0x88, 0x64, 0x82, 0x2e, 0x18, 0x8b, 0xae, 0x18, 0x72, 0xda, 0xfb, 0x9d, 0x6a, 0xec, 0xa4, + 0x51, 0x6a, 0x7c, 0xc7, 0x0b, 0x7d, 0x58, 0x2d, 0x76, 0xfe, 0x8b, 0x61, 0x15, 0x90, 0xac, 0xbd, + 0xa2, 0x16, 0x9d, 0xe7, 0xdf, 0x7c, 0x2d, 0x73, 0x59, 0x37, 0x51, 0x74, 0x9c, 0xf8, 0x9a, 0x55, + 0xe9, 0x60, 0x55, 0xaa, 0x78, 0xdf, 0x9a, 0x05, 0xe3, 0x66, 0x41, 0xa9, 0xf5, 0x5d, 0x63, 0x58, + 0xb7, 0xce, 0xf9, 0xaf, 0x98, 0x67, 0x36, 0x0b, 0xbe, 0x45, 0x3e, 0xdf, 0xca, 0xd8, 0x95, 0x5a, + 0x96, 0x38, 0x17, 0x3a, 0x9a, 0x89, 0x50, 0x4d, 0xac, 0x0e, 0x8e, 0xe1, 0xc0, 0xac, 0x9b, 0xbf, + 0x9f, 0x9e, 0xdb, 0xc2, 0xc8, 0xb5, 0xd0, 0x32, 0xac, 0x86, 0x4c, 0x33, 0x03, 0x5f, 0xf2, 0x33, + 0xc3, 0xf2, 0xc8, 0x3d, 0xd2, 0xb4, 0xeb, 0xd8, 0xeb, 0xc7, 0x9a, 0xf2, 0x2e, 0x0c, 0x15, 0x1f, + 0xa8, 0x6c, 0x73, 0x04, 0x24, 0x15, 0x14, 0x1e, 0xda, 0x54, 0x5b, 0xf6, 0xe0, 0x8c, 0x57, 0x0b, + 0x67, 0xd7, 0x26, 0x16, 0x7a, 0x2d, 0x78, 0x36, 0xec, 0xb0, 0xbd, 0xe9, 0x01, 0x47, 0xd3, 0xba, + 0xf1, 0xa6, 0xf5, 0x39, 0x14, 0x70, 0xd4, 0xae, 0x03, 0x43, 0xbb, 0x2a, 0xdb, 0x90, 0x78, 0x1b, + 0x5f, 0x50, 0xf8, 0xa7, 0xe6, 0x8f, 0x22, 0x5e, 0x7a, 0x50, 0x94, 0x24, 0x42, 0xda, 0x40, 0xf4, + 0x0a, 0x8c, 0xb9, 0x2f, 0x08, 0xe4, 0xc5, 0xab, 0x89, 0x85, 0x18, 0x8a, 0xbd, 0x35, 0x5f, 0xd3, + 0xae, 0xc8, 0x84, 0x50, 0xc8, 0xa2, 0x48, 0xb7, 0xf7, 0xe9, 0xcf, 0x8b, 0x07, 0x3a, 0xbc, 0xc7, + 0xe4, 0x38, 0xc4, 0x3b, 0x2f, 0x09, 0x77, 0xc6, 0x26, 0x41, 0x29, 0x67, 0x54, 0x82, 0xaf, 0x95, + 0x10, 0xf2, 0xf8, 0x9c, 0xc5, 0x81, 0x8f, 0x0f, 0x6c, 0xe9, 0xa9, 0x51, 0x3f, 0x0e, 0xaa, 0xc4, + 0xf6, 0xce, 0x1e, 0xca, 0xe8, 0x34, 0x2c, 0xd8, 0x0b, 0x81, 0x14, 0x3d, 0xd3, 0x6c, 0xc8, 0x80, + 0xa0, 0xca, 0xd4, 0x87, 0x87, 0x52, 0x0d, 0xeb, 0x7d, 0x38, 0x00, 0xf8, 0x33, 0xb2, 0xe3, 0xb0, + 0xd6, 0x71, 0xfe, 0x36, 0x65, 0x18, 0xcd, 0x65, 0xde, 0xa3, 0x64, 0xde, 0xa7, 0x79, 0xf1, 0x6e, + 0xf1, 0x39, 0xb9, 0x1d, 0xef, 0x39, 0x2e, 0x49, 0x11, 0x9a, 0x07, 0x1d, 0xa6, 0xdf, 0x31, 0x68, + 0xba, 0x3b, 0x94, 0x13, 0x8f, 0x71, 0x17, 0xab, 0xc4, 0x34, 0x3a, 0xb4, 0xdd, 0xb0, 0x90, 0xac, + 0x07, 0xcf, 0x59, 0x58, 0x0f, 0xab, 0x4c, 0xb1, 0xbb, 0x01, 0xfb, 0xa9, 0x1a, 0x58, 0x43, 0x60, + 0x79, 0xa9, 0x2c, 0xac, 0xd9, 0xa2, 0xa9, 0x2b, 0x2b, 0xc2, 0x4d, 0xeb, 0x5d, 0x67, 0xd4, 0x71, + 0x51, 0x71, 0x61, 0x55, 0x65, 0x49, 0x7d, 0x21, 0xb8, 0x66, 0x7f, 0x63, 0xc9, 0xb3, 0x64, 0x8a, + 0x4a, 0x2a, 0xcf, 0xa1, 0xcf, 0xcb, 0x8f, 0x0a, 0x7f, 0xc3, 0xe4, 0x67, 0x9d, 0x6d, 0xbe, 0x63, + 0x7e, 0x27, 0x5b, 0x4b, 0x90, 0x3c, 0x3d, 0x69, 0xe4, 0x21, 0x4b, 0x10, 0xb2, 0xe4, 0xce, 0x5f, + 0xd7, 0x11, 0xa5, 0x5d, 0x95, 0xbf, 0xb3, 0x4e, 0xe5, 0xa5, 0xa5, 0xcb, 0x02, 0x18, 0x72, 0x4e, + 0x20, 0xb2, 0xc6, 0x23, 0xd9, 0xd7, 0x3a, 0x46, 0x92, 0x71, 0xd0, 0xb4, 0xdb, 0xfe, 0xa3, 0x4e, + 0xe8, 0xaf, 0xbd, 0xf7, 0xc4, 0x25, 0x5e, 0x3c, 0xd1, 0x93, 0x55, 0xd1, 0x69, 0xa8, 0x40, 0x62, + 0xb4, 0x8f, 0xe4, 0x64, 0xed, 0x47, 0xe8, 0x61, 0x02, 0x85, 0x4f, 0xe3, 0x24, 0x12, 0xed, 0xf7, + 0x32, 0x92, 0x2e, 0xf1, 0x2e, 0xaa, 0x87, 0x66, 0xe9, 0x9f, 0x69, 0x6c, 0x3a, 0x25, 0x2c, 0x09, + 0x24, 0x96, 0xf7, 0x64, 0x55, 0x72, 0x0e, 0xed, 0x20, 0x63, 0xd6, 0x49, 0xe6, 0x75, 0xad, 0x5e, + 0x2c, 0xf5, 0x7f, 0x83, 0x0c, 0xee, 0x3d, 0x30, 0x7d, 0x64, 0xfb, 0x2a, 0x93, 0x97, 0xfa, 0x3e, + 0xdf, 0xf1, 0xfe, 0xd9, 0x83, 0x4d, 0xa9, 0xaf, 0x72, 0x4a, 0x4e, 0x07, 0x5e, 0xcc, 0x82, 0xee, + 0x0b, 0x2f, 0xf1, 0x1a, 0x24, 0xd0, 0xfd, 0xe9, 0x46, 0xe6, 0xfb, 0xb8, 0x7b, 0x7e, 0x8f, 0x7e, + 0x1d, 0xe7, 0x8c, 0x9f, 0x3c, 0xfa, 0xcd, 0x55, 0xb2, 0x3f, 0xd4, 0x72, 0x90, 0x6a, 0xed, 0xf4, + 0x41, 0xe3, 0x4f, 0xbc, 0xb1, 0x6a, 0x01, 0x0d, 0xb5, 0x2e, 0x65, 0x3c, 0xad, 0xdc, 0xbe, 0x4a, + 0xe9, 0xb3, 0x19, 0x51, 0xed, 0xfd, 0xb9, 0x3d, 0xfa, 0xad, 0x16, 0x3a, 0x42, 0x9b, 0x58, 0xa3, + 0x51, 0x5a, 0x6f, 0xdd, 0xea, 0xbc, 0x1d, 0x46, 0x6c, 0xef, 0x62, 0x19, 0x0d, 0x69, 0x0f, 0x61, + 0x15, 0x0f, 0x44, 0xe9, 0xf3, 0x2c, 0xfd, 0xb3, 0xf7, 0xb3, 0xd7, 0xc0, 0xfc, 0x89, 0xf7, 0x2d, + 0x2a, 0x78, 0xb0, 0xe9, 0x47, 0x21, 0xc4, 0x69, 0xa9, 0xa2, 0x82, 0xc4, 0xa0, 0xa2, 0xbb, 0x83, + 0xca, 0x3a, 0x82, 0xce, 0xf8, 0xa9, 0xa3, 0x7b, 0x56, 0x95, 0x7a, 0x6d, 0xa1, 0x70, 0x0e, 0x65, + 0xff, 0xc4, 0xdb, 0x54, 0x2d, 0x20, 0x80, 0x96, 0xf1, 0x69, 0xfb, 0x3a, 0xf5, 0x9c, 0x8f, 0xe5, + 0x48, 0x5b, 0xbd, 0x5d, 0xea, 0xff, 0xf7, 0xd9, 0x5d, 0x8b, 0x33, 0xc1, 0x97, 0x94, 0x08, 0x55, + 0xb4, 0x11, 0xa1, 0xf5, 0x70, 0x67, 0x0e, 0x1e, 0xd6, 0x21, 0x42, 0x8c, 0x50, 0x0b, 0x9e, 0xe4, + 0xb8, 0x2f, 0x43, 0xd4, 0x93, 0x75, 0xff, 0x20, 0x98, 0x00, 0xc6, 0xd9, 0xeb, 0x08, 0x3c, 0xd9, + 0x0b, 0x57, 0x45, 0x4f, 0x71, 0x92, 0x0f, 0xbe, 0xaf, 0xbf, 0xbf, 0x05, 0xf8, 0x0c, 0x7b, 0xec, + 0x6d, 0x8d, 0xd7, 0xdb, 0x8d, 0x3b, 0xdf, 0x35, 0xef, 0xfc, 0x33, 0xb4, 0xcf, 0xbd, 0xf4, 0x7e, + 0x6f, 0x85, 0x99, 0x82, 0xef, 0x00, 0x79, 0xf7, 0xef, 0x72, 0xca, 0x3b, 0x0c, 0xf2, 0xbe, 0xe5, + 0x94, 0xd7, 0xf8, 0x0c, 0x32, 0xac, 0xea, 0xf6, 0x76, 0xca, 0x3b, 0x9c, 0x2d, 0xea, 0xe9, 0xad, + 0x68, 0xa7, 0x3b, 0xe1, 0xdf, 0x5e, 0x65, 0xf5, 0xae, 0x86, 0x76, 0x83, 0x2e, 0x78, 0x4b, 0x75, + 0xf0, 0xd6, 0x83, 0xc1, 0x0f, 0x1d, 0x5c, 0x2e, 0x6d, 0xad, 0x37, 0x12, 0x7a, 0x06, 0xe2, 0xfd, + 0x83, 0x43, 0x67, 0x70, 0x95, 0xb2, 0xcf, 0x7c, 0x59, 0x1c, 0xbf, 0xfd, 0xae, 0xd3, 0x36, 0xe7, + 0xa9, 0x54, 0xf7, 0xda, 0x0c, 0xbe, 0x30, 0xd2, 0x4e, 0x5b, 0x7d, 0x87, 0x88, 0xcc, 0xb1, 0x32, + 0xdf, 0x7c, 0x4c, 0x2a, 0x33, 0x59, 0xbd, 0x8a, 0xc2, 0xd5, 0x5a, 0x92, 0x08, 0x1d, 0x9c, 0xdf, + 0x8b, 0xe4, 0xb4, 0xb9, 0x26, 0x0a, 0x4f, 0x39, 0x49, 0x75, 0x3c, 0xe5, 0xec, 0xe8, 0xd0, 0x1d, + 0xa0, 0x3a, 0xd2, 0x9d, 0x1d, 0xd9, 0xce, 0x8e, 0x3e, 0xce, 0x8e, 0xd3, 0x9d, 0x1d, 0x17, 0x3b, + 0x3b, 0xb6, 0x3a, 0x3b, 0x8a, 0xe5, 0x54, 0x47, 0x44, 0x41, 0xca, 0x9c, 0x97, 0x8c, 0x14, 0x12, + 0xa9, 0xb3, 0x17, 0xcb, 0xd9, 0xcb, 0xdb, 0x79, 0x49, 0xec, 0xec, 0x95, 0xe1, 0x62, 0x5b, 0x4b, + 0x41, 0xaa, 0x08, 0x8a, 0x9c, 0x83, 0xf6, 0x66, 0x65, 0x62, 0x96, 0x09, 0x35, 0xcd, 0x60, 0x70, + 0x2f, 0x5c, 0xe5, 0x42, 0x3b, 0xed, 0xfe, 0x77, 0x44, 0x92, 0x1c, 0x6d, 0xaf, 0xaf, 0x9e, 0x51, + 0x73, 0x8d, 0xc1, 0xf1, 0x2b, 0xd5, 0x1d, 0xb8, 0xbf, 0x55, 0x18, 0x29, 0x1b, 0xe5, 0xc8, 0x69, + 0xe9, 0x8f, 0xd0, 0x18, 0xdc, 0x6e, 0xd9, 0x67, 0x73, 0x96, 0x70, 0xfc, 0xcc, 0x1a, 0x23, 0xa9, + 0x13, 0x2f, 0x02, 0xfc, 0xeb, 0xc8, 0x7f, 0x04, 0x41, 0x77, 0x65, 0x5a, 0x96, 0x49, 0xf6, 0xd8, + 0x1f, 0x81, 0xee, 0x3c, 0x53, 0xfd, 0x4e, 0xe8, 0x1e, 0x2b, 0x96, 0xe4, 0x90, 0x1f, 0xde, 0x05, + 0xfc, 0x44, 0x0c, 0xfe, 0xf9, 0x30, 0x74, 0x0f, 0x78, 0x4c, 0x18, 0x69, 0x3a, 0x13, 0x03, 0x3c, + 0xfb, 0x14, 0x7d, 0x59, 0x60, 0x24, 0x09, 0xde, 0x1d, 0x1c, 0xbf, 0xc1, 0x4b, 0xfe, 0x94, 0xd4, + 0x1e, 0x36, 0xce, 0x62, 0x36, 0xc6, 0xe9, 0xab, 0xa7, 0xb2, 0x41, 0xea, 0x6f, 0x60, 0x83, 0x71, + 0x03, 0x80, 0x4a, 0x7b, 0x03, 0x40, 0xc6, 0x8d, 0x7c, 0xc6, 0x91, 0xfe, 0x8c, 0xa4, 0x31, 0x03, + 0x57, 0x1f, 0x72, 0xd5, 0xc6, 0xd0, 0x99, 0x0c, 0x5c, 0x5a, 0x22, 0xdb, 0x9f, 0x91, 0xcc, 0x69, + 0xe2, 0xd2, 0x94, 0x3c, 0x7f, 0x46, 0x56, 0x40, 0x34, 0x67, 0xc3, 0x38, 0xb4, 0x8c, 0x4d, 0x8b, + 0xe6, 0xf4, 0xc7, 0xe6, 0x09, 0x43, 0x77, 0xb7, 0x93, 0xfc, 0x43, 0x52, 0x79, 0x69, 0x6e, 0x81, + 0x5e, 0xaa, 0xed, 0x63, 0x74, 0xc8, 0xb7, 0x73, 0xb3, 0x9e, 0xf0, 0xf3, 0x37, 0x2e, 0x89, 0x8a, + 0xe6, 0x1c, 0xcb, 0xcd, 0x13, 0x6e, 0xdb, 0x03, 0x00, 0x09, 0x89, 0x72, 0xd1, 0x29, 0xb5, 0xde, + 0x3e, 0xd8, 0xcf, 0xe8, 0x78, 0x1a, 0x00, 0x14, 0xfe, 0xfe, 0xc6, 0x97, 0xa2, 0xa3, 0x39, 0xbb, + 0x96, 0xe5, 0x09, 0x9f, 0x79, 0x16, 0x00, 0xd2, 0x01, 0x60, 0x33, 0x60, 0x18, 0xef, 0x63, 0xa8, + 0x85, 0x3b, 0x01, 0x43, 0x90, 0xbf, 0x51, 0x12, 0x1f, 0xcd, 0xa1, 0xaf, 0x03, 0x80, 0xbf, 0x00, + 0xc0, 0xcb, 0x00, 0xb0, 0xb6, 0x10, 0x30, 0x0c, 0x30, 0xd4, 0x96, 0x5d, 0xdc, 0x5e, 0x4b, 0x98, + 0xbf, 0xf1, 0xfc, 0xbc, 0x68, 0x4e, 0x5f, 0x63, 0x9e, 0xf0, 0x63, 0x14, 0x80, 0x92, 0x7d, 0x0b, + 0x91, 0xb2, 0x53, 0x5a, 0xa0, 0x41, 0x24, 0x87, 0x75, 0x34, 0x62, 0xe8, 0x9f, 0xd7, 0xaf, 0x5f, + 0x97, 0xfe, 0x00, 0x5f, 0x7d, 0x38, 0x09, 0xee, 0x93, 0xcc, 0x5a, 0x7c, 0x7f, 0x6c, 0xb2, 0xdc, + 0xdf, 0x9a, 0x97, 0x1d, 0x82, 0x56, 0xc6, 0xb6, 0x8a, 0xc4, 0x88, 0xa3, 0xb7, 0xf5, 0xb2, 0x0f, + 0xfd, 0x7a, 0xfd, 0xfa, 0xa2, 0x4e, 0x0c, 0x22, 0xc3, 0x19, 0xc0, 0xbe, 0x56, 0x79, 0x75, 0x58, + 0xee, 0xb2, 0x11, 0x86, 0xd4, 0x9f, 0x40, 0xc3, 0xb1, 0x43, 0xd9, 0x08, 0xcd, 0xe5, 0x25, 0xfb, + 0x16, 0x23, 0x65, 0x87, 0x0b, 0xb5, 0x57, 0xf8, 0x30, 0x46, 0x2d, 0xfc, 0x09, 0x43, 0xff, 0xdb, + 0x89, 0x9a, 0x89, 0x06, 0x19, 0xc8, 0x85, 0x32, 0x8b, 0xdd, 0x85, 0x51, 0x6a, 0xf1, 0x25, 0x2a, + 0xa9, 0xd8, 0x67, 0x24, 0x4c, 0xf4, 0x83, 0xc9, 0xac, 0xa6, 0xad, 0x9c, 0x24, 0x02, 0xcd, 0x60, + 0x0d, 0xd0, 0xf4, 0x2a, 0xc7, 0x35, 0x79, 0x28, 0xc3, 0x9f, 0x65, 0x6d, 0xb1, 0x11, 0x5a, 0x52, + 0x14, 0x57, 0x8f, 0x74, 0x18, 0x5c, 0xeb, 0xe2, 0x80, 0x40, 0x00, 0xd8, 0xc7, 0x62, 0x8c, 0xb2, + 0xe8, 0xd2, 0x42, 0xe5, 0xfe, 0xe6, 0xe9, 0xfe, 0xe8, 0x66, 0x0c, 0x5a, 0xfd, 0x64, 0x0c, 0x9b, + 0x85, 0x14, 0x06, 0xd3, 0x0d, 0x18, 0x2e, 0x39, 0x31, 0xdc, 0x11, 0xe5, 0x8f, 0xec, 0x47, 0xd5, + 0x32, 0x7a, 0x4a, 0x7b, 0x62, 0xec, 0xb0, 0xc2, 0xc4, 0x45, 0xa2, 0x44, 0x69, 0x90, 0x90, 0x41, + 0x8f, 0x09, 0x18, 0x26, 0xdb, 0xa5, 0x68, 0x09, 0x5f, 0x80, 0x18, 0x36, 0x95, 0x2f, 0xf3, 0x7e, + 0x9c, 0x95, 0xdd, 0x0a, 0xfc, 0x3f, 0x6a, 0xc7, 0x98, 0xd4, 0x03, 0x66, 0xe5, 0x1f, 0xa4, 0x14, + 0xb8, 0x4c, 0x24, 0x64, 0x18, 0x38, 0x01, 0xfa, 0x54, 0xa5, 0xa1, 0xa8, 0x17, 0xce, 0xd3, 0x10, + 0x9c, 0x9f, 0x13, 0x44, 0x3e, 0x8f, 0x7b, 0x5c, 0xc1, 0x29, 0x5b, 0x40, 0x8d, 0x64, 0xd1, 0x48, + 0xd5, 0x8f, 0xca, 0x64, 0x42, 0xfe, 0x74, 0xa5, 0xe9, 0xa4, 0xcc, 0xfb, 0xf1, 0x10, 0x83, 0x3e, + 0x93, 0xf1, 0x34, 0xd2, 0xfa, 0x1a, 0x7a, 0x09, 0xb9, 0xb4, 0xfd, 0x57, 0x12, 0xa0, 0x4e, 0xd2, + 0x77, 0x73, 0xdd, 0x18, 0x98, 0x3e, 0xe5, 0xc0, 0xf7, 0xa3, 0x63, 0xbf, 0x60, 0x6a, 0x98, 0x64, + 0x73, 0x88, 0x81, 0x86, 0x8a, 0x68, 0x68, 0x5b, 0x98, 0x3e, 0x0d, 0x19, 0x42, 0x0c, 0xbd, 0x99, + 0xad, 0xcf, 0x22, 0xed, 0xea, 0x6d, 0x2a, 0x4e, 0x09, 0x9f, 0xf7, 0xb3, 0x14, 0xae, 0x2c, 0xe1, + 0x3f, 0xc6, 0x06, 0x66, 0x3f, 0xa2, 0x3f, 0x80, 0x49, 0xab, 0x30, 0xb3, 0x0e, 0x17, 0xb3, 0x48, + 0xfb, 0x8c, 0x85, 0xab, 0xea, 0x77, 0x34, 0x02, 0x03, 0x7b, 0x32, 0x2c, 0x3f, 0x42, 0xeb, 0xe8, + 0x39, 0x7c, 0xcb, 0x03, 0xe7, 0x94, 0xa7, 0x45, 0xf3, 0xb5, 0xeb, 0x04, 0x1f, 0x85, 0x1e, 0xb0, + 0xe1, 0x31, 0xce, 0xc2, 0x63, 0x5c, 0xa0, 0x8a, 0x83, 0x11, 0x15, 0xcc, 0xec, 0x92, 0x4b, 0xd5, + 0x30, 0x7e, 0xa4, 0x90, 0xa3, 0x97, 0xa7, 0xf0, 0x08, 0x71, 0x17, 0x91, 0x5c, 0xa8, 0x3c, 0xb5, + 0x6d, 0x85, 0x7f, 0x2a, 0x01, 0xa3, 0xea, 0x03, 0xa3, 0xba, 0x8f, 0x7d, 0xef, 0x51, 0x3c, 0xd6, + 0x58, 0xc9, 0x8b, 0x86, 0x44, 0x01, 0x48, 0x39, 0xf9, 0xda, 0x13, 0x13, 0xd7, 0xf2, 0x44, 0xa8, + 0xc8, 0x1b, 0x58, 0xb1, 0x7b, 0x2f, 0x89, 0x29, 0xa7, 0x95, 0x1a, 0x34, 0x1d, 0x36, 0x23, 0x21, + 0xb3, 0x09, 0x81, 0x78, 0x2a, 0x67, 0x75, 0x28, 0x5c, 0x0e, 0xe0, 0xab, 0x7b, 0x51, 0xb7, 0xca, + 0xc1, 0xa5, 0x3b, 0x68, 0x8a, 0x18, 0xbe, 0x36, 0x8c, 0xf7, 0x9c, 0xd4, 0x2d, 0x94, 0x6f, 0xd3, + 0x3f, 0xce, 0x63, 0x25, 0x14, 0xb8, 0x64, 0x31, 0x7b, 0xeb, 0xd9, 0xec, 0x64, 0xd6, 0xe1, 0xca, + 0xfc, 0xf9, 0x6a, 0x7f, 0xc4, 0x54, 0xc0, 0x58, 0xc5, 0x8b, 0x1a, 0xdd, 0xd8, 0xbb, 0xcd, 0x8e, + 0x10, 0x43, 0xc1, 0xbc, 0xd8, 0xe7, 0x28, 0xa1, 0x11, 0x08, 0x1d, 0x74, 0xcf, 0xc8, 0x69, 0xac, + 0x90, 0x1c, 0x50, 0x16, 0xc2, 0xe3, 0x96, 0x4a, 0x76, 0xaa, 0x50, 0x09, 0x7f, 0xc7, 0x97, 0xf9, + 0x75, 0xbd, 0xd1, 0x30, 0x0a, 0x67, 0x60, 0x14, 0xf2, 0xf3, 0xe4, 0x7f, 0xc5, 0xfa, 0x96, 0x3c, + 0x0d, 0x23, 0x66, 0x8e, 0xc6, 0x5c, 0x92, 0xac, 0x6a, 0xb0, 0x93, 0x31, 0xd6, 0x0b, 0x20, 0x95, + 0x52, 0x6a, 0xe4, 0xd2, 0xcd, 0xde, 0xb4, 0x90, 0xf1, 0x49, 0x9c, 0x97, 0xc8, 0xd8, 0xfe, 0x2c, + 0x0f, 0x03, 0xc0, 0xbf, 0xd5, 0x0e, 0xfc, 0x6f, 0xcb, 0x8a, 0xc1, 0x17, 0x37, 0xc9, 0x58, 0xff, + 0x0d, 0x8f, 0x66, 0x9f, 0x5e, 0x36, 0x0f, 0x03, 0xf2, 0x01, 0xd0, 0x6a, 0x21, 0x7c, 0x39, 0x04, + 0x10, 0xbd, 0x30, 0xb0, 0x6f, 0x42, 0x95, 0x59, 0x5e, 0x1b, 0xb4, 0xd4, 0xc4, 0x9a, 0x5b, 0xa8, + 0x44, 0x32, 0x18, 0x22, 0x3b, 0x8b, 0x10, 0xfc, 0x53, 0xe5, 0x46, 0x66, 0x56, 0x71, 0xfc, 0x59, + 0xb2, 0x30, 0x46, 0xfa, 0xb8, 0x81, 0x4b, 0xd7, 0xea, 0x25, 0xa0, 0xcd, 0x0a, 0xe1, 0x98, 0xc3, + 0x27, 0x9a, 0x8f, 0x78, 0xdb, 0x60, 0x08, 0xd7, 0x4a, 0xc7, 0x8d, 0x84, 0x46, 0xd7, 0x01, 0xf3, + 0xc2, 0xbb, 0x69, 0x39, 0xbe, 0x78, 0x99, 0x14, 0x60, 0xe9, 0x2d, 0x20, 0xbd, 0x07, 0xa4, 0x55, + 0xde, 0x11, 0xd6, 0xba, 0x7c, 0x84, 0xa1, 0x91, 0xdb, 0x30, 0x37, 0x4a, 0xe0, 0x46, 0x36, 0xcd, + 0x98, 0x5a, 0xda, 0x84, 0x19, 0x65, 0x61, 0x65, 0x8e, 0x68, 0x39, 0x0c, 0x02, 0x2c, 0x75, 0x73, + 0xe1, 0x71, 0xee, 0xb3, 0x9e, 0xb1, 0x61, 0xcf, 0xb7, 0xfc, 0x0b, 0x78, 0xeb, 0xe0, 0x63, 0xe5, + 0xee, 0x87, 0x0b, 0x27, 0xc9, 0xab, 0xc4, 0x2c, 0x30, 0x86, 0x3f, 0xdb, 0xc6, 0x8c, 0xcb, 0x9c, + 0xe3, 0x5a, 0x6a, 0x40, 0xbc, 0x57, 0x80, 0x8c, 0x4b, 0x89, 0xfa, 0xd8, 0xfd, 0xbd, 0x6e, 0x25, + 0x7a, 0xb1, 0x9e, 0x07, 0xcd, 0x48, 0xeb, 0x40, 0x79, 0x1d, 0x76, 0x7c, 0xb1, 0x77, 0xe6, 0x55, + 0x30, 0xc5, 0x83, 0x61, 0x7b, 0x80, 0x17, 0x0f, 0x48, 0x62, 0x6c, 0x9d, 0x01, 0x13, 0x8d, 0x8f, + 0x05, 0x15, 0x8e, 0x78, 0xe7, 0x82, 0xd4, 0x63, 0x06, 0x0b, 0xfb, 0xcf, 0x94, 0xa6, 0xcc, 0xa0, + 0x29, 0x7e, 0x98, 0x50, 0x27, 0x44, 0x98, 0xf1, 0x38, 0xac, 0xc6, 0x16, 0xdb, 0x25, 0x3c, 0xff, + 0xc7, 0xcd, 0xbc, 0x4e, 0xca, 0x34, 0x6d, 0x78, 0xf2, 0xcf, 0xa5, 0x2e, 0x50, 0x8e, 0x61, 0xdc, + 0x7a, 0x19, 0xeb, 0xf3, 0x22, 0x36, 0xd0, 0x0e, 0xb7, 0xf1, 0x92, 0xfe, 0x08, 0x6c, 0x3f, 0x5b, + 0xca, 0x61, 0x7d, 0x9a, 0x39, 0x6e, 0x0b, 0x87, 0xa6, 0x0f, 0x74, 0xc3, 0x20, 0xc2, 0x0c, 0x56, + 0x33, 0x43, 0xaf, 0x12, 0xb2, 0xbe, 0xb7, 0xf2, 0x1a, 0xa4, 0x02, 0x70, 0x38, 0x8d, 0x91, 0x18, + 0x95, 0x46, 0x61, 0x16, 0xa8, 0x80, 0x81, 0x96, 0xe6, 0x55, 0xd4, 0x50, 0x89, 0xbc, 0x38, 0x7a, + 0x9d, 0xc1, 0xe7, 0x9c, 0x09, 0x9b, 0x66, 0x23, 0x63, 0x12, 0xb5, 0xcb, 0x76, 0x8a, 0xda, 0x77, + 0x98, 0x5a, 0x3d, 0xf4, 0x40, 0xda, 0x3c, 0x64, 0x8d, 0x33, 0x48, 0x19, 0x80, 0xeb, 0x21, 0x11, + 0xe5, 0xbc, 0x3e, 0xa4, 0xeb, 0x55, 0x96, 0xc1, 0x3e, 0x6a, 0xc6, 0x74, 0x61, 0x86, 0x86, 0x29, + 0x96, 0xb1, 0x6b, 0x76, 0xc9, 0x72, 0xd9, 0xc9, 0xf2, 0x05, 0x27, 0x12, 0x35, 0xba, 0x52, 0x2d, + 0x62, 0xd6, 0x90, 0xe0, 0x18, 0xf6, 0xcd, 0x31, 0x3e, 0x6d, 0x06, 0x53, 0xb7, 0xe6, 0x83, 0xa9, + 0xef, 0x7d, 0x44, 0xd4, 0xac, 0xc2, 0x9e, 0x48, 0x16, 0x0d, 0x7e, 0xa4, 0x65, 0x9a, 0xbe, 0x4e, + 0xd4, 0xbc, 0x02, 0x7b, 0x97, 0xac, 0xa7, 0xb9, 0xcf, 0xb8, 0x3d, 0xda, 0xd3, 0xec, 0xfb, 0xda, + 0xf1, 0xb4, 0x54, 0x5f, 0x71, 0xbb, 0x96, 0x12, 0x3d, 0x9e, 0x06, 0x74, 0x04, 0xd3, 0xe0, 0xbc, + 0x2e, 0xa0, 0x04, 0x3b, 0x2e, 0x21, 0x05, 0xe1, 0x71, 0x6a, 0xc5, 0x11, 0xf9, 0x6a, 0x6c, 0x83, + 0xcd, 0x76, 0x97, 0xd3, 0xb8, 0x01, 0x1c, 0xdd, 0x08, 0x7e, 0x9a, 0xf2, 0x7e, 0xb8, 0x75, 0xf4, + 0x7b, 0xdc, 0x8f, 0x4b, 0x77, 0xcd, 0xc6, 0x3d, 0x5b, 0xc8, 0xa6, 0x2f, 0x30, 0x92, 0x6b, 0x78, + 0x4e, 0x4e, 0xf8, 0xd9, 0xa7, 0xd9, 0x2b, 0x28, 0xf0, 0x8e, 0xdb, 0x80, 0x5f, 0xbd, 0x35, 0xb8, + 0xfa, 0x36, 0xe0, 0x57, 0x6e, 0x0d, 0x2e, 0xb9, 0x0d, 0xf8, 0xf8, 0xad, 0xc1, 0x47, 0x2f, 0xde, + 0x1a, 0xfc, 0xc2, 0x6d, 0x78, 0xbf, 0x0d, 0xf8, 0xd8, 0x6d, 0x78, 0xbf, 0x0d, 0xf8, 0xd9, 0xdb, + 0xf0, 0x7e, 0x1b, 0x70, 0xc7, 0x4d, 0xe0, 0x8d, 0x14, 0xef, 0xdf, 0xdd, 0x04, 0xfe, 0x39, 0x06, + 0x3f, 0x75, 0x6b, 0xf0, 0x8e, 0xdb, 0x80, 0x8f, 0xdc, 0x1a, 0x5c, 0x7d, 0x1b, 0xf0, 0xe1, 0x5b, + 0x83, 0x4b, 0x6e, 0x03, 0x6e, 0xbf, 0x35, 0xb8, 0xfc, 0xca, 0xad, 0xc1, 0x3f, 0xbe, 0x35, 0xb8, + 0xed, 0xc2, 0xad, 0xc1, 0x8f, 0x78, 0xc0, 0x29, 0x67, 0x05, 0xe0, 0x1a, 0x0a, 0x5c, 0x40, 0x19, + 0x30, 0xe5, 0xf6, 0xcf, 0xdb, 0x02, 0xd7, 0x60, 0x53, 0xb5, 0x18, 0x26, 0x75, 0x6f, 0xc4, 0x2b, + 0x81, 0xed, 0x67, 0xbc, 0x48, 0x9e, 0xc0, 0x78, 0xdc, 0x0b, 0x47, 0xa2, 0x74, 0xba, 0x88, 0x61, + 0xe0, 0x4d, 0xa3, 0x56, 0xec, 0x53, 0x7a, 0xe7, 0x9c, 0x72, 0xa1, 0xbe, 0xcf, 0x85, 0x1a, 0xc3, + 0xb6, 0xc3, 0x85, 0xc7, 0x03, 0x86, 0x9f, 0x4b, 0x8c, 0x3d, 0x5f, 0x30, 0x06, 0xc7, 0xb1, 0xa5, + 0x83, 0x46, 0xc2, 0x15, 0x2a, 0x2d, 0xcd, 0xec, 0xc6, 0x81, 0x95, 0x12, 0x7b, 0x4d, 0xc5, 0x37, + 0xee, 0x50, 0x69, 0x88, 0x81, 0x1d, 0x0d, 0x1b, 0x81, 0x1b, 0x18, 0x56, 0x50, 0x6e, 0xe0, 0x2d, + 0xec, 0x06, 0x4c, 0x78, 0x8d, 0xa6, 0x96, 0x61, 0x6a, 0x25, 0x58, 0xe1, 0xf3, 0x0a, 0xc2, 0xfd, + 0xe8, 0x11, 0xe0, 0xe4, 0x1f, 0x16, 0xe7, 0x8d, 0x8a, 0x1b, 0x61, 0x55, 0x6d, 0xf7, 0x7a, 0x35, + 0xa6, 0x94, 0x36, 0x28, 0xfb, 0x12, 0x5c, 0x75, 0xfc, 0xb6, 0xe7, 0xcd, 0x5c, 0xad, 0x7e, 0x1b, + 0x5c, 0x77, 0xa1, 0x73, 0x38, 0xbd, 0x4a, 0x37, 0x46, 0xd7, 0x4e, 0xa1, 0x03, 0x0f, 0x64, 0xcd, + 0xb3, 0x33, 0xdc, 0xa1, 0xdb, 0x42, 0x8a, 0x1f, 0xed, 0x04, 0x3f, 0x54, 0x00, 0x45, 0x39, 0x9d, + 0xab, 0x16, 0xde, 0x21, 0xdc, 0xef, 0x02, 0x2c, 0x7a, 0xf6, 0x0f, 0x25, 0x81, 0xc3, 0xea, 0x70, + 0x58, 0x38, 0xde, 0xb5, 0x6c, 0x05, 0x7f, 0xc1, 0xbf, 0xb5, 0x78, 0x47, 0x17, 0x5a, 0x31, 0x3a, + 0x6a, 0x51, 0xa0, 0xff, 0x6d, 0xb2, 0x78, 0xc1, 0x76, 0xda, 0xc7, 0xa2, 0x80, 0xda, 0xc4, 0x2b, + 0x13, 0xa2, 0x8e, 0xd3, 0x87, 0x30, 0x44, 0x0f, 0xa6, 0x61, 0xf9, 0xf7, 0x24, 0xde, 0x34, 0xb4, + 0x05, 0x8e, 0x56, 0x79, 0x62, 0xb0, 0xe2, 0x2e, 0x0f, 0x9f, 0x4b, 0x17, 0x51, 0x88, 0xed, 0x37, + 0x23, 0x9e, 0x37, 0x7c, 0x13, 0xe2, 0xab, 0x4e, 0xc4, 0x1f, 0xdc, 0x8c, 0x38, 0x7b, 0x8e, 0x07, + 0xb1, 0xc9, 0x86, 0x26, 0x62, 0x45, 0xd2, 0x17, 0x87, 0xc5, 0x74, 0x5c, 0xbd, 0xe4, 0xb3, 0xdf, + 0xbd, 0x24, 0x48, 0xfd, 0x53, 0x88, 0xbd, 0x6a, 0xaf, 0xb4, 0x42, 0xe5, 0xd0, 0x61, 0x3b, 0x1c, + 0x17, 0x49, 0xad, 0x1e, 0x41, 0x77, 0xe6, 0x0c, 0x62, 0x7e, 0x48, 0xac, 0x52, 0xc5, 0xb7, 0xb7, + 0x18, 0xc7, 0x96, 0x6c, 0x8a, 0x07, 0xec, 0x08, 0x17, 0x99, 0xa7, 0x8e, 0xe3, 0x74, 0xbf, 0x2e, + 0x4a, 0x0e, 0xc5, 0x4c, 0x6a, 0x1c, 0x4b, 0x74, 0x11, 0x9b, 0xff, 0xe3, 0x38, 0xb6, 0xf5, 0x53, + 0xe8, 0x70, 0xe4, 0xb6, 0x68, 0x70, 0x8a, 0x48, 0xc4, 0x4d, 0xba, 0xda, 0x79, 0xe7, 0x10, 0xe6, + 0x0d, 0x87, 0x81, 0xd7, 0x0d, 0xa7, 0x26, 0xf3, 0x16, 0x73, 0x96, 0x7e, 0xa3, 0xae, 0xf6, 0x3a, + 0x11, 0x7f, 0x7d, 0x33, 0x62, 0x7a, 0xda, 0x8d, 0x88, 0xbd, 0x72, 0x29, 0xc4, 0xda, 0x9b, 0x11, + 0xdf, 0xe1, 0xb8, 0x09, 0x71, 0xa7, 0x13, 0xf1, 0x37, 0x37, 0x23, 0x5e, 0x7c, 0x13, 0xe2, 0x9d, + 0x4e, 0xc4, 0xe6, 0x9b, 0x11, 0x6f, 0x30, 0x4e, 0x20, 0x0e, 0xe1, 0x3b, 0x75, 0x48, 0xed, 0x52, + 0xfc, 0x52, 0xa8, 0xd1, 0xbd, 0x8e, 0xad, 0x0d, 0x6f, 0x3e, 0xfa, 0xdc, 0x2b, 0xa6, 0xe4, 0xb4, + 0x16, 0x96, 0xe0, 0xb5, 0xfc, 0x4c, 0xb9, 0xbf, 0x8c, 0x45, 0x9f, 0xd0, 0x60, 0x77, 0xf6, 0x31, + 0x8c, 0xf8, 0x22, 0xd5, 0xed, 0x16, 0x33, 0x61, 0xe7, 0x52, 0x3b, 0xe6, 0x01, 0xbb, 0xd3, 0xeb, + 0x7d, 0xdf, 0x4e, 0x9d, 0x09, 0xf1, 0xd5, 0x02, 0x4a, 0x8e, 0x7e, 0x88, 0x5c, 0x34, 0x6b, 0x32, + 0x81, 0x7d, 0x5d, 0xf0, 0x10, 0xb0, 0xaf, 0x79, 0x36, 0xc7, 0x81, 0xa3, 0x2b, 0x2b, 0x80, 0x32, + 0x9f, 0x83, 0xe8, 0x6a, 0x9e, 0x70, 0xbe, 0x1a, 0xed, 0x15, 0x42, 0xc8, 0x35, 0xc5, 0xbc, 0xe6, + 0x76, 0x60, 0xf3, 0x52, 0x50, 0xbb, 0xae, 0x83, 0x93, 0xcd, 0xcb, 0x3d, 0xb3, 0xfd, 0xbf, 0x41, + 0x58, 0x12, 0x7a, 0x3c, 0xf0, 0x1b, 0xcc, 0xba, 0x08, 0x12, 0x30, 0xd7, 0x49, 0x17, 0x81, 0x34, + 0xdb, 0x75, 0x77, 0x62, 0x0a, 0x85, 0xe3, 0x82, 0x34, 0x08, 0xd4, 0x48, 0x1c, 0xcb, 0x11, 0x54, + 0x2c, 0x67, 0x04, 0x6a, 0x31, 0x8c, 0x8c, 0x09, 0x85, 0xf8, 0xab, 0x30, 0x62, 0x2a, 0xec, 0x97, + 0x4e, 0x51, 0x88, 0x4b, 0x86, 0x8c, 0x4b, 0x02, 0xec, 0xd2, 0x16, 0x5d, 0xc3, 0x32, 0x94, 0x4a, + 0x7d, 0xc0, 0xac, 0x1d, 0xcc, 0x1f, 0xdc, 0x66, 0xad, 0xd9, 0x28, 0xf3, 0x01, 0x0a, 0xce, 0xe3, + 0xf7, 0x84, 0x1e, 0x3a, 0x3f, 0xf6, 0x9a, 0xe1, 0x9b, 0x4b, 0xdc, 0xe5, 0xd1, 0xa3, 0xe9, 0x30, + 0x5e, 0x76, 0x7c, 0xb4, 0xdf, 0x4f, 0x35, 0x7a, 0x2a, 0x86, 0x31, 0x35, 0x65, 0x52, 0xe5, 0x55, + 0x1a, 0x01, 0x74, 0x7a, 0xcb, 0x96, 0x3b, 0xa1, 0xa8, 0x4a, 0xad, 0xff, 0x84, 0x00, 0xe2, 0x31, + 0xf8, 0xa6, 0x77, 0xb8, 0x11, 0x4f, 0x1e, 0xd7, 0x37, 0x83, 0x2a, 0x30, 0x93, 0xe2, 0xb3, 0xb7, + 0xd0, 0xd2, 0x9b, 0x41, 0x51, 0xea, 0x6e, 0xd8, 0x3a, 0x6a, 0xea, 0x64, 0x7e, 0x1e, 0xee, 0xd7, + 0x86, 0x8f, 0x33, 0x40, 0x15, 0x1b, 0xd8, 0x51, 0x3a, 0x3c, 0x08, 0x34, 0xc0, 0x17, 0x8c, 0x07, + 0xe1, 0x94, 0x0c, 0x13, 0xc9, 0xb2, 0x4e, 0x0c, 0x42, 0x4d, 0x22, 0x96, 0xdf, 0x60, 0xf8, 0xd7, + 0x2d, 0x94, 0x53, 0x23, 0xf1, 0x5b, 0x96, 0x09, 0xba, 0x7f, 0x87, 0x3d, 0x53, 0xe7, 0xd6, 0xbd, + 0xd3, 0x7a, 0x3e, 0x67, 0xcf, 0x02, 0xc4, 0xce, 0xe3, 0x3b, 0x04, 0x84, 0x1b, 0xfd, 0xde, 0x74, + 0xbe, 0x7b, 0xa4, 0xdd, 0xf6, 0xb3, 0x6e, 0x0c, 0x5b, 0xb9, 0xea, 0xf0, 0xf5, 0xa9, 0xb6, 0x95, + 0x41, 0x5d, 0xeb, 0xcc, 0xfe, 0x14, 0xdb, 0x93, 0x2e, 0x2b, 0x7f, 0x42, 0x27, 0x1d, 0x8e, 0x20, + 0x8f, 0x4e, 0x6c, 0xb1, 0xb7, 0xd7, 0x89, 0x5f, 0xa8, 0x19, 0x6b, 0xa3, 0xee, 0xe7, 0x5b, 0xe8, + 0xc4, 0x2f, 0x34, 0xc1, 0xb6, 0xbb, 0x1f, 0xba, 0x76, 0x2a, 0x79, 0x19, 0x1e, 0x9d, 0x68, 0x78, + 0x98, 0xb9, 0x99, 0x7b, 0xf5, 0x37, 0x18, 0xc9, 0x8a, 0xd0, 0x17, 0x30, 0x0e, 0xa3, 0xee, 0x9f, + 0xb7, 0x18, 0xbc, 0xb6, 0x6d, 0x79, 0x5a, 0x22, 0x17, 0xc4, 0x5c, 0x25, 0xe8, 0xb4, 0x7a, 0x0c, + 0x90, 0xf9, 0x32, 0x36, 0x80, 0xe7, 0x0c, 0x33, 0x6f, 0x54, 0xe7, 0x2b, 0x6a, 0x8c, 0x44, 0x11, + 0xa2, 0xba, 0x01, 0x4d, 0xe7, 0x92, 0x65, 0x26, 0x62, 0x29, 0xa0, 0x99, 0xc7, 0x9b, 0x8c, 0xe6, + 0x25, 0x8c, 0xe6, 0x49, 0xbd, 0x07, 0xcd, 0xd4, 0xb9, 0xb9, 0x8d, 0x9a, 0x70, 0x1b, 0xc9, 0x1b, + 0xa4, 0x3b, 0x1d, 0x9a, 0xbe, 0x9b, 0x95, 0x98, 0x08, 0x4a, 0x9a, 0xd9, 0x4e, 0xfb, 0x44, 0x14, + 0xd0, 0x68, 0xbb, 0x86, 0x97, 0x12, 0x33, 0x96, 0xab, 0x81, 0xb7, 0xff, 0x46, 0xd3, 0x1c, 0x5c, + 0xf2, 0x0f, 0x8c, 0xa6, 0x12, 0xcf, 0x84, 0x9b, 0x86, 0xf8, 0x4d, 0x9b, 0x7f, 0x85, 0xd2, 0x1f, + 0x7a, 0xec, 0x56, 0xcc, 0x1c, 0xf7, 0x8c, 0x01, 0x31, 0x0b, 0x33, 0x74, 0xde, 0xa9, 0xb0, 0xc9, + 0xa3, 0x59, 0x61, 0xc5, 0x8e, 0x80, 0x64, 0x0f, 0xde, 0x80, 0xe6, 0xed, 0x4b, 0x41, 0xd5, 0x26, + 0x8c, 0xe6, 0x3b, 0x18, 0x32, 0xd8, 0xaa, 0x04, 0x2f, 0xcb, 0x77, 0xaf, 0x25, 0xbb, 0xf5, 0x6b, + 0xf1, 0x50, 0x6e, 0x16, 0x62, 0x94, 0x36, 0xcb, 0x84, 0xaa, 0xde, 0x23, 0x82, 0x5f, 0x74, 0xf8, + 0xbb, 0x72, 0x22, 0xb0, 0x59, 0x29, 0xf1, 0xe5, 0x5b, 0x71, 0xd7, 0xa5, 0xf9, 0x1e, 0x0b, 0x39, + 0x5a, 0xd9, 0xd3, 0x14, 0x7e, 0xb5, 0xdf, 0x4d, 0xec, 0x23, 0x5d, 0xe8, 0x0d, 0xc8, 0x8f, 0xd9, + 0x1e, 0xc0, 0xc8, 0x8b, 0x3d, 0xc8, 0x61, 0x7f, 0xf6, 0x56, 0xe9, 0x2e, 0x58, 0x2c, 0x12, 0xb6, + 0x59, 0xcc, 0xd4, 0xfe, 0xcc, 0x88, 0x20, 0x2e, 0xf9, 0xa9, 0x80, 0xeb, 0xe5, 0x89, 0x4b, 0xb8, + 0x3e, 0x7f, 0x76, 0xd0, 0xdf, 0xc4, 0x59, 0x08, 0x55, 0x74, 0x29, 0xad, 0x7b, 0x39, 0xbf, 0x0e, + 0x36, 0x50, 0x3b, 0xa3, 0xe3, 0x60, 0x9d, 0x51, 0x69, 0x61, 0xb3, 0x3a, 0x60, 0x4e, 0x80, 0x8d, + 0x6b, 0x5a, 0x3c, 0xde, 0xb8, 0xea, 0xd5, 0xb0, 0x71, 0x5d, 0xc8, 0xa9, 0x96, 0x84, 0x81, 0xfb, + 0x5c, 0xc7, 0x57, 0xcb, 0x9d, 0xfb, 0x51, 0x1a, 0xde, 0x65, 0x1d, 0xf6, 0x0b, 0xf2, 0x8c, 0x49, + 0x4d, 0xc4, 0x16, 0x09, 0x6f, 0x63, 0xa2, 0xdb, 0x99, 0x7f, 0xf6, 0x12, 0x06, 0x4f, 0x51, 0xbb, + 0xe7, 0xcb, 0x87, 0xbb, 0x58, 0x30, 0x20, 0xab, 0x98, 0xf3, 0xf1, 0xbe, 0xf2, 0x02, 0x04, 0x0e, + 0xec, 0xd1, 0xf8, 0xca, 0x42, 0x4c, 0x56, 0x02, 0x64, 0x61, 0xf3, 0x4d, 0x93, 0xe0, 0xcd, 0xf7, + 0xfb, 0xf9, 0xbd, 0x7a, 0xcf, 0xe6, 0xfb, 0xe4, 0x99, 0x14, 0x25, 0x11, 0xef, 0x0e, 0x9d, 0x96, + 0xf0, 0x5b, 0x99, 0x0c, 0x9b, 0xf5, 0xe9, 0x3f, 0x7c, 0x35, 0x82, 0x37, 0x38, 0x09, 0x7a, 0x6a, + 0x83, 0xe3, 0x8c, 0xcd, 0x7e, 0x92, 0x79, 0xaf, 0xd6, 0xee, 0x74, 0xe5, 0x43, 0x5c, 0x61, 0x60, + 0x99, 0x0f, 0x76, 0xae, 0xd3, 0x2a, 0x6d, 0x3e, 0x38, 0xae, 0xa3, 0x1b, 0xf4, 0x72, 0xe9, 0xfe, + 0x31, 0x7a, 0x82, 0x12, 0x88, 0x0e, 0xfa, 0x64, 0x47, 0x23, 0xd5, 0x1e, 0x15, 0x68, 0xe0, 0x4a, + 0x21, 0x0e, 0xe1, 0xc6, 0x50, 0xfe, 0x1d, 0xaa, 0x60, 0x6b, 0xbd, 0xde, 0x83, 0x82, 0xa2, 0xd5, + 0xf1, 0x87, 0x71, 0x2b, 0x60, 0xdd, 0xb7, 0x88, 0x86, 0xf3, 0x32, 0xf4, 0x42, 0x60, 0x4a, 0x33, + 0xa6, 0xc8, 0xb8, 0x5c, 0xd0, 0xeb, 0xce, 0x0a, 0x35, 0x2f, 0xec, 0x57, 0x24, 0x00, 0x7e, 0x6f, + 0xf8, 0xd3, 0xe2, 0x02, 0x16, 0x3a, 0xfc, 0xdd, 0x2f, 0x24, 0xa3, 0xa3, 0x37, 0xb7, 0x9f, 0x54, + 0xd7, 0xb0, 0xa9, 0xbb, 0x6f, 0xf8, 0xde, 0xc3, 0x27, 0x34, 0x7c, 0xef, 0x41, 0x4e, 0xdd, 0x7b, + 0xf0, 0x9a, 0x72, 0xef, 0x21, 0x6a, 0x45, 0xe4, 0xe2, 0x7b, 0x52, 0x8b, 0x57, 0xc6, 0xbe, 0xb8, + 0x22, 0xee, 0xdc, 0x8a, 0xa4, 0xa6, 0x7b, 0xe6, 0x1f, 0xbe, 0x67, 0x61, 0xd4, 0xca, 0xec, 0xa9, + 0xf7, 0x24, 0xe6, 0x23, 0xd7, 0x3d, 0x09, 0x96, 0x91, 0x81, 0x6f, 0x65, 0x51, 0xf7, 0x12, 0x3c, + 0x77, 0x12, 0x10, 0x7a, 0xb5, 0xf3, 0x4c, 0xe0, 0x0a, 0x5a, 0x63, 0xd3, 0x5f, 0x72, 0xd8, 0x76, + 0x94, 0x86, 0xb2, 0xe5, 0x42, 0xa3, 0x92, 0x40, 0x75, 0xb0, 0x8b, 0x0b, 0xd4, 0xe5, 0xf6, 0xe8, + 0xcb, 0x38, 0x87, 0x76, 0xa8, 0xa2, 0xd6, 0xd9, 0x52, 0x8c, 0xab, 0x17, 0x5b, 0xfd, 0xde, 0x50, + 0x85, 0x9e, 0x3c, 0x30, 0x5d, 0xb9, 0x7d, 0x55, 0xbe, 0xb7, 0xfa, 0x3e, 0xdf, 0xee, 0xfe, 0xd9, + 0x07, 0xb6, 0x49, 0x5f, 0xe5, 0xac, 0x3c, 0x1d, 0xb8, 0x56, 0xd1, 0x7e, 0x2f, 0x43, 0x7a, 0x89, + 0xf7, 0x3a, 0xce, 0xf4, 0xb7, 0x37, 0x32, 0x3f, 0xb7, 0x0f, 0x44, 0xe9, 0x73, 0x8b, 0xde, 0x18, + 0x0f, 0xfe, 0x5a, 0x88, 0xac, 0xdd, 0xd9, 0x4a, 0xee, 0x77, 0x81, 0xbf, 0x9e, 0x16, 0x33, 0x70, + 0xb2, 0x7c, 0xd6, 0xe8, 0xfb, 0x59, 0xa5, 0x83, 0x54, 0x92, 0x5b, 0x1e, 0xf5, 0xc1, 0x2a, 0xce, + 0xae, 0xad, 0x54, 0xf2, 0x7b, 0x3f, 0x4e, 0xae, 0x97, 0x5a, 0x5c, 0xed, 0xbd, 0x8e, 0xc0, 0xac, + 0x3e, 0x67, 0x72, 0x7d, 0xd6, 0xc1, 0xf7, 0xf5, 0xa5, 0xce, 0xe4, 0xfa, 0xd3, 0xe6, 0xed, 0xcf, + 0x58, 0xb6, 0x3f, 0x6b, 0xdd, 0xbe, 0xb7, 0x9d, 0x14, 0xd6, 0x48, 0xe5, 0xe4, 0x79, 0x95, 0x5e, + 0xc6, 0x7a, 0x4d, 0x2a, 0x57, 0xd1, 0x57, 0xe1, 0xfb, 0x84, 0xce, 0xfc, 0xa4, 0xff, 0x41, 0x16, + 0x5a, 0xcc, 0x73, 0xcd, 0x61, 0x63, 0xd6, 0x97, 0x78, 0x0e, 0x3f, 0x8c, 0xfd, 0x94, 0x10, 0x4f, + 0x99, 0xfd, 0x9e, 0x34, 0xa2, 0x1f, 0xaf, 0x0e, 0xb7, 0x8e, 0x63, 0x37, 0x2b, 0xa3, 0x42, 0x27, + 0x63, 0x7a, 0xbb, 0x21, 0xc4, 0x30, 0x3d, 0x85, 0xf1, 0xa4, 0x67, 0xd8, 0xf2, 0xe5, 0x02, 0xfd, + 0x44, 0x2c, 0x7f, 0x9f, 0x19, 0x7b, 0x7b, 0x1d, 0xb5, 0xed, 0x2b, 0x18, 0x30, 0x73, 0xbc, 0x17, + 0x47, 0xe1, 0x6c, 0xdc, 0x2b, 0x70, 0x6d, 0xdf, 0xbd, 0x9c, 0x71, 0x99, 0xa0, 0x85, 0x4b, 0x37, + 0xbf, 0x61, 0x90, 0xb1, 0xeb, 0xc0, 0xcc, 0x8d, 0xdb, 0xcc, 0x7e, 0xc8, 0x95, 0x00, 0x5b, 0x3e, + 0x7b, 0x50, 0x3e, 0xe1, 0x81, 0x4f, 0x4f, 0xa2, 0xac, 0x02, 0x1f, 0xd5, 0x91, 0xf8, 0x0a, 0xe6, + 0x8a, 0x0c, 0xe2, 0xe8, 0xe5, 0xfd, 0x3c, 0x79, 0xc4, 0xa0, 0x3c, 0xd1, 0x03, 0x9b, 0xc4, 0x6b, + 0xfb, 0x0a, 0x4b, 0x30, 0x80, 0xe7, 0xf2, 0x2c, 0xc2, 0xed, 0x9b, 0x5a, 0xf5, 0x4f, 0x51, 0xcb, + 0x0f, 0x05, 0x28, 0x0a, 0xe6, 0xeb, 0xe5, 0x4d, 0xbc, 0x3f, 0xe2, 0x04, 0x02, 0xeb, 0x05, 0x4c, + 0xd4, 0x19, 0x3d, 0xc7, 0x6a, 0xb6, 0x62, 0x3a, 0x22, 0x97, 0xdc, 0x91, 0x1d, 0x17, 0x5b, 0xe5, + 0xd5, 0xa1, 0x8a, 0xa5, 0x48, 0xe6, 0xf7, 0x2d, 0xb8, 0xbc, 0xc8, 0x14, 0x9c, 0x67, 0x4c, 0x25, + 0x8d, 0x5a, 0x14, 0xcd, 0x47, 0x7e, 0x06, 0x09, 0xb0, 0xb2, 0x9f, 0x78, 0x8b, 0x81, 0xae, 0xd4, + 0xa7, 0x5d, 0xb6, 0x7a, 0xc3, 0x04, 0x1a, 0x16, 0xad, 0xa1, 0xa1, 0x6d, 0xde, 0x2d, 0x32, 0x52, + 0x0b, 0x16, 0x3e, 0x77, 0xef, 0x1e, 0xe4, 0xde, 0xaa, 0x2b, 0x75, 0xff, 0xc2, 0xaa, 0x50, 0xe3, + 0x04, 0x97, 0x2c, 0x0a, 0x99, 0xdf, 0xa0, 0xef, 0x63, 0x57, 0x02, 0xfd, 0xbd, 0x03, 0x27, 0xfc, + 0x90, 0xfd, 0x43, 0xf9, 0x17, 0xf4, 0x34, 0x98, 0x25, 0xcb, 0xfb, 0x36, 0x72, 0x11, 0x15, 0x83, + 0x9e, 0x4e, 0xd9, 0x06, 0x9d, 0xc5, 0xc3, 0xcf, 0x49, 0x51, 0x0e, 0x15, 0xe0, 0x97, 0xcb, 0x38, + 0x72, 0x44, 0x65, 0x97, 0x4e, 0xc8, 0x7c, 0x30, 0x29, 0x2d, 0x90, 0x8a, 0x15, 0x41, 0x34, 0x61, + 0xff, 0x7c, 0x94, 0xcb, 0x4c, 0x82, 0xde, 0xca, 0xc2, 0x52, 0x2a, 0xbf, 0x46, 0x4d, 0x71, 0xde, + 0xb0, 0x66, 0x8d, 0x67, 0x8e, 0xea, 0x9a, 0x12, 0xd3, 0xa8, 0x7d, 0xe3, 0x33, 0x1e, 0xf2, 0x91, + 0xbc, 0xa2, 0x49, 0xe4, 0x43, 0x99, 0x2b, 0xfe, 0x23, 0x79, 0x9d, 0x93, 0xfc, 0x69, 0x32, 0xe0, + 0x46, 0xf2, 0xb9, 0xcc, 0xb9, 0x93, 0xc9, 0xcb, 0x6f, 0x24, 0x6f, 0x63, 0xce, 0x75, 0x6e, 0x5b, + 0x9f, 0xf5, 0x90, 0x7f, 0x89, 0xb7, 0x71, 0x12, 0xf9, 0xfb, 0x99, 0xe9, 0xff, 0xad, 0xf4, 0x97, + 0x51, 0xe0, 0x8d, 0xe4, 0x77, 0x32, 0xd3, 0x7e, 0x53, 0x7a, 0xa2, 0x39, 0xa3, 0x9b, 0x22, 0x4f, + 0xa5, 0xc9, 0x94, 0x40, 0xa3, 0x02, 0x86, 0x47, 0x3f, 0xf7, 0x99, 0xa7, 0x90, 0xf6, 0x8c, 0x92, + 0x00, 0xbf, 0xeb, 0x35, 0x1f, 0x28, 0x25, 0x89, 0x54, 0xe0, 0x8c, 0x7b, 0x7d, 0xb0, 0x4b, 0x96, + 0x5a, 0x99, 0x7b, 0x5d, 0x2d, 0xdd, 0x2a, 0xca, 0x3d, 0x17, 0x00, 0x98, 0x9a, 0xae, 0x0f, 0xd0, + 0x63, 0x2f, 0x9f, 0x5f, 0xb8, 0xc5, 0x93, 0x2f, 0x8e, 0x0a, 0xff, 0x27, 0xc2, 0x51, 0x17, 0x3b, + 0xb5, 0xdd, 0x29, 0x9d, 0x63, 0x50, 0x16, 0xa0, 0x19, 0x30, 0xab, 0x76, 0x9d, 0x8f, 0x42, 0xa4, + 0x81, 0x00, 0x8f, 0x95, 0x6c, 0x78, 0xc0, 0x8a, 0x71, 0xc8, 0x01, 0x07, 0x9f, 0x05, 0x5b, 0xe2, + 0xc7, 0x64, 0xcc, 0xe7, 0xa5, 0x68, 0xb9, 0xf7, 0x72, 0xc2, 0xdd, 0x12, 0x2f, 0xc2, 0x59, 0x38, + 0xf3, 0x08, 0x95, 0xa2, 0x9b, 0xad, 0x85, 0xd5, 0xd3, 0x16, 0xda, 0xb7, 0x14, 0x79, 0x72, 0x92, + 0x96, 0x81, 0xcb, 0x1e, 0x3b, 0xf5, 0xca, 0xdc, 0xdb, 0x4b, 0x45, 0x10, 0x0d, 0x54, 0x3e, 0x2b, + 0x17, 0x59, 0xdf, 0xb7, 0xcd, 0x72, 0xe0, 0x1e, 0xc7, 0xc0, 0x54, 0xa9, 0x65, 0x20, 0x98, 0x7d, + 0x40, 0x8b, 0xe3, 0x31, 0xc3, 0x72, 0x57, 0x2c, 0x23, 0x4e, 0xf4, 0x82, 0x38, 0x44, 0x1c, 0xce, + 0xf0, 0x2c, 0x0c, 0xac, 0xd1, 0x20, 0xbb, 0x1a, 0xb3, 0x39, 0x0a, 0x73, 0xd2, 0xbd, 0x7c, 0x4d, + 0x16, 0xec, 0xc5, 0x69, 0xeb, 0x74, 0x78, 0x11, 0x66, 0x2b, 0x5d, 0x82, 0x91, 0x67, 0x54, 0x1e, + 0xbd, 0x3d, 0x61, 0xa8, 0xa1, 0x44, 0x4a, 0x07, 0xe5, 0x38, 0x85, 0x9c, 0xb1, 0x59, 0x07, 0xc2, + 0x1c, 0x32, 0x6c, 0xb5, 0xba, 0x5b, 0xbc, 0x58, 0xa0, 0xd5, 0xf8, 0xd8, 0xcd, 0x38, 0x07, 0x29, + 0x14, 0x5c, 0xa2, 0xa4, 0x18, 0x07, 0x29, 0xca, 0x65, 0x8c, 0x2c, 0x04, 0x73, 0xe7, 0xc0, 0xc1, + 0x1e, 0x8f, 0x73, 0xa9, 0xf1, 0x1b, 0xa5, 0x62, 0x67, 0x03, 0xce, 0x5e, 0x22, 0x70, 0x04, 0x9a, + 0x07, 0x91, 0x00, 0xa2, 0x4c, 0xcb, 0x92, 0x1f, 0xfc, 0x90, 0x73, 0x09, 0xfe, 0x51, 0xbe, 0x10, + 0xc7, 0xe2, 0x36, 0xb3, 0x27, 0x1e, 0x6c, 0xa7, 0xe3, 0x78, 0x90, 0x77, 0x4e, 0xeb, 0x6e, 0x09, + 0xc6, 0x51, 0xe1, 0x5a, 0x25, 0x25, 0x9e, 0x2e, 0x3c, 0xb7, 0xe0, 0xb7, 0xc4, 0x5b, 0x1c, 0xdd, + 0x2f, 0x79, 0xa5, 0x09, 0x2f, 0x44, 0x2b, 0x69, 0xe8, 0xe3, 0x80, 0x13, 0xc4, 0x06, 0x3e, 0xef, + 0xb3, 0xd2, 0x75, 0x34, 0x97, 0x1d, 0xac, 0x54, 0xb2, 0xf7, 0xba, 0x86, 0xc5, 0xb9, 0x58, 0xb7, + 0x34, 0xe2, 0xfc, 0xf8, 0x4a, 0x89, 0x67, 0xb1, 0x4e, 0xe5, 0xfc, 0x28, 0xf3, 0x03, 0x57, 0xb1, + 0x89, 0x9f, 0x80, 0xef, 0x6c, 0x64, 0x93, 0x0c, 0x2b, 0x1e, 0x83, 0xa3, 0x30, 0x6a, 0xae, 0xc0, + 0x63, 0x41, 0x87, 0xe0, 0xf1, 0x04, 0x97, 0x3c, 0xa6, 0x97, 0xa5, 0x56, 0xd7, 0x10, 0x59, 0x3b, + 0x7a, 0xa9, 0x7d, 0x8b, 0x1c, 0x07, 0x3f, 0x4e, 0xd9, 0x7c, 0x7f, 0xc1, 0x31, 0xd9, 0x7a, 0xb6, + 0xc6, 0xc4, 0x6d, 0x04, 0x6b, 0x88, 0x15, 0x0d, 0xb8, 0x24, 0xb5, 0x32, 0x0f, 0x53, 0x59, 0xe3, + 0x5f, 0x3b, 0xa2, 0xc0, 0x78, 0x3f, 0x13, 0xad, 0x73, 0xfa, 0x17, 0x0e, 0x35, 0x10, 0x7b, 0x9e, + 0xf2, 0xf8, 0x97, 0x23, 0x05, 0x11, 0x69, 0x75, 0xed, 0xee, 0xe9, 0xa5, 0x48, 0x3f, 0xc5, 0xc8, + 0xc4, 0x1a, 0x3e, 0x0e, 0x1a, 0x76, 0x26, 0x7e, 0xdf, 0xe8, 0x4b, 0x3f, 0x9b, 0x9d, 0x49, 0x25, + 0xfb, 0x0b, 0xdc, 0x46, 0xcd, 0x79, 0xdc, 0x41, 0x5d, 0x99, 0x7f, 0x85, 0xb1, 0x70, 0xe2, 0x36, + 0x80, 0xc7, 0xdc, 0x53, 0x39, 0xb3, 0xaa, 0xfd, 0x7f, 0x53, 0x40, 0xcd, 0x71, 0x9f, 0x0d, 0x52, + 0x1f, 0x97, 0xbb, 0xbc, 0x52, 0xaf, 0x65, 0x1f, 0xcc, 0xd9, 0xee, 0xb2, 0x10, 0xc4, 0x63, 0x25, + 0xa9, 0xa1, 0xcd, 0xc4, 0x7e, 0x73, 0xbc, 0xd9, 0x9d, 0x1a, 0xa7, 0xc6, 0x47, 0x7c, 0xc9, 0x0f, + 0x4c, 0xd1, 0x9e, 0x40, 0xf1, 0x21, 0xc3, 0xd4, 0x68, 0x4e, 0x6a, 0x29, 0x44, 0xd0, 0x6f, 0x52, + 0xdb, 0xaa, 0xf6, 0xab, 0xb6, 0xbb, 0xa9, 0x99, 0xd2, 0xf8, 0x6a, 0xd7, 0x24, 0x03, 0x09, 0x16, + 0x76, 0x35, 0xdd, 0x49, 0x49, 0x50, 0xe8, 0x91, 0x6d, 0xaf, 0x53, 0xb6, 0x45, 0xfd, 0x8b, 0x73, + 0x6f, 0x29, 0xdb, 0xc2, 0xdd, 0xbf, 0x4d, 0xad, 0xf3, 0x92, 0xdf, 0x83, 0x1a, 0x3f, 0x8f, 0x6c, + 0x24, 0xf7, 0xbd, 0xd2, 0x49, 0xb2, 0x25, 0x62, 0xd9, 0xa4, 0xdc, 0x1e, 0xcd, 0xf6, 0xa9, 0xb2, + 0x25, 0x06, 0x65, 0xe0, 0x2b, 0x4a, 0xee, 0x07, 0xf6, 0x9d, 0xf8, 0x8a, 0xee, 0x06, 0xab, 0x94, + 0xcc, 0x39, 0xff, 0x9b, 0x56, 0x79, 0x6e, 0x6e, 0x4d, 0x6f, 0x40, 0x11, 0xbe, 0xd9, 0x82, 0x60, + 0x51, 0xfd, 0x40, 0x90, 0xe0, 0x1b, 0x9a, 0x9a, 0xe8, 0x9a, 0x06, 0xce, 0x8c, 0xfc, 0x07, 0x82, + 0xc4, 0xc4, 0xd0, 0x79, 0x89, 0x38, 0xa1, 0xdf, 0xe2, 0x76, 0x2a, 0x33, 0x4e, 0xe9, 0x63, 0xf8, + 0xe8, 0xcd, 0x66, 0x8a, 0x0f, 0x0e, 0xa6, 0x26, 0xa3, 0xa8, 0xa9, 0xe3, 0xaf, 0xfe, 0x26, 0xb5, + 0xa8, 0x79, 0x67, 0x69, 0x41, 0x8d, 0x2e, 0x6a, 0x68, 0xdf, 0x4e, 0xbc, 0xa2, 0xbd, 0x71, 0x1c, + 0xa2, 0x64, 0x7b, 0x3a, 0xd6, 0x97, 0x79, 0x3d, 0xf6, 0xb0, 0xae, 0xfd, 0xb5, 0xd1, 0xbd, 0xbf, + 0x76, 0xcd, 0xd8, 0xcb, 0x61, 0x75, 0xd5, 0x5e, 0x05, 0x89, 0x4e, 0x0f, 0x84, 0xbe, 0x3b, 0x2c, + 0x04, 0xfb, 0x1c, 0x19, 0x84, 0xa0, 0x2e, 0x5e, 0xd8, 0x38, 0x60, 0x6e, 0xdc, 0xb5, 0x24, 0x1a, + 0x39, 0x68, 0x7a, 0x98, 0x54, 0x23, 0xdd, 0xd0, 0x78, 0x92, 0xbc, 0xc2, 0x2c, 0x07, 0xec, 0x96, + 0x44, 0x67, 0x0c, 0x4e, 0xdd, 0x30, 0x60, 0x96, 0xa7, 0x25, 0x4d, 0xac, 0xd0, 0x1f, 0x3e, 0x30, + 0xa6, 0x5f, 0xed, 0x9a, 0x2d, 0xb2, 0xf7, 0xa5, 0x46, 0x58, 0x06, 0xe6, 0x86, 0x42, 0x40, 0x78, + 0x3f, 0x73, 0x0d, 0x75, 0x67, 0x0a, 0x0b, 0xba, 0x89, 0x79, 0x3f, 0x0c, 0xa1, 0xb6, 0xae, 0x80, + 0x83, 0x7b, 0x17, 0x41, 0xef, 0x60, 0x0e, 0xec, 0xbb, 0x7a, 0x96, 0xcc, 0xf0, 0x47, 0x1a, 0xc2, + 0x86, 0x1b, 0xd7, 0x42, 0x63, 0x85, 0x30, 0xf7, 0xcc, 0x1c, 0xcc, 0x8f, 0xa8, 0x68, 0x62, 0xbe, + 0xd0, 0x52, 0xc5, 0x4f, 0x7b, 0xe6, 0xcb, 0x67, 0x7d, 0x09, 0xfd, 0xb6, 0x39, 0xae, 0xf5, 0xa0, + 0x3b, 0x7d, 0x8c, 0xfe, 0x7c, 0x62, 0xec, 0xba, 0x17, 0x76, 0xc3, 0x31, 0x19, 0x88, 0x3d, 0xf1, + 0xfc, 0xab, 0x74, 0x70, 0x5e, 0xb1, 0x31, 0xdb, 0xc0, 0x6b, 0x59, 0x97, 0x44, 0x03, 0x76, 0x1d, + 0xec, 0xa6, 0x0e, 0x6f, 0x4a, 0xc1, 0x24, 0x85, 0x40, 0xd2, 0x3a, 0x80, 0xef, 0x60, 0xb2, 0x74, + 0x73, 0xbf, 0x05, 0xf5, 0x69, 0x77, 0xc9, 0xa3, 0x27, 0x34, 0xac, 0xea, 0x9b, 0xb8, 0x9b, 0xb8, + 0x78, 0x61, 0xce, 0x8c, 0xf0, 0x6f, 0xdd, 0xe3, 0xf9, 0xb7, 0x23, 0xda, 0x0d, 0xfc, 0x1d, 0x9f, + 0x97, 0x62, 0x2d, 0xb5, 0x60, 0x02, 0xaf, 0x2f, 0xc0, 0xdf, 0x9c, 0xff, 0x48, 0x46, 0x9d, 0xfa, + 0xd3, 0x6f, 0x92, 0x89, 0x5a, 0x54, 0x42, 0x8f, 0xb8, 0xea, 0x26, 0xe3, 0x8a, 0xc5, 0x7e, 0xa5, + 0x67, 0x5e, 0x84, 0xa6, 0xf6, 0x5d, 0x32, 0x1c, 0x75, 0x39, 0x6f, 0x51, 0x5c, 0xcf, 0xf1, 0xe9, + 0x01, 0x07, 0x93, 0x42, 0xb2, 0x3c, 0x31, 0x74, 0xd4, 0x8d, 0x31, 0xb4, 0x90, 0x89, 0x63, 0xe8, + 0x5c, 0x2a, 0x86, 0x0e, 0x87, 0x3f, 0x46, 0x40, 0x9e, 0x2e, 0x20, 0x9b, 0x60, 0x05, 0xac, 0x4d, + 0xdf, 0xb0, 0xd0, 0x90, 0x3a, 0xfc, 0xf0, 0x41, 0x4d, 0x52, 0xd6, 0xee, 0x79, 0x7f, 0x0f, 0x9b, + 0xb6, 0xf2, 0xcc, 0x2c, 0xc7, 0xb7, 0x59, 0xbf, 0xc4, 0x1c, 0x55, 0xcc, 0x5a, 0xb9, 0x75, 0xde, + 0x8f, 0xc9, 0x8a, 0xd5, 0xcf, 0x3e, 0x78, 0xda, 0xa7, 0x2d, 0xee, 0xb5, 0x8e, 0xef, 0xb3, 0xbe, + 0x09, 0x0c, 0xf3, 0x0e, 0x8c, 0x95, 0x2d, 0xb3, 0x05, 0x36, 0xca, 0x6c, 0x01, 0xa5, 0x32, 0x62, + 0x7a, 0xdb, 0xfa, 0x4b, 0x4f, 0xae, 0x1b, 0x7d, 0xf2, 0x01, 0x79, 0xe0, 0x03, 0xba, 0x27, 0xd7, + 0x76, 0x04, 0x2c, 0x2f, 0x6b, 0xcb, 0x79, 0xa5, 0x2d, 0xef, 0x9b, 0x80, 0x3b, 0x76, 0x07, 0x2c, + 0x3d, 0x1e, 0x70, 0xd7, 0x96, 0xb6, 0x3b, 0xdf, 0x6d, 0x5b, 0xf6, 0x8b, 0x30, 0x85, 0xe6, 0x8c, + 0xc5, 0xbf, 0x74, 0xc7, 0xe2, 0x2b, 0xec, 0x8f, 0x61, 0xde, 0x8e, 0x56, 0xb3, 0xed, 0x86, 0xc8, + 0xa6, 0xe3, 0x45, 0x4b, 0x0b, 0x33, 0x94, 0x29, 0x52, 0x46, 0x69, 0x85, 0xba, 0x70, 0xbd, 0xb3, + 0x82, 0xb1, 0x16, 0x17, 0x5e, 0xfe, 0x46, 0x69, 0xe8, 0x4d, 0x85, 0x9e, 0x9a, 0xaa, 0xda, 0xb2, + 0xc6, 0xf5, 0xae, 0xca, 0xd2, 0xf5, 0xeb, 0x9d, 0x1d, 0xd7, 0xbb, 0xd0, 0x78, 0xce, 0x71, 0xb9, + 0xe3, 0xfa, 0x3a, 0xaa, 0xe8, 0xb1, 0xac, 0xb2, 0x4e, 0x53, 0xae, 0x86, 0xef, 0xe2, 0xc6, 0x3a, + 0x0d, 0x06, 0xab, 0xaa, 0xaf, 0xd3, 0xd4, 0xbb, 0xab, 0x31, 0x97, 0x96, 0x96, 0x4f, 0x54, 0x59, + 0x2e, 0xdd, 0x5c, 0x7e, 0x43, 0xa5, 0xa5, 0xab, 0xcc, 0xb2, 0xac, 0xb2, 0xac, 0xce, 0x75, 0x58, + 0xaf, 0x81, 0x9d, 0x45, 0xf1, 0x0d, 0xe4, 0x6e, 0x38, 0xad, 0x9f, 0x44, 0x7e, 0x72, 0xcd, 0x65, + 0x79, 0x71, 0xa5, 0x0b, 0x4b, 0x49, 0x59, 0xa5, 0xba, 0xbc, 0x54, 0x5d, 0x5b, 0x8a, 0xfc, 0x8d, + 0xdb, 0xbc, 0xa3, 0x39, 0xda, 0xb7, 0x72, 0xe7, 0xaf, 0x93, 0x44, 0x69, 0x57, 0x71, 0x76, 0xbe, + 0x27, 0x9c, 0xa8, 0x62, 0xd2, 0x26, 0x20, 0xd5, 0x93, 0x75, 0x3d, 0xb4, 0x65, 0xe8, 0x0d, 0x99, + 0xd7, 0xbe, 0xbb, 0xbd, 0x10, 0x5b, 0x1b, 0xcb, 0xd1, 0x0b, 0x67, 0x21, 0x6b, 0x29, 0xd2, 0x7e, + 0x4c, 0xe7, 0x16, 0x71, 0x76, 0x4b, 0x66, 0x74, 0x1c, 0xcd, 0xb2, 0xc6, 0x50, 0xfb, 0x9b, 0x8d, + 0xb4, 0x46, 0x66, 0xb5, 0x72, 0x57, 0xf5, 0xc4, 0xfe, 0x66, 0x2d, 0x1d, 0x9d, 0x8c, 0x63, 0x3c, + 0x44, 0x83, 0xdd, 0x4b, 0xff, 0xe9, 0xc0, 0x21, 0x39, 0xec, 0x5e, 0x8a, 0x2e, 0xf1, 0xce, 0x93, + 0xb0, 0x7b, 0x79, 0xb3, 0x91, 0x59, 0xeb, 0x80, 0xcd, 0xcf, 0xea, 0x9e, 0xac, 0xf9, 0xe2, 0x43, + 0x3b, 0x1c, 0x71, 0xeb, 0x24, 0xe1, 0x6f, 0xe3, 0x22, 0xa9, 0x05, 0x44, 0x4f, 0x56, 0x66, 0xff, + 0xb6, 0xcc, 0x89, 0x22, 0xa9, 0x2e, 0x02, 0x3d, 0x1c, 0x44, 0x5b, 0x88, 0x8b, 0xa4, 0xca, 0x2e, + 0xf1, 0xae, 0xa9, 0xa0, 0xf7, 0x5b, 0x8d, 0xcc, 0x47, 0x06, 0x4b, 0x02, 0x6d, 0x6b, 0x7a, 0x68, + 0x39, 0x91, 0x87, 0x76, 0x90, 0x73, 0xd6, 0x75, 0x44, 0xc3, 0xd6, 0xc9, 0x11, 0xf4, 0x86, 0xd2, + 0xbf, 0xf7, 0xc0, 0xf4, 0xc6, 0x9d, 0xab, 0xf6, 0x73, 0x2b, 0x94, 0xc4, 0x01, 0x23, 0x81, 0x1e, + 0x14, 0x68, 0xf9, 0x6b, 0x69, 0x01, 0x5a, 0x5a, 0xfe, 0x30, 0xba, 0x6f, 0x69, 0xff, 0x61, 0x3a, + 0x2e, 0x2c, 0x42, 0x28, 0x6e, 0x23, 0xda, 0x19, 0x75, 0x7a, 0x7a, 0xa0, 0x96, 0x2a, 0xb3, 0xd4, + 0x2e, 0xf6, 0x56, 0xbd, 0xc2, 0x88, 0x1b, 0x27, 0x64, 0xf8, 0x61, 0x29, 0x64, 0xd1, 0x09, 0xd9, + 0x0f, 0xef, 0xdf, 0x59, 0x3b, 0x92, 0xcd, 0xd1, 0x3e, 0x00, 0x1b, 0xa5, 0xd1, 0x98, 0x75, 0xa7, + 0x03, 0x7b, 0xb3, 0xa6, 0xd1, 0xf0, 0x46, 0x69, 0x11, 0xe1, 0xff, 0x86, 0x30, 0xa8, 0x5e, 0x82, + 0x37, 0x5c, 0x57, 0xb7, 0xb7, 0x37, 0x36, 0x59, 0xd2, 0x9a, 0x09, 0x34, 0x10, 0xd5, 0x7b, 0x97, + 0xc9, 0x36, 0xbb, 0x75, 0xf1, 0x2c, 0xdc, 0xdd, 0xba, 0xb3, 0xc7, 0xbe, 0xf3, 0xfd, 0x11, 0x72, + 0x44, 0x97, 0x57, 0x2e, 0xbc, 0xa0, 0x8a, 0x4e, 0xe5, 0x6c, 0xb6, 0xfb, 0x9f, 0xf1, 0x23, 0xe2, + 0x06, 0x1d, 0x81, 0xa5, 0x44, 0x14, 0x0d, 0x8d, 0x90, 0x28, 0xf6, 0xe0, 0x76, 0xa1, 0xd6, 0x8e, + 0x52, 0x19, 0xe6, 0xc4, 0x78, 0xdf, 0x7e, 0x3d, 0x7f, 0x9d, 0x5c, 0xac, 0x9c, 0x8e, 0xb4, 0x99, + 0x6c, 0x19, 0x2b, 0x9d, 0xe0, 0x59, 0x09, 0xe0, 0xd0, 0x2b, 0xe6, 0x34, 0x8d, 0x96, 0x8b, 0xe7, + 0x1b, 0x0a, 0x9a, 0xab, 0xad, 0xf7, 0xaf, 0xd6, 0xf1, 0xb4, 0xd4, 0x03, 0xdb, 0xd6, 0x7d, 0x2c, + 0x4b, 0x39, 0x2d, 0xe8, 0x22, 0x4a, 0xf3, 0xc6, 0xa7, 0x23, 0x32, 0x14, 0xdb, 0xe1, 0xb3, 0x1f, + 0x23, 0x1c, 0xc6, 0xb5, 0x5a, 0xf9, 0xb8, 0x4c, 0xd2, 0xb0, 0x90, 0x83, 0x6b, 0xb5, 0xfa, 0xb3, + 0x62, 0x30, 0xe6, 0x42, 0x5c, 0x7e, 0x45, 0x06, 0xa9, 0xc7, 0x79, 0x67, 0x55, 0xb0, 0xc1, 0x2d, + 0x27, 0x73, 0x0a, 0xe7, 0xe6, 0xbf, 0x30, 0x77, 0x20, 0x2a, 0x6b, 0x0d, 0xb0, 0x3d, 0x4c, 0xcf, + 0x65, 0x20, 0x0b, 0xac, 0x0d, 0xa7, 0xc5, 0xa9, 0xbe, 0x34, 0x14, 0x06, 0xa2, 0xe5, 0x78, 0x3d, + 0xdf, 0xd8, 0xb4, 0x35, 0x8d, 0x8d, 0x45, 0xcb, 0x5a, 0x63, 0xb4, 0xcd, 0x3e, 0x65, 0x98, 0x03, + 0xa2, 0xa9, 0x1b, 0xbd, 0xbf, 0x68, 0xdf, 0xc5, 0xa5, 0x49, 0xd8, 0xfe, 0x8c, 0x02, 0x41, 0x34, + 0x27, 0x34, 0x3d, 0x4f, 0x88, 0x1e, 0x69, 0x27, 0x91, 0x84, 0x48, 0xf6, 0x0d, 0x91, 0xed, 0xee, + 0x75, 0x2d, 0x83, 0xef, 0x08, 0xf1, 0xf6, 0xde, 0x40, 0xe5, 0xfc, 0x4f, 0xe2, 0x3d, 0xd5, 0x22, + 0x8f, 0xc7, 0x3e, 0x95, 0x25, 0xee, 0xc2, 0x71, 0xb5, 0x79, 0x99, 0x27, 0x05, 0x74, 0x8a, 0x46, + 0x65, 0x9d, 0xcb, 0xf1, 0x36, 0xaa, 0x14, 0x22, 0x9a, 0x4f, 0x5a, 0xc8, 0x40, 0x95, 0x04, 0x22, + 0xf6, 0x1d, 0x07, 0x85, 0x8f, 0x78, 0xf6, 0xfb, 0xbe, 0xcd, 0x52, 0xce, 0xc4, 0x5d, 0xcc, 0x01, + 0x02, 0x17, 0x18, 0xb0, 0xdf, 0xc6, 0x59, 0x84, 0xb7, 0x43, 0x0c, 0x05, 0x71, 0xfb, 0xff, 0xe8, + 0x71, 0xd3, 0x1a, 0xea, 0x5a, 0xf3, 0x21, 0xd7, 0x35, 0x1a, 0xb2, 0x4e, 0x8f, 0xd3, 0x3e, 0xef, + 0xad, 0x9f, 0x35, 0xd8, 0xdb, 0x2a, 0x57, 0x7b, 0xb1, 0xf3, 0x8d, 0x4c, 0xfb, 0x21, 0x75, 0x7e, + 0xd3, 0x1a, 0xf0, 0x87, 0x95, 0xa3, 0x68, 0xa7, 0x05, 0x6d, 0x5d, 0x22, 0x3c, 0xa0, 0xf4, 0x3a, + 0x00, 0xfe, 0xd4, 0xa1, 0x47, 0x41, 0x6a, 0xe2, 0x4a, 0x6b, 0xec, 0x1a, 0x5d, 0xd0, 0x1a, 0x88, + 0x15, 0xac, 0x4c, 0x4e, 0x5c, 0x2f, 0x4d, 0x94, 0x28, 0x93, 0x82, 0xc3, 0xdc, 0x2f, 0xa6, 0xad, + 0x16, 0x19, 0x0a, 0x07, 0xcc, 0x96, 0x26, 0x36, 0x6e, 0x85, 0x5d, 0x5d, 0x1a, 0xb5, 0x69, 0x0b, + 0x26, 0x2d, 0x1c, 0x2f, 0xf3, 0x06, 0xe3, 0x28, 0xef, 0x1d, 0x13, 0x2f, 0x99, 0xb5, 0x38, 0x9e, + 0xa3, 0xf2, 0x0d, 0xc2, 0x61, 0x78, 0xbf, 0x0d, 0xc7, 0xac, 0xef, 0x22, 0xdd, 0xe2, 0x7c, 0x94, + 0x39, 0xe3, 0xb1, 0x55, 0xd6, 0xa6, 0x95, 0x40, 0xb4, 0x4e, 0x8e, 0x89, 0xc2, 0x12, 0x43, 0x0a, + 0x38, 0xb8, 0x28, 0x80, 0xa2, 0x31, 0x16, 0xa2, 0xb3, 0x66, 0xc5, 0x77, 0x02, 0x8b, 0x07, 0xbd, + 0x68, 0xc0, 0x22, 0x8e, 0x78, 0xab, 0xa5, 0xf8, 0x0e, 0x79, 0xbc, 0x0c, 0xb0, 0x81, 0x56, 0x22, + 0x83, 0xea, 0xd4, 0x41, 0xb0, 0xfa, 0xac, 0x13, 0x62, 0x81, 0xd4, 0xf4, 0xe9, 0x2d, 0x74, 0x1a, + 0x60, 0x6b, 0x24, 0x68, 0x94, 0x08, 0xb1, 0x6f, 0x5a, 0xbc, 0xfe, 0x04, 0x22, 0x5c, 0xa1, 0x44, + 0x80, 0xe5, 0x52, 0x2e, 0xc6, 0x29, 0xab, 0xe3, 0x5e, 0x42, 0x2c, 0x70, 0x72, 0xc1, 0xd3, 0xcc, + 0x75, 0x4a, 0x08, 0x5d, 0x7b, 0x83, 0x19, 0xc0, 0x2c, 0x5e, 0x10, 0x4e, 0x6b, 0xf1, 0xa6, 0x67, + 0xbd, 0x96, 0x52, 0x8f, 0x2f, 0x7f, 0xce, 0x15, 0x3d, 0x8e, 0xa3, 0xff, 0x42, 0x6a, 0x81, 0x59, + 0x88, 0x6e, 0x84, 0x6c, 0x5c, 0x74, 0x73, 0x8d, 0xc6, 0x00, 0x6c, 0xae, 0x3c, 0x52, 0x92, 0x60, + 0x01, 0x1e, 0x24, 0x6a, 0x63, 0xa4, 0x62, 0xe1, 0x30, 0xa7, 0xe5, 0x70, 0xbe, 0x3b, 0x89, 0xd8, + 0xaa, 0xf8, 0x04, 0x0f, 0xe3, 0x06, 0xea, 0xb6, 0x95, 0x8d, 0xca, 0xca, 0x51, 0x59, 0xb2, 0xb4, + 0x2b, 0x3a, 0x2a, 0xfb, 0x5c, 0x32, 0x71, 0x37, 0x25, 0x49, 0xf0, 0x88, 0x12, 0xdf, 0x9b, 0x36, + 0x84, 0x50, 0xf9, 0x44, 0x67, 0x77, 0xfa, 0xb4, 0x36, 0x27, 0x5e, 0x7f, 0x16, 0xfa, 0xb7, 0x0d, + 0x22, 0x83, 0x1d, 0xb5, 0x63, 0x43, 0x05, 0x58, 0xd0, 0x7d, 0x5c, 0xac, 0xa6, 0xb4, 0xe6, 0x63, + 0x71, 0x03, 0x34, 0x5c, 0x99, 0x70, 0x90, 0xda, 0xc2, 0xac, 0x6e, 0x65, 0xca, 0x26, 0x81, 0xb9, + 0xf2, 0x52, 0x43, 0x72, 0x1f, 0xea, 0x0e, 0x65, 0x8e, 0x01, 0x8f, 0x7c, 0x7f, 0x01, 0x16, 0x4d, + 0x18, 0x7f, 0xad, 0x37, 0x0e, 0x44, 0xfb, 0x5a, 0xda, 0x7e, 0x38, 0xdf, 0x13, 0xb8, 0x55, 0x0b, + 0x9e, 0x05, 0x14, 0xa0, 0xe6, 0x8c, 0x33, 0x32, 0x1c, 0x57, 0xcc, 0xcf, 0x28, 0x49, 0x0c, 0x92, + 0x85, 0x19, 0xef, 0x6e, 0xa7, 0x02, 0x7c, 0xc0, 0x89, 0x4b, 0x2d, 0x60, 0xbf, 0xa9, 0xd8, 0x10, + 0x54, 0xe8, 0xd6, 0xc0, 0xe3, 0x82, 0x87, 0x2c, 0x98, 0x73, 0x7a, 0x18, 0x55, 0x80, 0x00, 0x17, + 0xae, 0xb4, 0xb6, 0x6f, 0x96, 0x8b, 0x37, 0xaa, 0x31, 0x83, 0x36, 0x60, 0xd0, 0xbd, 0x99, 0xdd, + 0x51, 0x3b, 0xe2, 0xe4, 0x3e, 0x6b, 0x16, 0x1b, 0x0f, 0x93, 0x7d, 0x34, 0x71, 0xe7, 0x41, 0x54, + 0xc2, 0xd5, 0x87, 0x18, 0xa6, 0x87, 0x0b, 0x0e, 0x89, 0xbc, 0x5c, 0x05, 0x3e, 0x41, 0xf5, 0x0e, + 0x3a, 0x65, 0xc6, 0x27, 0x55, 0x78, 0x25, 0x3e, 0x28, 0xf2, 0x82, 0xcd, 0xdc, 0xcc, 0xe1, 0x5e, + 0xcc, 0xe0, 0x73, 0x4e, 0x19, 0xc1, 0xec, 0xf7, 0xf8, 0xee, 0x49, 0x68, 0xeb, 0x9b, 0x73, 0x1b, + 0x21, 0x64, 0x81, 0x32, 0x18, 0xc9, 0xba, 0x46, 0x4c, 0xd0, 0xcb, 0x8e, 0xb7, 0x51, 0x6a, 0xfa, + 0x69, 0x1e, 0x07, 0xd7, 0x15, 0x54, 0x72, 0xf2, 0x08, 0xd8, 0xc2, 0xee, 0xa8, 0x33, 0x7f, 0x0c, + 0x17, 0x57, 0xb3, 0xd4, 0x1c, 0x7c, 0x92, 0x46, 0x69, 0x8c, 0x3e, 0x43, 0x2f, 0x97, 0x8e, 0x8c, + 0xc9, 0x8f, 0x42, 0xe7, 0x06, 0xd2, 0x0e, 0x02, 0xff, 0x39, 0x34, 0x09, 0x02, 0x23, 0xba, 0x11, + 0xe4, 0x5a, 0xab, 0x61, 0xc3, 0x80, 0x81, 0x19, 0xad, 0x96, 0xe1, 0xcd, 0x86, 0x85, 0xe8, 0x78, + 0x8d, 0x4e, 0x00, 0xfd, 0x71, 0x61, 0xc7, 0xc4, 0x98, 0x0f, 0xd2, 0x67, 0xdb, 0xf1, 0xa0, 0x29, + 0xd9, 0x37, 0x18, 0xc3, 0xa0, 0xe1, 0x24, 0x1e, 0xf3, 0x9a, 0xeb, 0x9e, 0xca, 0x88, 0xb2, 0x8e, + 0x20, 0x4f, 0x65, 0x04, 0xa5, 0xc2, 0x3e, 0xca, 0x3d, 0xd4, 0x4f, 0xba, 0xc7, 0xe6, 0xf3, 0x9a, + 0x03, 0x5f, 0x50, 0x84, 0x4f, 0x58, 0xc5, 0xa0, 0x82, 0xc2, 0x53, 0xe9, 0xc4, 0xe3, 0x31, 0xaa, + 0x9d, 0x19, 0x66, 0x4c, 0x76, 0x02, 0xbc, 0x8f, 0xd5, 0xff, 0x19, 0x9b, 0x41, 0xa5, 0xf0, 0xd7, + 0xec, 0x67, 0xde, 0x12, 0x0a, 0x0f, 0x98, 0x29, 0x68, 0x23, 0xe1, 0xa1, 0x56, 0xea, 0xb1, 0x65, + 0x25, 0x1b, 0x24, 0x8c, 0xb3, 0x41, 0x5c, 0x7a, 0xb5, 0xcf, 0x3a, 0x19, 0xe4, 0x80, 0xec, 0x67, + 0x4f, 0x5f, 0x72, 0xc2, 0x0a, 0xa6, 0xfb, 0x6c, 0xf4, 0xdc, 0x22, 0x73, 0x8a, 0xde, 0xd9, 0xb4, + 0x66, 0xa2, 0x28, 0x84, 0x62, 0xb9, 0xea, 0x26, 0x96, 0xbb, 0xf4, 0x37, 0x4b, 0x5c, 0x36, 0x95, + 0x07, 0x0d, 0x5d, 0x47, 0xa5, 0x58, 0xc6, 0xfb, 0xba, 0x80, 0x8d, 0xbd, 0x97, 0x04, 0x37, 0x48, + 0xe4, 0x95, 0xb9, 0x1f, 0xc3, 0x22, 0xcc, 0x55, 0x9f, 0x47, 0xa2, 0xce, 0xe3, 0x54, 0x12, 0x7a, + 0x53, 0x47, 0x90, 0xec, 0x68, 0xcb, 0xf7, 0xe2, 0x53, 0x12, 0x08, 0xd6, 0xb0, 0x77, 0x09, 0xa0, + 0x51, 0x95, 0x25, 0x69, 0x11, 0xe0, 0xbb, 0x0e, 0x47, 0x50, 0x65, 0x01, 0x26, 0x9c, 0x50, 0x92, + 0xe0, 0x5c, 0x10, 0xca, 0xf1, 0x7a, 0xcb, 0x9d, 0x73, 0x3e, 0xe8, 0x74, 0xa4, 0x54, 0x15, 0xc3, + 0x20, 0xbe, 0xad, 0xbe, 0xc7, 0x46, 0xb6, 0xc0, 0xbe, 0x65, 0x5a, 0x6b, 0x97, 0xd2, 0x4b, 0xd5, + 0xad, 0x2e, 0xa5, 0x52, 0x45, 0xd9, 0xfa, 0x32, 0xe8, 0x52, 0x12, 0xc2, 0x8b, 0xc4, 0x27, 0x05, + 0xa5, 0x70, 0xf2, 0x78, 0x29, 0xec, 0xc7, 0x4a, 0x43, 0x24, 0xac, 0x6f, 0x85, 0x3e, 0x20, 0xaa, + 0xf6, 0x25, 0xab, 0xd1, 0x0a, 0xdb, 0x53, 0xb9, 0x3f, 0xcc, 0x61, 0xd6, 0x18, 0xa2, 0xe3, 0x7c, + 0x3a, 0xf1, 0xb8, 0x8e, 0x14, 0x65, 0x47, 0xc9, 0x07, 0x15, 0x1a, 0x5c, 0x5f, 0x95, 0x93, 0x57, + 0x31, 0x61, 0x09, 0xd7, 0xf0, 0x5c, 0xbd, 0x4e, 0xa7, 0x92, 0x6f, 0x8f, 0x62, 0x59, 0x65, 0x58, + 0xd6, 0xa5, 0x5a, 0x90, 0x2c, 0x72, 0xf7, 0x5b, 0xa0, 0xd3, 0x3e, 0xef, 0xed, 0x71, 0x26, 0xb0, + 0x9f, 0x51, 0x1f, 0xfe, 0xfd, 0x70, 0xe5, 0xa8, 0x26, 0x92, 0x3a, 0xa1, 0xe3, 0x13, 0x25, 0x61, + 0x69, 0x76, 0x84, 0xd0, 0x03, 0xbd, 0x1b, 0x39, 0x6d, 0x3a, 0x62, 0x81, 0x15, 0x28, 0xdb, 0x93, + 0xb2, 0xbc, 0xcf, 0x4a, 0xa6, 0xe9, 0xb9, 0x74, 0x74, 0xbf, 0xae, 0x45, 0x87, 0x93, 0x0a, 0xd1, + 0xd1, 0x7c, 0xc4, 0x77, 0x10, 0x2c, 0x2a, 0xd1, 0x1c, 0x49, 0x97, 0x4b, 0x5b, 0xd6, 0xe8, 0xed, + 0xcd, 0x0e, 0x6f, 0x98, 0x06, 0x8f, 0xb6, 0x8f, 0x64, 0xcd, 0x71, 0x3b, 0x8e, 0x9c, 0x7d, 0x54, + 0xde, 0x82, 0xaa, 0x96, 0x59, 0x4e, 0x15, 0xe1, 0x61, 0xd9, 0xf7, 0x90, 0x4f, 0x27, 0xc6, 0xae, + 0xe8, 0xcd, 0xa5, 0x74, 0xd5, 0xca, 0x61, 0xd9, 0x54, 0x0a, 0xee, 0xbc, 0x52, 0xf0, 0x2d, 0xfa, + 0xc8, 0x6d, 0x6f, 0xc3, 0xf5, 0x7e, 0x74, 0x1c, 0xe7, 0x25, 0xf7, 0x94, 0xd2, 0x1f, 0xd6, 0x34, + 0xcd, 0x03, 0xbd, 0xe4, 0x52, 0x7a, 0x29, 0xe1, 0xfa, 0x15, 0xd0, 0xb1, 0x14, 0x33, 0xd5, 0x2f, + 0x82, 0x14, 0xc1, 0xda, 0xfe, 0x63, 0x70, 0x3c, 0x8a, 0x8f, 0x43, 0x52, 0xc0, 0xcc, 0x3a, 0xb3, + 0xdb, 0x60, 0xdc, 0x4c, 0x61, 0x29, 0x45, 0x03, 0xe6, 0x1c, 0x6e, 0xcc, 0x9c, 0x61, 0x5a, 0xb7, + 0x4c, 0x0b, 0x7a, 0x1f, 0xd1, 0x6a, 0x0d, 0x38, 0x51, 0x88, 0xf3, 0x3b, 0x89, 0xb1, 0x2b, 0xb3, + 0x30, 0xdd, 0xad, 0x4b, 0xec, 0xc4, 0xa2, 0xd6, 0xfe, 0xd9, 0x80, 0x6d, 0x96, 0x04, 0xdb, 0x99, + 0x7b, 0xee, 0x77, 0xf8, 0x29, 0x41, 0x5b, 0x1a, 0x43, 0x86, 0x03, 0xd6, 0x0c, 0xbf, 0x75, 0x70, + 0x6c, 0xb2, 0xe1, 0xf5, 0x22, 0x37, 0x07, 0xe6, 0x1a, 0xac, 0x17, 0x0b, 0xae, 0xb2, 0x9f, 0x68, + 0xc1, 0xd5, 0x60, 0x51, 0x46, 0x2c, 0x8a, 0xbb, 0x1a, 0xec, 0x3e, 0x1a, 0xc6, 0xfa, 0x31, 0x87, + 0xbb, 0x17, 0xf6, 0x75, 0xbd, 0x4b, 0xe1, 0x38, 0x49, 0x04, 0xae, 0x47, 0xc5, 0x9d, 0x09, 0x6c, + 0x8c, 0x85, 0x74, 0xb0, 0xa7, 0xef, 0xf6, 0x3b, 0x84, 0xf3, 0x2e, 0x46, 0x6c, 0x5b, 0x9e, 0x6d, + 0xd7, 0x52, 0x19, 0x9e, 0xc1, 0x51, 0xef, 0x6a, 0x61, 0x7d, 0x5b, 0xda, 0x88, 0x29, 0xb0, 0xe8, + 0xc0, 0xd2, 0x1c, 0x09, 0x16, 0x2a, 0x73, 0xc6, 0x3f, 0xcd, 0x91, 0xf9, 0xfb, 0x60, 0x75, 0xda, + 0xb1, 0x47, 0x78, 0x02, 0x94, 0x0a, 0xab, 0x93, 0x90, 0x05, 0x58, 0x4b, 0xb9, 0xb1, 0x80, 0x35, + 0x6d, 0x5b, 0xa4, 0x66, 0xc0, 0xac, 0xe1, 0x26, 0xc0, 0xf1, 0x20, 0xce, 0x07, 0xf5, 0x46, 0x75, + 0x02, 0x4b, 0xe6, 0x0d, 0x8c, 0x58, 0x73, 0xff, 0xd2, 0x53, 0xe0, 0xeb, 0x46, 0xfd, 0xb2, 0xf0, + 0xc8, 0xbb, 0xb3, 0x3c, 0xf1, 0x04, 0xc6, 0xfa, 0xf3, 0x29, 0x5c, 0x26, 0x90, 0xe0, 0x54, 0x1b, + 0x1f, 0x58, 0xea, 0x31, 0x62, 0xb5, 0x5d, 0x69, 0x15, 0x35, 0x3d, 0x69, 0xe2, 0xae, 0x05, 0x59, + 0xd6, 0x65, 0x61, 0x2b, 0xc6, 0x9b, 0x35, 0x21, 0x60, 0x3d, 0x1d, 0x65, 0x06, 0xac, 0x8e, 0xc8, + 0xb5, 0x56, 0x70, 0xe0, 0xd1, 0x3d, 0x70, 0x4c, 0x1a, 0x08, 0x30, 0xf5, 0x76, 0x13, 0x66, 0xe9, + 0x79, 0xdf, 0x97, 0x1c, 0x7e, 0x73, 0x77, 0x7b, 0x81, 0x2c, 0x79, 0x1c, 0x2c, 0x8b, 0x3b, 0x4d, + 0x66, 0x65, 0x60, 0xac, 0x6b, 0xeb, 0x71, 0xea, 0xa8, 0xdf, 0xf8, 0x14, 0x1c, 0x17, 0xe1, 0xb4, + 0x8b, 0xaf, 0xff, 0x0a, 0x60, 0xc9, 0x9e, 0x3c, 0x3d, 0xb0, 0x80, 0x16, 0x73, 0x02, 0x2c, 0xa2, + 0x85, 0x2b, 0x01, 0xfe, 0xb1, 0x7f, 0xd7, 0x61, 0xff, 0xde, 0xae, 0xc5, 0x58, 0x5d, 0x4e, 0x74, + 0x30, 0x2b, 0x70, 0x05, 0x80, 0x98, 0x9c, 0x20, 0xce, 0x29, 0xc7, 0x8c, 0xfb, 0x49, 0x87, 0x27, + 0x6a, 0x73, 0x35, 0xce, 0xb1, 0x90, 0x93, 0x2f, 0x5c, 0x76, 0x5f, 0x90, 0xa2, 0xc1, 0x00, 0x04, + 0x3e, 0x77, 0xa4, 0x9f, 0x11, 0x0c, 0x3c, 0x58, 0xf0, 0x2d, 0xde, 0x91, 0x6c, 0x91, 0xd5, 0x2d, + 0xf1, 0x88, 0x11, 0xb7, 0xc3, 0x20, 0xfc, 0x2a, 0xc4, 0x43, 0xae, 0xf6, 0x17, 0xae, 0xdd, 0xcf, + 0x94, 0xbd, 0x8c, 0x5a, 0x41, 0xda, 0xe8, 0xe8, 0x6e, 0x90, 0x96, 0xf6, 0xa8, 0x15, 0x1f, 0xf7, + 0xa2, 0x78, 0x97, 0x6e, 0x4f, 0x47, 0x47, 0x42, 0xbb, 0xd9, 0x3b, 0x2b, 0x67, 0x0c, 0xdc, 0x42, + 0xb5, 0x3f, 0x7d, 0xed, 0x24, 0xc5, 0xce, 0x23, 0x6c, 0x80, 0xba, 0x93, 0x87, 0xc0, 0xac, 0x35, + 0x05, 0x7a, 0x50, 0x5e, 0xbc, 0x10, 0x1b, 0x82, 0x66, 0x3a, 0xdf, 0x01, 0xd2, 0x50, 0x66, 0xa7, + 0xc9, 0xc2, 0xed, 0x27, 0xc9, 0xb6, 0xec, 0x3c, 0xe8, 0x91, 0x96, 0x68, 0x9d, 0x64, 0x73, 0x3a, + 0x27, 0x03, 0xaf, 0x61, 0x06, 0xa6, 0xc7, 0x38, 0x19, 0x78, 0xc2, 0x8a, 0x8f, 0x27, 0x18, 0x98, + 0x1e, 0xe3, 0x62, 0x20, 0x77, 0x1c, 0x18, 0xd8, 0x3d, 0x95, 0x81, 0x74, 0x8a, 0x01, 0x86, 0x17, + 0x66, 0xa0, 0xce, 0xc9, 0x80, 0x12, 0x33, 0x50, 0x37, 0x89, 0x81, 0x3a, 0x17, 0x03, 0x5d, 0xd9, + 0x78, 0x6b, 0x3f, 0x7f, 0x0a, 0x03, 0x1d, 0x4e, 0x06, 0x0e, 0x61, 0x06, 0x0a, 0x5c, 0x0c, 0x3c, + 0x65, 0xc5, 0xc7, 0x13, 0x0c, 0x14, 0xb8, 0x19, 0xc8, 0x1b, 0xec, 0x83, 0xa9, 0x31, 0x95, 0x81, + 0x05, 0x14, 0x03, 0x45, 0x14, 0x03, 0x8d, 0x4e, 0x06, 0x4c, 0x98, 0x81, 0xc6, 0x49, 0x0c, 0x34, + 0xba, 0x18, 0x18, 0x36, 0xe6, 0x40, 0x8f, 0x8c, 0x29, 0x0c, 0xd8, 0x9c, 0x0c, 0xbc, 0x8b, 0x19, + 0xd8, 0xe7, 0x62, 0xe0, 0x59, 0x2b, 0x3e, 0x9e, 0x60, 0x60, 0x9f, 0x9b, 0x81, 0xe5, 0x67, 0x81, + 0x81, 0xe3, 0x53, 0x19, 0xc8, 0xa4, 0x18, 0x70, 0x2d, 0x16, 0xd7, 0x0e, 0xe7, 0xe1, 0x4a, 0xa8, + 0xeb, 0xa4, 0x9f, 0x7b, 0x15, 0xf9, 0x79, 0x94, 0x01, 0x46, 0x9f, 0xea, 0xcb, 0xd2, 0xb8, 0xa7, + 0x58, 0xaa, 0x04, 0x77, 0xa8, 0x10, 0x36, 0xf6, 0xe2, 0xdc, 0xc3, 0xb3, 0x22, 0x87, 0x6b, 0x7e, + 0xd1, 0x60, 0x7e, 0x59, 0xb8, 0x1c, 0x20, 0xda, 0x5d, 0x15, 0x03, 0xf3, 0xab, 0x7b, 0xbb, 0x54, + 0xeb, 0x9e, 0xcd, 0xdd, 0x5c, 0x2e, 0xb4, 0x97, 0x1a, 0xc6, 0xfd, 0x2b, 0xc1, 0xdd, 0x9c, 0xea, + 0x47, 0xc1, 0x13, 0x53, 0xf9, 0xf0, 0x32, 0x19, 0xe0, 0xb6, 0x6e, 0x59, 0x88, 0x6f, 0x9b, 0x2f, + 0x37, 0x12, 0x6b, 0x5d, 0x8e, 0x83, 0xb9, 0x3c, 0x07, 0xd3, 0x0c, 0x63, 0x1c, 0x2c, 0xc5, 0xb7, + 0xeb, 0x62, 0x58, 0xdd, 0x4e, 0xaf, 0x41, 0x25, 0x0e, 0x34, 0x34, 0xac, 0x92, 0xd7, 0xbd, 0xbc, + 0x40, 0x55, 0x35, 0x93, 0x54, 0x55, 0xe3, 0x36, 0x16, 0xe6, 0x9d, 0x78, 0x74, 0xa7, 0xa8, 0x6a, + 0x37, 0xa5, 0x2a, 0x8d, 0x78, 0xb5, 0x03, 0x8f, 0x9b, 0x1a, 0xf3, 0x40, 0xcd, 0xac, 0x0e, 0x7f, + 0x3f, 0x68, 0xb7, 0xb3, 0x88, 0x39, 0x79, 0x05, 0x10, 0xfe, 0x6e, 0x27, 0xe2, 0x87, 0x3d, 0x77, + 0x19, 0x79, 0xcf, 0x69, 0x31, 0xee, 0xbf, 0x7d, 0x4c, 0xdb, 0xc0, 0xdf, 0xf1, 0x1c, 0x87, 0xde, + 0xed, 0x9a, 0xc4, 0x3b, 0x9e, 0x33, 0xe1, 0xf6, 0x54, 0xce, 0x26, 0x1d, 0xa8, 0xea, 0xf0, 0x72, + 0xbe, 0x66, 0xd2, 0x0c, 0xbe, 0xc0, 0xc0, 0xb3, 0x64, 0xef, 0x4b, 0x41, 0x30, 0x7b, 0xc6, 0x27, + 0xcd, 0x9e, 0x71, 0x6a, 0xf6, 0x74, 0xc9, 0x35, 0x5e, 0x4f, 0xe2, 0x51, 0x2d, 0xd0, 0xba, 0x9c, + 0x05, 0x95, 0x09, 0x8d, 0x21, 0xf1, 0xd8, 0xbd, 0xf9, 0xf6, 0xed, 0xc6, 0x6e, 0xad, 0xa5, 0xff, + 0xb7, 0xc7, 0xee, 0xd4, 0xb6, 0x35, 0x79, 0xf3, 0x13, 0x5d, 0x8b, 0x96, 0xa6, 0x61, 0x3c, 0xe8, + 0x96, 0x73, 0xb7, 0x4b, 0x6e, 0xde, 0x79, 0x02, 0xa8, 0x97, 0x4f, 0xa1, 0xde, 0x1b, 0x4d, 0x51, + 0xbf, 0x28, 0x8b, 0xbf, 0xcd, 0xc0, 0x69, 0x82, 0x5f, 0xbc, 0xdd, 0xc0, 0x7d, 0x21, 0x7f, 0x00, + 0x17, 0x24, 0x4c, 0x52, 0xa8, 0xce, 0xa5, 0x50, 0x79, 0x42, 0x0e, 0xec, 0x4e, 0xac, 0x53, 0x15, + 0xba, 0x97, 0x52, 0xe8, 0xab, 0xf4, 0x9e, 0xdb, 0x4d, 0xd3, 0xf5, 0xa7, 0x6e, 0x37, 0x4d, 0xef, + 0x60, 0x3f, 0x08, 0x36, 0xd2, 0x34, 0xc9, 0x46, 0x9a, 0xdc, 0x36, 0x62, 0x1f, 0xdc, 0x1e, 0x62, + 0xc8, 0x9a, 0x6a, 0x23, 0x75, 0x94, 0x8d, 0x54, 0x0a, 0xae, 0xdd, 0x6e, 0xec, 0x5e, 0x38, 0xe8, + 0x7f, 0xbb, 0xb1, 0x13, 0x1b, 0x59, 0x60, 0xf6, 0x19, 0x93, 0xcc, 0x3e, 0xc3, 0x65, 0xf6, 0x79, + 0x2f, 0xc4, 0x80, 0x14, 0xcf, 0x4f, 0x31, 0x7b, 0x87, 0xd3, 0xec, 0xd3, 0x48, 0x6f, 0x30, 0xc7, + 0xad, 0x93, 0xcc, 0x71, 0xab, 0xcb, 0x1c, 0x3b, 0x07, 0xee, 0xc2, 0xc3, 0x35, 0xc5, 0x1c, 0x8f, + 0x53, 0xe6, 0xe8, 0xde, 0x96, 0x3c, 0x68, 0x1c, 0x08, 0x1d, 0x3c, 0xec, 0x8a, 0x4c, 0x65, 0x1f, + 0xf4, 0x62, 0xe1, 0x96, 0x39, 0x85, 0x33, 0x7e, 0x3a, 0xb2, 0x0b, 0x0f, 0xd1, 0x14, 0xe1, 0xca, + 0x29, 0xe1, 0x4e, 0x04, 0x62, 0x2a, 0x95, 0x6e, 0x07, 0xb5, 0xad, 0x12, 0xfb, 0xd4, 0x29, 0x54, + 0xaa, 0x29, 0x2a, 0xa6, 0x03, 0x93, 0xc7, 0x65, 0x74, 0xae, 0xe6, 0x76, 0xe3, 0xb2, 0xb2, 0x09, + 0x2b, 0x68, 0xaf, 0x4b, 0x41, 0x07, 0xd5, 0x41, 0xb0, 0xbc, 0x4e, 0x55, 0xd0, 0x59, 0x4a, 0x41, + 0x91, 0xb3, 0xb0, 0x49, 0x8d, 0xb9, 0x4c, 0xaa, 0x7d, 0xd7, 0x21, 0xac, 0xef, 0x29, 0x26, 0x95, + 0x45, 0x19, 0x34, 0xb9, 0x4c, 0x3d, 0xd9, 0x03, 0x56, 0x98, 0x0f, 0xdf, 0xc6, 0x03, 0xde, 0xc9, + 0x9b, 0xac, 0xe4, 0xca, 0x19, 0x73, 0x6e, 0xa3, 0xe4, 0x9c, 0xbb, 0xb1, 0x59, 0x8e, 0xb9, 0xcc, + 0xd2, 0x14, 0x86, 0xcb, 0x08, 0xae, 0x4c, 0x31, 0xcb, 0xc5, 0x77, 0x51, 0x66, 0xe9, 0x0a, 0xe9, + 0xae, 0xef, 0x0e, 0x7b, 0x90, 0x0c, 0x9d, 0x88, 0x89, 0xa9, 0xa7, 0x3c, 0xda, 0x38, 0x1b, 0x31, + 0x23, 0xbb, 0x83, 0x6c, 0x77, 0x21, 0x2d, 0xab, 0xdf, 0x73, 0x2f, 0xde, 0x1a, 0x13, 0xfd, 0x41, + 0xfb, 0x3f, 0x0b, 0x2e, 0x7b, 0x79, 0xf2, 0x88, 0x47, 0xe9, 0x38, 0x8f, 0xb8, 0x84, 0xca, 0x23, + 0xe2, 0x3f, 0x46, 0xdb, 0x9d, 0x65, 0x01, 0x8b, 0x3f, 0xa2, 0xb2, 0x89, 0xdb, 0xdb, 0xee, 0xd8, + 0x1d, 0x70, 0x47, 0x62, 0xc0, 0xb2, 0xd5, 0x6d, 0xb9, 0xde, 0x01, 0x77, 0x1d, 0x54, 0xde, 0x43, + 0x3d, 0x10, 0xc1, 0xcc, 0x51, 0xe2, 0x7b, 0x69, 0xd3, 0xa2, 0xb0, 0x23, 0xbd, 0xfb, 0x34, 0xd5, + 0x84, 0x2f, 0x50, 0x37, 0xe8, 0x71, 0x4e, 0xf0, 0x79, 0x77, 0x4e, 0x70, 0x61, 0x1e, 0xf5, 0xcc, + 0xa0, 0x52, 0xc8, 0xc0, 0xef, 0xe0, 0x21, 0x39, 0xb6, 0x26, 0xc2, 0x95, 0x14, 0xab, 0xab, 0x51, + 0x57, 0xd6, 0xe2, 0x27, 0xd2, 0xd5, 0x05, 0x85, 0x45, 0xc5, 0x25, 0x1b, 0x4a, 0x37, 0xd6, 0x25, + 0xd6, 0x25, 0x55, 0x50, 0xc9, 0xb9, 0xcd, 0xca, 0x44, 0xe9, 0xc4, 0x33, 0xcf, 0xca, 0xa5, 0xae, + 0x9c, 0xdd, 0x66, 0xe5, 0x66, 0xe5, 0xd2, 0xa9, 0x29, 0x3b, 0xfc, 0x58, 0xaa, 0xf1, 0x25, 0xef, + 0xfb, 0xee, 0xfc, 0x70, 0x76, 0x27, 0x63, 0x9c, 0x57, 0xa6, 0x0c, 0xda, 0x88, 0x34, 0xa8, 0x45, + 0x4f, 0x72, 0x3a, 0x68, 0x68, 0x84, 0x89, 0x86, 0x66, 0xe9, 0xf7, 0x36, 0x32, 0xe7, 0x09, 0x4b, + 0x02, 0x75, 0xcb, 0x7b, 0xf4, 0x61, 0x9c, 0xd9, 0xac, 0xe7, 0xed, 0x3b, 0xdf, 0x6f, 0xbf, 0x97, + 0x91, 0x7e, 0x89, 0x57, 0x8d, 0x13, 0x63, 0xcf, 0x37, 0x36, 0xa5, 0x09, 0xef, 0xe3, 0x2f, 0xb2, + 0x05, 0x3f, 0x9c, 0xf8, 0x2a, 0xa7, 0xe6, 0x74, 0xe0, 0x3f, 0x65, 0x70, 0x55, 0x75, 0x89, 0xf7, + 0x30, 0xbe, 0x6a, 0x69, 0x6c, 0x5a, 0x38, 0x72, 0x1f, 0xbf, 0x70, 0x34, 0xf8, 0xd1, 0x83, 0x6a, + 0xa4, 0xcc, 0x9a, 0x96, 0xea, 0x4b, 0x93, 0x05, 0x59, 0xbb, 0xb3, 0x07, 0xb9, 0x49, 0x8d, 0x4d, + 0x29, 0xb2, 0xed, 0xf8, 0x59, 0xbd, 0xac, 0xe5, 0xed, 0xb6, 0xd9, 0x9d, 0x3a, 0x67, 0xfe, 0xa7, + 0x26, 0x2b, 0x6a, 0x9d, 0xda, 0xbb, 0x9c, 0xc0, 0xf9, 0x1f, 0x93, 0xff, 0xec, 0x4b, 0xbc, 0x4d, + 0x38, 0xff, 0xd3, 0xba, 0xd4, 0xb8, 0x57, 0xb5, 0x7d, 0x55, 0x3e, 0xfd, 0x7e, 0xaa, 0x2a, 0xe0, + 0x6c, 0xf6, 0xd2, 0x9e, 0xde, 0xd0, 0x11, 0x1a, 0xae, 0x0a, 0x90, 0xc4, 0xac, 0x3d, 0x1d, 0xf8, + 0x99, 0x35, 0x88, 0xaa, 0x0a, 0x48, 0xbf, 0xe4, 0xf7, 0x86, 0x85, 0xf5, 0x36, 0x42, 0x14, 0x89, + 0xf6, 0xc6, 0xa6, 0xb9, 0x16, 0xa6, 0x93, 0x44, 0x7f, 0xff, 0xec, 0x03, 0xba, 0x39, 0xd4, 0xe3, + 0x80, 0xb0, 0x18, 0x4c, 0x22, 0x91, 0x34, 0x89, 0x44, 0xfb, 0x24, 0x12, 0x8c, 0x65, 0x2e, 0x12, + 0x4f, 0x4c, 0x97, 0xe0, 0x1c, 0x1b, 0x53, 0x18, 0x80, 0x10, 0x95, 0x8c, 0xa3, 0x18, 0xc0, 0x57, + 0xed, 0x70, 0x16, 0x16, 0x71, 0x28, 0xcd, 0xab, 0x0b, 0x62, 0xba, 0x7c, 0xaf, 0xb7, 0x4b, 0xbd, + 0xde, 0x69, 0xf4, 0xea, 0x6e, 0xf1, 0x7a, 0xb7, 0x7d, 0xe7, 0x9f, 0x71, 0x32, 0x6d, 0x59, 0xb9, + 0xf0, 0x82, 0x03, 0x27, 0xd3, 0xb4, 0xfe, 0xf3, 0x7d, 0x22, 0x4d, 0x92, 0xec, 0x6d, 0xad, 0xc6, + 0x1a, 0xba, 0x6e, 0x2f, 0x0a, 0x10, 0xb7, 0x9d, 0x65, 0x98, 0x4f, 0xcb, 0xb4, 0x31, 0x28, 0x8a, + 0x2d, 0xcb, 0x20, 0xf6, 0x2f, 0x14, 0x5e, 0xe5, 0xca, 0x3a, 0xf4, 0xd6, 0xbb, 0x50, 0x34, 0xe7, + 0x19, 0x71, 0x9e, 0xb0, 0x25, 0xbd, 0x9d, 0xe4, 0xbc, 0x26, 0x95, 0x97, 0xaa, 0xd4, 0x7a, 0x7b, + 0x4f, 0x2f, 0xa3, 0x23, 0xbd, 0x99, 0x9b, 0x65, 0x10, 0xf8, 0x1b, 0x97, 0x84, 0x47, 0x73, 0x96, + 0xe5, 0xe5, 0x09, 0xd1, 0x33, 0xed, 0x24, 0x4a, 0x4d, 0x94, 0x23, 0x08, 0x89, 0xd0, 0x58, 0x3f, + 0x83, 0x70, 0x6c, 0xe7, 0xd2, 0x1c, 0xfe, 0xfe, 0x0c, 0x14, 0x17, 0xcd, 0xd1, 0xe6, 0xe7, 0x09, + 0x9f, 0x39, 0x08, 0x00, 0x45, 0x00, 0x70, 0x04, 0x00, 0xda, 0x0f, 0x33, 0x88, 0xb4, 0x9d, 0x5c, + 0x9a, 0x36, 0xc8, 0x9f, 0x41, 0xce, 0x01, 0x80, 0x35, 0x79, 0x42, 0xed, 0x5b, 0x00, 0xb0, 0x0f, + 0x00, 0x8a, 0x0a, 0xf5, 0x68, 0x68, 0x80, 0x41, 0x98, 0x77, 0x71, 0xb3, 0xee, 0x09, 0xc3, 0xf5, + 0x12, 0x84, 0x6c, 0x97, 0x3b, 0x2f, 0x66, 0x1e, 0xc7, 0x8f, 0x04, 0x38, 0xb7, 0xb4, 0x54, 0xad, + 0x53, 0xba, 0x27, 0x2f, 0xa6, 0xd5, 0x53, 0x45, 0xbf, 0xd4, 0x9e, 0x94, 0x3f, 0x51, 0x86, 0x64, + 0xb6, 0x3c, 0x47, 0xd5, 0x61, 0x4e, 0xd4, 0x5d, 0x69, 0x7b, 0x4b, 0xa8, 0xdd, 0xf3, 0x44, 0xa5, + 0x03, 0x8d, 0x77, 0x3f, 0x95, 0x60, 0xe9, 0xf3, 0x54, 0x42, 0x79, 0xc5, 0x96, 0x17, 0xdd, 0x84, + 0x68, 0xd7, 0x4d, 0x88, 0xa2, 0x6f, 0x46, 0x34, 0x72, 0x13, 0x22, 0xd5, 0x4d, 0x88, 0xfe, 0x7d, + 0xed, 0x46, 0x44, 0xe7, 0x7f, 0xb8, 0x09, 0xd1, 0x27, 0x37, 0x21, 0xca, 0x70, 0x21, 0x92, 0xb1, + 0xfa, 0xc1, 0xd3, 0x6f, 0x22, 0xcf, 0xe2, 0xfb, 0xb8, 0xd4, 0x33, 0x18, 0x87, 0x78, 0x39, 0x93, + 0xaa, 0x44, 0x79, 0xf1, 0x18, 0xf0, 0x02, 0xf5, 0x2c, 0x1b, 0x78, 0xa8, 0x4d, 0x42, 0x36, 0xa5, + 0xa5, 0x41, 0x96, 0x5e, 0x25, 0x7c, 0x25, 0x4b, 0xc3, 0x1e, 0x9c, 0x54, 0x65, 0xc7, 0x13, 0x53, + 0x0c, 0xf7, 0x4f, 0xd5, 0xa5, 0x91, 0xf6, 0x33, 0x55, 0x1a, 0x9c, 0xa8, 0x46, 0x43, 0x7e, 0xf8, + 0x99, 0x8d, 0x30, 0xce, 0x7c, 0xfc, 0xc4, 0xfe, 0xae, 0x74, 0x54, 0x2d, 0xe4, 0xaf, 0x4c, 0x19, + 0x43, 0xfd, 0x72, 0x4f, 0xf9, 0x46, 0x0f, 0x26, 0x44, 0x3d, 0x06, 0x67, 0xa0, 0xd6, 0xf2, 0xe5, + 0x9e, 0x9b, 0x79, 0x2f, 0x38, 0xf0, 0x68, 0x19, 0x28, 0x0a, 0x03, 0xf8, 0xce, 0x98, 0xcd, 0x0b, + 0x5c, 0xf5, 0xbc, 0xfc, 0xcd, 0xae, 0x2a, 0x02, 0x13, 0x21, 0xc4, 0xdb, 0xdc, 0x53, 0x4c, 0xe0, + 0xb2, 0x4a, 0xfa, 0x1d, 0x03, 0xad, 0x95, 0xb3, 0x17, 0xc0, 0x26, 0x85, 0x08, 0xb9, 0xc0, 0x40, + 0x5d, 0x72, 0x91, 0x01, 0xfc, 0x66, 0xa3, 0xa1, 0x32, 0x06, 0x39, 0xef, 0xf5, 0x85, 0x20, 0xe0, + 0x47, 0x85, 0x58, 0xf3, 0xf0, 0x46, 0x46, 0x1e, 0x0a, 0x30, 0x6b, 0x55, 0x17, 0x5a, 0xe5, 0x97, + 0x58, 0x27, 0x81, 0xe4, 0x9c, 0x2d, 0x16, 0x70, 0x99, 0x62, 0xe9, 0x02, 0x7c, 0x1f, 0xea, 0x04, + 0x2e, 0x56, 0x77, 0x98, 0x47, 0xb8, 0xc8, 0xf9, 0xa4, 0x10, 0x0b, 0x57, 0xce, 0x88, 0xda, 0x6c, + 0xde, 0x40, 0x48, 0x23, 0x04, 0x42, 0x7b, 0x7d, 0xa9, 0x8e, 0x1a, 0x8b, 0x3f, 0xd2, 0xec, 0x9e, + 0x06, 0xc7, 0x04, 0x5b, 0x6d, 0xc1, 0xb7, 0x7c, 0x46, 0xbd, 0x71, 0x95, 0x94, 0xa0, 0xeb, 0x39, + 0xe4, 0x7c, 0x4c, 0xa8, 0x08, 0x61, 0xd5, 0xb0, 0xbf, 0x00, 0x0a, 0x81, 0x36, 0xd0, 0xba, 0x46, + 0x03, 0xbd, 0xbb, 0x54, 0x83, 0x2b, 0x47, 0x9f, 0x49, 0x8c, 0xfd, 0x4a, 0x35, 0xe2, 0x2c, 0x7e, + 0x50, 0xe3, 0xed, 0xcc, 0x3c, 0x19, 0xc8, 0x25, 0x4c, 0x66, 0x8a, 0x70, 0xa1, 0xbc, 0xf9, 0x6f, + 0x13, 0x37, 0xa3, 0x82, 0x07, 0xa9, 0xb4, 0x00, 0xf5, 0xcc, 0x10, 0xae, 0xc5, 0x20, 0x63, 0x10, + 0x4a, 0x5c, 0xa5, 0xd5, 0xc1, 0x0a, 0xe9, 0x3d, 0xa8, 0x8a, 0x41, 0xee, 0xba, 0x9d, 0x07, 0x48, + 0x2a, 0xb7, 0x80, 0xeb, 0x76, 0xd8, 0x55, 0x78, 0xff, 0xbc, 0x17, 0x69, 0x47, 0x59, 0xb6, 0x40, + 0x2b, 0xa8, 0x41, 0x63, 0xd8, 0x04, 0x80, 0x7b, 0xe4, 0x1c, 0x3d, 0xee, 0xc5, 0x78, 0x0e, 0x69, + 0x75, 0x3b, 0xce, 0x07, 0x32, 0xfe, 0xc8, 0x71, 0x55, 0x5b, 0x7c, 0xd3, 0xf4, 0xe6, 0x75, 0xf7, + 0x13, 0x23, 0x88, 0xca, 0xdc, 0xd5, 0xd0, 0x90, 0x54, 0x44, 0xe7, 0x00, 0x33, 0x67, 0x65, 0x97, + 0xb8, 0xa8, 0xdb, 0xca, 0xaf, 0xeb, 0x45, 0xa5, 0x36, 0xc4, 0x3a, 0x28, 0xc4, 0x77, 0x66, 0x11, + 0xbe, 0x67, 0xab, 0x15, 0x68, 0x7a, 0x51, 0x9a, 0x4e, 0x50, 0x09, 0xdf, 0x92, 0x11, 0x7c, 0xff, + 0x76, 0x11, 0xae, 0x2f, 0xe0, 0x2d, 0xea, 0x86, 0x6f, 0xa3, 0x2a, 0x86, 0xaf, 0x5d, 0xf0, 0x2b, + 0x82, 0x6f, 0x7f, 0x1a, 0xf5, 0xc8, 0x52, 0x63, 0x2f, 0x92, 0x7d, 0xed, 0x4d, 0x02, 0x3b, 0x26, + 0xc3, 0xb1, 0x18, 0xe4, 0xac, 0x43, 0x30, 0x33, 0x15, 0x61, 0x57, 0xb3, 0xf0, 0xa3, 0x4e, 0xa8, + 0x95, 0x4b, 0x47, 0x51, 0xe9, 0x5a, 0xbc, 0x94, 0x0a, 0x86, 0xac, 0x18, 0x60, 0x81, 0x13, 0x40, + 0xdc, 0xa2, 0x70, 0x03, 0x38, 0x68, 0x8d, 0x98, 0x04, 0xe3, 0x5e, 0x0f, 0x89, 0x19, 0x79, 0xb8, + 0x1e, 0x63, 0x76, 0xde, 0x28, 0xec, 0xda, 0xfd, 0xf5, 0xcf, 0x49, 0xd1, 0xc5, 0x76, 0x5c, 0x04, + 0xb0, 0x9c, 0x43, 0x3d, 0x5e, 0xe6, 0x00, 0x9c, 0x8b, 0x16, 0x39, 0x71, 0x8e, 0x63, 0x9c, 0xb4, + 0x15, 0x14, 0x4e, 0xc3, 0xb4, 0x9e, 0x49, 0x38, 0xb9, 0xb0, 0xf6, 0xa6, 0x0f, 0x3e, 0x44, 0x43, + 0xf1, 0xdd, 0x98, 0x3b, 0x7a, 0xd2, 0x38, 0x48, 0xec, 0xa0, 0x3a, 0x5d, 0x80, 0x4e, 0x66, 0x66, + 0x5f, 0xac, 0xdd, 0x10, 0x02, 0xa3, 0x5f, 0x23, 0xbd, 0xea, 0xbc, 0x13, 0x8a, 0x13, 0xc3, 0x4d, + 0x62, 0x72, 0x21, 0x81, 0x1a, 0x59, 0xe3, 0x88, 0x0e, 0x8b, 0xb0, 0x38, 0x67, 0xa1, 0x67, 0x02, + 0x98, 0xfa, 0xa9, 0xda, 0xcc, 0x33, 0x78, 0x22, 0xed, 0xed, 0x75, 0x4d, 0x8e, 0x3e, 0x6f, 0xf9, + 0x42, 0xad, 0x0d, 0xf6, 0xb5, 0xec, 0xd6, 0xbb, 0x90, 0x35, 0xae, 0x8f, 0x64, 0xe0, 0x5e, 0x9c, + 0x4c, 0x02, 0x76, 0xef, 0xbd, 0xa3, 0x11, 0xb2, 0xd3, 0x11, 0xc0, 0xc5, 0x7c, 0x29, 0x28, 0x3e, + 0x16, 0x4d, 0x7a, 0x3a, 0xe0, 0x4e, 0xfc, 0x1c, 0xa8, 0xb3, 0xc4, 0xda, 0x59, 0x67, 0x61, 0x02, + 0x43, 0x4b, 0x2a, 0x10, 0x5f, 0x96, 0x47, 0x8e, 0xc1, 0x8e, 0x77, 0x3f, 0x7d, 0x06, 0x18, 0x38, + 0x4d, 0x35, 0xe1, 0x0e, 0x3a, 0x8d, 0x54, 0x45, 0x27, 0xb6, 0x83, 0x45, 0x16, 0x37, 0xf1, 0x39, + 0x33, 0x8e, 0xa8, 0xa7, 0xe5, 0xec, 0xc3, 0x24, 0x16, 0xdc, 0x44, 0x22, 0xb7, 0x07, 0x63, 0xa7, + 0xaa, 0xa9, 0x0d, 0xb3, 0x3d, 0x24, 0x4e, 0x8b, 0xff, 0x69, 0x8b, 0xbc, 0x00, 0x24, 0xba, 0x6f, + 0x22, 0xd1, 0xc5, 0xa0, 0x9e, 0xaa, 0xba, 0x84, 0x49, 0x58, 0x27, 0x48, 0x9c, 0x18, 0x9d, 0xa6, + 0x9c, 0x1e, 0x09, 0x24, 0x32, 0x6e, 0x22, 0xb1, 0xb4, 0x9f, 0x2a, 0x0d, 0xa5, 0x48, 0xc4, 0x4d, + 0x48, 0x11, 0x9e, 0x95, 0x15, 0x75, 0x19, 0x48, 0x0c, 0xde, 0x44, 0xa2, 0xdf, 0x48, 0x91, 0xc0, + 0x7e, 0x64, 0x91, 0x7d, 0x82, 0xc4, 0x49, 0x75, 0x64, 0x7e, 0x16, 0x7e, 0xba, 0x24, 0xf3, 0x26, + 0x12, 0x79, 0x43, 0x98, 0x04, 0xf5, 0xf8, 0xad, 0x61, 0xce, 0x84, 0x14, 0xe1, 0xb9, 0xbd, 0x51, + 0x3f, 0x01, 0x89, 0x91, 0x9b, 0x48, 0x0c, 0x33, 0xa8, 0x07, 0xcc, 0xf0, 0xe3, 0x9d, 0x8b, 0x1c, + 0xbd, 0x53, 0x5d, 0xd8, 0x30, 0x23, 0x83, 0x7a, 0x74, 0x55, 0xeb, 0x35, 0xa9, 0x22, 0xfd, 0x6e, + 0x3c, 0xc1, 0x0c, 0xd4, 0xc3, 0xba, 0xdd, 0x13, 0x4e, 0x70, 0x85, 0x3f, 0x4e, 0xde, 0x2d, 0x3a, + 0x75, 0x13, 0x78, 0x35, 0xf5, 0xe0, 0xc5, 0xaf, 0x37, 0x81, 0x53, 0x0f, 0x96, 0x9c, 0xbd, 0x09, + 0x7c, 0x37, 0x85, 0xfd, 0x66, 0xf0, 0x3f, 0x53, 0xee, 0xf8, 0x26, 0xf0, 0x83, 0x14, 0xf6, 0xeb, + 0x6e, 0xf0, 0x21, 0x3f, 0x21, 0x98, 0xd3, 0x34, 0x8e, 0x8a, 0x72, 0xb4, 0x3b, 0xf9, 0xe7, 0x64, + 0xfc, 0x95, 0xa8, 0x5f, 0x2a, 0xa4, 0x07, 0x6a, 0x93, 0xf8, 0xfd, 0x32, 0x26, 0xf2, 0xa6, 0x27, + 0x2a, 0x89, 0x7c, 0x45, 0x3c, 0xb4, 0xa0, 0x79, 0xb8, 0x85, 0x64, 0xf5, 0x61, 0x98, 0x52, 0x29, + 0x3e, 0x71, 0xb0, 0xfa, 0xe2, 0x84, 0xee, 0x47, 0x41, 0x18, 0x54, 0x9d, 0x3a, 0xf5, 0x1c, 0xaa, + 0xf1, 0x86, 0x65, 0xf2, 0x6a, 0x3f, 0xf5, 0x08, 0xe0, 0xaf, 0xce, 0x6b, 0x13, 0xa5, 0xbf, 0x77, + 0xe1, 0x07, 0xb6, 0xae, 0x8f, 0x63, 0x76, 0x14, 0x69, 0x13, 0x2a, 0xbe, 0x9a, 0x4d, 0x81, 0xcb, + 0x26, 0x37, 0x31, 0xa8, 0x26, 0xf9, 0xe4, 0xa6, 0x7e, 0x6a, 0x20, 0xb2, 0x26, 0x37, 0x19, 0xa9, + 0xa6, 0xa9, 0xb8, 0xa8, 0xa6, 0xec, 0x29, 0xb8, 0xa8, 0xa6, 0xc5, 0xb8, 0x69, 0x55, 0x17, 0x7e, + 0xea, 0xe1, 0x11, 0x6b, 0x0b, 0x13, 0xed, 0x3d, 0x2e, 0x98, 0x87, 0x4b, 0x93, 0x2f, 0x18, 0x09, + 0x4d, 0xcb, 0x02, 0x5c, 0xb5, 0xb3, 0x7d, 0xc1, 0x29, 0x5c, 0x43, 0x8d, 0xeb, 0x8b, 0x7d, 0x71, + 0xf1, 0xf3, 0x87, 0xe3, 0xf4, 0xe5, 0x22, 0xf4, 0xb9, 0xe9, 0xf0, 0x32, 0x5c, 0xec, 0xbd, 0x40, + 0x8d, 0xc4, 0xbe, 0x54, 0x45, 0x39, 0x5e, 0xac, 0xa6, 0xc5, 0x16, 0x10, 0x28, 0x66, 0xf1, 0xfc, + 0x42, 0xe5, 0x55, 0x79, 0x54, 0x10, 0xd2, 0x3c, 0x9e, 0x89, 0x2f, 0xdd, 0x4b, 0xd5, 0xf5, 0xf4, + 0x41, 0xaf, 0x55, 0x38, 0xcd, 0x7d, 0xd5, 0x16, 0x19, 0x84, 0xec, 0xfa, 0x8e, 0x84, 0xde, 0x2c, + 0xf0, 0xc9, 0xd7, 0x54, 0xfc, 0x7e, 0x6c, 0x8d, 0xb8, 0x00, 0x48, 0x81, 0x3d, 0xc3, 0x34, 0xa3, + 0x2e, 0x1f, 0xc9, 0xbc, 0xb6, 0x6d, 0x21, 0x77, 0x56, 0x0e, 0x98, 0xc7, 0xe9, 0x73, 0x85, 0x5e, + 0xc8, 0x8c, 0x44, 0xf8, 0x21, 0x04, 0x9c, 0xc3, 0x7f, 0x44, 0xcb, 0x2a, 0x98, 0x30, 0xb5, 0x26, + 0xaa, 0x2e, 0xcc, 0x6f, 0xa1, 0xcb, 0x66, 0x35, 0xf9, 0x6b, 0x61, 0x7b, 0x79, 0x89, 0xdd, 0x92, + 0x8f, 0xac, 0xc5, 0x64, 0x35, 0xae, 0xd7, 0xb6, 0x01, 0xd9, 0x77, 0x0e, 0xe3, 0x9a, 0xfd, 0x0f, + 0x8f, 0xf5, 0x4f, 0x65, 0x79, 0x3d, 0xf5, 0xac, 0x83, 0x4a, 0xe9, 0xef, 0x91, 0x38, 0x1b, 0x57, + 0x7e, 0x3c, 0x49, 0x84, 0x8c, 0x63, 0x24, 0xbb, 0x01, 0x09, 0xb3, 0x88, 0x2a, 0x47, 0xd7, 0x85, + 0x78, 0xca, 0xd1, 0x99, 0x78, 0xc9, 0x7c, 0x74, 0x1c, 0x54, 0xe5, 0x29, 0x72, 0xff, 0x85, 0x1a, + 0x51, 0x22, 0xd7, 0xc5, 0x84, 0xfb, 0x11, 0xa2, 0x32, 0x46, 0xb1, 0xd6, 0x6f, 0xc2, 0xea, 0x5e, + 0x24, 0xda, 0xa9, 0x72, 0x77, 0xf7, 0x13, 0x36, 0x03, 0x94, 0xfd, 0x6d, 0xa0, 0x40, 0x16, 0x6f, + 0xc2, 0x5b, 0xe4, 0xd8, 0xc8, 0x09, 0xc9, 0xda, 0x97, 0x50, 0xd6, 0x5c, 0x66, 0xa2, 0x92, 0x2b, + 0x67, 0x3d, 0x75, 0x63, 0x05, 0xa1, 0x94, 0xfd, 0xec, 0x97, 0x4f, 0x42, 0xd5, 0xbe, 0x84, 0x42, + 0xb5, 0xc9, 0x34, 0x89, 0xda, 0x4b, 0x36, 0xdc, 0x46, 0x0f, 0xeb, 0xc4, 0xc5, 0xfa, 0x7a, 0x18, + 0x9b, 0xc3, 0x33, 0x63, 0x27, 0xb0, 0xef, 0x75, 0x62, 0xaf, 0x34, 0xbb, 0xb1, 0x9b, 0xc5, 0x76, + 0x26, 0x1f, 0xf8, 0x7f, 0x58, 0xd5, 0xe4, 0x11, 0x4c, 0xef, 0x14, 0x6c, 0xaf, 0xcd, 0x23, 0xd8, + 0x29, 0xe1, 0x15, 0xa6, 0x08, 0x43, 0x21, 0x80, 0x1a, 0x4a, 0x0a, 0xc8, 0xc6, 0xb7, 0xec, 0x74, + 0x28, 0xc8, 0x23, 0xf2, 0xc6, 0x80, 0x8d, 0xd6, 0x1b, 0x18, 0x7e, 0x3c, 0xb4, 0x3f, 0x14, 0x3c, + 0x92, 0xe7, 0x81, 0xb4, 0x8d, 0xfc, 0x72, 0xeb, 0x24, 0x3e, 0x5f, 0xf1, 0xed, 0xa6, 0xaa, 0xf7, + 0xdd, 0x0e, 0x98, 0x35, 0xce, 0x8a, 0x9b, 0x28, 0x6e, 0x7d, 0x3c, 0xf4, 0x3a, 0xe5, 0x27, 0xa7, + 0x80, 0x2c, 0xe9, 0x98, 0x0a, 0xf2, 0xbf, 0x1a, 0xff, 0x00, 0xa5, 0x1b, 0xcd, 0x14, 0x2c, 0xd8, + 0x5d, 0x5f, 0xef, 0x0b, 0x9b, 0x42, 0x08, 0x55, 0x4e, 0x25, 0xd4, 0x35, 0x95, 0x10, 0x35, 0x26, + 0x53, 0x79, 0x49, 0x3c, 0x30, 0x15, 0xe4, 0x06, 0x41, 0x16, 0x53, 0x82, 0x68, 0xfa, 0x62, 0x71, + 0x9e, 0x89, 0xa7, 0x5c, 0x8e, 0xab, 0x21, 0xef, 0xe6, 0x11, 0x04, 0x7e, 0x2c, 0x84, 0xb5, 0x0f, + 0x5b, 0xc8, 0x2c, 0x59, 0x3a, 0xf5, 0x52, 0x81, 0x99, 0x0c, 0x3a, 0xf8, 0xad, 0x53, 0x61, 0x46, + 0x1a, 0x2e, 0x7a, 0x43, 0xe7, 0xa8, 0x85, 0xf5, 0x05, 0xa1, 0x10, 0x3f, 0x4d, 0x53, 0x8d, 0x78, + 0x30, 0x2c, 0x5d, 0xb4, 0x36, 0x7f, 0x5c, 0x79, 0xd8, 0x92, 0x25, 0xc5, 0xb7, 0xc0, 0x24, 0x8f, + 0xe2, 0xa9, 0x35, 0xdb, 0xd9, 0x3d, 0x3b, 0x96, 0xc1, 0xc0, 0xcf, 0x61, 0x87, 0x5f, 0xc5, 0x13, + 0xea, 0x0d, 0x57, 0x77, 0xb3, 0x90, 0x8f, 0xbb, 0x37, 0xd8, 0xd9, 0x38, 0xaf, 0xec, 0xea, 0x7e, + 0x4d, 0x4e, 0xdd, 0x41, 0x3b, 0x47, 0x4c, 0xc3, 0x59, 0x65, 0x2f, 0x27, 0x4f, 0xa3, 0x6c, 0x1b, + 0xa2, 0xc4, 0xa0, 0xf6, 0xc7, 0xa7, 0x58, 0xb0, 0xa5, 0x6a, 0x95, 0x4b, 0xbc, 0xe4, 0xcb, 0x91, + 0x16, 0xa6, 0x19, 0x91, 0xc8, 0xa1, 0xf6, 0xc7, 0x28, 0x26, 0xfa, 0xbd, 0xf6, 0x8b, 0x05, 0xbd, + 0x3b, 0xe7, 0x18, 0xc2, 0x73, 0x16, 0x1c, 0x2c, 0x16, 0xb1, 0x3f, 0x8a, 0x79, 0x9b, 0xff, 0x9a, + 0x64, 0x3b, 0x55, 0xc6, 0xe0, 0xde, 0x33, 0xa7, 0xa0, 0x89, 0x77, 0xe7, 0xe0, 0x57, 0x7a, 0xa6, + 0xb4, 0xd1, 0x7c, 0x67, 0xb8, 0x6a, 0xd3, 0x43, 0x3c, 0xb5, 0xe9, 0x0c, 0x26, 0xbe, 0xbe, 0x7e, + 0x7d, 0x61, 0x49, 0xd9, 0xfa, 0xc2, 0xd2, 0xe2, 0xc2, 0x4d, 0xeb, 0x4b, 0xd4, 0x65, 0xe5, 0xaf, + 0x76, 0x2a, 0x02, 0xb5, 0x6d, 0x4a, 0xa6, 0x2a, 0x0a, 0xf6, 0xe4, 0x32, 0x5f, 0xaa, 0xf4, 0xc3, + 0x11, 0x85, 0x54, 0xfe, 0x12, 0xf4, 0x2a, 0x8a, 0xdb, 0xa8, 0xa5, 0x2a, 0x7c, 0x5c, 0xfb, 0xb4, + 0xfd, 0x0c, 0x84, 0xe2, 0x7c, 0xb5, 0x34, 0xd8, 0xf5, 0xad, 0x04, 0x3a, 0x7b, 0x84, 0x32, 0x62, + 0x84, 0xec, 0x32, 0x2e, 0xc5, 0x20, 0x7d, 0xde, 0xd9, 0x88, 0x75, 0x88, 0xaf, 0x13, 0xb6, 0x8a, + 0x84, 0x62, 0x8e, 0x5e, 0xfe, 0x0e, 0x2b, 0xef, 0xb0, 0x74, 0x5b, 0x18, 0x4d, 0xcf, 0x2f, 0x09, + 0xd1, 0x4b, 0xec, 0x54, 0xfd, 0x3d, 0x17, 0xcb, 0xc4, 0x20, 0xa3, 0xde, 0xe6, 0x6b, 0x5f, 0xe6, + 0xdd, 0xbf, 0xcd, 0x7a, 0x4f, 0xd3, 0x1c, 0x83, 0xe3, 0x95, 0xde, 0x3d, 0xea, 0xf1, 0x95, 0xea, + 0xa3, 0xb2, 0xc6, 0x3f, 0x59, 0x8a, 0xd3, 0x32, 0xee, 0x9d, 0x24, 0x17, 0x83, 0x92, 0xcb, 0xd6, + 0x42, 0x10, 0x46, 0x52, 0x54, 0x57, 0x66, 0xc5, 0xed, 0x1d, 0xd0, 0x1e, 0x01, 0xbf, 0x2f, 0x30, + 0x06, 0x95, 0xc4, 0xf4, 0x3f, 0x21, 0x49, 0x92, 0xb1, 0x45, 0x28, 0xc9, 0xea, 0xe7, 0x6c, 0x0f, + 0x95, 0xb5, 0xf0, 0x25, 0xd3, 0xb3, 0x5b, 0x84, 0x89, 0x59, 0x2b, 0x04, 0xc2, 0xe9, 0x85, 0xc6, + 0xfe, 0x1e, 0x32, 0x7b, 0x5b, 0x8b, 0xaf, 0xdf, 0x65, 0xad, 0x30, 0x24, 0x6b, 0xc5, 0x1a, 0xe1, + 0xf4, 0x22, 0x63, 0x2e, 0x0a, 0xe8, 0xa1, 0x23, 0xc4, 0x31, 0x18, 0x9a, 0x8d, 0xf3, 0xd3, 0x98, + 0xdf, 0x21, 0xa4, 0x25, 0x3b, 0xfc, 0x96, 0x13, 0x8b, 0x10, 0x22, 0x95, 0xb1, 0x4d, 0xf7, 0xc4, + 0x7a, 0x6b, 0x11, 0x07, 0x6d, 0xec, 0x08, 0x00, 0x55, 0x69, 0x37, 0x92, 0x4c, 0x02, 0xf6, 0xbe, + 0x68, 0xb9, 0x24, 0xd6, 0x82, 0x92, 0x85, 0xd4, 0xeb, 0xe2, 0x51, 0x35, 0xd0, 0xc7, 0x3a, 0x49, + 0x02, 0x12, 0x46, 0xda, 0x45, 0x5e, 0xa3, 0xbd, 0x51, 0xc7, 0xfd, 0x4a, 0xbc, 0x1f, 0x55, 0xe9, + 0xbd, 0xde, 0x8f, 0x1f, 0x91, 0x7e, 0x0f, 0x8a, 0xd9, 0xb9, 0xe3, 0x89, 0xbf, 0xc8, 0x7f, 0x08, + 0xff, 0xaa, 0xe1, 0x61, 0x5b, 0x6a, 0xce, 0x03, 0xf7, 0xa7, 0x3e, 0xfb, 0xfc, 0xb4, 0x65, 0x8b, + 0xbc, 0x4f, 0x04, 0xb1, 0x8b, 0xef, 0x45, 0xff, 0xe9, 0xfd, 0xf4, 0xc7, 0x89, 0xff, 0xf2, 0xfd, + 0xf4, 0x7c, 0xe7, 0xfb, 0xe9, 0x8b, 0x3c, 0xef, 0xa7, 0x4f, 0xfa, 0x8d, 0xf7, 0xd3, 0x27, 0x4d, + 0x7e, 0x3f, 0x7d, 0x9f, 0xfb, 0xfd, 0xf4, 0x38, 0xeb, 0x92, 0x34, 0x7d, 0x90, 0x83, 0xdf, 0x4f, + 0xff, 0x84, 0xa4, 0xd3, 0x08, 0x5f, 0xae, 0xf7, 0xd3, 0x6f, 0x6b, 0xf5, 0x32, 0x16, 0xe5, 0x09, + 0x85, 0x74, 0xa2, 0x96, 0xa1, 0x92, 0xde, 0xa1, 0x1d, 0x82, 0x51, 0xff, 0x9f, 0x7a, 0xd7, 0xaf, + 0xd9, 0xb7, 0xf7, 0xac, 0x69, 0xda, 0xba, 0xb1, 0x86, 0xf7, 0xae, 0x9d, 0x78, 0xa1, 0xef, 0xfb, + 0x6b, 0xef, 0x3d, 0x7f, 0xd7, 0x5f, 0x2e, 0x56, 0xfd, 0xb2, 0x55, 0xe0, 0xf3, 0x87, 0xa3, 0x6f, + 0x58, 0x9e, 0x8d, 0x7b, 0xf4, 0xe5, 0x8f, 0x2e, 0x07, 0xff, 0xeb, 0xbb, 0x85, 0xcd, 0x5f, 0xbe, + 0x51, 0xbf, 0xfa, 0x62, 0xfc, 0xa1, 0xf5, 0x17, 0xba, 0xde, 0x7b, 0xac, 0xea, 0xd3, 0xb5, 0x5d, + 0xc1, 0xab, 0x9f, 0x7f, 0xfb, 0xa9, 0x73, 0x3f, 0x3c, 0xf5, 0x5e, 0xde, 0xa3, 0x5f, 0xfe, 0xf5, + 0x72, 0xd2, 0x7b, 0x19, 0x7f, 0xfc, 0xcb, 0xb7, 0x3f, 0xd7, 0x1c, 0x8b, 0x7e, 0xe2, 0xfd, 0x6f, + 0x2f, 0x5e, 0xb9, 0x96, 0xf9, 0xc1, 0x1f, 0xbe, 0x4c, 0x48, 0x5b, 0x90, 0x37, 0xef, 0x2f, 0xe7, + 0xbe, 0xfb, 0xfc, 0xe1, 0x0b, 0xbf, 0xee, 0xf8, 0x6b, 0xe5, 0xe5, 0xcf, 0xd7, 0xed, 0x79, 0xf9, + 0xd8, 0x96, 0xcf, 0xf3, 0x0b, 0x0c, 0xb2, 0xbb, 0xff, 0x01, 0x16, 0x00, 0x33, 0x0a, 0x3f, 0xcf, + 0x91, 0x14, 0xd1, 0x2e, 0x9c, 0xf4, 0xce, 0xda, 0xdc, 0xf4, 0x80, 0x2c, 0xdf, 0x36, 0x39, 0xb7, + 0x15, 0x99, 0x72, 0xcd, 0x9c, 0xd2, 0x19, 0x28, 0x70, 0xd1, 0x83, 0x5e, 0xaf, 0x7c, 0xfc, 0x7a, + 0x45, 0x63, 0x84, 0xf2, 0xb3, 0xbd, 0x3d, 0x7f, 0xbd, 0xfe, 0xd8, 0xf6, 0x27, 0xa8, 0x17, 0xe7, + 0xfe, 0xfe, 0xbe, 0xd4, 0xdf, 0xdf, 0x97, 0xfa, 0x7f, 0xea, 0x7d, 0xa9, 0x7f, 0x44, 0xff, 0xf9, + 0x7d, 0xa9, 0x63, 0xd2, 0x58, 0xfa, 0xae, 0xce, 0x94, 0xa7, 0xeb, 0x2e, 0x64, 0x87, 0xc4, 0x05, + 0x3f, 0xb9, 0xf2, 0x7f, 0xfb, 0xdb, 0x29, 0x57, 0x96, 0x96, 0x55, 0xc2, 0xe1, 0xff, 0x8f, 0xdf, + 0x60, 0xfa, 0x5f, 0xbd, 0x36, 0xee, 0xbf, 0x78, 0x7b, 0x66, 0x7d, 0x65, 0x63, 0xd9, 0xfa, 0x0d, + 0xc5, 0x75, 0xeb, 0x6b, 0xab, 0x0a, 0x61, 0x75, 0x2d, 0xd3, 0x94, 0x15, 0xfd, 0xf6, 0x7b, 0x34, + 0x59, 0xa9, 0xce, 0x75, 0x4e, 0xaa, 0x17, 0xa2, 0x19, 0x1c, 0x39, 0xfc, 0x70, 0x66, 0x70, 0x6c, + 0xf0, 0x23, 0x84, 0xb3, 0x44, 0x3d, 0x29, 0x9a, 0xc1, 0xa1, 0x27, 0xe9, 0xa5, 0x91, 0x33, 0x38, + 0xbd, 0x89, 0x7a, 0x69, 0x6c, 0x32, 0xff, 0x2e, 0x74, 0x4c, 0x9a, 0xad, 0x4f, 0xe9, 0x93, 0x7a, + 0x1f, 0xe7, 0xd3, 0xb3, 0xf3, 0x92, 0xf9, 0x4a, 0xf9, 0x31, 0x69, 0xde, 0x00, 0x34, 0x84, 0x0f, + 0xf3, 0x89, 0x24, 0x83, 0x6a, 0x66, 0x32, 0xe7, 0x33, 0xf8, 0x79, 0x20, 0x39, 0xe0, 0xce, 0x28, + 0x56, 0xa1, 0x8c, 0x95, 0xcc, 0xb9, 0x2f, 0xd9, 0xa0, 0x4a, 0x87, 0x9f, 0x54, 0x85, 0x4d, 0x55, + 0xa2, 0x61, 0x95, 0x6a, 0xc2, 0xac, 0xae, 0x77, 0x13, 0x4e, 0x7a, 0x2b, 0x61, 0xbe, 0xf8, 0x43, + 0x1d, 0xed, 0xc3, 0xea, 0x24, 0xbf, 0x76, 0x73, 0xeb, 0xc8, 0xc8, 0x85, 0x93, 0x6b, 0x4f, 0x7e, + 0x35, 0xf8, 0xed, 0xc8, 0x91, 0xb5, 0x43, 0x23, 0xbd, 0x1f, 0x9f, 0x5f, 0x92, 0x9e, 0x54, 0x71, + 0x66, 0xfe, 0xf7, 0x4b, 0xa7, 0xbc, 0x2c, 0x90, 0xff, 0x66, 0x48, 0xf2, 0xd2, 0xda, 0xc4, 0x57, + 0x6b, 0xc3, 0x5e, 0x58, 0xfa, 0x60, 0xed, 0xb3, 0x61, 0x8b, 0x49, 0x7a, 0xca, 0xff, 0xd1, 0xf7, + 0x05, 0xda, 0x48, 0x67, 0x9c, 0x43, 0xc5, 0x00, 0x34, 0xe7, 0x9a, 0x4c, 0x73, 0xad, 0xc9, 0x0c, + 0x57, 0xfc, 0x50, 0x0c, 0x6b, 0xa9, 0x1e, 0x7e, 0xfd, 0xe8, 0x6d, 0xd7, 0xe8, 0xae, 0xb8, 0x08, + 0x23, 0x4f, 0x82, 0xbf, 0x3c, 0xd7, 0x79, 0x91, 0x0b, 0xb6, 0xc8, 0x75, 0xaf, 0xe1, 0x2c, 0xe1, + 0x7c, 0x93, 0x7a, 0x34, 0xe1, 0x8c, 0x9b, 0x16, 0xc1, 0xef, 0x43, 0x08, 0x79, 0x5e, 0x70, 0x7e, + 0xcd, 0xf3, 0xa6, 0x73, 0x27, 0xbc, 0xfb, 0x57, 0xe8, 0x82, 0xc1, 0x2f, 0xae, 0x8c, 0x9a, 0xf4, + 0x8b, 0xa3, 0x57, 0x14, 0x89, 0x50, 0x82, 0x0b, 0xc6, 0xfd, 0x8b, 0xdb, 0x39, 0x71, 0x80, 0x1f, + 0x8e, 0x71, 0x5c, 0xe4, 0xfe, 0x75, 0xb7, 0xe3, 0xe7, 0xec, 0x20, 0x4c, 0xf0, 0xfc, 0xba, 0xdb, + 0x37, 0xb9, 0xce, 0x37, 0x4d, 0x6a, 0x17, 0x01, 0xfe, 0x47, 0xe1, 0x18, 0xaf, 0x53, 0xee, 0x5f, + 0x8a, 0x2e, 0xc4, 0x7e, 0xbb, 0x5c, 0x31, 0x84, 0xfb, 0xd7, 0x8d, 0xe7, 0x05, 0xe4, 0x5c, 0xfb, + 0xdd, 0xbf, 0x6e, 0xf8, 0xd7, 0x5d, 0xfc, 0xbd, 0x3e, 0x89, 0x4f, 0xdc, 0xfe, 0x81, 0xeb, 0xfc, + 0x83, 0x49, 0xed, 0xbb, 0x81, 0xee, 0xc7, 0xc8, 0x19, 0xd3, 0xb9, 0x7f, 0xdd, 0xf8, 0x3f, 0x77, + 0xe1, 0xfd, 0x7c, 0x12, 0x7e, 0x21, 0xc0, 0x9f, 0x76, 0xf1, 0x77, 0x7a, 0x12, 0x9f, 0x18, 0x1e, + 0xbf, 0x3f, 0x13, 0x8f, 0x9b, 0xfb, 0x97, 0x6a, 0x8f, 0x74, 0xea, 0xd7, 0xad, 0x72, 0xc2, 0xcd, + 0x8f, 0xd0, 0x79, 0xcc, 0x45, 0x13, 0xbf, 0xb8, 0x9d, 0xc1, 0x9f, 0x18, 0x1b, 0x77, 0x9f, 0xf7, + 0xe0, 0xc0, 0xdb, 0x75, 0xfc, 0x00, 0x5c, 0xaf, 0x77, 0xda, 0xc3, 0x7e, 0x6c, 0x0f, 0x9b, 0xb0, + 0xbf, 0x88, 0xaf, 0x07, 0x3f, 0xf4, 0x5f, 0xb9, 0x00, 0x0a, 0xba, 0xa8, 0x60, 0x43, 0x7c, 0x51, + 0x31, 0x78, 0xaa, 0x9a, 0x62, 0xea, 0xbc, 0xbc, 0xac, 0xa4, 0xb8, 0xae, 0xac, 0xa2, 0x38, 0x1e, + 0xff, 0xb7, 0x4b, 0x75, 0xf1, 0x1a, 0x69, 0x59, 0x1a, 0xd5, 0x5e, 0x51, 0x5c, 0x51, 0x5b, 0xec, + 0x3c, 0x8f, 0x2f, 0x4b, 0x4d, 0xb9, 0x95, 0x73, 0x98, 0xfa, 0x88, 0xe8, 0x54, 0x6c, 0xc5, 0x95, + 0x45, 0x54, 0xdf, 0xc9, 0xa5, 0xea, 0x37, 0xdc, 0xa5, 0xba, 0x31, 0x8a, 0xa7, 0x10, 0xc0, 0x55, + 0xcd, 0xa4, 0x0b, 0x1e, 0x96, 0x37, 0xab, 0xcb, 0xeb, 0x8b, 0x0b, 0x0a, 0x2b, 0x34, 0x4e, 0xaf, + 0xba, 0xa1, 0xec, 0xbf, 0xf7, 0x8f, 0x6a, 0x75, 0x4d, 0x61, 0x69, 0x6a, 0xca, 0x9c, 0xfa, 0xca, + 0x4d, 0x95, 0x55, 0x0d, 0x95, 0x73, 0x9c, 0x45, 0xf2, 0x1b, 0x2a, 0xeb, 0xff, 0x27, 0x5f, 0xa5, + 0xed, 0xd2, 0xb1, 0xf3, 0xd5, 0xc3, 0xe8, 0xf7, 0xcf, 0xef, 0x9f, 0xdf, 0x3f, 0xbf, 0x7f, 0x7e, + 0xff, 0xfc, 0xfe, 0xf9, 0xfd, 0xf3, 0xfb, 0xe7, 0xf7, 0xcf, 0xef, 0x9f, 0xdf, 0x3f, 0xff, 0x4f, + 0x7e, 0xfe, 0x3f, 0x58, 0xb7, 0xf7, 0x26, 0x00, 0x78, 0x00, 0x00 +}; + +static unsigned char wcn_bind_verify_lib[] = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xed, 0x5b, 0x7b, 0x78, 0x53, 0xc7, + 0x95, 0x9f, 0x7b, 0xaf, 0xfc, 0x40, 0xf2, 0xdb, 0xe6, 0x61, 0x6c, 0x2c, 0xc9, 0x36, 0x0f, 0x3b, + 0x48, 0xb6, 0xc1, 0x36, 0x76, 0x82, 0x83, 0x2c, 0xf3, 0x74, 0x28, 0xc1, 0x0e, 0xd9, 0x92, 0x92, + 0x56, 0xc8, 0xd2, 0xb5, 0x25, 0x90, 0x25, 0xa1, 0x07, 0x36, 0x21, 0x59, 0x1c, 0x02, 0xa4, 0xcd, + 0xa3, 0xc1, 0x0d, 0x49, 0x60, 0x79, 0x14, 0x1b, 0x08, 0xe0, 0x34, 0x2d, 0xdb, 0x84, 0x26, 0xb0, + 0x2d, 0xaf, 0x10, 0x42, 0xd2, 0x7c, 0x5b, 0x5a, 0x17, 0xc2, 0x36, 0xb4, 0x71, 0x1e, 0x6d, 0x09, + 0x6c, 0x5b, 0x58, 0x48, 0x82, 0x37, 0x80, 0xf7, 0xcc, 0xbd, 0x33, 0x57, 0xd2, 0x48, 0xda, 0xb4, + 0xfd, 0x76, 0xff, 0xd8, 0x6f, 0x3d, 0xdf, 0xc7, 0x9d, 0x33, 0xbf, 0x39, 0xe7, 0xcc, 0x39, 0x67, + 0xce, 0x9c, 0xfb, 0x90, 0xe9, 0xb0, 0xb9, 0x2d, 0x2d, 0x4e, 0xb7, 0xdd, 0xb2, 0x52, 0xf4, 0x39, + 0x5b, 0x57, 0x19, 0x3d, 0xe8, 0x7f, 0xbe, 0x95, 0x43, 0xab, 0xae, 0xae, 0xc4, 0x7d, 0xc5, 0xb4, + 0xaa, 0x0a, 0xd2, 0x4f, 0x95, 0xf0, 0xf2, 0xf2, 0xa9, 0x95, 0xd3, 0xa6, 0x96, 0xa3, 0x8a, 0xa9, + 0x80, 0x54, 0x4c, 0x83, 0x06, 0x7c, 0x15, 0x55, 0x53, 0xa7, 0x56, 0x20, 0x5d, 0xf9, 0xff, 0x82, + 0x2d, 0x51, 0x2d, 0xe8, 0x0f, 0x58, 0x7d, 0x3a, 0x1d, 0x7a, 0xc8, 0x61, 0xf5, 0xac, 0xf2, 0x04, + 0x57, 0x39, 0xe3, 0xf0, 0x7d, 0xd5, 0xfc, 0xff, 0xd1, 0xb6, 0x66, 0xd6, 0xfc, 0xd9, 0x3c, 0xc7, + 0x29, 0x63, 0x0e, 0xbd, 0x86, 0xb8, 0x18, 0x7c, 0x63, 0x2a, 0x43, 0xb4, 0x89, 0x5c, 0x47, 0xa3, + 0x1c, 0x74, 0x6b, 0x75, 0xdf, 0x7e, 0x01, 0x75, 0xfd, 0xea, 0x96, 0x80, 0xba, 0xaf, 0xdd, 0xc7, + 0xed, 0xff, 0x81, 0x8d, 0xeb, 0xfe, 0x6c, 0x09, 0xbf, 0xff, 0x0b, 0x9b, 0xb0, 0xff, 0x87, 0xa9, + 0x68, 0xf1, 0x60, 0x11, 0x1a, 0x3c, 0xc1, 0x99, 0x06, 0x7b, 0x7f, 0x84, 0x06, 0x79, 0xe0, 0x1b, + 0xaf, 0x32, 0xd5, 0xea, 0x33, 0x50, 0x77, 0xf1, 0x31, 0x4b, 0x4d, 0xe1, 0x80, 0xa5, 0x66, 0xc2, + 0x15, 0x4b, 0xcd, 0x9e, 0xe9, 0x19, 0xf7, 0x9d, 0xd0, 0xf1, 0xa5, 0xbb, 0x97, 0xaa, 0x4a, 0xd7, + 0x22, 0xbe, 0x74, 0xad, 0xb3, 0xe8, 0x75, 0x1b, 0xf0, 0xac, 0x41, 0xdc, 0xd5, 0x47, 0x6f, 0x0f, + 0x2d, 0xfa, 0x50, 0x48, 0xe9, 0x7b, 0x9c, 0x13, 0xba, 0x8b, 0x92, 0x4d, 0x25, 0x92, 0x6c, 0xa5, + 0xe9, 0xd0, 0x78, 0x9d, 0xe9, 0xd0, 0x10, 0xe2, 0x2e, 0xef, 0x42, 0x82, 0x66, 0xd6, 0xdc, 0xb5, + 0xd9, 0x1b, 0xe6, 0xaf, 0xcb, 0xde, 0x93, 0x7f, 0xa2, 0xf1, 0xd4, 0xcc, 0x93, 0x8d, 0xbd, 0x29, + 0xe6, 0xc6, 0x93, 0x93, 0x66, 0x36, 0x82, 0x2e, 0x8d, 0x19, 0xe6, 0x0b, 0xa7, 0xa3, 0x43, 0x7a, + 0xd0, 0x33, 0x72, 0x61, 0x63, 0x49, 0xc2, 0xb5, 0xf5, 0xcd, 0xd9, 0x9d, 0xf7, 0x94, 0x24, 0x82, + 0x2d, 0x59, 0x33, 0xe7, 0x97, 0xcc, 0x6a, 0xda, 0xe7, 0xcb, 0x98, 0xfe, 0xb5, 0x92, 0xcb, 0x42, + 0x41, 0x69, 0x7b, 0x32, 0x5a, 0x7c, 0x49, 0xc8, 0x2c, 0xfd, 0x58, 0xc8, 0x2a, 0xfd, 0xa3, 0x90, + 0x5d, 0xfa, 0xb9, 0x90, 0x5e, 0xfa, 0xa9, 0x90, 0x51, 0x7a, 0x51, 0xc8, 0x29, 0xfd, 0x44, 0x18, + 0x59, 0xaa, 0x46, 0x28, 0xe7, 0x4d, 0x47, 0xfb, 0xeb, 0x9f, 0x0b, 0x23, 0x4a, 0x2f, 0x0b, 0x49, + 0x30, 0xa7, 0x06, 0xbe, 0xe4, 0xd2, 0x4b, 0x82, 0x00, 0x3c, 0x2a, 0x90, 0xe3, 0x81, 0x8f, 0x2b, + 0x5d, 0x35, 0xf9, 0xb1, 0x6c, 0x3d, 0x57, 0xa4, 0xde, 0x5c, 0xb9, 0x2e, 0xbb, 0x05, 0xa9, 0xd5, + 0xb5, 0x79, 0x6f, 0x34, 0xbe, 0xe0, 0x6c, 0x7d, 0xbd, 0x10, 0xf1, 0x8d, 0x63, 0x34, 0x27, 0x1b, + 0x3f, 0x44, 0xc9, 0x8d, 0xb5, 0x6d, 0x6f, 0x34, 0x9e, 0x02, 0x5f, 0xde, 0xe4, 0x13, 0x34, 0x85, + 0x02, 0xaf, 0xa9, 0x46, 0x2a, 0xf5, 0x07, 0x48, 0x75, 0x95, 0xe3, 0x92, 0xd4, 0x66, 0x94, 0xa0, + 0x19, 0xb3, 0xe4, 0x64, 0xe3, 0x71, 0x9e, 0x6b, 0xfc, 0x3a, 0x1a, 0xad, 0xe1, 0x04, 0x4e, 0xf3, + 0x11, 0xaf, 0xd1, 0x7c, 0xc8, 0x73, 0x1a, 0xee, 0xe6, 0xd0, 0xa2, 0x1e, 0xe8, 0xd7, 0xf1, 0x2a, + 0x8d, 0x83, 0x4f, 0xd6, 0xbc, 0x25, 0x24, 0x69, 0xcc, 0x3c, 0xaf, 0x29, 0xe2, 0x05, 0x8d, 0x9a, + 0x57, 0x6b, 0x3e, 0xe5, 0x46, 0x68, 0xb8, 0x0c, 0x75, 0xc9, 0x9e, 0x1f, 0x99, 0x06, 0x8f, 0x43, + 0xdc, 0x7b, 0x10, 0xf7, 0x4e, 0x72, 0xbe, 0xa6, 0x84, 0x4f, 0x49, 0x29, 0x51, 0x17, 0xa7, 0x96, + 0x7c, 0x88, 0xd0, 0xc1, 0x6b, 0xf7, 0xd5, 0xef, 0xff, 0x6c, 0x89, 0x19, 0xf6, 0xa8, 0x61, 0xff, + 0x60, 0x91, 0x69, 0xf0, 0xd6, 0xea, 0x73, 0xfb, 0x8e, 0x09, 0x96, 0x73, 0xb0, 0xa9, 0x9b, 0xd8, + 0x7d, 0x07, 0x7f, 0xfa, 0xf0, 0xfe, 0xae, 0x87, 0x7d, 0x9b, 0x84, 0x84, 0x27, 0x1f, 0x4f, 0x36, + 0xd5, 0xae, 0x4b, 0x41, 0xdd, 0x6b, 0xcf, 0x58, 0x6a, 0x12, 0x1d, 0xb6, 0x9a, 0xfd, 0x28, 0x49, + 0xfd, 0x7b, 0x94, 0xd0, 0x68, 0x53, 0xa1, 0xee, 0x09, 0x5c, 0x62, 0x63, 0x2f, 0xe2, 0xd5, 0x27, + 0xc0, 0xcf, 0x35, 0x19, 0xe8, 0x2a, 0x5f, 0x81, 0x6a, 0xeb, 0x21, 0xee, 0x58, 0xf7, 0xad, 0xd5, + 0x07, 0xf7, 0x7f, 0xf2, 0xee, 0xb6, 0xe6, 0x5d, 0x67, 0x9e, 0x6b, 0x9e, 0xed, 0xde, 0xd1, 0x8c, + 0xf3, 0x05, 0xe7, 0xc9, 0xe7, 0x02, 0xea, 0xc3, 0x79, 0xf3, 0x99, 0x30, 0xaa, 0xef, 0x5a, 0x36, + 0x5a, 0x6c, 0xde, 0xbb, 0xa3, 0xb9, 0xb8, 0xfe, 0x65, 0xdf, 0xc7, 0xae, 0xd7, 0x7c, 0x1f, 0xed, + 0x7f, 0xd5, 0x77, 0xea, 0xe9, 0xbd, 0xbe, 0xeb, 0x60, 0x83, 0x95, 0x07, 0x5f, 0xbe, 0x8e, 0x06, + 0x39, 0xb0, 0xa5, 0x67, 0x94, 0xa9, 0xe6, 0xf7, 0xf7, 0x3e, 0xd1, 0xbc, 0x3b, 0x3d, 0xb3, 0x64, + 0x5d, 0xe6, 0xd3, 0xcd, 0x2f, 0x6a, 0xb2, 0x4a, 0x6c, 0x55, 0x5b, 0x9b, 0x0b, 0x77, 0x6d, 0x69, + 0xd6, 0xa1, 0xae, 0xe6, 0x37, 0xf5, 0x7d, 0xbe, 0x73, 0x59, 0xa8, 0x7b, 0xf7, 0xd2, 0x57, 0x7c, + 0xb6, 0x2b, 0xbb, 0x7c, 0xfc, 0xc3, 0x2f, 0xf9, 0x3e, 0xe0, 0x47, 0x5e, 0xee, 0xf9, 0x18, 0xd5, + 0xf6, 0x34, 0xd4, 0xfd, 0x72, 0xe7, 0x6a, 0x74, 0xe8, 0x68, 0x03, 0x1a, 0xdc, 0xb3, 0x15, 0x1d, + 0xda, 0xfd, 0x4c, 0x76, 0x49, 0xef, 0x5e, 0x74, 0xa8, 0x8b, 0x43, 0x8b, 0xf4, 0x26, 0xdd, 0x93, + 0xbd, 0xbc, 0xa9, 0x16, 0xa9, 0x50, 0xa6, 0x16, 0x71, 0x2b, 0x30, 0x5f, 0xa1, 0xee, 0xee, 0xda, + 0xa5, 0x1a, 0xb4, 0xe8, 0x60, 0x22, 0xea, 0x96, 0x74, 0x80, 0xfc, 0x71, 0xf0, 0x49, 0x7b, 0x01, + 0xad, 0xf8, 0x54, 0x23, 0xcb, 0x7c, 0x94, 0xde, 0x95, 0x25, 0xc9, 0xdc, 0x44, 0x2b, 0x30, 0xff, + 0x45, 0x84, 0x16, 0x61, 0x3e, 0x3c, 0x47, 0x75, 0xcd, 0x00, 0xdc, 0x3a, 0x04, 0x7b, 0xf7, 0x31, + 0xea, 0x1e, 0x00, 0x7f, 0xa6, 0x0c, 0x0d, 0xbd, 0xb0, 0x13, 0x68, 0xed, 0xc3, 0x68, 0xff, 0xce, + 0x22, 0x4e, 0xee, 0x6d, 0x72, 0x7f, 0x74, 0x1a, 0x1a, 0xdc, 0xb9, 0xda, 0x74, 0x68, 0x57, 0x83, + 0x69, 0x90, 0xf7, 0x3e, 0xd2, 0x8f, 0x65, 0x20, 0x8f, 0x9f, 0xc4, 0x72, 0xbd, 0x1f, 0x70, 0xb5, + 0xbd, 0x60, 0x7b, 0xc3, 0xcd, 0x85, 0xfd, 0x73, 0x6e, 0xce, 0xed, 0x9f, 0x7d, 0x73, 0x71, 0xff, + 0xac, 0x9b, 0x4b, 0xfb, 0x67, 0xde, 0x74, 0xf4, 0xef, 0x7a, 0x8f, 0xab, 0x6d, 0xb8, 0xe9, 0xed, + 0x37, 0xdf, 0xec, 0xec, 0xdf, 0xfb, 0x3e, 0x57, 0xfb, 0x62, 0x3f, 0x57, 0xbb, 0xe7, 0x17, 0x5c, + 0xed, 0xee, 0x9f, 0x73, 0xb5, 0xbb, 0xde, 0x02, 0xb9, 0x37, 0xb8, 0xda, 0x1c, 0x58, 0xf7, 0x43, + 0x21, 0xa7, 0x0f, 0x09, 0x5d, 0xcd, 0xbd, 0xe9, 0x4d, 0x25, 0x7a, 0xd8, 0x37, 0x73, 0xf1, 0xb1, + 0xb1, 0x36, 0xf8, 0x57, 0x78, 0x45, 0x5b, 0x53, 0x94, 0x82, 0x6a, 0x7b, 0x9f, 0x35, 0x1d, 0xc2, + 0x58, 0x61, 0x3e, 0xd0, 0x2f, 0x10, 0x7a, 0x32, 0xd0, 0x5b, 0x09, 0x3d, 0x1d, 0xe8, 0xef, 0x13, + 0x7a, 0x3e, 0xd0, 0xbb, 0x08, 0xfd, 0x20, 0xd0, 0x7b, 0x65, 0x1a, 0xe9, 0x50, 0x93, 0x56, 0x87, + 0x2a, 0x0a, 0x5d, 0xa8, 0xf6, 0x38, 0xe4, 0xec, 0xce, 0xaf, 0x9b, 0x06, 0xf1, 0x1e, 0x72, 0x90, + 0x8f, 0x08, 0xf6, 0xc8, 0xaa, 0x0a, 0xe5, 0xe1, 0xad, 0xd5, 0x3f, 0x97, 0xf2, 0x4f, 0xab, 0x13, + 0xce, 0x62, 0x5f, 0x71, 0xac, 0xb1, 0xaf, 0x9f, 0xde, 0x1e, 0x7a, 0xe1, 0x28, 0xec, 0x41, 0x0f, + 0xc4, 0x01, 0xcb, 0xe8, 0x51, 0x72, 0x77, 0x0f, 0xf8, 0xbe, 0x63, 0x68, 0x68, 0x74, 0x21, 0xc4, + 0xf6, 0x63, 0x88, 0x3b, 0x07, 0xf1, 0x9d, 0x31, 0x80, 0x56, 0x34, 0x40, 0x7c, 0xbb, 0x3e, 0x1f, + 0x5a, 0xd4, 0x0b, 0x71, 0x37, 0x9b, 0xf4, 0x4f, 0xea, 0x09, 0x6e, 0x01, 0xfc, 0xd8, 0x67, 0xb1, + 0xf1, 0x1e, 0xd8, 0xc7, 0xbd, 0xa0, 0x2b, 0x3c, 0xef, 0x6f, 0xad, 0x7e, 0x7d, 0x3f, 0xad, 0x65, + 0xaf, 0xbe, 0x41, 0x73, 0x94, 0xeb, 0xeb, 0x4f, 0x40, 0x8b, 0x71, 0xdc, 0x3e, 0x83, 0x7c, 0x6d, + 0x01, 0x3f, 0x7a, 0x67, 0xc8, 0xf5, 0xac, 0x11, 0xe2, 0x79, 0x49, 0x40, 0xa5, 0x4b, 0x05, 0x54, + 0xb5, 0xb3, 0x81, 0xeb, 0xc6, 0xf9, 0xf9, 0x11, 0xf0, 0x98, 0x8b, 0x51, 0xf7, 0xba, 0x87, 0xac, + 0x37, 0x76, 0x2d, 0xb3, 0xd6, 0xe0, 0x18, 0xcf, 0x80, 0xf3, 0xd0, 0x00, 0xf1, 0x9d, 0xe9, 0xd5, + 0xde, 0xd0, 0x43, 0x1e, 0x7c, 0x02, 0xf9, 0xbe, 0xa7, 0x9f, 0xeb, 0x16, 0x10, 0xe4, 0x1b, 0x9c, + 0x27, 0x1e, 0xea, 0x20, 0x07, 0xf5, 0xf0, 0x28, 0x42, 0x97, 0xcd, 0xa8, 0x48, 0x6d, 0x45, 0x9c, + 0xba, 0x1e, 0x71, 0x8d, 0x8f, 0xe6, 0xa0, 0x9a, 0x0f, 0xa5, 0x1a, 0x38, 0xaa, 0x6f, 0x40, 0x18, + 0xd9, 0x97, 0x8f, 0xf3, 0x66, 0x46, 0x28, 0x96, 0x03, 0x50, 0x83, 0x7a, 0x50, 0x78, 0x2c, 0x4f, + 0x2b, 0x67, 0x19, 0xc7, 0x33, 0xe4, 0xd7, 0x6b, 0x8a, 0x5f, 0xaf, 0x08, 0x72, 0x8d, 0xc6, 0xe7, + 0x6a, 0x64, 0x12, 0xf6, 0x2b, 0xbb, 0x0f, 0x9f, 0xc3, 0x5e, 0xec, 0xd7, 0x1c, 0xd9, 0x2f, 0x9c, + 0x27, 0x03, 0x2a, 0x54, 0xd5, 0xfb, 0x98, 0xec, 0x13, 0xd4, 0xb6, 0x3e, 0x1b, 0xf8, 0x24, 0x82, + 0x4f, 0x27, 0xc3, 0x7c, 0xb2, 0x83, 0x4f, 0x22, 0xf1, 0xe9, 0x45, 0x88, 0x17, 0xae, 0x15, 0xb3, + 0xa0, 0x56, 0x98, 0xc1, 0xa7, 0x7a, 0xf0, 0x69, 0x26, 0xd4, 0x89, 0x89, 0x50, 0x1f, 0xa0, 0x0e, + 0xa9, 0x3f, 0x81, 0x1a, 0xf7, 0x28, 0xf8, 0x74, 0xdc, 0x51, 0x54, 0x83, 0xeb, 0xc5, 0x9a, 0x72, + 0x74, 0xb5, 0x47, 0xf2, 0x2d, 0x51, 0xaa, 0x31, 0xe3, 0x21, 0x16, 0x7a, 0x90, 0x2b, 0xbe, 0x22, + 0xdf, 0x1b, 0xd6, 0xa1, 0xf1, 0x6a, 0x5c, 0x4f, 0xa0, 0x8e, 0x37, 0xae, 0x5d, 0x46, 0x64, 0x60, + 0x4d, 0x7c, 0xfe, 0x7a, 0xe7, 0x40, 0x3d, 0x00, 0x7b, 0x21, 0x46, 0xef, 0x44, 0xfa, 0xff, 0x76, + 0x1c, 0xff, 0x0f, 0x2b, 0xfe, 0x63, 0xbf, 0xb1, 0xff, 0x78, 0x2f, 0xb3, 0xc1, 0x7f, 0x7c, 0x0e, + 0xa5, 0xfa, 0x52, 0x26, 0xd7, 0x97, 0xef, 0xff, 0x23, 0xda, 0x8f, 0xe5, 0x75, 0x1c, 0xaa, 0xec, + 0x2d, 0x93, 0x63, 0x8d, 0xd7, 0xb1, 0x26, 0x84, 0xaf, 0x73, 0x4a, 0x5a, 0xe7, 0x23, 0xd8, 0x93, + 0x9f, 0x80, 0xdf, 0x58, 0x6e, 0x37, 0xcf, 0x3d, 0xd9, 0x00, 0xbe, 0xcf, 0x4a, 0x96, 0xfd, 0x37, + 0x81, 0xef, 0xeb, 0xca, 0x4d, 0xb5, 0xad, 0x28, 0x41, 0x0d, 0xf7, 0xa9, 0xc6, 0x93, 0x48, 0xd5, + 0xb8, 0x14, 0x21, 0x75, 0x17, 0x42, 0x8d, 0xc7, 0x96, 0xe9, 0x95, 0x18, 0xe2, 0x1a, 0x39, 0x00, + 0xfb, 0xdb, 0x03, 0x75, 0x60, 0x29, 0xc4, 0x7d, 0xe9, 0xcd, 0xa1, 0x2a, 0x4c, 0xe3, 0xfd, 0xe6, + 0xf9, 0xae, 0x5f, 0x61, 0x5b, 0x4c, 0x1c, 0x22, 0xd8, 0xa8, 0xbe, 0xa7, 0x81, 0xc7, 0xf4, 0xe5, + 0x50, 0x15, 0xce, 0x47, 0x5c, 0x3b, 0xee, 0x83, 0xf1, 0x39, 0xc8, 0x63, 0xec, 0x2f, 0xae, 0x7f, + 0xfd, 0x24, 0xa7, 0xc3, 0xfd, 0xdf, 0x5c, 0xf6, 0x84, 0xb9, 0x7b, 0xe6, 0xb4, 0x15, 0xbf, 0xf8, + 0xf2, 0xd8, 0xc1, 0x3d, 0xef, 0x1f, 0xfc, 0x74, 0xc9, 0x89, 0x7f, 0xa8, 0xbd, 0x9a, 0x79, 0xf5, + 0x81, 0xdd, 0x6b, 0x67, 0x7c, 0xef, 0xec, 0xb7, 0xf2, 0x5f, 0xda, 0xdc, 0x97, 0x74, 0x9e, 0x5b, + 0xf2, 0x58, 0xd6, 0x91, 0xf5, 0x15, 0xc5, 0x6f, 0x3c, 0x92, 0x72, 0x7f, 0xe0, 0x9b, 0x47, 0x7c, + 0xb7, 0xff, 0xf9, 0x77, 0x5d, 0x7b, 0x13, 0x2f, 0x6c, 0x0d, 0x5c, 0xdd, 0x7a, 0xfc, 0xb8, 0x73, + 0xeb, 0x27, 0x1b, 0xe6, 0x1c, 0xf9, 0xcb, 0xa9, 0xed, 0xc7, 0xd3, 0xdf, 0xed, 0x49, 0x29, 0xf6, + 0x4c, 0xfe, 0xd4, 0xd0, 0xb7, 0x2e, 0xd0, 0x78, 0x61, 0xff, 0x81, 0x07, 0x7f, 0xf3, 0xed, 0xc1, + 0x95, 0xcd, 0x4d, 0x77, 0x6f, 0x6e, 0x3f, 0x55, 0xb1, 0xef, 0xf4, 0x44, 0xe1, 0xc0, 0x5b, 0x6b, + 0x1e, 0x38, 0x7a, 0x4d, 0x33, 0x70, 0x6a, 0x4e, 0xf7, 0xde, 0xb3, 0x4d, 0xb6, 0x77, 0x12, 0xdb, + 0x4a, 0x4a, 0x72, 0xd6, 0xab, 0x5f, 0x9b, 0x58, 0xa3, 0xcf, 0x33, 0xde, 0x6c, 0x9f, 0xfc, 0xb5, + 0xec, 0xd4, 0x9a, 0xfb, 0x16, 0xf9, 0xd5, 0xe2, 0xbf, 0xa8, 0x97, 0xad, 0x34, 0xbe, 0x7d, 0xe2, + 0xd1, 0xf5, 0x93, 0x7d, 0xdf, 0xeb, 0xb9, 0x78, 0xb4, 0xf7, 0x9e, 0xd6, 0xb1, 0xfb, 0xbc, 0x4f, + 0xde, 0x73, 0x62, 0x57, 0x93, 0xeb, 0xad, 0xdc, 0x8b, 0xdf, 0xfb, 0x65, 0x71, 0xe2, 0x96, 0x73, + 0xeb, 0xab, 0xd2, 0xae, 0x7b, 0x77, 0x2e, 0xcb, 0x18, 0x75, 0x7c, 0x77, 0x6e, 0xb2, 0x6b, 0x5a, + 0xc1, 0xfc, 0x8e, 0xb9, 0x13, 0x0f, 0xfe, 0xf4, 0x40, 0xe5, 0x2b, 0x29, 0xf9, 0xb5, 0x8d, 0x7d, + 0xe7, 0x17, 0xdc, 0xfb, 0xce, 0xb6, 0x25, 0xd7, 0x3c, 0x46, 0xc7, 0x9f, 0xd7, 0x3e, 0x13, 0xf0, + 0xd8, 0xf6, 0x74, 0xe6, 0x74, 0x9e, 0x5e, 0x97, 0xcc, 0xbf, 0xf5, 0xd4, 0x7f, 0x0e, 0x1d, 0xd9, + 0x78, 0xd9, 0xb5, 0x70, 0xf7, 0x17, 0xbb, 0x06, 0x8f, 0xfc, 0x47, 0xe7, 0x8a, 0x53, 0xd7, 0x92, + 0x10, 0x94, 0x62, 0xdc, 0x92, 0x39, 0xf9, 0x39, 0x87, 0x69, 0xfb, 0x92, 0x42, 0x34, 0xaf, 0x4a, + 0x70, 0xba, 0x03, 0x48, 0x48, 0x96, 0x30, 0xda, 0x71, 0xc9, 0xb8, 0x53, 0x99, 0x31, 0xad, 0x22, + 0x50, 0x22, 0xee, 0x12, 0x24, 0x99, 0x9c, 0xb6, 0x10, 0x93, 0xc0, 0x27, 0xc8, 0x5d, 0x52, 0x68, + 0x7e, 0xec, 0x02, 0x49, 0x57, 0x42, 0x08, 0x29, 0xd8, 0x12, 0xd2, 0x2e, 0xf3, 0xa7, 0xbd, 0xc4, + 0xf0, 0x08, 0xe9, 0x95, 0x0a, 0x39, 0xe7, 0xc7, 0x0a, 0x39, 0x77, 0xa7, 0xb4, 0x16, 0xaf, 0xf0, + 0xa9, 0xaa, 0x7f, 0xa6, 0x90, 0x77, 0x9d, 0x56, 0xc8, 0x65, 0x0f, 0x2a, 0xa4, 0xeb, 0x61, 0x85, + 0xf4, 0x7c, 0x17, 0xae, 0x92, 0xe5, 0x5e, 0x4e, 0xbf, 0x00, 0x22, 0x21, 0x59, 0xc0, 0x15, 0x62, + 0x92, 0xd0, 0x45, 0x5f, 0xc2, 0xd5, 0x24, 0xd3, 0xc5, 0x89, 0x80, 0xcf, 0x95, 0xe9, 0xf1, 0xdf, + 0x02, 0x7a, 0x21, 0x4a, 0xbe, 0x02, 0x03, 0x4c, 0x8e, 0xb8, 0x0b, 0x88, 0x19, 0x28, 0x19, 0xb3, + 0xbb, 0xe9, 0x38, 0x09, 0xa9, 0x25, 0xe6, 0x45, 0xdc, 0x06, 0x80, 0x34, 0xb6, 0x40, 0x27, 0xd0, + 0x98, 0x44, 0x29, 0xc9, 0x99, 0xd0, 0xa5, 0x4a, 0xb3, 0x47, 0x0d, 0xf8, 0x7a, 0x11, 0x73, 0xd8, + 0x9d, 0x6e, 0x18, 0x63, 0x32, 0x4d, 0x9e, 0xc2, 0x64, 0xba, 0xdf, 0x01, 0x45, 0xf0, 0xf8, 0x9f, + 0x31, 0xd9, 0x12, 0x6c, 0x05, 0xf2, 0x36, 0x26, 0x03, 0xed, 0x5e, 0x20, 0xd3, 0xc0, 0xf5, 0x74, + 0x27, 0x10, 0xd8, 0x90, 0x74, 0x9f, 0x18, 0x40, 0xdc, 0x09, 0xac, 0x0f, 0x56, 0xc0, 0x88, 0x74, + 0xb9, 0x4d, 0xed, 0xd1, 0xca, 0x63, 0x2c, 0x23, 0x8d, 0x8b, 0xe4, 0x71, 0x01, 0x1d, 0x0b, 0xc4, + 0xde, 0x16, 0xee, 0x7e, 0x9e, 0xda, 0xdb, 0xb2, 0x41, 0xb1, 0xa6, 0x45, 0x42, 0x5d, 0x22, 0xd8, + 0xd8, 0xf2, 0x1b, 0x24, 0xaf, 0x6b, 0xff, 0x52, 0x5e, 0x6c, 0x09, 0x4c, 0xa9, 0xb0, 0x32, 0xd9, + 0xa7, 0x1e, 0xc9, 0xa7, 0xed, 0x3c, 0x15, 0xed, 0xb9, 0x3f, 0x44, 0xfe, 0x1e, 0x29, 0xa4, 0xe4, + 0x9e, 0xb4, 0xcc, 0x2e, 0x1c, 0x0f, 0x94, 0x21, 0xc1, 0x25, 0x34, 0xfd, 0xce, 0x90, 0xe4, 0xe4, + 0xb6, 0x39, 0x05, 0x84, 0x32, 0x25, 0xc6, 0x92, 0x0d, 0x04, 0xcc, 0x92, 0x79, 0xef, 0xe7, 0xe5, + 0x61, 0x3a, 0xc4, 0xe8, 0x0e, 0x6c, 0x4c, 0x7a, 0x0b, 0x25, 0x6c, 0x94, 0xb0, 0x53, 0x42, 0xa4, + 0x44, 0x2b, 0x25, 0xda, 0x28, 0xe1, 0xa0, 0x84, 0x93, 0x12, 0xcb, 0x08, 0x91, 0x1d, 0xa8, 0x20, + 0x14, 0x92, 0x46, 0x53, 0xc2, 0x46, 0x39, 0xed, 0x30, 0xc0, 0xc6, 0x09, 0xdd, 0x37, 0x1e, 0x19, + 0x49, 0xed, 0xfe, 0x08, 0xe7, 0x88, 0x94, 0x0a, 0xab, 0x04, 0x25, 0x35, 0x46, 0x3d, 0x15, 0x76, + 0xd4, 0xe6, 0x22, 0xea, 0xd9, 0x11, 0xe0, 0x18, 0xbd, 0x8d, 0x4c, 0x8d, 0xd9, 0x0b, 0x04, 0xd7, + 0x94, 0xfb, 0x63, 0xe8, 0x72, 0x7f, 0x86, 0x2f, 0xa7, 0xf1, 0xa5, 0x1f, 0x5f, 0x2e, 0x60, 0x1e, + 0x79, 0x7f, 0x82, 0x1c, 0xdc, 0x69, 0xc9, 0xfe, 0x04, 0x43, 0xfb, 0x13, 0x94, 0xc2, 0x09, 0xf6, + 0x77, 0x48, 0xe6, 0x8d, 0x5a, 0xca, 0x87, 0x16, 0xdc, 0xc9, 0xd3, 0x05, 0xcf, 0xc1, 0xe9, 0x1f, + 0xed, 0x25, 0xc3, 0xd1, 0x1b, 0x08, 0x31, 0xb6, 0x9b, 0xc7, 0x4e, 0x7c, 0x7b, 0x4d, 0xde, 0x6a, + 0x20, 0xf2, 0xdd, 0x4c, 0x59, 0xe0, 0xf6, 0x98, 0x41, 0x2c, 0xef, 0x21, 0x0c, 0xe7, 0x17, 0xf0, + 0xcc, 0xe4, 0x8b, 0x8f, 0xe2, 0x49, 0x13, 0xc0, 0x79, 0x55, 0xf8, 0x52, 0x0a, 0x97, 0x71, 0x78, + 0x26, 0xf7, 0x1e, 0xa0, 0x94, 0xb0, 0x6c, 0x97, 0xe4, 0xf2, 0xb1, 0xc7, 0x11, 0xe2, 0x7b, 0x4f, + 0x63, 0xf1, 0xb3, 0x00, 0xe7, 0xbd, 0x23, 0x50, 0xc9, 0x01, 0x81, 0x91, 0x64, 0xd4, 0x44, 0x06, + 0x3b, 0x22, 0xb8, 0xef, 0x2a, 0xc1, 0xbd, 0x37, 0x21, 0x2c, 0xb8, 0xa3, 0xf7, 0x12, 0x62, 0x2c, + 0x0e, 0xaf, 0xd0, 0x7d, 0x60, 0xcd, 0x58, 0x1c, 0x62, 0xbe, 0x7b, 0x61, 0x28, 0xca, 0x05, 0x17, + 0x08, 0x8f, 0xa2, 0xfe, 0x52, 0xb8, 0x1d, 0xab, 0x04, 0x76, 0x61, 0xad, 0xb4, 0xd0, 0x4b, 0x86, + 0x30, 0x7f, 0xae, 0x2b, 0xcb, 0xff, 0x09, 0x96, 0xcf, 0x94, 0xce, 0xf4, 0x4b, 0x17, 0x23, 0xb2, + 0x56, 0x19, 0xe6, 0x48, 0x67, 0xfb, 0xe5, 0x3f, 0x13, 0x83, 0x72, 0xa4, 0xf3, 0xfd, 0xf2, 0x6d, + 0xd9, 0xac, 0x1c, 0xe9, 0x88, 0xbf, 0x8c, 0xb5, 0x08, 0xdd, 0x3b, 0xd7, 0xe0, 0x9d, 0x7d, 0x19, + 0x1f, 0xb1, 0x6c, 0xe9, 0x98, 0xff, 0x90, 0xae, 0x19, 0xdb, 0x54, 0x39, 0x07, 0x31, 0xfb, 0xad, + 0x04, 0x92, 0x83, 0x1a, 0x72, 0x38, 0xcf, 0x4a, 0x87, 0x73, 0x41, 0x22, 0x2d, 0x38, 0x67, 0x43, + 0x05, 0x47, 0x22, 0xe5, 0x2a, 0xf3, 0x1e, 0x66, 0x90, 0xab, 0xcc, 0x7b, 0xb4, 0xca, 0xbc, 0x17, + 0xaa, 0x32, 0xe7, 0xa5, 0xe5, 0xe5, 0xfa, 0x97, 0x48, 0x16, 0x48, 0x87, 0x87, 0x5d, 0xac, 0xe5, + 0x62, 0xec, 0x70, 0x2c, 0x49, 0xa2, 0xe1, 0xb8, 0x18, 0x19, 0x0e, 0x65, 0xa8, 0x97, 0x86, 0x97, + 0xf0, 0x72, 0xe0, 0x7f, 0xc4, 0xc8, 0x91, 0xe3, 0x84, 0x63, 0x7c, 0x09, 0x1b, 0xc5, 0x77, 0x2f, + 0x96, 0x6d, 0xb8, 0x8c, 0xd7, 0xc9, 0xbf, 0x95, 0x80, 0x22, 0x1a, 0x77, 0xb5, 0x14, 0x16, 0xca, + 0x1b, 0x03, 0x9c, 0x79, 0xa9, 0x89, 0x24, 0x9f, 0xc6, 0x16, 0x49, 0x82, 0x8e, 0x5c, 0x23, 0xf4, + 0xb9, 0xb5, 0xf8, 0x62, 0x4e, 0x0c, 0x0b, 0x17, 0xce, 0x1f, 0x65, 0x70, 0x59, 0xaa, 0xf1, 0x85, + 0x74, 0xa8, 0xe0, 0x38, 0x9d, 0x62, 0x4b, 0xc8, 0xd1, 0x5e, 0x0e, 0x57, 0xfc, 0x8f, 0x9c, 0x78, + 0x15, 0x3e, 0x86, 0x39, 0xcb, 0x11, 0x97, 0xf6, 0x18, 0x06, 0x95, 0xb4, 0x57, 0xe1, 0x40, 0x14, + 0x61, 0x2a, 0xc1, 0x80, 0xef, 0x6a, 0xc9, 0xd8, 0x8d, 0x1d, 0x80, 0x15, 0xcb, 0x68, 0x62, 0xd9, + 0xb3, 0x30, 0x18, 0x8f, 0xc9, 0xa4, 0x23, 0x1c, 0x9e, 0x4c, 0x9e, 0x07, 0x97, 0x63, 0x12, 0x87, + 0x0c, 0x73, 0xfc, 0xbb, 0xf8, 0x3e, 0x7e, 0x50, 0xe1, 0x4b, 0xe1, 0x7f, 0x4b, 0x81, 0x09, 0x74, + 0x9d, 0x89, 0x94, 0x48, 0xae, 0x42, 0x5c, 0x26, 0x37, 0x3e, 0x2d, 0x5b, 0x23, 0xa4, 0xe5, 0xa5, + 0x65, 0x72, 0x59, 0x49, 0x19, 0xf0, 0x5c, 0xc4, 0x17, 0x23, 0x8d, 0xe6, 0x6e, 0x8d, 0x00, 0x37, + 0x6a, 0x81, 0x90, 0x90, 0x04, 0xaa, 0x09, 0x68, 0x5e, 0x36, 0x58, 0x36, 0x0a, 0x6e, 0xc2, 0x77, + 0x6a, 0xee, 0xd2, 0xe0, 0x41, 0x62, 0x36, 0x27, 0xa4, 0x69, 0x34, 0x78, 0xc8, 0xc1, 0x30, 0x29, + 0x55, 0x99, 0xab, 0xd1, 0xe0, 0xe7, 0x08, 0x6e, 0x5e, 0x36, 0xc6, 0x47, 0xe8, 0x41, 0xb4, 0x0c, + 0x10, 0xb5, 0x91, 0x93, 0x19, 0x26, 0xe6, 0xea, 0x24, 0x09, 0x4d, 0x02, 0xdc, 0xcc, 0xa9, 0xb6, + 0x94, 0x74, 0x58, 0x0c, 0x13, 0xa9, 0x21, 0xb6, 0x79, 0xd9, 0x32, 0x63, 0x5a, 0x42, 0xd8, 0xb2, + 0x70, 0xcb, 0x0f, 0x49, 0x65, 0x84, 0x98, 0xb1, 0x03, 0xa6, 0x31, 0x2f, 0x98, 0x73, 0xb1, 0x44, + 0x66, 0x48, 0x35, 0x0f, 0x4e, 0x65, 0x85, 0x14, 0xe0, 0x61, 0x76, 0x65, 0xc4, 0x6c, 0x4e, 0xd8, + 0x70, 0x0c, 0x6c, 0xdf, 0x77, 0xd6, 0x72, 0x28, 0x93, 0xab, 0x00, 0x35, 0xa3, 0x8c, 0xd0, 0x45, + 0x28, 0x1e, 0x9d, 0x80, 0x2a, 0x24, 0xa1, 0x31, 0x12, 0x01, 0xec, 0xb9, 0x95, 0x08, 0xb3, 0x8e, + 0xad, 0x24, 0xe3, 0xbc, 0x04, 0x69, 0x9c, 0x3f, 0x0e, 0x44, 0x9b, 0xb9, 0xfb, 0x47, 0x2f, 0xd6, + 0x3c, 0x20, 0x39, 0x31, 0x4e, 0x03, 0x03, 0xa8, 0x25, 0x95, 0x44, 0x81, 0x36, 0xdc, 0xcf, 0x88, + 0x35, 0x74, 0x46, 0x6e, 0x46, 0x6e, 0x9c, 0x39, 0x7d, 0x65, 0xc8, 0x13, 0x58, 0xac, 0x50, 0xb6, + 0x15, 0x12, 0x27, 0x84, 0xcf, 0xc8, 0x9d, 0x9e, 0x0b, 0x39, 0x81, 0xcf, 0xc9, 0x78, 0x82, 0x26, + 0x50, 0x74, 0x82, 0x11, 0x61, 0xc2, 0x9d, 0x86, 0x37, 0x75, 0x62, 0x68, 0x80, 0x25, 0xc3, 0x0e, + 0xcb, 0x2f, 0xe8, 0x2d, 0x16, 0x1e, 0x66, 0xe2, 0x34, 0xfa, 0xc1, 0x8b, 0x43, 0x4d, 0xec, 0xd4, + 0x15, 0xd2, 0x4f, 0x56, 0xb4, 0xb4, 0xd9, 0x09, 0x79, 0x2c, 0x04, 0xbd, 0x4b, 0xc8, 0x33, 0x21, + 0x88, 0x55, 0xe4, 0x20, 0x53, 0x5e, 0x85, 0x25, 0x6a, 0xad, 0x01, 0x32, 0x55, 0x4c, 0xef, 0x64, + 0xd1, 0x16, 0x4f, 0x22, 0x53, 0x9b, 0x42, 0x2c, 0x94, 0xdc, 0xa6, 0x40, 0xad, 0xf1, 0xa4, 0x02, + 0x0a, 0x4b, 0x13, 0x25, 0x4d, 0x2a, 0x0a, 0xd9, 0xe7, 0x13, 0xf2, 0x74, 0x08, 0x62, 0x15, 0x9d, + 0x21, 0x53, 0x42, 0x82, 0xb2, 0x3c, 0x25, 0x37, 0x2a, 0x90, 0xb8, 0x99, 0x90, 0xdb, 0x42, 0x50, + 0x3c, 0x45, 0x57, 0x94, 0xb5, 0x9a, 0x28, 0x19, 0x52, 0xd4, 0x1a, 0xad, 0x28, 0xca, 0xb5, 0x64, + 0x32, 0xe5, 0x57, 0x58, 0xbe, 0x11, 0x20, 0x64, 0x57, 0xc8, 0x48, 0x4a, 0x6e, 0x0d, 0x71, 0xb1, + 0x8a, 0xf6, 0x91, 0xa9, 0xf7, 0x43, 0x52, 0x94, 0xdc, 0x98, 0x18, 0xb2, 0x88, 0x90, 0xdb, 0x42, + 0x50, 0x3c, 0x45, 0xa7, 0x15, 0x45, 0x4d, 0x94, 0x7c, 0x4a, 0x91, 0xb2, 0x47, 0x2b, 0x8a, 0x0a, + 0xf6, 0x85, 0x28, 0xa9, 0x85, 0x54, 0x6a, 0x6b, 0x08, 0x8a, 0x5a, 0x9e, 0x4c, 0x9d, 0x0e, 0xb1, + 0x50, 0xf2, 0x86, 0x02, 0x89, 0x88, 0xbc, 0x02, 0x6d, 0x4b, 0x0a, 0x41, 0x71, 0x14, 0xfd, 0x5a, + 0x91, 0x6a, 0xa2, 0xe4, 0xf5, 0x30, 0xa3, 0xa3, 0x14, 0x45, 0xf9, 0x31, 0x19, 0xfe, 0xc9, 0xd9, + 0x96, 0x1c, 0xb9, 0x40, 0x12, 0xcb, 0x49, 0xf8, 0x49, 0x6a, 0xd6, 0x90, 0x7e, 0x21, 0xe9, 0xed, + 0xa4, 0xef, 0x24, 0xfd, 0x46, 0xe6, 0x2c, 0xec, 0x23, 0xfd, 0xeb, 0xa4, 0x3f, 0xcd, 0x3c, 0xc4, + 0xd1, 0x36, 0x97, 0xe0, 0xf3, 0x99, 0x53, 0xf1, 0xb7, 0xea, 0xbd, 0x41, 0xed, 0x23, 0x89, 0xdb, + 0xa9, 0x8a, 0xbd, 0x1e, 0xe5, 0x9b, 0xc4, 0xf0, 0x9d, 0x8c, 0xc3, 0x9f, 0x42, 0xe2, 0xe2, 0x20, + 0xfd, 0x46, 0xd2, 0x6f, 0x8e, 0x13, 0xaf, 0xeb, 0xf8, 0xe9, 0x01, 0x0d, 0x02, 0xa5, 0xe2, 0xbe, + 0x4c, 0x4b, 0x45, 0x1c, 0x27, 0x7d, 0xe4, 0xc7, 0xcf, 0xd9, 0x76, 0x9f, 0x73, 0xa5, 0xe8, 0xf3, + 0x97, 0xb9, 0xc5, 0x40, 0x59, 0x87, 0xd3, 0x27, 0xba, 0x44, 0xbf, 0xbf, 0x2c, 0xd8, 0x21, 0x56, + 0x55, 0x4f, 0x99, 0x52, 0x16, 0x74, 0x3b, 0xfd, 0x1e, 0x5b, 0x87, 0xcd, 0x5d, 0xe6, 0x75, 0x59, + 0x03, 0xad, 0x1e, 0x5f, 0x3b, 0x32, 0x96, 0x39, 0xdd, 0x36, 0x57, 0xd0, 0x2e, 0x96, 0x05, 0xad, + 0x5e, 0x67, 0x99, 0xd5, 0xdf, 0x6e, 0x68, 0x13, 0xdd, 0xa2, 0xcf, 0x69, 0x0b, 0x9b, 0x72, 0x39, + 0xdd, 0xc1, 0x4e, 0x18, 0x5b, 0x7d, 0x36, 0x07, 0x5c, 0xda, 0xab, 0x2b, 0x95, 0x29, 0x10, 0x40, + 0xa8, 0x83, 0xf9, 0x9d, 0xc9, 0x86, 0x4d, 0x81, 0x97, 0x6c, 0x83, 0xcb, 0x55, 0x5d, 0x69, 0x74, + 0xe0, 0x5c, 0xf0, 0x7a, 0xfc, 0xce, 0x4e, 0x4b, 0x60, 0x95, 0x57, 0xf4, 0xcb, 0x00, 0x25, 0xe1, + 0x09, 0xc2, 0x66, 0xb5, 0x39, 0x44, 0x3c, 0x86, 0x21, 0x44, 0xc8, 0xeb, 0x03, 0xd1, 0xe5, 0xf2, + 0xd4, 0x72, 0xd1, 0xe7, 0x16, 0x5d, 0x32, 0xed, 0x0f, 0xc0, 0x44, 0x9b, 0xcc, 0x03, 0x37, 0x66, + 0x65, 0xaf, 0x85, 0x12, 0x6e, 0x23, 0xbc, 0xd5, 0x0b, 0xf5, 0xf8, 0xf2, 0x12, 0x5c, 0xf8, 0x05, + 0xf8, 0x32, 0x0f, 0x5f, 0xf4, 0xf8, 0xb2, 0xbd, 0x78, 0x42, 0x7e, 0x71, 0x41, 0x61, 0x69, 0xb9, + 0xb6, 0x60, 0xbc, 0x36, 0x4f, 0x2b, 0xa4, 0x4f, 0xef, 0xc4, 0xac, 0x42, 0x87, 0x0e, 0x77, 0x65, + 0xf8, 0xa2, 0xc5, 0x97, 0x7b, 0xf0, 0xc5, 0xa0, 0x50, 0x05, 0xf8, 0x52, 0xa8, 0xcc, 0xea, 0x95, + 0x59, 0x89, 0x2a, 0x56, 0x2e, 0xc2, 0x4a, 0x9d, 0x90, 0xaa, 0xd3, 0xcb, 0x4d, 0x78, 0x48, 0x37, + 0x71, 0x5a, 0x61, 0xa1, 0x5e, 0xf8, 0x13, 0x3a, 0xac, 0x13, 0x32, 0x74, 0x7a, 0x6d, 0x9d, 0xaf, + 0xb0, 0x60, 0xbc, 0xb0, 0x40, 0x27, 0xbc, 0xb6, 0x06, 0x98, 0x84, 0xb7, 0x90, 0x4e, 0x98, 0xdd, + 0x28, 0xdc, 0xa9, 0x13, 0x0e, 0xaf, 0xd1, 0x8d, 0xd3, 0x17, 0x6a, 0x29, 0x12, 0xd4, 0x8d, 0x2b, + 0x2e, 0x28, 0xd2, 0x0b, 0x23, 0x74, 0x42, 0x40, 0x57, 0xa6, 0xd7, 0x4f, 0xd4, 0x97, 0x09, 0x1e, + 0xdd, 0xf8, 0x42, 0x4c, 0xe8, 0xb5, 0xda, 0xc2, 0x3b, 0xf4, 0x5a, 0x61, 0x94, 0x6e, 0x6a, 0x9d, + 0x56, 0xaf, 0xbf, 0x4b, 0xaf, 0x2d, 0xac, 0xdb, 0x20, 0x8c, 0x30, 0x82, 0x0b, 0x98, 0xbf, 0x53, + 0xa7, 0x2d, 0xd2, 0x16, 0xea, 0xf5, 0xe3, 0x8a, 0xf1, 0xfa, 0x85, 0x92, 0x21, 0xf5, 0x06, 0x3d, + 0x70, 0xd6, 0xe1, 0x26, 0x74, 0x4e, 0x9f, 0x04, 0x3c, 0x42, 0x8e, 0x4e, 0x98, 0xb5, 0x63, 0xbe, + 0x16, 0xf4, 0xa4, 0x4d, 0x27, 0x6a, 0xf0, 0x3f, 0xe1, 0x0e, 0xa3, 0x30, 0x7a, 0xfa, 0xdd, 0x05, + 0xba, 0xf2, 0x82, 0xf9, 0x52, 0x30, 0x1e, 0x54, 0x9c, 0x9c, 0x1c, 0x19, 0x02, 0xe9, 0x62, 0xc6, + 0x97, 0x79, 0x0a, 0xcb, 0xbc, 0x66, 0xe1, 0x81, 0xd3, 0xb2, 0xb0, 0xfe, 0xaf, 0x14, 0xde, 0x9e, + 0x38, 0x1d, 0x77, 0x89, 0x52, 0xf4, 0x9e, 0xa9, 0x10, 0x26, 0x1f, 0x5e, 0x3c, 0x25, 0x7f, 0x06, + 0xc4, 0x26, 0x5d, 0x27, 0xac, 0xd8, 0x21, 0xb4, 0xeb, 0xb4, 0xf7, 0x74, 0x4d, 0xad, 0x2b, 0x12, + 0x32, 0x1a, 0x8b, 0xea, 0x8a, 0xea, 0x04, 0x87, 0x51, 0xc8, 0x33, 0xf2, 0x2a, 0xc8, 0x72, 0x9f, + 0xd5, 0x6d, 0xf7, 0xb4, 0x23, 0xaf, 0xd5, 0xed, 0xb4, 0x59, 0x02, 0xce, 0x76, 0xd1, 0x13, 0x0c, + 0x20, 0x8b, 0x25, 0x58, 0x5d, 0x09, 0xc9, 0x61, 0x0d, 0x88, 0x28, 0x08, 0x99, 0x53, 0x5d, 0x69, + 0x09, 0x20, 0xbf, 0xf3, 0x21, 0x91, 0x74, 0x38, 0xb1, 0x10, 0xbc, 0x92, 0x4c, 0xa9, 0xaa, 0xb6, + 0x04, 0xbd, 0x76, 0xcc, 0x26, 0xba, 0x6d, 0xbe, 0x55, 0x5e, 0x98, 0xa6, 0x6c, 0x0e, 0x8f, 0x2f, + 0xa0, 0xc3, 0x5f, 0x85, 0x60, 0xda, 0x6a, 0xa1, 0xd3, 0x58, 0x5b, 0x0d, 0x4c, 0xdb, 0x3c, 0x6e, + 0xbf, 0xc7, 0x25, 0x5a, 0xe4, 0xc4, 0xc4, 0x0b, 0x4e, 0x9d, 0x02, 0x57, 0x39, 0x37, 0x2d, 0x54, + 0x89, 0x24, 0x6a, 0x17, 0x81, 0xb9, 0x35, 0x68, 0x73, 0x7a, 0xdc, 0xc8, 0xd1, 0x6e, 0xb5, 0x59, + 0xe4, 0x85, 0xa5, 0x49, 0xfc, 0x91, 0xc1, 0xe5, 0x71, 0xb7, 0xe9, 0xa4, 0x0b, 0x5e, 0x0d, 0x4e, + 0x21, 0x74, 0x62, 0x67, 0x80, 0xda, 0xd7, 0xea, 0x74, 0x5b, 0x5d, 0x48, 0x99, 0xb7, 0x63, 0xff, + 0x24, 0xbd, 0x21, 0xad, 0x41, 0xb7, 0xdf, 0xd9, 0xe6, 0x16, 0xed, 0x3a, 0x9b, 0xc3, 0xea, 0x43, + 0xed, 0x62, 0xbb, 0x0d, 0xde, 0x66, 0x1c, 0x56, 0xbf, 0x03, 0x85, 0xe3, 0x16, 0x8b, 0x53, 0x3a, + 0x55, 0x96, 0x56, 0x97, 0xb5, 0xcd, 0x1f, 0xb6, 0xac, 0x22, 0x8e, 0xf5, 0x63, 0x07, 0xa7, 0x4e, + 0x01, 0xdb, 0xe7, 0x2c, 0xb8, 0x5f, 0xd7, 0x50, 0x53, 0xab, 0xab, 0x32, 0x4e, 0x35, 0x56, 0xe8, + 0xa6, 0x94, 0x57, 0x54, 0x97, 0x57, 0x56, 0x4c, 0xd1, 0x19, 0xda, 0x5d, 0xce, 0x40, 0xc0, 0x25, + 0x1a, 0x44, 0xb7, 0xdd, 0x69, 0x75, 0xc3, 0x58, 0xaa, 0x0d, 0x56, 0x97, 0xc1, 0x27, 0xb6, 0xf9, + 0x0d, 0x1e, 0xb7, 0x6b, 0x15, 0x60, 0x5e, 0x1b, 0x0c, 0xa1, 0x9e, 0x40, 0xe1, 0x31, 0x00, 0xbf, + 0x34, 0xef, 0xf2, 0x58, 0xed, 0x7e, 0x98, 0xb3, 0xb5, 0x7b, 0xec, 0xa2, 0xab, 0xce, 0x65, 0xf5, + 0xb5, 0x89, 0x30, 0xc4, 0x05, 0xa4, 0x0e, 0x0a, 0xc8, 0xca, 0x1a, 0x83, 0x15, 0x0f, 0x5b, 0x9c, + 0x75, 0x2e, 0x6f, 0x75, 0xa5, 0xce, 0xd0, 0xa6, 0x33, 0xdc, 0x0b, 0xeb, 0xf9, 0x03, 0xf6, 0xba, + 0x36, 0x77, 0xb0, 0xb6, 0x5c, 0x67, 0x68, 0x75, 0x7b, 0x0c, 0xf8, 0xc4, 0xdb, 0x02, 0x06, 0xab, + 0xcb, 0x69, 0xf5, 0xc3, 0xd1, 0x97, 0x41, 0x9b, 0xa7, 0xbd, 0xdd, 0x03, 0xb6, 0xb4, 0x4a, 0xbb, + 0x66, 0xe8, 0xc0, 0xfe, 0xca, 0x33, 0x56, 0xff, 0x2a, 0xb7, 0xcd, 0xe1, 0xf3, 0xb8, 0x3d, 0x41, + 0xbf, 0x21, 0xe8, 0xee, 0x80, 0x8a, 0x64, 0x08, 0x58, 0x5b, 0xa0, 0x04, 0xca, 0xf3, 0x60, 0x89, + 0x18, 0x10, 0x0d, 0xee, 0xa0, 0xcb, 0x65, 0xf0, 0x7a, 0x70, 0xe4, 0x7d, 0x06, 0x88, 0x91, 0x6d, + 0x39, 0x9e, 0x87, 0x04, 0xb2, 0x2d, 0x37, 0x78, 0x7d, 0x9e, 0x80, 0x68, 0x0b, 0x78, 0x7c, 0x78, + 0x6d, 0x0f, 0x5d, 0xd2, 0xd3, 0xee, 0x0c, 0x18, 0x5a, 0x7d, 0xd6, 0x76, 0x91, 0xca, 0x11, 0xdc, + 0x0b, 0x49, 0x08, 0xbb, 0x6f, 0xf0, 0x3b, 0x5b, 0xa0, 0x46, 0xb6, 0x19, 0x6c, 0x56, 0x97, 0x8b, + 0x2c, 0xb6, 0xd2, 0xea, 0x33, 0x04, 0x7c, 0xa0, 0x13, 0xe3, 0x56, 0x3f, 0x8e, 0x7a, 0xbb, 0xe8, + 0x0e, 0xf8, 0x23, 0x3c, 0xf3, 0x40, 0xc1, 0x6c, 0x75, 0x79, 0x3a, 0x64, 0xb0, 0x5d, 0x84, 0x28, + 0x81, 0xb7, 0x2e, 0x03, 0xce, 0xb8, 0x80, 0x55, 0xe6, 0x96, 0xd1, 0x70, 0x44, 0x36, 0x55, 0xb2, + 0xbc, 0xce, 0xed, 0x01, 0x00, 0x4f, 0x8a, 0x3e, 0x08, 0xbf, 0x34, 0x23, 0x2b, 0xf3, 0x3a, 0x6d, + 0x3a, 0x83, 0xc1, 0x6b, 0x05, 0xab, 0x75, 0xa0, 0xd2, 0xd3, 0x01, 0x93, 0x1e, 0x9f, 0x68, 0xc0, + 0xe9, 0x64, 0x00, 0xbb, 0x44, 0x7f, 0x5d, 0x39, 0x8a, 0xc8, 0x86, 0x16, 0x67, 0x00, 0xa7, 0x28, + 0x49, 0x45, 0xfc, 0x21, 0x86, 0x90, 0xe0, 0x86, 0xdb, 0x2f, 0xdd, 0x2d, 0xe4, 0x83, 0x12, 0x21, + 0x25, 0xa5, 0x1b, 0x61, 0x74, 0xba, 0x9d, 0x81, 0xd0, 0xc1, 0x08, 0xe2, 0x84, 0x83, 0xe4, 0xb2, + 0x98, 0x3d, 0x1e, 0x97, 0x94, 0xc6, 0xa1, 0x39, 0x3a, 0x65, 0x09, 0xd6, 0xa0, 0xe8, 0xbc, 0x74, + 0x88, 0x9d, 0x16, 0xab, 0xdf, 0x86, 0xca, 0x1c, 0x9e, 0x76, 0xb1, 0xcc, 0x6e, 0x75, 0xba, 0x56, + 0xb5, 0x04, 0x9d, 0x2e, 0x7b, 0xd9, 0x32, 0xd1, 0x0d, 0xf1, 0xf4, 0x97, 0xd9, 0x20, 0xab, 0xc2, + 0x71, 0xa8, 0x0b, 0x3e, 0x8f, 0xd3, 0xbe, 0xa2, 0xcc, 0x51, 0x5d, 0x51, 0x8d, 0xa3, 0x00, 0x9b, + 0x0e, 0x77, 0x2d, 0x08, 0x91, 0x58, 0x26, 0xaf, 0x28, 0xdf, 0xc3, 0x0c, 0x95, 0xc6, 0x5a, 0xf6, + 0x6e, 0x65, 0x81, 0x4d, 0xb3, 0x05, 0x21, 0x7f, 0x45, 0x0a, 0x48, 0xa6, 0xc2, 0xd1, 0xf3, 0x06, + 0xc3, 0xbc, 0x21, 0xa7, 0xdc, 0x62, 0x91, 0x62, 0x6c, 0xb1, 0x39, 0x96, 0x5b, 0x5a, 0xc1, 0x00, + 0xe4, 0xc5, 0x13, 0xe8, 0x6f, 0xbc, 0xed, 0x96, 0x45, 0xdf, 0x31, 0x89, 0xcf, 0x50, 0xa2, 0xbc, + 0xa2, 0x0f, 0xa1, 0x39, 0x0d, 0x0d, 0x77, 0xea, 0x26, 0xcd, 0x87, 0x7a, 0xe0, 0xf3, 0xe8, 0x60, + 0x80, 0x8f, 0xa6, 0x01, 0x1f, 0x4c, 0x63, 0x79, 0x55, 0x09, 0x73, 0x4e, 0x51, 0x0a, 0xdc, 0x05, + 0x87, 0xa0, 0x71, 0x48, 0xd5, 0x59, 0x90, 0xa2, 0x45, 0x33, 0x99, 0xe7, 0x05, 0xfa, 0x92, 0x52, + 0x9f, 0x36, 0xc0, 0x6f, 0x9f, 0xbc, 0xe3, 0x0e, 0x73, 0xea, 0xb8, 0xd9, 0xcf, 0x96, 0x6e, 0x2a, + 0x79, 0x6e, 0xd2, 0xf3, 0x13, 0x5f, 0x98, 0xb0, 0x79, 0xfc, 0x96, 0x62, 0xde, 0xa9, 0xfe, 0xdd, + 0x6f, 0xff, 0xed, 0xbd, 0xf3, 0x67, 0xcf, 0xf5, 0xff, 0x1a, 0x14, 0xd4, 0xcb, 0xaf, 0x53, 0x39, + 0x8c, 0x1e, 0xfa, 0x85, 0x6f, 0x3a, 0x83, 0xd3, 0x0f, 0x71, 0xf5, 0x69, 0x07, 0xb8, 0xed, 0xa3, + 0x76, 0x8c, 0x9c, 0x99, 0x3a, 0xae, 0xfe, 0xb9, 0xac, 0xe7, 0x33, 0xcd, 0xcf, 0xe6, 0x6c, 0xca, + 0xe6, 0xbb, 0x40, 0x35, 0xd1, 0x6b, 0xd6, 0xc4, 0x94, 0xa7, 0x1f, 0xb7, 0xea, 0xd3, 0xba, 0xb8, + 0xed, 0x19, 0x3b, 0xd2, 0xeb, 0x41, 0xfe, 0xd9, 0xb4, 0x4d, 0xa9, 0xe6, 0xe7, 0x52, 0x9e, 0xd7, + 0xb8, 0x42, 0xe2, 0xc4, 0xac, 0x28, 0xf9, 0xeb, 0x8a, 0xfc, 0x46, 0x6e, 0x7b, 0xd6, 0x8e, 0x4c, + 0x49, 0x3e, 0x63, 0x53, 0xba, 0xf9, 0xb9, 0xb4, 0xe7, 0x53, 0x57, 0xfe, 0x2d, 0xf2, 0x4b, 0xb7, + 0xa7, 0xec, 0xd0, 0x48, 0xe2, 0xea, 0x4d, 0x23, 0xcc, 0xcf, 0x25, 0x3f, 0x9f, 0xb4, 0x30, 0x5a, + 0x1c, 0x21, 0xa3, 0x7f, 0x55, 0x3b, 0x24, 0x19, 0xf4, 0x01, 0x9f, 0xdc, 0x3b, 0x28, 0x85, 0x4b, + 0xa1, 0x51, 0xaa, 0xe9, 0x46, 0x29, 0x8f, 0x8c, 0x2d, 0x7e, 0x3f, 0xa0, 0x1e, 0x79, 0x20, 0xcd, + 0xda, 0xc5, 0x96, 0x60, 0x1b, 0x1c, 0x96, 0x56, 0x0f, 0x22, 0xb4, 0xb5, 0xa5, 0xc5, 0x27, 0xae, + 0xa4, 0x23, 0x97, 0xc7, 0x16, 0xc1, 0x09, 0x67, 0xd8, 0xdd, 0x26, 0xfa, 0xe9, 0x34, 0x1d, 0x85, + 0x71, 0x40, 0x72, 0x8b, 0x74, 0x1a, 0x0c, 0x41, 0x46, 0x5c, 0x24, 0xa1, 0xda, 0x20, 0xa3, 0x1b, + 0xea, 0x99, 0x11, 0xca, 0xbb, 0x5c, 0x1a, 0x22, 0x84, 0xa4, 0x82, 0x86, 0xfe, 0xbb, 0x86, 0xd3, + 0x46, 0x85, 0xae, 0x0e, 0xc5, 0x9a, 0x13, 0x62, 0xfe, 0x25, 0x09, 0xc6, 0x85, 0x38, 0x78, 0xf4, + 0xc3, 0x6f, 0xb6, 0xb2, 0x4a, 0x64, 0x1b, 0x85, 0xf0, 0xf3, 0x6d, 0x08, 0xa7, 0xf9, 0x3b, 0x91, + 0xf0, 0x9f, 0x61, 0x44, 0x28, 0x7e, 0x9e, 0xc1, 0xa9, 0xfe, 0x01, 0x06, 0x2f, 0x25, 0xfa, 0x29, + 0x4e, 0xf3, 0xda, 0x44, 0x70, 0xfa, 0xf6, 0x4c, 0xf3, 0x9a, 0xea, 0x3f, 0xcd, 0xb8, 0x40, 0xf5, + 0x9f, 0x61, 0xf0, 0xc5, 0x44, 0x0f, 0xc5, 0x69, 0x7e, 0x53, 0x3d, 0x3b, 0x99, 0xaf, 0x7b, 0x54, + 0xcf, 0x3e, 0x06, 0x6f, 0x23, 0x7a, 0x28, 0x4e, 0xf3, 0x54, 0xd1, 0x93, 0x18, 0x47, 0x0f, 0x83, + 0x2b, 0xfc, 0x31, 0xde, 0x27, 0x04, 0x94, 0x10, 0x85, 0xc9, 0xfc, 0xd1, 0x78, 0x40, 0xd2, 0x12, + 0x86, 0x87, 0xc5, 0x55, 0x40, 0x89, 0x51, 0xfc, 0x32, 0x9e, 0x1c, 0x07, 0x1f, 0x11, 0x07, 0x57, + 0xc7, 0xc1, 0x53, 0xe2, 0xe0, 0xa9, 0x71, 0xf0, 0xf4, 0x38, 0x78, 0x66, 0x14, 0x26, 0xfb, 0x9b, + 0x25, 0xff, 0x54, 0x13, 0xc5, 0x9f, 0x15, 0x47, 0x4f, 0x34, 0xf7, 0x4a, 0x84, 0x62, 0xea, 0x78, + 0x3c, 0x0e, 0xbe, 0x45, 0x5a, 0x35, 0xb4, 0x5f, 0x74, 0x7f, 0x8f, 0xc6, 0xe1, 0x3f, 0x05, 0xff, + 0x74, 0xb1, 0x8c, 0x89, 0xbe, 0x9d, 0x14, 0xc7, 0xb8, 0x7b, 0x17, 0xdb, 0x99, 0x87, 0x49, 0x23, + 0x3c, 0x1e, 0x04, 0x8c, 0xe5, 0xe1, 0x4f, 0xaa, 0x46, 0xe9, 0x41, 0x03, 0x1e, 0x83, 0xbc, 0xc6, + 0x0a, 0xf6, 0xd1, 0x33, 0xe2, 0xe1, 0x78, 0x79, 0xf4, 0xad, 0x30, 0x1c, 0x68, 0x0b, 0x5a, 0x7d, + 0xf6, 0xbf, 0xf2, 0x56, 0x4b, 0x1e, 0x62, 0xfd, 0x41, 0x77, 0xa7, 0xd3, 0xd2, 0x26, 0x06, 0x2c, + 0x70, 0xb7, 0x04, 0x25, 0x4e, 0xaf, 0x93, 0x7c, 0x59, 0xa0, 0x1f, 0xdb, 0xf2, 0x38, 0xf2, 0x8d, + 0x99, 0x34, 0xe5, 0xe3, 0x1b, 0x87, 0xbf, 0x22, 0x87, 0xda, 0xf9, 0x30, 0x7c, 0x64, 0x18, 0x4e, + 0xdf, 0xbf, 0x59, 0x3d, 0xca, 0xf7, 0x2f, 0x46, 0x0f, 0xfd, 0x1a, 0xc5, 0xf2, 0xd3, 0xf3, 0x1b, + 0xc5, 0x9f, 0x18, 0x87, 0x3f, 0x31, 0x36, 0xff, 0xf9, 0x30, 0xfe, 0x89, 0x61, 0xb8, 0x3d, 0x29, + 0x84, 0x4f, 0x08, 0xc3, 0x37, 0x87, 0xe1, 0x11, 0xfa, 0xe9, 0xa7, 0x18, 0x46, 0x3f, 0x3d, 0x91, + 0x3c, 0xfe, 0x29, 0x28, 0x0c, 0x4f, 0x09, 0xc3, 0x0b, 0xa0, 0x7f, 0x80, 0xc4, 0x2b, 0x93, 0xc1, + 0xff, 0x89, 0xc4, 0x65, 0x24, 0x83, 0x5f, 0x21, 0x25, 0x9e, 0xea, 0xc4, 0xeb, 0x86, 0x7f, 0x7a, + 0x29, 0x09, 0xe3, 0x1f, 0x17, 0x86, 0x4f, 0x63, 0xf4, 0x9c, 0x23, 0x7a, 0xee, 0x66, 0xf0, 0x0a, + 0x32, 0x9e, 0xc5, 0xe0, 0x9b, 0x08, 0x7f, 0x13, 0x83, 0x37, 0x11, 0x7c, 0x31, 0x83, 0x17, 0x10, + 0xbf, 0xbe, 0xc9, 0xe0, 0xbf, 0x24, 0xfc, 0xcb, 0x18, 0x5c, 0x45, 0xf8, 0x57, 0x30, 0x38, 0xd5, + 0xdb, 0xc9, 0xe0, 0x8f, 0x12, 0x3d, 0x8f, 0x30, 0xf8, 0x06, 0x32, 0x7e, 0x82, 0xc1, 0x4f, 0x90, + 0xf1, 0x33, 0x0c, 0x4e, 0xe3, 0xbb, 0x8d, 0xc1, 0x6b, 0x89, 0x3d, 0x3d, 0x0c, 0x7e, 0x9c, 0xac, + 0xfb, 0x43, 0x06, 0xff, 0x23, 0x19, 0xbf, 0xc2, 0xe0, 0x7b, 0x08, 0xff, 0x11, 0x06, 0xf7, 0x93, + 0xfd, 0x7d, 0x9b, 0xc1, 0x9f, 0x22, 0xe3, 0x73, 0x0c, 0xfe, 0x13, 0xa2, 0xe7, 0x7d, 0x06, 0x2f, + 0x25, 0xe3, 0x3f, 0x30, 0x38, 0xfd, 0x54, 0x79, 0x95, 0xc1, 0xe9, 0xdf, 0x21, 0xdf, 0x64, 0xf9, + 0x89, 0xbf, 0x49, 0x5c, 0x24, 0xae, 0x27, 0x7c, 0x59, 0x0c, 0x2e, 0x12, 0x7b, 0x0a, 0x18, 0xfc, + 0xa7, 0x04, 0x2f, 0x65, 0xf0, 0xc3, 0x44, 0x4f, 0x35, 0x83, 0x7f, 0x8b, 0xf0, 0x9b, 0x19, 0x3c, + 0x8f, 0xf0, 0x7b, 0x18, 0x7c, 0x0b, 0xe1, 0x7f, 0x9a, 0xc1, 0x3f, 0x23, 0xfc, 0xfb, 0x18, 0x9c, + 0xfe, 0xa4, 0xa0, 0xe5, 0x23, 0xf1, 0x3b, 0xa9, 0x3d, 0x0c, 0x4e, 0xed, 0xb7, 0x32, 0x38, 0xdd, + 0xef, 0x15, 0x0c, 0x7e, 0x86, 0xe0, 0x0f, 0x33, 0xf8, 0x26, 0xb2, 0xbf, 0x8f, 0x33, 0xb8, 0x8b, + 0xe0, 0x3b, 0x18, 0xdc, 0x4b, 0xd6, 0xdd, 0x4d, 0x7f, 0x35, 0x60, 0xce, 0xf5, 0x9b, 0x61, 0xfc, + 0x63, 0xc3, 0xf0, 0x77, 0xe2, 0xd8, 0xff, 0x6b, 0x86, 0x9f, 0xd6, 0xac, 0xe9, 0x42, 0x24, 0x3e, + 0x9b, 0xe0, 0x8d, 0x0c, 0x4e, 0xcf, 0xc9, 0x83, 0x42, 0xa4, 0x3d, 0xb4, 0xee, 0xff, 0x23, 0x83, + 0xd3, 0xe7, 0xb9, 0x2d, 0x8c, 0x9e, 0x1f, 0x13, 0x3d, 0x47, 0xc3, 0x70, 0x6c, 0xe7, 0x6f, 0x08, + 0x7e, 0x8e, 0xc1, 0x73, 0x89, 0x9e, 0xbf, 0x30, 0xfa, 0xe9, 0x73, 0xa1, 0x5a, 0x15, 0xa9, 0x9f, + 0xfe, 0x21, 0x56, 0x36, 0x83, 0x6b, 0x88, 0x9e, 0x52, 0x55, 0xa4, 0x1e, 0xfa, 0xbd, 0x7b, 0x4a, + 0x18, 0x7f, 0x3e, 0x0a, 0xb5, 0x39, 0x0c, 0x3f, 0xfd, 0x7e, 0x7d, 0x2f, 0xc3, 0xbf, 0x94, 0xf0, + 0x3b, 0xe3, 0xe0, 0x7e, 0x46, 0xcf, 0x52, 0x32, 0xde, 0xc0, 0xe0, 0xf4, 0x7b, 0xf5, 0x77, 0x19, + 0x3d, 0x34, 0xaf, 0x76, 0xc5, 0xc1, 0x5f, 0x66, 0xf4, 0xd0, 0x7d, 0x3d, 0xcc, 0xe0, 0xaf, 0x12, + 0xfc, 0x6d, 0x06, 0xa7, 0xf7, 0xdd, 0xf7, 0x19, 0x9c, 0x3e, 0x37, 0x7f, 0xce, 0xc4, 0x73, 0x11, + 0x89, 0xe7, 0x10, 0x83, 0x6f, 0x27, 0x78, 0x51, 0x42, 0x24, 0xfe, 0x07, 0x82, 0x4f, 0x0a, 0xbb, + 0x5f, 0x63, 0xfd, 0x2a, 0x32, 0xae, 0x62, 0x70, 0xfa, 0x3b, 0x92, 0x99, 0xc1, 0xe9, 0xaf, 0x51, + 0x0b, 0xc3, 0xf4, 0xe3, 0x3c, 0x69, 0x21, 0x71, 0xf8, 0x06, 0xc3, 0x4f, 0x9f, 0xd7, 0x57, 0x33, + 0xf6, 0x94, 0x91, 0x38, 0x77, 0x31, 0x7a, 0x68, 0x7d, 0x78, 0x82, 0xe1, 0xa7, 0xbf, 0x4f, 0xfc, + 0x2b, 0x83, 0x1f, 0x27, 0x78, 0x3f, 0xb3, 0x2e, 0xfd, 0xfd, 0x68, 0x80, 0xb5, 0x9f, 0x3c, 0x08, + 0xdc, 0x66, 0xd6, 0xdd, 0x4e, 0xd6, 0xcd, 0x4d, 0x8c, 0x6d, 0x8f, 0x85, 0xc1, 0x67, 0x93, 0xb8, + 0x3b, 0xc3, 0x9e, 0x67, 0x24, 0x7f, 0xc9, 0xf8, 0x89, 0x30, 0x7e, 0x6c, 0xe7, 0x17, 0xc4, 0xce, + 0x67, 0xe2, 0xe8, 0xdf, 0xc2, 0xf0, 0x9b, 0x48, 0x9e, 0xec, 0x60, 0xf8, 0x69, 0xfb, 0x01, 0x83, + 0xd3, 0xf7, 0xb6, 0x73, 0x8c, 0x3d, 0xf4, 0xf7, 0x94, 0xdf, 0x85, 0xf1, 0x4b, 0xe7, 0x8b, 0xe4, + 0xc3, 0xb5, 0x38, 0x78, 0x7a, 0x52, 0xa4, 0x9e, 0x45, 0x64, 0x9c, 0xcf, 0xe0, 0xf4, 0x77, 0x9a, + 0x3b, 0x18, 0xfc, 0x02, 0xd1, 0x5b, 0xc9, 0xe0, 0x9d, 0x64, 0x5c, 0xcf, 0xe0, 0xdf, 0x26, 0xe3, + 0x05, 0x0c, 0x4e, 0x7f, 0x5a, 0x5b, 0x1d, 0x86, 0x87, 0x3f, 0xc7, 0x7e, 0x27, 0x29, 0x32, 0x0e, + 0xf4, 0x3e, 0xf7, 0x7d, 0x06, 0xef, 0x20, 0xfc, 0x7d, 0x0c, 0x4e, 0x5f, 0x03, 0x8f, 0x33, 0xf8, + 0x45, 0x12, 0xff, 0x5f, 0x31, 0xf8, 0x05, 0xb2, 0xef, 0x1f, 0x33, 0xf8, 0x63, 0x04, 0xff, 0x63, + 0x1c, 0xfc, 0xdf, 0x19, 0x9c, 0xde, 0xbf, 0xaf, 0xc4, 0xc1, 0xc3, 0x9f, 0x57, 0xc7, 0x84, 0xf9, + 0x4b, 0xdf, 0x85, 0xd8, 0xfb, 0x51, 0x22, 0x17, 0x1b, 0xa7, 0xdf, 0xad, 0xb0, 0x1e, 0x7d, 0x18, + 0x4e, 0x75, 0xb2, 0xfc, 0x0f, 0xc6, 0xe1, 0x5f, 0xca, 0xf0, 0xd3, 0xfb, 0x4b, 0x20, 0x0e, 0x7f, + 0x27, 0xc3, 0x4f, 0xef, 0x17, 0xaf, 0xc6, 0xe1, 0x7f, 0x9d, 0xe1, 0xa7, 0x75, 0xef, 0x7a, 0x1c, + 0xfe, 0x1b, 0x0c, 0x3f, 0xad, 0x33, 0x95, 0x5c, 0x6c, 0xfe, 0x1a, 0x26, 0x3e, 0xec, 0x77, 0x81, + 0xbf, 0xb7, 0xe9, 0x90, 0x7c, 0x64, 0x58, 0x75, 0x26, 0xd2, 0xb3, 0xbf, 0xf3, 0xb2, 0x5f, 0x00, + 0xf0, 0x73, 0x95, 0x2a, 0x8c, 0x9f, 0xb6, 0xd3, 0xe4, 0x65, 0x87, 0xda, 0x3d, 0x92, 0xac, 0x43, + 0xe5, 0xe9, 0xfe, 0x4d, 0x20, 0x38, 0xfb, 0xa5, 0xe9, 0x62, 0x9c, 0xdf, 0x4b, 0x39, 0x66, 0x3c, + 0x99, 0xe8, 0xfc, 0x7b, 0xe5, 0x2b, 0x08, 0xc6, 0xfe, 0xdc, 0xac, 0xc8, 0x33, 0x02, 0xac, 0xff, + 0x77, 0xc7, 0xd0, 0x29, 0xc9, 0x13, 0xc6, 0x2f, 0x18, 0x3b, 0x58, 0xde, 0x5a, 0x14, 0x3b, 0x7e, + 0x68, 0x92, 0xdc, 0x1d, 0x20, 0x9f, 0x50, 0x70, 0xfc, 0x12, 0x51, 0x74, 0xfc, 0x1a, 0xe3, 0xac, + 0xff, 0x01, 0x39, 0x68, 0x19, 0xec, 0x1f, 0x43, 0x32, 0x7c, 0x8b, 0xe3, 0xc8, 0xff, 0x85, 0x7c, + 0x2a, 0xf9, 0x0e, 0xfb, 0xd7, 0x90, 0x0c, 0x9f, 0x23, 0x8e, 0x7c, 0xe7, 0x28, 0xb9, 0x67, 0xff, + 0x6f, 0x20, 0xcb, 0x6b, 0x43, 0xb1, 0xfd, 0x3f, 0x30, 0x25, 0x52, 0x1e, 0xfb, 0x8f, 0x43, 0xc1, + 0xfa, 0xdf, 0x11, 0x67, 0xfd, 0x7d, 0x74, 0x7d, 0x66, 0x92, 0xe5, 0x7d, 0x22, 0x8e, 0xfc, 0xf9, + 0xd1, 0x72, 0x7f, 0xe3, 0x2b, 0xe2, 0xb7, 0x1e, 0xc5, 0xb6, 0x7f, 0x60, 0x4a, 0xa4, 0x9d, 0xd8, + 0x7e, 0xfc, 0x75, 0x8b, 0xb5, 0xff, 0x79, 0xa2, 0x93, 0x8d, 0xd3, 0x19, 0xf2, 0x50, 0x7e, 0x89, + 0xf9, 0x1e, 0xc9, 0x31, 0x7d, 0x4f, 0x1c, 0xf9, 0xc3, 0x5a, 0xb9, 0x37, 0x32, 0x38, 0x2b, 0xdf, + 0x87, 0xe2, 0xe4, 0xaf, 0x36, 0x06, 0x18, 0x83, 0xf7, 0xe8, 0x57, 0xc8, 0x7b, 0xbf, 0xe2, 0xfc, + 0xe0, 0xf7, 0xb8, 0x58, 0xf1, 0xbb, 0x41, 0xe2, 0xa7, 0x0b, 0xab, 0x1f, 0x59, 0x28, 0x3a, 0x7e, + 0xf8, 0x3b, 0x47, 0xac, 0xaf, 0xd4, 0x8b, 0x49, 0xf1, 0x7c, 0x97, 0xc1, 0x59, 0x5b, 0x63, 0x9d, + 0x7d, 0xdc, 0x26, 0x91, 0x3f, 0xaf, 0x3c, 0x46, 0x94, 0xe3, 0x74, 0x2a, 0x8a, 0xb1, 0xfe, 0x88, + 0x38, 0xeb, 0x5f, 0x1c, 0x2f, 0xf7, 0xef, 0x33, 0x78, 0xac, 0x58, 0x0d, 0xb7, 0xe1, 0x36, 0xdc, + 0x86, 0xdb, 0x70, 0x1b, 0x6e, 0xc3, 0x6d, 0xb8, 0x0d, 0xb7, 0xe1, 0x36, 0xdc, 0x86, 0xdb, 0x70, + 0x1b, 0x6e, 0xc3, 0x6d, 0xb8, 0x0d, 0xb7, 0xe1, 0x36, 0xdc, 0xfe, 0x7f, 0xb7, 0xff, 0x02, 0xab, + 0xd3, 0x36, 0xbe, 0x00, 0x50, 0x00, 0x00 +}; + +int main(int argc, const char *argv[]) +{ + unsigned char *buf = wcn_bind_verify_lib; + ssize_t len = sizeof(wcn_bind_verify_lib); + + if (argv[1] != NULL && strcmp(argv[1], "clang") == 0) { + buf = wcn_bind_verify_bc; + len = sizeof(wcn_bind_verify_bc); + } + + while (len--) + printf("%c", *buf++); + + return 0; +} diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c old mode 100644 new mode 100755 index 220bac67ddd..58b9d290f23 --- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c @@ -92,7 +92,7 @@ struct gpio_config { }; #endif -#define WCN_FW_MAX_PATH_NUM 3 +#define WCN_FW_MAX_PATH_NUM 4 /* path of cp2 firmware. */ #ifdef CONFIG_CUSTOMIZE_UNISOC_FW_PATH #define UNISOC_FW_PATH_DEFAULT CONFIG_CUSTOMIZE_UNISOC_FW_PATH @@ -2318,7 +2316,7 @@ static int marlin_start_run(void) return ret; } -#if IS_ENABLED(CONFIG_AW_BIND_VERIFY) +//#if IS_ENABLED(CONFIG_AW_BIND_VERIFY) #include static void expand_seed(u8 *seed, u8 *out) @@ -2424,7 +2422,7 @@ static int marlin_bind_verify(void) return ret; } -#endif +//#endif static int check_cp_ready(void) { @@ -2449,7 +2447,7 @@ static int check_cp_ready(void) marlin_dev->sync_f.prj_type); if (marlin_dev->sync_f.init_status == SYNC_ALL_FINISHED) i = 0; -#if IS_ENABLED(CONFIG_AW_BIND_VERIFY) +//#ifdef CONFIG_AW_BIND_VERIFY else if (marlin_dev->sync_f.init_status == SYNC_VERIFY_WAITING) { ret = marlin_bind_verify(); @@ -2459,7 +2457,7 @@ static int check_cp_ready(void) return ret; } } -#endif +//#endif else msleep(20); if (i > 10) diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_misc.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_misc.c old mode 100644 new mode 100755 index 126746321ef..e7e48258c21 --- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_misc.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_misc.c @@ -18,7 +18,8 @@ #include #include #include -#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE +#include +#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE #include #endif @@ -130,13 +131,21 @@ static void wcn_gmtime(struct timespec64 *tv, struct wcn_tm *tm) /* AP notify BTWF time by at+aptime=... cmd */ long int wcn_ap_notify_btwf_time(void) { +#if KERNEL_VERSION(4, 20, 0) <= LINUX_VERSION_CODE struct timespec64 now; +#else + struct timespec now; +#endif struct wcn_tm tm; char aptime[64]; long int send_cnt = 0; /* get ap kernel time and transfer to China-BeiJing Time */ - ktime_get_coarse_real_ts64(&now); +#if KERNEL_VERSION(4, 20, 0) <= LINUX_VERSION_CODE + ktime_get_real_ts64(&now); +#else + now = current_kernel_time(); +#endif wcn_gmtime(&now, &tm); tm.tm_hour = (tm.tm_hour + WCN_BTWF_TIME_OFFSET) % 24; diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c old mode 100644 new mode 100755 index 77b4ec259e3..ce3f8d110ae --- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c @@ -94,12 +94,12 @@ void mdbg_assert_interface(char *str) stop_loopcheck(); #endif -#if (CONFIG_CP2_ASSERT) memset(mdbg_proc->assert.buf, 0, MDBG_ASSERT_SIZE); strncpy(mdbg_proc->assert.buf, str, len); WCN_INFO("mdbg_assert_interface:%s\n", (char *)(mdbg_proc->assert.buf)); +#if (CONFIG_CP2_ASSERT) sprdwcn_bus_set_carddump_status(true); #ifndef CONFIG_WCND /* wcn_hold_cpu(); */ @@ -113,8 +113,9 @@ void mdbg_assert_interface(char *str) #else WCN_ERR("%s,%s reset & notify...\n", __func__, str); marlin_reset_notify_call(MARLIN_CP2_STS_ASSERTED); + marlin_cp2_reset(); msleep(1000); - marlin_reset_notify_call(MARLIN_CP2_STS_READY); + // marlin_reset_notify_call(MARLIN_CP2_STS_READY); #endif } @@ -764,12 +761,6 @@ static ssize_t mdbg_proc_write(struct file *filp, return count; } - if (strncmp(mdbg_proc->write_buf, "startgps", 7) == 0) { - start_marlin(MARLIN_GNSS); - return count; - } - - /* unit of loglimitsize is MByte. */ if (strncmp(mdbg_proc->write_buf, "loglimitsize=", diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdio_v3.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdio_v3.c old mode 100644 new mode 100755 index 98f48335316..a37fe8c55d6 --- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdio_v3.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdio_v3.c @@ -128,9 +128,9 @@ static void sdio_remove_card(void) static void sdiohal_cp_allow_sleep(enum slp_subsys subsys) { #ifdef CONFIG_WCN_SLP -#ifdef CONFIG_CPLOG_DEBUG - sdiohal_info("%s entry\n", __func__); -#endif +//#ifdef CONFIG_CPLOG_DEBUG +// sdiohal_info("%s entry\n", __func__); +//#endif slp_mgr_drv_sleep(subsys, true); #endif } @@ -138,9 +138,9 @@ static void sdiohal_cp_allow_sleep(enum slp_subsys subsys) static void sdiohal_cp_sleep_wakeup(enum slp_subsys subsys) { #ifdef CONFIG_WCN_SLP -#ifdef CONFIG_CPLOG_DEBUG - sdiohal_info("%s entry\n", __func__); -#endif +//#ifdef CONFIG_CPLOG_DEBUG +// sdiohal_info("%s entry\n", __func__); +//#endif slp_mgr_drv_sleep(subsys, false); slp_mgr_wakeup(subsys); #endif diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h old mode 100644 new mode 100755 index c26bfb3251b..f87dfafe9c8 --- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h +++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h @@ -62,7 +62,7 @@ extern long int sdiohal_log_level; } while (0) #define sdiohal_pr_perf(fmt, args...) \ do { if (sdiohal_log_level & SDIOHAL_PERF_LEVEL) \ - trace_printk(fmt, ## args); \ + printk(fmt, ## args); \ } while (0) #else #define sdiohal_normal(fmt, args...) diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c old mode 100644 new mode 100755 index 0f67a7f35c3..a10b7909e95 --- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c @@ -48,9 +48,9 @@ extern void sdio_clk_always_on(int on); extern void sdio_set_max_reqsz(unsigned int size); #endif -//#ifdef CONFIG_RK_BOARD -//extern int rockchip_wifi_set_carddetect(int val); -//#endif +#ifdef CONFIG_RK_BOARD +extern int rockchip_wifi_set_carddetect(int val); +#endif #ifdef CONFIG_AW_BOARD extern int sunxi_wlan_get_bus_index(void); @@ -2090,9 +2090,10 @@ void sdiohal_remove_card(void) sdiohal_set_card_present(0); #endif -//#ifdef CONFIG_RK_BOARD -// rockchip_wifi_set_carddetect(0); -//#endif +#ifdef CONFIG_RK_BOARD + //rockchip_wifi_set_carddetect(0); + return ; +#endif #ifdef CONFIG_AW_BOARD // sunxi_mmc_rescan_card(wlan_bus_index); @@ -2192,9 +2193,9 @@ int sdiohal_scan_card(void) sdiohal_set_card_present(1); #endif -//#ifdef CONFIG_RK_BOARD -// rockchip_wifi_set_carddetect(1); -//#endif +#ifdef CONFIG_RK_BOARD + //rockchip_wifi_set_carddetect(1); +#endif #if 0 wlan_bus_index = sunxi_wlan_get_bus_index(); diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c old mode 100644 new mode 100755 index 2a64dac7af5..e968c09b233 --- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c @@ -205,7 +205,7 @@ int sdiohal_rx_thread(void *data) static int times_count; param.sched_priority = SDIO_RX_TASK_PRIO; - sched_set_fifo_low(current); + sched_setscheduler(current, SCHED_FIFO, ¶m); sdiohal_rx_adapt_set_dtbs(0); sdiohal_rx_adapt_set_pac_num(1); diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c old mode 100644 new mode 100755 index c0790f6cdd1..b3b000e951b --- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c @@ -141,7 +141,7 @@ int sdiohal_tx_thread(void *data) static int times_count; param.sched_priority = SDIO_TX_TASK_PRIO; - sched_set_fifo_low(current); + sched_setscheduler(current, SCHED_FIFO, ¶m); while (1) { /* Wait the semaphore */ diff --git a/drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_download.c b/drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_download.c old mode 100644 new mode 100755 index 6e95b0f3ce8..0c2664d876f --- a/drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_download.c +++ b/drivers/net/wireless/uwe5622/unisocwcn/usb/wcn_usb_download.c @@ -344,3 +340,7 @@ int wcn_usb_dinit(void) if (!this->download) wcn_usb_dp("%s create file[download] failed\n", __func__); + ddthis = this; + return 0; +} + diff --git a/drivers/net/wireless/uwe5622/unisocwifi/api_version.c b/drivers/net/wireless/uwe5622/unisocwifi/api_version.c old mode 100644 new mode 100755 index 91bcfee46fb..b677980115e --- a/drivers/net/wireless/uwe5622/unisocwifi/api_version.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/api_version.c @@ -449,11 +449,7 @@ int sprdwl_api_available_check(struct sprdwl_priv *priv, u8 drv_ver = 0, fw_ver = 0; u32 min_ver = 255; -#if defined(UWE5621_FTR) hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset); -#else - hdr = (struct sprdwl_cmd_hdr *)msg->skb->data; -#endif cmd_id = hdr->cmd_id; if (cmd_id == WIFI_CMD_SYNC_VERSION) return 0; diff --git a/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c b/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c old mode 100644 new mode 100755 index 53b5fd0ec29..f26113c08af --- a/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c @@ -1725,20 +1721,6 @@ static int sprdwl_cfg80211_sched_scan_stop(struct wiphy *wiphy, #ifdef SYNC_DISCONNECT void sprdwl_disconnect_handle(struct sprdwl_vif *vif) { - u16 reason_code = 0; - if ((vif->sm_state == SPRDWL_CONNECTED) || - (vif->sm_state == SPRDWL_DISCONNECTING)) { - cfg80211_disconnected(vif->ndev, reason_code, -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83) - NULL, 0, true, GFP_KERNEL); -#else - NULL, 0, GFP_KERNEL); -#endif - wl_ndev_log(L_DBG, vif->ndev, - "%s %s, reason_code %d\n", __func__, - vif->ssid, reason_code); - } - vif->sm_state = SPRDWL_DISCONNECTED; /* Clear bssid & ssid */ @@ -1784,19 +1766,17 @@ static int sprdwl_cfg80211_disconnect(struct wiphy *wiphy, goto out; } #ifdef SYNC_DISCONNECT +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 60) if (!sprdwl_sync_disconnect_event(vif, msecs_to_jiffies(1000))) { kt = ktime_get(); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) - msec = (u32)(div_u64(kt, NSEC_PER_MSEC)); -#else msec = (u32)(div_u64(kt.tv64, NSEC_PER_MSEC)); -#endif wl_err("Wait disconnect event timeout. [mstime = %d]\n", - cpu_to_le32(msec)); + cpu_to_le32(msec)); } else { sprdwl_disconnect_handle(vif); } atomic_set(&vif->sync_disconnect_event, 0); +#endif #endif trace_deauth_reason(vif->mode, reason_code, LOCAL_EVENT); out: @@ -2249,9 +2229,8 @@ void sprdwl_report_scan_result(struct sprdwl_vif *vif, u16 chan, s16 rssi, ie, ielen, signal, GFP_KERNEL); if (unlikely(!bss)) - ; - //wl_ndev_log(L_ERR, vif->ndev, - // "%s failed to inform bss frame!\n", __func__); + wl_ndev_log(L_ERR, vif->ndev, + "%s failed to inform bss frame!\n", __func__); cfg80211_put_bss(wiphy, bss); /*check log mac flag and call report fake probe*/ @@ -2382,11 +2361,10 @@ void sprdwl_report_connection(struct sprdwl_vif *vif, mgmt->bssid, tsf, capability, beacon_interval, ie, ielen, conn_info->signal, GFP_KERNEL); - if (unlikely(!bss)) - ; - //wl_ndev_log(L_ERR, vif->ndev, - // "%s failed to inform bss frame!\n", - // __func__); + //if (unlikely(!bss)) + // wl_ndev_log(L_ERR, vif->ndev, + // "%s failed to inform bss frame!\n", + // __func__); } else { wl_ndev_log(L_ERR, vif->ndev, "%s No Beason IE!\n", __func__); } @@ -2702,9 +2680,24 @@ static int sprdwl_cfg80211_mgmt_tx(struct wiphy *wiphy, /* send tx mgmt */ if (len > 0) { ret = sprdwl_tx_mgmt(vif->priv, vif->ctx_id, - ieee80211_frequency_to_channel - (chan->center_freq), dont_wait_for_ack, - wait, cookie, buf, len); + ieee80211_frequency_to_channel + (chan->center_freq), dont_wait_for_ack, + wait, cookie, buf, len); + + if (ret == 0 && len == 217 && (chan->center_freq == 2412 || chan->center_freq == 5200)) { + int type = ((*buf) & IEEE80211_FCTL_FTYPE) >> 2; + int subtype = ((*buf) & IEEE80211_FCTL_STYPE) >> 4; + int action = *(buf + MAC_LEN); + int action_subtype = *(buf + ACTION_SUBTYPE_OFFSET); + if (type == IEEE80211_FTYPE_MGMT && subtype == ACTION_TYPE && + action == PUB_ACTION && action_subtype == 1 && + buf[4] == 0x00 && buf[5] == 0x01 && buf[6] == 0x02 && + buf[7] == 0x03 && buf[8] == 0x04 && buf[9] == 0x05) { + printk("sprdwl: %s(%d), DPP Frame Received\n", __func__, __LINE__); + cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, 0, GFP_KERNEL); + } + } + if (ret) if (!dont_wait_for_ack) cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, @@ -3110,7 +3103,7 @@ static int sprdwl_cfg80211_set_mac_acl(struct wiphy *wiphy, unsigned char *mac_addr = NULL; if (!acl || !acl->n_acl_entries) { - //wl_ndev_log(L_ERR, ndev, "%s no ACL data\n", __func__); + wl_ndev_log(L_ERR, ndev, "%s no ACL data\n", __func__); return 0; } diff --git a/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c b/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c old mode 100644 new mode 100755 index 809e24ca700..42c394d22b9 --- a/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c @@ -400,7 +400,6 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv, struct sprdwl_cmd_hdr *hdr; u16 plen = sizeof(*hdr) + len; enum sprdwl_mode mode = SPRDWL_MODE_NONE;/*default to open new device*/ -#if defined(UWE5621_FTR) void *data = NULL; struct sprdwl_vif *vif; struct sprdwl_intf *intf = (struct sprdwl_intf *)(priv->hw_priv); @@ -424,14 +423,13 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv, if (cmd_id >= WIFI_CMD_OPEN) { vif = ctx_id_to_vif(priv, ctx_id); if (!vif) - ; - //wl_err("%s cant't get vif, ctx_id: %d\n", - // __func__, ctx_id); + wl_err("%s cant't get vif, ctx_id: %d\n", + __func__, ctx_id); else mode = vif->mode; sprdwl_put_vif(vif); } -#endif + msg = sprdwl_intf_get_msg_buf(priv, SPRDWL_TYPE_CMD, mode, ctx_id); if (!msg) { wl_err("%s, %d, getmsgbuf fail, mode=%d\n", @@ -439,7 +437,6 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv, return NULL; } -#if defined(UWE5621_FTR) data = kzalloc((plen + priv->hw_offset), flags); if (data) { hdr = (struct sprdwl_cmd_hdr *)(data + priv->hw_offset); @@ -456,25 +453,7 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv, sprdwl_intf_free_msg_buf(priv, msg); return NULL; } -#else - msg->skb = dev_alloc_skb(plen); - if (msg->skb) { - memset(msg->skb->data, 0, plen); - hdr = (struct sprdwl_cmd_hdr *)msg->skb->data; - hdr->common.type = SPRDWL_TYPE_CMD; - hdr->common.reserv = 0; - hdr->common.rsp = rsp; - hdr->common.ctx_id = ctx_id; - hdr->plen = cpu_to_le16(plen); - hdr->cmd_id = cmd_id; - sprdwl_fill_msg(msg, msg->skb, msg->skb->data, plen); - msg->data = hdr + 1; - } else { - wl_err("%s failed to allocate skb\n", __func__); - sprdwl_intf_free_msg_buf(priv, msg); - return NULL; - } -#endif + return msg; } @@ -488,11 +467,7 @@ static int sprdwl_cmd_send_to_ic(struct sprdwl_priv *priv, struct sprdwl_intf *intf = (struct sprdwl_intf *)(priv->hw_priv); struct sprdwl_tx_msg *tx_msg = (struct sprdwl_tx_msg *)intf->sprdwl_tx; -#if defined(UWE5621_FTR) hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset); -#else - hdr = (struct sprdwl_cmd_hdr *)msg->skb->data; -#endif /*TODO:consider common this if condition since * SPRDWL_HEAD_NORSP not used any more */ @@ -595,22 +570,15 @@ int sprdwl_cmd_send_recv(struct sprdwl_priv *priv, ret = sprdwl_api_available_check(priv, msg); if (ret || sprdwl_cmd_lock(cmd)) { sprdwl_intf_free_msg_buf(priv, msg); -#if defined(UWE5621_FTR) kfree(msg->tran_data); -#else - dev_kfree_skb(msg->skb); -#endif if (rlen) *rlen = 0; if (ret) wl_err("API check fail, return!!\n"); goto out; } -#if defined(UWE5621_FTR) + hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset); -#else - hdr = (struct sprdwl_cmd_hdr *)msg->skb->data; -#endif cmd_id = hdr->cmd_id; ctx_id = hdr->common.ctx_id; @@ -692,18 +660,11 @@ int sprdwl_cmd_send_recv_no_wait(struct sprdwl_priv *priv, if (sprdwl_cmd_lock(cmd)) { wl_err("%s, %d, error!\n", __func__, __LINE__); sprdwl_intf_free_msg_buf(priv, msg); -#if defined(UWE5621_FTR) kfree(msg->tran_data); -#else - dev_kfree_skb(msg->skb); -#endif goto out; } -#if defined(UWE5621_FTR) + hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset); -#else - hdr = (struct sprdwl_cmd_hdr *)msg->skb->data; -#endif cmd_id = hdr->cmd_id; ctx_id = hdr->common.ctx_id; @@ -724,7 +685,7 @@ int sprdwl_sync_version(struct sprdwl_priv *priv) struct sprdwl_cmd_api_t *drv_api = NULL; struct sprdwl_cmd_api_t *fw_api = NULL; u16 r_len = sizeof(*fw_api); - u8 r_buf[r_len]; + u8 r_buf[sizeof(*fw_api)]; int ret = 0; msg = sprdwl_cmd_getbuf(priv, sizeof(struct sprdwl_cmd_api_t), @@ -864,40 +825,28 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv) struct sprdwl_tlv_data *tlv; u16 r_len = sizeof(*p) + GET_INFO_TLV_RBUF_SIZE; u16 r_len_ori = r_len; - u8 r_buf[r_len]; -#ifdef COMPAT_SAMPILE_CODE + u8 r_buf[sizeof(*p) + GET_INFO_TLV_RBUF_SIZE]; u8 compat_ver = 0; -#endif unsigned int len_count = 0; bool b_tlv_data_chk = true; - u16 tlv_len; + u16 tlv_len = sizeof(struct ap_version_tlv_elmt); #ifdef WL_CONFIG_DEBUG u8 ap_version = NOTIFY_AP_VERSION_USER_DEBUG; #else u8 ap_version = NOTIFY_AP_VERSION_USER; #endif - u16 offset = 0; -#ifdef OTT_UWE - u8 bytes_allign = 1; -#define OTT_UWE_OFFSET_ENABLE 1 -#endif - u8 credit_via_data = 1; - tlv_len = sizeof(*tlv) + 1; #ifdef OTT_UWE - tlv_len += (sizeof(*tlv) + 1); +#define OTT_UWE_OFFSET_ENABLE 1 + tlv_len += 1; #endif - if (priv->hw_type == SPRDWL_HW_USB) - tlv_len += (sizeof(*tlv) + 1); - memset(r_buf, 0, r_len); msg = sprdwl_cmd_getbuf(priv, tlv_len, SPRDWL_MODE_NONE, SPRDWL_HEAD_RSP, WIFI_CMD_GET_INFO); if (!msg) return -ENOMEM; -#ifdef COMPAT_SAMPILE_CODE compat_ver = need_compat_operation(priv, WIFI_CMD_GET_INFO); if (compat_ver) { switch (compat_ver) { @@ -917,25 +866,16 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv) break; } } -#endif - /*to notify CP2 use more CP2 buffer*/ - sprdwl_set_tlv_elmt((u8 *)(msg->data + offset), NOTIFY_AP_VERSION, + sprdwl_set_tlv_elmt((u8 *)msg->data, NOTIFY_AP_VERSION, sizeof(ap_version), &ap_version); - offset += (sizeof(*tlv) + 1); + #ifdef OTT_UWE - /*to notify CP2 this is OTT version ,4bytes allign*/ - sprdwl_set_tlv_elmt((u8 *)(msg->data + offset), OTT_UWE_OFFSET_ENABLE, - sizeof(bytes_allign), &bytes_allign); - offset += (sizeof(*tlv) + 1); + tlv = (struct sprdwl_tlv_data *)msg->data; + tlv->type = OTT_UWE_OFFSET_ENABLE; + tlv->len = 1; + *((char *)tlv->data) = 1; #endif - if (priv->hw_type == SPRDWL_HW_USB) { - /*to notify CP2 data credit disable*/ - sprdwl_set_tlv_elmt((u8 *)(msg->data + offset), NOTIFY_CREDIT_VIA_RX_DATA, - sizeof(credit_via_data), &credit_via_data); - offset += (sizeof(*tlv) + 1); - } - ret = sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf, &r_len); if (!ret && r_len) { #if defined COMPAT_SAMPILE_CODE @@ -1598,16 +1538,12 @@ int sprdwl_set_qos_map(struct sprdwl_priv *priv, u8 vif_ctx_id, void *qos_map) if (!qos_map) return 0; msg = - sprdwl_cmd_getbuf(priv, sizeof(*p), vif_ctx_id, 1, - WIFI_CMD_SET_QOS_MAP); + sprdwl_cmd_getbuf(priv, sizeof(*p), vif_ctx_id, 1, + WIFI_CMD_SET_QOS_MAP); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprdwl_cmd_qos_map *)msg->data; -#else - p = (struct sprdwl_cmd_qos_map *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif memset((u8 *)p, 0, sizeof(*p)); memcpy((u8 *)p, qos_map, sizeof(*p)); memcpy(&g_11u_qos_map.qos_exceptions[0], &p->dscp_exception[0], @@ -1633,12 +1569,8 @@ int sprdwl_gscan_subcmd(struct sprdwl_priv *priv, u8 vif_ctx_id, if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = subcmd; if (data != NULL) { @@ -1661,12 +1593,8 @@ int sprdwl_set_gscan_config(struct sprdwl_priv *priv, u8 vif_ctx_id, vif_ctx_id, 1, WIFI_CMD_GSCAN); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_GSCAN_SUBCMD_SET_CONFIG; p->data_len = len; memcpy(p->data, data, len); @@ -1683,12 +1611,8 @@ int sprdwl_set_gscan_scan_config(struct sprdwl_priv *priv, u8 vif_ctx_id, vif_ctx_id, 1, WIFI_CMD_GSCAN); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *)(msg->skb->data + - sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_GSCAN_SUBCMD_SET_SCAN_CONFIG; p->data_len = len; memcpy(p->data, data, len); @@ -1705,12 +1629,8 @@ int sprdwl_enable_gscan(struct sprdwl_priv *priv, u8 vif_ctx_id, void *data, vif_ctx_id, 1, WIFI_CMD_GSCAN); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_GSCAN_SUBCMD_ENABLE_GSCAN; p->data_len = sizeof(int); memcpy(p->data, data, p->data_len); @@ -1727,12 +1647,8 @@ int sprdwl_get_gscan_capabilities(struct sprdwl_priv *priv, u8 vif_ctx_id, SPRDWL_HEAD_RSP, WIFI_CMD_GSCAN); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_GSCAN_SUBCMD_GET_CAPABILITIES; p->data_len = 0; @@ -1751,29 +1667,19 @@ int sprdwl_get_gscan_channel_list(struct sprdwl_priv *priv, u8 vif_ctx_id, if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_GSCAN_SUBCMD_GET_CHANNEL_LIST; p->data_len = sizeof(*band); -#if defined(UWE5621_FTR) band = (int *)(msg->data + sizeof(struct sprd_cmd_gscan_header)); -#else - band = (int *)(msg->skb->data + sizeof(struct sprdwl_cmd_hdr) + - sizeof(struct sprd_cmd_gscan_header)); -#endif - *band = *((int *)data); return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf, r_len); } int sprdwl_set_gscan_bssid_hotlist(struct sprdwl_priv *priv, u8 vif_ctx_id, - void *data, u16 len, u8 *r_buf, u16 *r_len) + void *data, u16 len, u8 *r_buf, u16 *r_len) { struct sprdwl_msg_buf *msg; struct sprd_cmd_gscan_header *p; @@ -1782,12 +1688,8 @@ int sprdwl_set_gscan_bssid_hotlist(struct sprdwl_priv *priv, u8 vif_ctx_id, vif_ctx_id, 1, WIFI_CMD_GSCAN); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_GSCAN_SUBCMD_SET_HOTLIST; p->data_len = len; memcpy(p->data, data, len); @@ -1804,19 +1706,15 @@ int sprdwl_set_gscan_bssid_blacklist(struct sprdwl_priv *priv, u8 vif_ctx_id, vif_ctx_id, 1, WIFI_CMD_GSCAN); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprd_cmd_gscan_header *)msg->data; -#else - p = (struct sprd_cmd_gscan_header *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif p->subcmd = SPRDWL_WIFI_SUBCMD_SET_BSSID_BLACKLIST; p->data_len = len; memcpy(p->data, data, len); return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf, r_len); } int sprdwl_add_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid, - const u8 *peer, u8 user_prio, u16 admitted_time) + const u8 *peer, u8 user_prio, u16 admitted_time) { struct sprdwl_msg_buf *msg; struct sprdwl_cmd_tx_ts *p; @@ -1828,12 +1726,8 @@ int sprdwl_add_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid, WIFI_CMD_ADD_TX_TS); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprdwl_cmd_tx_ts *)msg->data; -#else - p = (struct sprdwl_cmd_tx_ts *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif memset((u8 *)p, 0, sizeof(*p)); p->tsid = tsid; @@ -1859,12 +1753,8 @@ int sprdwl_del_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid, WIFI_CMD_DEL_TX_TS); if (!msg) return -ENOMEM; -#if defined(UWE5621_FTR) + p = (struct sprdwl_cmd_tx_ts *)msg->data; -#else - p = (struct sprdwl_cmd_tx_ts *) - (msg->skb->data + sizeof(struct sprdwl_cmd_hdr)); -#endif memset((u8 *)p, 0, sizeof(*p)); p->tsid = tsid; @@ -2023,37 +1913,19 @@ int sprdwl_set_roam_offload(struct sprdwl_priv *priv, u8 vif_ctx_id, int sprdwl_tdls_mgmt(struct sprdwl_vif *vif, struct sk_buff *skb) { -#ifndef UWE5621_FTR - struct sprdwl_msg_buf *msg; -#endif int ret; -#ifndef UWE5621_FTR - msg = sprdwl_intf_get_msg_buf(vif->priv, SPRDWL_TYPE_DATA, - SPRDWL_MODE_STATION, vif->ctx_id); - if (!msg) { - if (vif->priv->hw_type == SPRDWL_HW_SDIO_BA) - sprdwl_stop_net(vif); - vif->ndev->stats.tx_fifo_errors++; - wl_err("%s, %d, get msg bug failed\n", __func__, __LINE__); - return -NETDEV_TX_BUSY; - } -#endif /* temp debug use */ if (skb_headroom(skb) < vif->ndev->needed_headroom) wl_err("%s skb head len err:%d %d\n", - __func__, skb_headroom(skb), - vif->ndev->needed_headroom); -#ifdef UWE5621_FTR + __func__, skb_headroom(skb), + vif->ndev->needed_headroom); + /*send TDLS mgmt through cmd port instead of data port,needed by CP2*/ ret = sprdwl_send_tdlsdata_use_cmd(skb, vif, 1); -#else - /* sprdwl_send_data: offset use 2 for cp bytes align */ - ret = sprdwl_send_data(vif, msg, skb, 2, false); -#endif if (ret) { - //wl_err("%s drop msg due to TX Err\n", - // __func__); + wl_err("%s drop msg due to TX Err\n", + __func__); goto out; } @@ -2735,12 +2607,12 @@ unsigned short sprdwl_rx_rsp_process(struct sprdwl_priv *priv, u8 *msg) complete(&cmd->completed); } else { kfree(data); - //wl_err("%s ctx_id %d recv mismatched rsp[%s] status[%s]\n", - // __func__, hdr->common.ctx_id, - // cmd2str(hdr->cmd_id), - // err2str(hdr->status)); - //wl_err("%s mstime:[%u %u]\n", __func__, - // SPRDWL_GET_LE32(hdr->mstime), cmd->mstime); + wl_err("%s ctx_id %d recv mismatched rsp[%s] status[%s]\n", + __func__, hdr->common.ctx_id, + cmd2str(hdr->cmd_id), + err2str(hdr->status)); + wl_err("%s mstime:[%u %u]\n", __func__, + SPRDWL_GET_LE32(hdr->mstime), cmd->mstime); } spin_unlock_bh(&cmd->lock); atomic_dec(&cmd->refcnt); @@ -2789,11 +2661,11 @@ void sprdwl_event_scan_done(struct sprdwl_vif *vif, u8 *data, u16 len) default: sprdwl_scan_done(vif, true); sprdwl_sched_scan_done(vif, false); - //if (p->type == SPRDWL_SCAN_ERROR) - // wl_ndev_log(L_ERR, vif->ndev, "%s error!\n", __func__); - //else - // wl_ndev_log(L_ERR, vif->ndev, "%s invalid scan done type: %d\n", - // __func__, p->type); + if (p->type == SPRDWL_SCAN_ERROR) + wl_ndev_log(L_ERR, vif->ndev, "%s error!\n", __func__); + else + wl_ndev_log(L_ERR, vif->ndev, "%s invalid scan done type: %d\n", + __func__, p->type); break; } bss_count = 0; @@ -2897,16 +2769,19 @@ void sprdwl_event_disconnect(struct sprdwl_vif *vif, u8 *data, u16 len) u16 reason_code; memcpy(&reason_code, data, sizeof(reason_code)); - wl_info("%s reason code = %d\n", __func__, reason_code); #ifdef SYNC_DISCONNECT + /*Report disconnection on version > 4.9.60, even though disconnect + is from wpas, otherwise it returns -EALREADY on next connect.*/ +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 60) if (atomic_read(&vif->sync_disconnect_event)) { vif->disconnect_event_code = reason_code; atomic_set(&vif->sync_disconnect_event, 0); wake_up(&vif->disconnect_wq); + wl_err("%s reason code = %d\n", __func__, reason_code); } else #endif - sprdwl_report_disconnection(vif, reason_code); - +#endif + sprdwl_report_disconnection(vif, reason_code); } void sprdwl_event_mic_failure(struct sprdwl_vif *vif, u8 *data, u16 len) @@ -3600,11 +3471,9 @@ unsigned short sprdwl_rx_event_process(struct sprdwl_priv *priv, u8 *msg) sprdwl_event_nan(vif, data, len); break; #endif /* NAN_SUPPORT */ -#ifdef UWE5621_FTR case WIFI_EVENT_STA_LUT_INDEX: sprdwl_event_sta_lut(vif, data, len); break; -#endif case WIFI_EVENT_BA: sprdwl_event_ba_mgmt(vif, data, len); break; @@ -3724,14 +3593,14 @@ int sprdwl_sync_disconnect_event(struct sprdwl_vif *vif, unsigned int timeout) #endif int sprdwl_set_packet_offload(struct sprdwl_priv *priv, u8 vif_ctx_id, - u32 req, u8 enable, u32 interval, - u32 len, u8 *data) + u32 req, u8 enable, u32 interval, + u32 len, u8 *data) { struct sprdwl_msg_buf *msg; struct sprdwl_cmd_packet_offload *p; struct sprdwl_cmd_packet_offload *packet = NULL; u16 r_len = sizeof(*packet); - u8 r_buf[r_len]; + u8 r_buf[sizeof(*packet)]; msg = sprdwl_cmd_getbuf(priv, sizeof(*p) + len, vif_ctx_id, SPRDWL_HEAD_RSP, WIFI_CMD_PACKET_OFFLOAD); diff --git a/drivers/net/wireless/uwe5622/unisocwifi/intf.h b/drivers/net/wireless/uwe5622/unisocwifi/intf.h old mode 100644 new mode 100755 index c17356251e0..41b9bd5a3fe --- a/drivers/net/wireless/uwe5622/unisocwifi/intf.h +++ b/drivers/net/wireless/uwe5622/unisocwifi/intf.h @@ -24,35 +24,17 @@ struct sprdwl_priv; struct sprdwl_if_ops { struct sprdwl_msg_buf *(*get_msg_buf)(void *sdev, enum sprdwl_head_type type, -#if defined(UWE5621_FTR) enum sprdwl_mode mode, u8 ctx_id); -#else - enum sprdwl_mode mode); -#endif + void (*free_msg_buf)(void *sdev, struct sprdwl_msg_buf *msg); int (*tx)(void *spdev, struct sprdwl_msg_buf *msg); - -#if defined(UWE5621_FTR) void (*force_exit)(void *spdev); int (*is_exit)(void *spdev); -#else - void (*force_exit)(void); - int (*is_exit)(void); -#endif /* UWE5621_FTR */ int (*suspend)(struct sprdwl_priv *priv); int (*resume)(struct sprdwl_priv *priv); -#if defined(UWE5621_FTR) void (*debugfs)(void *spdev, struct dentry *dir); -#else - void (*debugfs)(struct dentry *dir); -#endif /* UWE5621_FTR */ - -#if defined(UWE5621_FTR) void (*tcp_drop_msg)(void *spdev, struct sprdwl_msg_buf *msg); -#else - void (*tcp_drop_msg)(struct sprdwl_msg_buf *msg); -#endif /* UWE5621_FTR*/ int (*ini_download_status)(void); }; diff --git a/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h b/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h old mode 100644 new mode 100755 index 3844b0b0676..c580b304026 --- a/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h +++ b/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h @@ -28,11 +28,7 @@ inline struct sprdwl_msg_buf *sprdwl_intf_get_msg_buf(struct sprdwl_priv *priv, enum sprdwl_mode mode, u8 ctx_id) { -#if defined(UWE5621_FTR) return priv->if_ops->get_msg_buf(priv->hw_priv, type, mode, ctx_id); -#else - return priv->if_ops->get_msg_buf(priv->hw_priv, type, mode); -#endif } static inline void sprdwl_intf_free_msg_buf(struct sprdwl_priv *priv, @@ -53,20 +49,12 @@ static inline int sprdwl_intf_tx(struct sprdwl_priv *priv, static inline void sprdwl_intf_force_exit(struct sprdwl_priv *priv) { -#if defined(UWE5621_FTR) priv->if_ops->force_exit(priv->hw_priv); -#else - priv->if_ops->force_exit(); -#endif } static inline int sprdwl_intf_is_exit(struct sprdwl_priv *priv) { -#if defined(UWE5621_FTR) return priv->if_ops->is_exit(priv->hw_priv); -#else - return priv->if_ops->is_exit(); -#endif } static inline int sprdwl_intf_suspend(struct sprdwl_priv *priv) @@ -88,25 +76,15 @@ static inline int sprdwl_intf_resume(struct sprdwl_priv *priv) static inline void sprdwl_intf_debugfs(struct sprdwl_priv *priv, struct dentry *dir) { -#if defined(UWE5621_FTR) if (priv->if_ops->debugfs) priv->if_ops->debugfs(priv->hw_priv, dir); -#else - if (priv->if_ops->debugfs) - priv->if_ops->debugfs(dir); -#endif /* UWE5621_FTR */ } static inline void sprdwl_intf_tcp_drop_msg(struct sprdwl_priv *priv, struct sprdwl_msg_buf *msg) { -#if defined(UWE5621_FTR) if (priv->if_ops->tcp_drop_msg) priv->if_ops->tcp_drop_msg(priv->hw_priv, msg); -#else - if (priv->if_ops->tcp_drop_msg) - priv->if_ops->tcp_drop_msg(msg); -#endif } static inline int sprdwl_get_ini_status(struct sprdwl_priv *priv) diff --git a/drivers/net/wireless/uwe5622/unisocwifi/main.c b/drivers/net/wireless/uwe5622/unisocwifi/main.c old mode 100644 new mode 100755 index 46b9039519c..f1d6d7285d8 --- a/drivers/net/wireless/uwe5622/unisocwifi/main.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/main.c @@ -994,9 +994,8 @@ static int sprdwl_inetaddr_event(struct notifier_block *this, if (entry->ctx_id == vif->ctx_id) entry->ip_acquired = 1; else - ; - //wl_err("ctx_id(%d) mismatch\n", - // entry->ctx_id); + wl_err("ctx_id(%d) mismatch\n", + entry->ctx_id); } else { wl_err("failed to find entry\n"); } @@ -1089,7 +1088,12 @@ static void sprdwl_set_mac_addr(struct sprdwl_vif *vif, u8 *pending_addr, if (is_valid_ether_addr(custom_mac)) { ether_addr_copy(addr, custom_mac); } else if (priv && is_valid_ether_addr(priv->mac_addr)) { - ether_addr_copy(addr, priv->mac_addr); + if (type == NL80211_IFTYPE_P2P_DEVICE) { + ether_addr_copy(addr, priv->mac_addr); + } else { + vif->ndev->addr_len = ETH_ALEN; + dev_addr_set(vif->ndev, priv->mac_addr); + } } else if (pending_addr && is_valid_ether_addr(pending_addr)) { ether_addr_copy(addr, pending_addr); } else if (priv && is_valid_ether_addr(priv->default_mac)) { diff --git a/drivers/net/wireless/uwe5622/unisocwifi/msg.c b/drivers/net/wireless/uwe5622/unisocwifi/msg.c old mode 100644 new mode 100755 index f71a6879615..47f78c4343b --- a/drivers/net/wireless/uwe5622/unisocwifi/msg.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/msg.c @@ -169,7 +169,6 @@ struct sprdwl_msg_buf *sprdwl_get_msgbuf_by_data(void *data, return find ? msg_buf : NULL; } -#if defined(UWE5621_FTR) struct sprdwl_msg_buf *sprdwl_get_tail_msg_buf(struct sprdwl_msg_list *list) { struct sprdwl_msg_buf *msg_buf = NULL; @@ -181,5 +180,4 @@ struct sprdwl_msg_buf *sprdwl_get_tail_msg_buf(struct sprdwl_msg_list *list) spin_unlock_bh(&list->busylock); return msg_buf; } -#endif diff --git a/drivers/net/wireless/uwe5622/unisocwifi/msg.h b/drivers/net/wireless/uwe5622/unisocwifi/msg.h old mode 100644 new mode 100755 index 67a4b474e74..dd57521ae70 --- a/drivers/net/wireless/uwe5622/unisocwifi/msg.h +++ b/drivers/net/wireless/uwe5622/unisocwifi/msg.h @@ -215,7 +215,5 @@ void sprdwl_dequeue_msg_buf(struct sprdwl_msg_buf *msg_buf, struct sprdwl_msg_list *list); struct sprdwl_msg_buf *sprdwl_get_msgbuf_by_data(void *data, struct sprdwl_msg_list *list); -#if defined(UWE5621_FTR) struct sprdwl_msg_buf *sprdwl_get_tail_msg_buf(struct sprdwl_msg_list *list); #endif -#endif diff --git a/drivers/net/wireless/uwe5622/unisocwifi/npi.c b/drivers/net/wireless/uwe5622/unisocwifi/npi.c old mode 100644 new mode 100755 index 90b333b701b..e165d2aa71a --- a/drivers/net/wireless/uwe5622/unisocwifi/npi.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/npi.c @@ -33,9 +33,6 @@ static struct genl_family sprdwl_nl_genl_family; static int sprdwl_get_flag(void) { struct file *fp = NULL; -#ifdef setfs - mm_segment_t fs; -#endif loff_t *pos; int flag = 0; char file_data[2]; @@ -46,18 +43,11 @@ static int sprdwl_get_flag(void) wl_err("open file:%s failed\n", SPRDWL_PSM_PATH); return PTR_ERR(fp); } -#ifdef setfs - fs = get_fs(); - set_fs(KERNEL_DS); -#endif pos = &fp->f_pos; kernel_read(fp, file_data, 1, pos); filp_close(fp, NULL); -#ifdef setfs - set_fs(fs); -#endif file_data[1] = 0; if (kstrtoull(file_data, 10, &tmp)) { @@ -268,6 +258,7 @@ static int sprdwl_nl_get_info_handler(struct sk_buff *skb_2, } static struct nla_policy sprdwl_genl_policy[SPRDWL_NL_ATTR_MAX + 1] = { + [SPRDWL_NL_ATTR_IFINDEX] = { .type = NLA_U32, }, [SPRDWL_NL_ATTR_AP2CP] = {.type = NLA_BINARY, .len = 1024}, [SPRDWL_NL_ATTR_CP2AP] = {.type = NLA_BINARY, .len = 1024} }; @@ -275,16 +266,10 @@ static struct nla_policy sprdwl_genl_policy[SPRDWL_NL_ATTR_MAX + 1] = { static struct genl_ops sprdwl_nl_ops[] = { { .cmd = SPRDWL_NL_CMD_NPI, -#if KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE - .policy = sprdwl_genl_policy, -#endif .doit = sprdwl_nl_npi_handler, }, { .cmd = SPRDWL_NL_CMD_GET_INFO, -#if KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE - .policy = sprdwl_genl_policy, -#endif .doit = sprdwl_nl_get_info_handler, } }; @@ -295,6 +280,7 @@ static struct genl_family sprdwl_nl_genl_family = { .name = "SPRDWL_NL", .version = 1, .maxattr = SPRDWL_NL_ATTR_MAX, + .policy = sprdwl_genl_policy, .pre_doit = sprdwl_npi_pre_doit, .post_doit = sprdwl_npi_post_doit, #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) diff --git a/drivers/net/wireless/uwe5622/unisocwifi/qos.c b/drivers/net/wireless/uwe5622/unisocwifi/qos.c old mode 100644 new mode 100755 index d0e42a882cb..7abcc0a02ee --- a/drivers/net/wireless/uwe5622/unisocwifi/qos.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/qos.c @@ -552,15 +552,9 @@ void wmm_ac_init(struct sprdwl_priv *priv) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) timer_setup(&priv->wmmac.wmmac_edcaf_timer, update_wmmac_edcaftime_timeout, 0); - timer_setup(&priv->wmmac.wmmac_vo_timer, update_wmmac_vo_timeout, 0); - timer_setup(&priv->wmmac.wmmac_vi_timer, update_wmmac_vi_timeout, 0); #else setup_timer(&priv->wmmac.wmmac_edcaf_timer, update_wmmac_edcaftime_timeout, - (unsigned long)priv); - setup_timer(&priv->wmmac.wmmac_vo_timer, update_wmmac_vo_timeout, - (unsigned long)priv); - setup_timer(&priv->wmmac.wmmac_vi_timer, update_wmmac_vi_timeout, - (unsigned long)priv); + (unsigned long)priv); #endif memset(&priv->wmmac.ac[0], 0, 4*sizeof(struct wmm_ac_params)); } @@ -576,12 +570,6 @@ void reset_wmmac_parameters(struct sprdwl_priv *priv) if (timer_pending(&priv->wmmac.wmmac_edcaf_timer)) del_timer_sync(&priv->wmmac.wmmac_edcaf_timer); - if (timer_pending(&priv->wmmac.wmmac_vo_timer)) - del_timer_sync(&priv->wmmac.wmmac_vo_timer); - - if (timer_pending(&priv->wmmac.wmmac_vi_timer)) - del_timer_sync(&priv->wmmac.wmmac_vi_timer); - memset(&priv->wmmac.ac[0], 0, 4*sizeof(struct wmm_ac_params)); } @@ -697,14 +685,6 @@ void update_admitted_time(struct sprdwl_priv *priv, u8 tsid, u16 medium_time, bo g_wmmac_admittedtime[ac] += (medium_time<<5); mod_timer(&priv->wmmac.wmmac_edcaf_timer, jiffies + WMMAC_EDCA_TIMEOUT_MS * HZ / 1000); - - /*replace the usedtime logic method with timer counter, just for simplify for the WFA certification*/ - if (ac == AC_VO) - mod_timer(&priv->wmmac.wmmac_vo_timer, - jiffies + usecs_to_jiffies(g_wmmac_admittedtime[ac] * WMMAC_TIME_RATIO)); - else if (ac == AC_VI) - mod_timer(&priv->wmmac.wmmac_vi_timer, - jiffies + usecs_to_jiffies(g_wmmac_admittedtime[ac] * WMMAC_TIME_RATIO)); } else { if (g_wmmac_admittedtime[ac] > (medium_time<<5)) g_wmmac_admittedtime[ac] -= (medium_time<<5); @@ -712,12 +692,6 @@ void update_admitted_time(struct sprdwl_priv *priv, u8 tsid, u16 medium_time, bo g_wmmac_admittedtime[ac] = 0; if (timer_pending(&priv->wmmac.wmmac_edcaf_timer)) del_timer_sync(&priv->wmmac.wmmac_edcaf_timer); - - if (timer_pending(&priv->wmmac.wmmac_vo_timer)) - del_timer_sync(&priv->wmmac.wmmac_vo_timer); - - if (timer_pending(&priv->wmmac.wmmac_vi_timer)) - del_timer_sync(&priv->wmmac.wmmac_vi_timer); } } @@ -738,38 +712,13 @@ void update_wmmac_edcaftime_timeout(unsigned long data) if (g_wmmac_admittedtime[AC_VO] > 0) { g_wmmac_usedtime[AC_VO] = 0; g_wmmac_available[AC_VO] = true; - mod_timer(&priv->wmmac.wmmac_vo_timer, - jiffies + usecs_to_jiffies(g_wmmac_admittedtime[AC_VO] * WMMAC_TIME_RATIO)); } if (g_wmmac_admittedtime[AC_VI] > 0) { g_wmmac_usedtime[AC_VI] = 0; g_wmmac_available[AC_VI] = true; - mod_timer(&priv->wmmac.wmmac_vi_timer, - jiffies + usecs_to_jiffies(g_wmmac_admittedtime[AC_VI] * WMMAC_TIME_RATIO)); } } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) -void update_wmmac_vo_timeout(struct timer_list *t) -#else -void update_wmmac_vo_timeout(unsigned long data) -#endif -{ - g_wmmac_usedtime[AC_VO] = g_wmmac_admittedtime[AC_VO]; - g_wmmac_available[AC_VO] = false; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) -void update_wmmac_vi_timeout(struct timer_list *t) -#else -void update_wmmac_vi_timeout(unsigned long data) -#endif -{ - g_wmmac_usedtime[AC_VI] = g_wmmac_admittedtime[AC_VI]; - g_wmmac_available[AC_VI] = false; - -} - /*change priority according to the g_wmmac_available value */ unsigned int change_priority_if(struct sprdwl_priv *priv, unsigned char *tid, unsigned char *tos, u16 len) { diff --git a/drivers/net/wireless/uwe5622/unisocwifi/qos.h b/drivers/net/wireless/uwe5622/unisocwifi/qos.h old mode 100644 new mode 100755 index 3d69d1c5730..06eeb5c8161 --- a/drivers/net/wireless/uwe5622/unisocwifi/qos.h +++ b/drivers/net/wireless/uwe5622/unisocwifi/qos.h @@ -237,13 +237,11 @@ u16 get_wmmac_admitted_time(u8 tsid); void reset_wmmac_parameters(struct sprdwl_priv *priv); #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) void update_wmmac_edcaftime_timeout(struct timer_list *t); -void update_wmmac_vo_timeout(struct timer_list *t); -void update_wmmac_vi_timeout(struct timer_list *t); #else void update_wmmac_edcaftime_timeout(unsigned long data); +#endif void update_wmmac_vo_timeout(unsigned long data); void update_wmmac_vi_timeout(unsigned long data); -#endif unsigned int change_priority_if(struct sprdwl_priv *priv, unsigned char *tid, unsigned char *tos, u16 len); const u8 *get_wmm_ie(u8 *res, u16 ie_len, u8 ie, uint oui, uint oui_type); #endif diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c b/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c old mode 100644 new mode 100755 index ca307f12ac9..a2f6cc394ce --- a/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c @@ -181,9 +181,9 @@ static struct nvm_name_table g_config_table[] = { CF_TAB("Chain0_149", tx_scale.chain0[34][0], 1), CF_TAB("Chain1_149", tx_scale.chain1[34][0], 1), CF_TAB("Chain0_153", tx_scale.chain0[35][0], 1), - CF_TAB("Chain1_153", tx_scale.chain1[35][0], 1), + CF_TAB("Chain1_153", tx_scale.chain0[35][0], 1), CF_TAB("Chain0_157", tx_scale.chain0[36][0], 1), - CF_TAB("Chain1_157", tx_scale.chain1[36][0], 1), + CF_TAB("Chain1_157", tx_scale.chain0[36][0], 1), CF_TAB("Chain0_161", tx_scale.chain0[37][0], 1), CF_TAB("Chain1_161", tx_scale.chain1[37][0], 1), CF_TAB("Chain0_165", tx_scale.chain0[38][0], 1), diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rfkill-bt.c b/drivers/net/wireless/uwe5622/unisocwifi/rfkill-bt.c new file mode 100644 index 00000000000..a3abdd850ff --- /dev/null +++ b/drivers/net/wireless/uwe5622/unisocwifi/rfkill-bt.c @@ -0,0 +1,825 @@ +/* + * Copyright (C) 2012 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ +/* Rock-chips rfkill driver for bluetooth + * +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_OF +#include +#include +#include +#endif + +#if 0 +#define DBG(x...) pr_info("[BT_RFKILL]: " x) +#else +#define DBG(x...) +#endif + +#define LOG(x...) pr_info("[BT_RFKILL]: " x) + +#define BT_WAKEUP_TIMEOUT 10000 +#define BT_IRQ_WAKELOCK_TIMEOUT (10 * 1000) + +#define BT_BLOCKED true +#define BT_UNBLOCK false +#define BT_SLEEP true +#define BT_WAKEUP false + +enum { + IOMUX_FNORMAL = 0, + IOMUX_FGPIO, + IOMUX_FMUX, +}; + +struct rfkill_rk_data { + struct rfkill_rk_platform_data *pdata; + struct platform_device *pdev; + struct rfkill *rfkill_dev; + struct wake_lock bt_irq_wl; + struct delayed_work bt_sleep_delay_work; + int irq_req; +}; + +static struct rfkill_rk_data *g_rfkill = NULL; + +static const char bt_name[] = +#if defined(CONFIG_BCM4330) +#if defined(CONFIG_BT_MODULE_NH660) + "nh660" +#else + "bcm4330" +#endif +#elif defined(CONFIG_RK903) +#if defined(CONFIG_RKWIFI_26M) + "rk903_26M" +#else + "rk903" +#endif +#elif defined(CONFIG_BCM4329) + "bcm4329" +#elif defined(CONFIG_MV8787) + "mv8787" +#elif defined(CONFIG_AP6210) +#if defined(CONFIG_RKWIFI_26M) + "ap6210" +#else + "ap6210_24M" +#endif +#elif defined(CONFIG_AP6330) + "ap6330" +#elif defined(CONFIG_AP6476) + "ap6476" +#elif defined(CONFIG_AP6493) + "ap6493" +#elif defined(CONFIG_AP6441) + "ap6441" +#elif defined(CONFIG_AP6335) + "ap6335" +#elif defined(CONFIG_GB86302I) + "gb86302i" +#else + "bt_default" +#endif + ; + +static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev) +{ + struct rfkill_rk_data *rfkill = dev; + + LOG("BT_WAKE_HOST IRQ fired\n"); + + DBG("BT IRQ wakeup, request %dms wakelock\n", BT_IRQ_WAKELOCK_TIMEOUT); + + wake_lock_timeout(&rfkill->bt_irq_wl, + msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT)); + + return IRQ_HANDLED; +} + +static int rfkill_rk_setup_gpio(struct platform_device *pdev, + struct rfkill_rk_gpio *gpio, const char *prefix, + const char *name) +{ + if (gpio_is_valid(gpio->io)) { + int ret = 0; + + sprintf(gpio->name, "%s_%s", prefix, name); + ret = devm_gpio_request(&pdev->dev, gpio->io, gpio->name); + if (ret) { + LOG("Failed to get %s gpio.\n", gpio->name); + return -1; + } + } + + return 0; +} + +static int rfkill_rk_setup_wake_irq(struct rfkill_rk_data *rfkill, int flag) +{ + int ret = 0; + struct rfkill_rk_irq *irq = &rfkill->pdata->wake_host_irq; + + if (!flag) { + rfkill->irq_req = 0; + ret = rfkill_rk_setup_gpio(rfkill->pdev, &irq->gpio, + rfkill->pdata->name, "wake_host"); + if (ret) + goto fail1; + } + if (gpio_is_valid(irq->gpio.io)) { + if (rfkill->irq_req) { + rfkill->irq_req = 0; + free_irq(irq->irq, rfkill); + } + LOG("Request irq for bt wakeup host\n"); + irq->irq = gpio_to_irq(irq->gpio.io); + sprintf(irq->name, "%s_irq", irq->gpio.name); + ret = request_irq(irq->irq, rfkill_rk_wake_host_irq, + (irq->gpio.enable == GPIO_ACTIVE_LOW) ? + IRQF_TRIGGER_FALLING : + IRQF_TRIGGER_RISING, + irq->name, rfkill); + if (ret) + goto fail2; + rfkill->irq_req = 1; + LOG("** disable irq\n"); + disable_irq(irq->irq); + ret = enable_irq_wake(irq->irq); + if (ret) + goto fail3; + } + + return ret; + +fail3: + free_irq(irq->irq, rfkill); +fail2: + gpio_free(irq->gpio.io); +fail1: + return ret; +} + +static inline void rfkill_rk_sleep_bt_internal(struct rfkill_rk_data *rfkill, + bool sleep) +{ + struct rfkill_rk_gpio *wake = &rfkill->pdata->wake_gpio; + + DBG("*** bt sleep: %d ***\n", sleep); +#ifndef CONFIG_BK3515A_COMBO + gpio_direction_output(wake->io, sleep ? !wake->enable : wake->enable); +#else + if (!sleep) { + DBG("HOST_UART0_TX pull down 10us\n"); + if (rfkill_rk_setup_gpio(rfkill->pdev, wake, + rfkill->pdata->name, "wake") != 0) { + return; + } + + gpio_direction_output(wake->io, wake->enable); + usleep_range(10, 20); + gpio_direction_output(wake->io, !wake->enable); + + gpio_free(wake->io); + } +#endif +} + +static void rfkill_rk_delay_sleep_bt(struct work_struct *work) +{ + struct rfkill_rk_data *rfkill = NULL; + + DBG("Enter %s\n", __func__); + + rfkill = container_of(work, struct rfkill_rk_data, + bt_sleep_delay_work.work); + + rfkill_rk_sleep_bt_internal(rfkill, BT_SLEEP); +} + +void rfkill_rk_sleep_bt(bool sleep) +{ + struct rfkill_rk_data *rfkill = g_rfkill; + struct rfkill_rk_gpio *wake; + bool ret; + + DBG("Enter %s\n", __func__); + + if (!rfkill) { + LOG("*** RFKILL is empty???\n"); + return; + } + + wake = &rfkill->pdata->wake_gpio; + if (!gpio_is_valid(wake->io)) { + DBG("*** Not support bt wakeup and sleep\n"); + return; + } + + ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); + + rfkill_rk_sleep_bt_internal(rfkill, sleep); + +#ifdef CONFIG_BT_AUTOSLEEP + if (sleep == BT_WAKEUP) { + schedule_delayed_work(&rfkill->bt_sleep_delay_work, + msecs_to_jiffies(BT_WAKEUP_TIMEOUT)); + } +#endif +} +EXPORT_SYMBOL(rfkill_rk_sleep_bt); + +static int bt_power_state = 0; +int rfkill_get_bt_power_state(int *power, bool *toggle) +{ + struct rfkill_rk_data *mrfkill = g_rfkill; + + if (!mrfkill) { + LOG("%s: rfkill-bt driver has not Successful initialized\n", + __func__); + return -1; + } + + *toggle = mrfkill->pdata->power_toggle; + *power = bt_power_state; + + return 0; +} + +static int rfkill_rk_set_power(void *data, bool blocked) +{ + struct rfkill_rk_data *rfkill = data; + struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; + struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio; + struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio; + struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio; + struct pinctrl *pinctrl = rfkill->pdata->pinctrl; + int wifi_power = 0; + bool toggle = false; + + DBG("Enter %s\n", __func__); + + DBG("Set blocked:%d\n", blocked); + + toggle = rfkill->pdata->power_toggle; + + if (toggle) { + if (rfkill_get_wifi_power_state(&wifi_power)) { + LOG("%s: cannot get wifi power state!\n", __func__); + return -1; + } + } + + DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false"); + + if (!blocked) { + if (toggle) { + rfkill_set_wifi_bt_power(1); + msleep(100); + } + + rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup + + if (gpio_is_valid(wake_host->io)) { + LOG("%s: set bt wake_host high!\n", __func__); + gpio_direction_output(wake_host->io, 1); + msleep(20); + } + + if (gpio_is_valid(poweron->io)) { + if (gpio_get_value(poweron->io) == !poweron->enable) { + gpio_direction_output(poweron->io, + !poweron->enable); + msleep(20); + gpio_direction_output(poweron->io, + poweron->enable); + msleep(20); + if (gpio_is_valid(wake_host->io)) + gpio_direction_input(wake_host->io); + } + } + + if (gpio_is_valid(reset->io)) { + if (gpio_get_value(reset->io) == !reset->enable) { + gpio_direction_output(reset->io, + !reset->enable); + msleep(20); + gpio_direction_output(reset->io, reset->enable); + } + } + + if (pinctrl && gpio_is_valid(rts->io)) { + pinctrl_select_state(pinctrl, rts->gpio_state); + LOG("ENABLE UART_RTS\n"); + gpio_direction_output(rts->io, rts->enable); + msleep(100); + LOG("DISABLE UART_RTS\n"); + gpio_direction_output(rts->io, !rts->enable); + pinctrl_select_state(pinctrl, rts->default_state); + } + + bt_power_state = 1; + LOG("bt turn on power\n"); + rfkill_rk_setup_wake_irq(rfkill, 1); + } else { + if (gpio_is_valid(poweron->io)) { + if (gpio_get_value(poweron->io) == poweron->enable) { + gpio_direction_output(poweron->io, + !poweron->enable); + msleep(20); + } + } + + bt_power_state = 0; + LOG("bt shut off power\n"); + if (gpio_is_valid(reset->io)) { + if (gpio_get_value(reset->io) == reset->enable) { + gpio_direction_output(reset->io, + !reset->enable); + msleep(20); + } + } + if (toggle) { + if (!wifi_power) { + LOG("%s: bt will set vbat to low\n", __func__); + rfkill_set_wifi_bt_power(0); + } else { + LOG("%s: bt shouldn't control the vbat\n", __func__); + } + } + } + + return 0; +} + +static int rfkill_rk_pm_prepare(struct device *dev) +{ + struct rfkill_rk_data *rfkill = g_rfkill; + struct rfkill_rk_gpio *rts; + struct rfkill_rk_irq *wake_host_irq; + struct pinctrl *pinctrl = rfkill->pdata->pinctrl; + + DBG("Enter %s\n", __func__); + + if (!rfkill) + return 0; + + rts = &rfkill->pdata->rts_gpio; + wake_host_irq = &rfkill->pdata->wake_host_irq; + + //To prevent uart to receive bt data when suspended + if (pinctrl && gpio_is_valid(rts->io)) { + DBG("Disable UART_RTS\n"); + pinctrl_select_state(pinctrl, rts->gpio_state); + gpio_direction_output(rts->io, !rts->enable); + } + +#ifdef CONFIG_BT_AUTOSLEEP + rfkill_rk_sleep_bt(BT_SLEEP); +#endif + + // enable bt wakeup host + if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { + DBG("enable irq for bt wakeup host\n"); + enable_irq(wake_host_irq->irq); + } + +#ifdef CONFIG_RFKILL_RESET + rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); + rfkill_rk_set_power(rfkill, BT_BLOCKED); +#endif + + return 0; +} + +static void rfkill_rk_pm_complete(struct device *dev) +{ + struct rfkill_rk_data *rfkill = g_rfkill; + struct rfkill_rk_irq *wake_host_irq; + struct rfkill_rk_gpio *rts; + struct pinctrl *pinctrl = rfkill->pdata->pinctrl; + + DBG("Enter %s\n", __func__); + + if (!rfkill) + return; + + wake_host_irq = &rfkill->pdata->wake_host_irq; + rts = &rfkill->pdata->rts_gpio; + + if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { + LOG("** disable irq\n"); + disable_irq(wake_host_irq->irq); + } + + if (pinctrl && gpio_is_valid(rts->io)) { + DBG("Enable UART_RTS\n"); + gpio_direction_output(rts->io, rts->enable); + pinctrl_select_state(pinctrl, rts->default_state); + } +} + +static const struct rfkill_ops rfkill_rk_ops = { + .set_block = rfkill_rk_set_power, +}; + +#define PROC_DIR "bluetooth/sleep" + +static struct proc_dir_entry *bluetooth_dir, *sleep_dir; + +static ssize_t bluesleep_read_proc_lpm(struct file *file, char __user *buffer, + size_t count, loff_t *data) +{ + return sprintf(buffer, "unsupported to read\n"); +} + +static ssize_t bluesleep_write_proc_lpm(struct file *file, + const char __user *buffer, size_t count, + loff_t *data) +{ + return count; +} + +static ssize_t bluesleep_read_proc_btwrite(struct file *file, + char __user *buffer, size_t count, + loff_t *data) +{ + return sprintf(buffer, "unsupported to read\n"); +} + +static ssize_t bluesleep_write_proc_btwrite(struct file *file, + const char __user *buffer, + size_t count, loff_t *data) +{ + char b; + + if (count < 1) + return -EINVAL; + + if (copy_from_user(&b, buffer, 1)) + return -EFAULT; + + DBG("btwrite %c\n", b); + /* HCI_DEV_WRITE */ + if (b != '0') + rfkill_rk_sleep_bt(BT_WAKEUP); + else + rfkill_rk_sleep_bt(BT_SLEEP); + + return count; +} + +#ifdef CONFIG_OF +static int bluetooth_platdata_parse_dt(struct device *dev, + struct rfkill_rk_platform_data *data) +{ + struct device_node *node = dev->of_node; + int gpio; + enum of_gpio_flags flags; + + if (!node) + return -ENODEV; + + memset(data, 0, sizeof(*data)); + + if (of_find_property(node, "wifi-bt-power-toggle", NULL)) { + data->power_toggle = true; + LOG("%s: get property wifi-bt-power-toggle.\n", __func__); + } else { + data->power_toggle = false; + } + + gpio = of_get_named_gpio_flags(node, "uart_rts_gpios", 0, &flags); + if (gpio_is_valid(gpio)) { + data->rts_gpio.io = gpio; + data->rts_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: get property: uart_rts_gpios = %d.\n", __func__, gpio); + data->pinctrl = devm_pinctrl_get(dev); + if (!IS_ERR(data->pinctrl)) { + data->rts_gpio.default_state = + pinctrl_lookup_state(data->pinctrl, "default"); + data->rts_gpio.gpio_state = + pinctrl_lookup_state(data->pinctrl, "rts_gpio"); + } else { + data->pinctrl = NULL; + LOG("%s: dts does't define the uart rts iomux.\n", + __func__); + return -EINVAL; + } + } else { + data->pinctrl = NULL; + data->rts_gpio.io = -EINVAL; + LOG("%s: uart_rts_gpios is no-in-use.\n", __func__); + } + + gpio = of_get_named_gpio_flags(node, "BT,power_gpio", 0, &flags); + if (gpio_is_valid(gpio)) { + data->poweron_gpio.io = gpio; + data->poweron_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: get property: BT,power_gpio = %d.\n", __func__, gpio); + } else { + data->poweron_gpio.io = -1; + } + gpio = of_get_named_gpio_flags(node, "BT,reset_gpio", 0, &flags); + if (gpio_is_valid(gpio)) { + data->reset_gpio.io = gpio; + data->reset_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: get property: BT,reset_gpio = %d.\n", __func__, gpio); + } else { + data->reset_gpio.io = -1; + } + gpio = of_get_named_gpio_flags(node, "BT,wake_gpio", 0, &flags); + if (gpio_is_valid(gpio)) { + data->wake_gpio.io = gpio; + data->wake_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: get property: BT,wake_gpio = %d.\n", __func__, gpio); + } else { + data->wake_gpio.io = -1; + } + gpio = of_get_named_gpio_flags(node, "BT,wake_host_irq", 0, &flags); + if (gpio_is_valid(gpio)) { + data->wake_host_irq.gpio.io = gpio; + data->wake_host_irq.gpio.enable = flags; + LOG("%s: get property: BT,wake_host_irq = %d.\n", __func__, + gpio); + } else { + data->wake_host_irq.gpio.io = -1; + } + + data->ext_clk = devm_clk_get(dev, "ext_clock"); + if (IS_ERR(data->ext_clk)) { + LOG("%s: clk_get failed!!!.\n", __func__); + } else { + clk_prepare_enable(data->ext_clk); + } + return 0; +} +#endif //CONFIG_OF + +static const struct proc_ops bluesleep_lpm = { + .proc_read = bluesleep_read_proc_lpm, + .proc_write = bluesleep_write_proc_lpm, +}; + +static const struct proc_ops bluesleep_btwrite = { + .proc_read = bluesleep_read_proc_btwrite, + .proc_write = bluesleep_write_proc_btwrite, +}; + +static int rfkill_rk_probe(struct platform_device *pdev) +{ + struct rfkill_rk_data *rfkill; + struct rfkill_rk_platform_data *pdata = pdev->dev.platform_data; + int ret = 0; + struct proc_dir_entry *ent; + + DBG("Enter %s\n", __func__); + + if (!pdata) { +#ifdef CONFIG_OF + pdata = devm_kzalloc(&pdev->dev, + sizeof(struct rfkill_rk_platform_data), + GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + ret = bluetooth_platdata_parse_dt(&pdev->dev, pdata); + if (ret < 0) { +#endif + LOG("%s: No platform data specified\n", __func__); + return ret; +#ifdef CONFIG_OF + } +#endif + } + + pdata->name = (char *)bt_name; + pdata->type = RFKILL_TYPE_BLUETOOTH; + + rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL); + if (!rfkill) + return -ENOMEM; + + rfkill->pdata = pdata; + rfkill->pdev = pdev; + g_rfkill = rfkill; + + bluetooth_dir = proc_mkdir("bluetooth", NULL); + if (!bluetooth_dir) { + LOG("Unable to create /proc/bluetooth directory"); + return -ENOMEM; + } + + sleep_dir = proc_mkdir("sleep", bluetooth_dir); + if (!sleep_dir) { + LOG("Unable to create /proc/%s directory", PROC_DIR); + return -ENOMEM; + } + + /* read/write proc entries */ + ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm); + if (!ent) { + LOG("Unable to create /proc/%s/lpm entry", PROC_DIR); + ret = -ENOMEM; + goto fail_alloc; + } + + /* read/write proc entries */ + ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite); + if (!ent) { + LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR); + ret = -ENOMEM; + goto fail_alloc; + } + + DBG("init gpio\n"); + + ret = rfkill_rk_setup_gpio(pdev, &pdata->poweron_gpio, pdata->name, + "poweron"); + if (ret) + goto fail_gpio; + + ret = rfkill_rk_setup_gpio(pdev, &pdata->reset_gpio, pdata->name, + "reset"); + if (ret) + goto fail_gpio; + + ret = rfkill_rk_setup_gpio(pdev, &pdata->wake_gpio, pdata->name, + "wake"); + if (ret) + goto fail_gpio; + + ret = rfkill_rk_setup_gpio(pdev, &pdata->rts_gpio, rfkill->pdata->name, + "rts"); + if (ret) + goto fail_gpio; + + wake_lock_init(&rfkill->bt_irq_wl, WAKE_LOCK_SUSPEND, + "rfkill_rk_irq_wl"); + + ret = rfkill_rk_setup_wake_irq(rfkill, 0); + if (ret) + goto fail_setup_wake_irq; + + DBG("setup rfkill\n"); + rfkill->rfkill_dev = rfkill_alloc(pdata->name, &pdev->dev, pdata->type, + &rfkill_rk_ops, rfkill); + if (!rfkill->rfkill_dev) + goto fail_alloc; + + rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); + ret = rfkill_register(rfkill->rfkill_dev); + if (ret < 0) + goto fail_rfkill; + + INIT_DELAYED_WORK(&rfkill->bt_sleep_delay_work, + rfkill_rk_delay_sleep_bt); + + //rfkill_rk_set_power(rfkill, BT_BLOCKED); + // bt turn off power + if (gpio_is_valid(pdata->poweron_gpio.io)) { + gpio_direction_output(pdata->poweron_gpio.io, + !pdata->poweron_gpio.enable); + } + if (gpio_is_valid(pdata->reset_gpio.io)) { + gpio_direction_output(pdata->reset_gpio.io, + !pdata->reset_gpio.enable); + } + + platform_set_drvdata(pdev, rfkill); + + LOG("%s device registered.\n", pdata->name); + + return 0; + +fail_rfkill: + rfkill_destroy(rfkill->rfkill_dev); +fail_alloc: + + remove_proc_entry("btwrite", sleep_dir); + remove_proc_entry("lpm", sleep_dir); +fail_setup_wake_irq: + wake_lock_destroy(&rfkill->bt_irq_wl); +fail_gpio: + + g_rfkill = NULL; + return ret; +} + +static int rfkill_rk_remove(struct platform_device *pdev) +{ + struct rfkill_rk_data *rfkill = platform_get_drvdata(pdev); + + LOG("Enter %s\n", __func__); + + rfkill_unregister(rfkill->rfkill_dev); + rfkill_destroy(rfkill->rfkill_dev); + + cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); + + // free gpio + if (gpio_is_valid(rfkill->pdata->rts_gpio.io)) + gpio_free(rfkill->pdata->rts_gpio.io); + + if (gpio_is_valid(rfkill->pdata->wake_host_irq.gpio.io)) { + free_irq(rfkill->pdata->wake_host_irq.irq, rfkill); +#ifndef CONFIG_BK3515A_COMBO + gpio_free(rfkill->pdata->wake_host_irq.gpio.io); +#endif + } + +#ifndef CONFIG_BK3515A_COMBO + if (gpio_is_valid(rfkill->pdata->wake_gpio.io)) + gpio_free(rfkill->pdata->wake_gpio.io); +#endif + + if (gpio_is_valid(rfkill->pdata->reset_gpio.io)) + gpio_free(rfkill->pdata->reset_gpio.io); + + if (gpio_is_valid(rfkill->pdata->poweron_gpio.io)) + gpio_free(rfkill->pdata->poweron_gpio.io); + clk_disable_unprepare(rfkill->pdata->ext_clk); + wake_lock_destroy(&rfkill->bt_irq_wl); + g_rfkill = NULL; + + return 0; +} + +static const struct dev_pm_ops rfkill_rk_pm_ops = { + .prepare = rfkill_rk_pm_prepare, + .complete = rfkill_rk_pm_complete, +}; + +#ifdef CONFIG_OF +static struct of_device_id bt_platdata_of_match[] = { + { .compatible = "bluetooth-platdata" }, + {} +}; +MODULE_DEVICE_TABLE(of, bt_platdata_of_match); +#endif //CONFIG_OF + +static struct platform_driver rfkill_rk_driver = { + .probe = rfkill_rk_probe, + .remove = rfkill_rk_remove, + .driver = { + .name = "rfkill_bt", + .owner = THIS_MODULE, + .pm = &rfkill_rk_pm_ops, + .of_match_table = of_match_ptr(bt_platdata_of_match), + }, +}; + +static int __init rfkill_rk_init(void) +{ + int err; + + LOG("Enter %s\n", __func__); + err = rfkill_wlan_init(); + if (err) + return err; + return platform_driver_register(&rfkill_rk_driver); +} + +static void __exit rfkill_rk_exit(void) +{ + LOG("Enter %s\n", __func__); + platform_driver_unregister(&rfkill_rk_driver); + rfkill_wlan_exit(); +} + +module_init(rfkill_rk_init); +module_exit(rfkill_rk_exit); + +MODULE_DESCRIPTION("rock-chips rfkill for Bluetooth v0.3"); +MODULE_AUTHOR("cmy@rock-chips.com, gwl@rock-chips.com"); +MODULE_LICENSE("GPL"); diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rfkill-wlan.c b/drivers/net/wireless/uwe5622/unisocwifi/rfkill-wlan.c new file mode 100644 index 00000000000..a0933abb0bf --- /dev/null +++ b/drivers/net/wireless/uwe5622/unisocwifi/rfkill-wlan.c @@ -0,0 +1,971 @@ +/* + * Copyright (C) 2012 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ +/* Rock-chips rfkill driver for wifi +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#ifdef CONFIG_OF +#include +#include +#include +#endif +#include +#include + +#include "../../../../../drivers/mmc/core/pwrseq.h" + +#if 0 +#define DBG(x...) pr_info("[WLAN_RFKILL]: " x) +#else +#define DBG(x...) +#endif + +#define LOG(x...) pr_info("[WLAN_RFKILL]: " x) + +struct rfkill_wlan_data { + struct rksdmmc_gpio_wifi_moudle *pdata; + struct wake_lock wlan_irq_wl; +}; + +static struct rfkill_wlan_data *g_rfkill = NULL; +static int power_set_time = 0; +static int wifi_bt_vbat_state; +static int wifi_power_state; + +static const char wlan_name[] = "rkwifi"; + +static char wifi_chip_type_string[64]; +/*********************************************************** + * + * Broadcom Wifi Static Memory + * + **********************************************************/ +#ifdef CONFIG_RKWIFI +#define BCM_STATIC_MEMORY_SUPPORT 0 +#else +#define BCM_STATIC_MEMORY_SUPPORT 0 +#endif +//=========================== +#if BCM_STATIC_MEMORY_SUPPORT +#define PREALLOC_WLAN_SEC_NUM 4 +#define PREALLOC_WLAN_BUF_NUM 160 +#define PREALLOC_WLAN_SECTION_HEADER 0 +#define WLAN_SKB_BUF_NUM 16 + +#define WLAN_SECTION_SIZE_0 (12 * 1024) +#define WLAN_SECTION_SIZE_1 (12 * 1024) +#define WLAN_SECTION_SIZE_2 (32 * 1024) +#define WLAN_SECTION_SIZE_3 (136 * 1024) +#define WLAN_SECTION_SIZE_4 (4 * 1024) +#define WLAN_SECTION_SIZE_5 (64 * 1024) +#define WLAN_SECTION_SIZE_6 (4 * 1024) +#define WLAN_SECTION_SIZE_7 (4 * 1024) + +static struct sk_buff *wlan_static_skb[WLAN_SKB_BUF_NUM + 1]; + +struct wifi_mem_prealloc { + void *mem_ptr; + unsigned long size; +}; + +static struct wifi_mem_prealloc wifi_mem_array[8] = { + { NULL, (WLAN_SECTION_SIZE_0) }, { NULL, (WLAN_SECTION_SIZE_1) }, + { NULL, (WLAN_SECTION_SIZE_2) }, { NULL, (WLAN_SECTION_SIZE_3) }, + { NULL, (WLAN_SECTION_SIZE_4) }, { NULL, (WLAN_SECTION_SIZE_5) }, + { NULL, (WLAN_SECTION_SIZE_6) }, { NULL, (WLAN_SECTION_SIZE_7) } +}; + +static int rockchip_init_wifi_mem(void) +{ + int i; + int j; + + for (i = 0; i < WLAN_SKB_BUF_NUM; i++) { + wlan_static_skb[i] = + dev_alloc_skb(((i < (WLAN_SKB_BUF_NUM / 2)) ? + (PAGE_SIZE * 1) : + (PAGE_SIZE * 2))); + + if (!wlan_static_skb[i]) + goto err_skb_alloc; + } + + wlan_static_skb[i] = dev_alloc_skb((PAGE_SIZE * 4)); + if (!wlan_static_skb[i]) + goto err_skb_alloc; + + for (i = 0; i <= 7; i++) { + wifi_mem_array[i].mem_ptr = + kmalloc(wifi_mem_array[i].size, GFP_KERNEL); + + if (!wifi_mem_array[i].mem_ptr) + goto err_mem_alloc; + } + return 0; + +err_mem_alloc: + pr_err("Failed to mem_alloc for WLAN\n"); + for (j = 0; j < i; j++) + kfree(wifi_mem_array[j].mem_ptr); + i = WLAN_SKB_BUF_NUM; +err_skb_alloc: + pr_err("Failed to skb_alloc for WLAN\n"); + for (j = 0; j < i; j++) + dev_kfree_skb(wlan_static_skb[j]); + dev_kfree_skb(wlan_static_skb[j]); + + return -ENOMEM; +} + +void *rockchip_mem_prealloc(int section, unsigned long size) +{ + if (section == PREALLOC_WLAN_SEC_NUM) + return wlan_static_skb; + + if (section < 0 || section > 7) + return NULL; + + if (wifi_mem_array[section].size < size) + return NULL; + + return wifi_mem_array[section].mem_ptr; +} +#else +void *rockchip_mem_prealloc(int section, unsigned long size) +{ + return NULL; +} +#endif +EXPORT_SYMBOL(rockchip_mem_prealloc); + +int rfkill_set_wifi_bt_power(int on) +{ + struct rfkill_wlan_data *mrfkill = g_rfkill; + struct rksdmmc_gpio *vbat; + + LOG("%s: %d\n", __func__, on); + + if (!mrfkill) { + LOG("%s: rfkill-wlan driver has not Successful initialized\n", + __func__); + return -1; + } + + vbat = &mrfkill->pdata->vbat_n; + if (on) { + if (gpio_is_valid(vbat->io)) + gpio_direction_output(vbat->io, vbat->enable); + } else { + if (gpio_is_valid(vbat->io)) + gpio_direction_output(vbat->io, !(vbat->enable)); + } + wifi_bt_vbat_state = on; + return 0; +} + +/************************************************************************** + * + * get wifi power state Func + * + *************************************************************************/ +int rfkill_get_wifi_power_state(int *power) +{ + struct rfkill_wlan_data *mrfkill = g_rfkill; + + if (!mrfkill) { + LOG("%s: rfkill-wlan driver has not Successful initialized\n", + __func__); + return -1; + } + + *power = wifi_power_state; + + return 0; +} + +/************************************************************************** + * + * Wifi Power Control Func + * 0 -> power off + * 1 -> power on + * + *************************************************************************/ +int rockchip_wifi_power(int on) +{ + struct rfkill_wlan_data *mrfkill = g_rfkill; + struct rksdmmc_gpio *poweron, *reset; + struct regulator *ldo = NULL; + int bt_power = 0; + bool toggle = false; + + LOG("%s: %d\n", __func__, on); + + if (!on && primary_sdio_host) + mmc_pwrseq_power_off(primary_sdio_host); + + if (!mrfkill) { + LOG("%s: rfkill-wlan driver has not Successful initialized\n", + __func__); + return -1; + } + + if (mrfkill->pdata->wifi_power_remain && power_set_time) { + LOG("%s: wifi power is setted to be remain on.", __func__); + return 0; + } + power_set_time++; + + if (!rfkill_get_bt_power_state(&bt_power, &toggle)) { + LOG("%s: toggle = %s\n", __func__, toggle ? "true" : "false"); + } + + if (mrfkill->pdata->mregulator.power_ctrl_by_pmu) { + int ret = -1; + char *ldostr; + int level = mrfkill->pdata->mregulator.enable; + + ldostr = mrfkill->pdata->mregulator.pmu_regulator; + if (!ldostr) + return -1; + ldo = regulator_get(NULL, ldostr); + if (!ldo || IS_ERR(ldo)) { + LOG("\n\n\n%s get ldo error,please mod this\n\n\n", + __func__); + return -1; + } + if (on == level) { + regulator_set_voltage(ldo, 3000000, 3000000); + LOG("%s: %s enabled\n", __func__, ldostr); + ret = regulator_enable(ldo); + wifi_power_state = 1; + LOG("wifi turn on power.\n"); + } else { + LOG("%s: %s disabled\n", __func__, ldostr); + while (regulator_is_enabled(ldo) > 0) + ret = regulator_disable(ldo); + wifi_power_state = 0; + LOG("wifi shut off power.\n"); + } + regulator_put(ldo); + msleep(100); + } else { + poweron = &mrfkill->pdata->power_n; + reset = &mrfkill->pdata->reset_n; + + if (on) { + if (toggle) { + rfkill_set_wifi_bt_power(1); + msleep(100); + } + + if (gpio_is_valid(poweron->io)) { + gpio_direction_output(poweron->io, poweron->enable); + msleep(100); + } + + if (gpio_is_valid(reset->io)) { + gpio_direction_output(reset->io, reset->enable); + msleep(100); + } + + wifi_power_state = 1; + LOG("wifi turn on power [GPIO%d-%d]\n", poweron->io, poweron->enable); + } else { + if (gpio_is_valid(poweron->io)) { + printk("wifi power off\n"); + gpio_direction_output(poweron->io, !(poweron->enable)); + msleep(100); + } + + if (gpio_is_valid(reset->io)) { + gpio_direction_output(reset->io, !(reset->enable)); + } + + wifi_power_state = 0; + if (toggle) { + if (!bt_power) { + LOG("%s: wifi will set vbat to low\n", __func__); + rfkill_set_wifi_bt_power(0); + } else { + LOG("%s: wifi shouldn't control the vbat\n", __func__); + } + } + LOG("wifi shut off power [GPIO%d-%d]\n", poweron->io, !poweron->enable); + } + } + + return 0; +} +EXPORT_SYMBOL(rockchip_wifi_power); + +/************************************************************************** + * + * Wifi Sdio Detect Func + * + *************************************************************************/ +extern int mmc_host_rescan(struct mmc_host *host, int val, int irq_type); +int rockchip_wifi_set_carddetect(int val) +{ + return mmc_host_rescan(NULL, val, 1); +} +EXPORT_SYMBOL(rockchip_wifi_set_carddetect); + +/************************************************************************** + * + * Wifi Get Interrupt irq Func + * + *************************************************************************/ +int rockchip_wifi_get_oob_irq(void) +{ + struct rfkill_wlan_data *mrfkill = g_rfkill; + struct rksdmmc_gpio *wifi_int_irq; + + LOG("%s: Enter\n", __func__); + + if (!mrfkill) { + LOG("%s: rfkill-wlan driver has not Successful initialized\n", + __func__); + return -1; + } + + wifi_int_irq = &mrfkill->pdata->wifi_int_b; + if (gpio_is_valid(wifi_int_irq->io)) { + return gpio_to_irq(wifi_int_irq->io); + //return wifi_int_irq->io; + } else { + LOG("%s: wifi OOB pin isn't defined.\n", __func__); + } + + return -1; +} +EXPORT_SYMBOL(rockchip_wifi_get_oob_irq); + +int rockchip_wifi_get_oob_irq_flag(void) +{ + struct rfkill_wlan_data *mrfkill = g_rfkill; + struct rksdmmc_gpio *wifi_int_irq; + int gpio_flags = -1; + + if (mrfkill) { + wifi_int_irq = &mrfkill->pdata->wifi_int_b; + if (gpio_is_valid(wifi_int_irq->io)) + gpio_flags = wifi_int_irq->enable; + } + + return gpio_flags; +} +EXPORT_SYMBOL(rockchip_wifi_get_oob_irq_flag); + +/************************************************************************** + * + * Wifi Reset Func + * + *************************************************************************/ +int rockchip_wifi_reset(int on) +{ + return 0; +} +EXPORT_SYMBOL(rockchip_wifi_reset); + +/************************************************************************** + * + * Wifi MAC custom Func + * + *************************************************************************/ +#include +#include +u8 wifi_custom_mac_addr[6] = { 0, 0, 0, 0, 0, 0 }; + +//#define RANDOM_ADDRESS_SAVE +static int get_wifi_addr_vendor(unsigned char *addr) +{ + int ret; + int count = 5; + + while (count-- > 0) { + if (is_rk_vendor_ready()) + break; + /* sleep 500ms wait rk vendor driver ready */ + msleep(500); + } + ret = rk_vendor_read(WIFI_MAC_ID, addr, 6); + if (ret != 6 || is_zero_ether_addr(addr)) { + LOG("%s: rk_vendor_read wifi mac address failed (%d)\n", + __func__, ret); +#ifdef CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR + random_ether_addr(addr); + LOG("%s: generate random wifi mac address: " + "%02x:%02x:%02x:%02x:%02x:%02x\n", + __func__, addr[0], addr[1], addr[2], addr[3], addr[4], + addr[5]); + ret = rk_vendor_write(WIFI_MAC_ID, addr, 6); + if (ret != 0) { + memset(addr, 0, 6); + return -1; + } +#else + return -1; +#endif + } + + return 0; +} + +int rockchip_wifi_mac_addr(unsigned char *buf) +{ + char mac_buf[20] = { 0 }; + + // from vendor storage + if (is_zero_ether_addr(wifi_custom_mac_addr)) { + if (get_wifi_addr_vendor(wifi_custom_mac_addr) != 0) + return -1; + } + + sprintf(mac_buf, "%02x:%02x:%02x:%02x:%02x:%02x", + wifi_custom_mac_addr[0], wifi_custom_mac_addr[1], + wifi_custom_mac_addr[2], wifi_custom_mac_addr[3], + wifi_custom_mac_addr[4], wifi_custom_mac_addr[5]); + LOG("falsh wifi_custom_mac_addr=[%s]\n", mac_buf); + + if (is_valid_ether_addr(wifi_custom_mac_addr)) { + if (!strncmp(wifi_chip_type_string, "rtl", 3)) + wifi_custom_mac_addr[0] &= ~0x2; // for p2p + } else { + LOG("This mac address is not valid, ignored...\n"); + return -1; + } + + memcpy(buf, wifi_custom_mac_addr, 6); + + return 0; +} +EXPORT_SYMBOL(rockchip_wifi_mac_addr); + +/************************************************************************** + * + * wifi get country code func + * + *************************************************************************/ +struct cntry_locales_custom { + char iso_abbrev[4]; /* ISO 3166-1 country abbreviation */ + char custom_locale[4]; /* Custom firmware locale */ + int custom_locale_rev; /* Custom local revisin default -1 */ +}; + +static struct cntry_locales_custom country_cloc; + +void *rockchip_wifi_country_code(char *ccode) +{ + struct cntry_locales_custom *mcloc; + + LOG("%s: set country code [%s]\n", __func__, ccode); + mcloc = &country_cloc; + memcpy(mcloc->custom_locale, ccode, 4); + mcloc->custom_locale_rev = 0; + + return mcloc; +} +EXPORT_SYMBOL(rockchip_wifi_country_code); +/**************************************************************************/ + +static int rfkill_rk_setup_gpio(struct rksdmmc_gpio *gpio, const char *prefix, + const char *name) +{ + if (gpio_is_valid(gpio->io)) { + int ret = 0; + + sprintf(gpio->name, "%s_%s", prefix, name); + ret = gpio_request(gpio->io, gpio->name); + if (ret) { + LOG("Failed to get %s gpio.\n", gpio->name); + return -1; + } + } + + return 0; +} + +#ifdef CONFIG_OF +static int wlan_platdata_parse_dt(struct device *dev, + struct rksdmmc_gpio_wifi_moudle *data) +{ + struct device_node *node = dev->of_node; + const char *strings; + u32 value; + int gpio, ret; + enum of_gpio_flags flags; + u32 ext_clk_value = 0; + + if (!node) + return -ENODEV; + + memset(data, 0, sizeof(*data)); + +#ifdef CONFIG_MFD_SYSCON + data->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); + if (IS_ERR(data->grf)) { + LOG("can't find rockchip,grf property\n"); + //return -1; + } +#endif + + ret = of_property_read_string(node, "wifi_chip_type", &strings); + if (ret) { + LOG("%s: Can not read wifi_chip_type, set default to rkwifi.\n", + __func__); + strcpy(wifi_chip_type_string, "rkwifi"); + } else { + strcpy(wifi_chip_type_string, strings); + } + LOG("%s: wifi_chip_type = %s\n", __func__, wifi_chip_type_string); + + if (of_find_property(node, "keep_wifi_power_on", NULL)) { + data->wifi_power_remain = true; + LOG("%s: wifi power remain\n", __func__); + } else { + data->wifi_power_remain = false; + LOG("%s: enable wifi power control.\n", __func__); + } + + if (of_find_property(node, "power_ctrl_by_pmu", NULL)) { + data->mregulator.power_ctrl_by_pmu = true; + ret = of_property_read_string(node, "power_pmu_regulator", + &strings); + if (ret) { + LOG("%s: Can not read property: power_pmu_regulator.\n", + __func__); + data->mregulator.power_ctrl_by_pmu = false; + } else { + LOG("%s: wifi power controlled by pmu(%s).\n", __func__, + strings); + sprintf(data->mregulator.pmu_regulator, "%s", strings); + } + ret = of_property_read_u32(node, "power_pmu_enable_level", + &value); + if (ret) { + LOG("%s: Can not read: power_pmu_enable_level.\n", + __func__); + data->mregulator.power_ctrl_by_pmu = false; + } else { + LOG("%s: wifi power controlled by pmu(level = %s).\n", + __func__, (value == 1) ? "HIGH" : "LOW"); + data->mregulator.enable = value; + } + } else { + data->mregulator.power_ctrl_by_pmu = false; + LOG("%s: wifi power controled by gpio.\n", __func__); + gpio = of_get_named_gpio_flags(node, "WIFI,poweren_gpio", 0, + &flags); + if (gpio_is_valid(gpio)) { + data->power_n.io = gpio; + data->power_n.enable = + (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: WIFI,poweren_gpio = %d flags = %d.\n", + __func__, gpio, flags); + } else { + data->power_n.io = -1; + } + gpio = of_get_named_gpio_flags(node, "WIFI,vbat_gpio", 0, + &flags); + if (gpio_is_valid(gpio)) { + data->vbat_n.io = gpio; + data->vbat_n.enable = + (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: WIFI,vbat_gpio = %d, flags = %d.\n", + __func__, gpio, flags); + } else { + data->vbat_n.io = -1; + } + gpio = of_get_named_gpio_flags(node, "WIFI,reset_gpio", 0, + &flags); + if (gpio_is_valid(gpio)) { + data->reset_n.io = gpio; + data->reset_n.enable = + (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; + LOG("%s: WIFI,reset_gpio = %d, flags = %d.\n", + __func__, gpio, flags); + } else { + data->reset_n.io = -1; + } + gpio = of_get_named_gpio_flags(node, "WIFI,host_wake_irq", 0, + &flags); + if (gpio_is_valid(gpio)) { + data->wifi_int_b.io = gpio; + data->wifi_int_b.enable = !flags; + LOG("%s: WIFI,host_wake_irq = %d, flags = %d.\n", + __func__, gpio, flags); + } else { + data->wifi_int_b.io = -1; + } + } + + data->ext_clk = devm_clk_get(dev, "clk_wifi"); + if (IS_ERR(data->ext_clk)) { + LOG("%s: The ref_wifi_clk not found !\n", __func__); + } else { + of_property_read_u32(node, "ref-clock-frequency", + &ext_clk_value); + if (ext_clk_value > 0) { + ret = clk_set_rate(data->ext_clk, ext_clk_value); + if (ret) + LOG("%s: set ref clk error!\n", __func__); + } + + ret = clk_prepare_enable(data->ext_clk); + if (ret) + LOG("%s: enable ref clk error!\n", __func__); + + /* WIFI clock (REF_CLKOUT) output enable. + * 1'b0: drive disable + * 1'b1: output enable + */ + if (of_machine_is_compatible("rockchip,rk3308")) + regmap_write(data->grf, 0x0314, 0x00020002); + } + + return 0; +} +#endif //CONFIG_OF + +#if defined(CONFIG_HAS_EARLYSUSPEND) +#include + +static void wlan_early_suspend(struct early_suspend *h) +{ + LOG("%s :enter\n", __func__); + + return; +} + +static void wlan_late_resume(struct early_suspend *h) +{ + LOG("%s :enter\n", __func__); + + return; +} + +struct early_suspend wlan_early_suspend { + .level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; + .suspend = wlan_early_suspend; + .resume = wlan_late_resume; +} +#endif + +static void +rfkill_wlan_early_suspend(void) +{ + //LOG("%s :enter\n", __func__); + + return; +} + +static void rfkill_wlan_later_resume(void) +{ + //LOG("%s :enter\n", __func__); + + return; +} + +static int rfkill_wlan_fb_event_notify(struct notifier_block *self, + unsigned long action, void *data) +{ + struct fb_event *event = data; + int blank_mode = *((int *)event->data); + + switch (blank_mode) { + case FB_BLANK_UNBLANK: + rfkill_wlan_later_resume(); + break; + case FB_BLANK_NORMAL: + rfkill_wlan_early_suspend(); + break; + default: + rfkill_wlan_early_suspend(); + break; + } + + return 0; +} + +static struct notifier_block rfkill_wlan_fb_notifier = { + .notifier_call = rfkill_wlan_fb_event_notify, +}; + +static ssize_t wifi_power_show(struct class *cls, struct class_attribute *attr, char *_buf) +{ + return sprintf(_buf, "%d\n", wifi_power_state); +} + +static ssize_t wifi_power_store(struct class *cls, struct class_attribute *attr, const char *_buf, size_t _count) +{ + long poweren = 0; + + if (kstrtol(_buf, 10, &poweren) < 0) + return -EINVAL; + + LOG("%s: poweren = %ld\n", __func__, poweren); + + if (poweren > 0) + rockchip_wifi_power(1); + else + rockchip_wifi_power(0); + + return _count; +} + +static CLASS_ATTR_RW(wifi_power); + +static ssize_t wifi_bt_vbat_show(struct class *cls, struct class_attribute *attr, char *_buf) +{ + return sprintf(_buf, "%d\n", wifi_bt_vbat_state); +} + +static ssize_t wifi_bt_vbat_store(struct class *cls, struct class_attribute *attr, const char *_buf, size_t _count) +{ + long vbat = 0; + + if (kstrtol(_buf, 10, &vbat) < 0) + return -EINVAL; + + LOG("%s: vbat = %ld\n", __func__, vbat); + + if (vbat > 0) + rfkill_set_wifi_bt_power(1); + else + rfkill_set_wifi_bt_power(0); + + return _count; +} + +static CLASS_ATTR_RW(wifi_bt_vbat); + +static ssize_t wifi_set_carddetect_store(struct class *cls, struct class_attribute *attr, const char *_buf, size_t _count) +{ + long val = 0; + + if (kstrtol(_buf, 10, &val) < 0) + return -EINVAL; + + LOG("%s: val = %ld\n", __func__, val); + + if (val > 0) + rockchip_wifi_set_carddetect(1); + else + rockchip_wifi_set_carddetect(0); + + return _count; +} + +static CLASS_ATTR_WO(wifi_set_carddetect); + +static struct attribute *rkwifi_power_attrs[] = { + &class_attr_wifi_power.attr, + &class_attr_wifi_bt_vbat.attr, + &class_attr_wifi_set_carddetect.attr, + NULL, +}; +ATTRIBUTE_GROUPS(rkwifi_power); + +/** Device model classes */ +static struct class rkwifi_power = { + .name = "rkwifi", + .class_groups = rkwifi_power_groups, +}; + +static int rfkill_wlan_probe(struct platform_device *pdev) +{ + struct rfkill_wlan_data *rfkill; + struct rksdmmc_gpio_wifi_moudle *pdata = pdev->dev.platform_data; + int ret = -1; + + LOG("Enter %s\n", __func__); + + class_register(&rkwifi_power); + + if (!pdata) { +#ifdef CONFIG_OF + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + ret = wlan_platdata_parse_dt(&pdev->dev, pdata); + if (ret < 0) { +#endif + LOG("%s: No platform data specified\n", __func__); + return ret; +#ifdef CONFIG_OF + } +#endif + } + + rfkill = kzalloc(sizeof(*rfkill), GFP_KERNEL); + if (!rfkill) + goto rfkill_alloc_fail; + + rfkill->pdata = pdata; + g_rfkill = rfkill; + + LOG("%s: init gpio\n", __func__); + + if (!pdata->mregulator.power_ctrl_by_pmu) { + ret = rfkill_rk_setup_gpio(&pdata->vbat_n, wlan_name, + "wlan_vbat"); + if (ret) + goto fail_alloc; + + ret = rfkill_rk_setup_gpio(&pdata->power_n, wlan_name, + "wlan_poweren"); + if (ret) + goto fail_alloc; + + ret = rfkill_rk_setup_gpio(&pdata->reset_n, wlan_name, + "wlan_reset"); + if (ret) + goto fail_alloc; + } + + wake_lock_init(&rfkill->wlan_irq_wl, WAKE_LOCK_SUSPEND, + "rfkill_wlan_wake"); + + rfkill_set_wifi_bt_power(1); + +#ifdef CONFIG_SDIO_KEEPALIVE + if (gpio_is_valid(pdata->power_n.io) && + primary_sdio_host && primary_sdio_host->support_chip_alive) + gpio_direction_output(pdata->power_n.io, pdata->power_n.enable); +#else + if (gpio_is_valid(pdata->power_n.io)) + gpio_direction_output(pdata->power_n.io, !pdata->power_n.enable); +#endif + + + if (pdata->wifi_power_remain) + rockchip_wifi_power(1); + +#if BCM_STATIC_MEMORY_SUPPORT + rockchip_init_wifi_mem(); +#endif + +#if defined(CONFIG_HAS_EARLYSUSPEND) + register_early_suspend(wlan_early_suspend); +#endif + + fb_register_client(&rfkill_wlan_fb_notifier); + + LOG("Exit %s\n", __func__); + + return 0; + +fail_alloc: + kfree(rfkill); +rfkill_alloc_fail: + kfree(pdata); + + g_rfkill = NULL; + + return ret; +} + +static int rfkill_wlan_remove(struct platform_device *pdev) +{ + struct rfkill_wlan_data *rfkill = platform_get_drvdata(pdev); + + LOG("Enter %s\n", __func__); + + wake_lock_destroy(&rfkill->wlan_irq_wl); + + fb_unregister_client(&rfkill_wlan_fb_notifier); + + if (gpio_is_valid(rfkill->pdata->power_n.io)) + gpio_free(rfkill->pdata->power_n.io); + + if (gpio_is_valid(rfkill->pdata->reset_n.io)) + gpio_free(rfkill->pdata->reset_n.io); + + kfree(rfkill); + g_rfkill = NULL; + + return 0; +} + +static int rfkill_wlan_suspend(struct platform_device *pdev, pm_message_t state) +{ + LOG("Enter %s\n", __func__); + return 0; +} + +static int rfkill_wlan_resume(struct platform_device *pdev) +{ + LOG("Enter %s\n", __func__); + return 0; +} + +#ifdef CONFIG_OF +static struct of_device_id wlan_platdata_of_match[] = { + { .compatible = "wlan-platdata" }, + {} +}; +MODULE_DEVICE_TABLE(of, wlan_platdata_of_match); +#endif //CONFIG_OF + +static struct platform_driver rfkill_wlan_driver = { + .probe = rfkill_wlan_probe, + .remove = rfkill_wlan_remove, + .suspend = rfkill_wlan_suspend, + .resume = rfkill_wlan_resume, + .driver = { + .name = "wlan-platdata", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(wlan_platdata_of_match), + }, +}; + +int __init rfkill_wlan_init(void) +{ + LOG("Enter %s\n", __func__); + return platform_driver_register(&rfkill_wlan_driver); +} + +void __exit rfkill_wlan_exit(void) +{ + LOG("Enter %s\n", __func__); + platform_driver_unregister(&rfkill_wlan_driver); +} + +MODULE_DESCRIPTION("rock-chips rfkill for wifi v0.1"); +MODULE_AUTHOR("gwl@rock-chips.com"); +MODULE_LICENSE("GPL"); diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c b/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c old mode 100644 new mode 100755 index b51207d19c8..d80267ad55e --- a/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c @@ -384,9 +384,6 @@ int sprdwl_pkt_log_save(struct sprdwl_intf *intf, void *data) { int i, j, temp, data_len, pkt_line_num, temp_pkt_line_num, pkt_len, m = 0; -#ifdef setfs - mm_segment_t fs; -#endif /*for pkt log space key and enter key*/ char temp_space, temp_enter; /*for pkt log txt line number and write pkt log into file*/ @@ -399,10 +396,6 @@ int sprdwl_pkt_log_save(struct sprdwl_intf *intf, void *data) wl_err("file create/open fail %s, %d\n", __func__, __LINE__); return 1; } -#ifdef setfs - fs = get_fs(); - set_fs(KERNEL_DS); -#endif pkt_len = ((struct sprdwl_pktlog_hdr *)(data))->plen; data += sizeof(struct sprdwl_pktlog_hdr); while (m < pkt_len) { @@ -449,9 +442,6 @@ int sprdwl_pkt_log_save(struct sprdwl_intf *intf, void *data) memset(temphdr, 0x00, 6); } filp_close(intf->pfile, NULL); -#ifdef setfs - set_fs(fs); -#endif return 0; } diff --git a/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h b/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h old mode 100644 new mode 100755 index a1b2f8544ec..f612a9e9967 --- a/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h +++ b/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h @@ -176,8 +176,6 @@ struct wmm_params_element { struct sprdwl_wmmac_params { struct wmm_ac_params ac[4]; struct timer_list wmmac_edcaf_timer; - struct timer_list wmmac_vo_timer; - struct timer_list wmmac_vi_timer; }; #endif diff --git a/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c b/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c old mode 100644 new mode 100755 index 40d51a7130d..d7375248dde --- a/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c @@ -530,9 +530,9 @@ void sprdwl_fc_add_share_credit(struct sprdwl_vif *vif) tx_msg = (struct sprdwl_tx_msg *)intf->sprdwl_tx; for (i = 0; i < MAX_COLOR_BIT; i++) { if (tx_msg->flow_ctrl[i].mode == vif->mode) { - wl_err("%s, %d, mode:%d closed, index:%d, share it\n", - __func__, __LINE__, - vif->mode, i); + //wl_err("%s, %d, mode:%d closed, index:%d, share it\n", + // __func__, __LINE__, + // vif->mode, i); tx_msg->flow_ctrl[i].mode = SPRDWL_MODE_NONE; break; } @@ -1081,10 +1081,6 @@ int sprdwl_sdio_process_credit(void *pdev, void *data) if (common->type == SPRDWL_TYPE_DATA_SPECIAL) { int offset = (size_t)&((struct rx_msdu_desc *)0)->rsvd5; - if (intf->priv->hw_type == SPRDWL_HW_USB) { - return -2; - } - flow = data + offset; goto out; } diff --git a/drivers/net/wireless/uwe5622/unisocwifi/txrx.c b/drivers/net/wireless/uwe5622/unisocwifi/txrx.c old mode 100644 new mode 100755 index 227339ada73..b0a24a3615b --- a/drivers/net/wireless/uwe5622/unisocwifi/txrx.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/txrx.c @@ -23,9 +23,7 @@ #include "cmdevt.h" #include "intf_ops.h" #include "work.h" -#if defined(UWE5621_FTR) #include "wl_intf.h" -#endif #include "rx_msg.h" #include "tcp_ack.h" #include "wl_core.h" @@ -34,33 +32,20 @@ * here just free the msg buf to the freelist */ int sprdwl_send_data(struct sprdwl_vif *vif, struct sprdwl_msg_buf *msg, - struct sk_buff *skb, u8 offset) + struct sk_buff *skb, u8 offset) { int ret; int delta; unsigned long align_addr; unsigned char *buf = NULL; -/*TODO temp for MARLIN2*/ -#ifndef UWE5621_FTR - struct sprdwl_data_hdr *hdr; -#endif struct sprdwl_intf *intf; unsigned int plen = cpu_to_le16(skb->len); intf = (struct sprdwl_intf *)vif->priv->hw_priv; buf = skb->data; -/*TODO temp for MARLIN2*/ -#ifndef UWE5621_FTR - skb_push(skb, sizeof(*hdr) + offset); - hdr = (struct sprdwl_data_hdr *)skb->data; - memset(hdr, 0, sizeof(*hdr)); - hdr->common.type = SPRDWL_TYPE_DATA; - hdr->common.ctx_id = vif->ctx_id; - hdr->plen = cpu_to_le16(skb->len); -#else + if (sprdwl_intf_fill_msdu_dscr(vif, skb, SPRDWL_TYPE_DATA, offset)) return -EPERM; -#endif /* UWE5621_FTR */ #ifdef OTT_UWE skb_push(skb, 3); if ((unsigned long)skb->data & 0x3) { @@ -120,10 +105,6 @@ int sprdwl_send_cmd(struct sprdwl_priv *priv, struct sprdwl_msg_buf *msg) ret = sprdwl_intf_tx(priv, msg); if (ret) { wl_err("%s TX cmd Err: %d\n", __func__, ret); - /* now cmd msg droped */ -#if !defined(UWE5621_FTR) - dev_kfree_skb(skb); -#endif } return ret; diff --git a/drivers/net/wireless/uwe5622/unisocwifi/vendor.c b/drivers/net/wireless/uwe5622/unisocwifi/vendor.c old mode 100644 new mode 100755 index 6fba95b60d6..1b4ec43ce59 --- a/drivers/net/wireless/uwe5622/unisocwifi/vendor.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/vendor.c @@ -453,7 +453,7 @@ static int sprdwl_vendor_get_llstat_handler(struct wiphy *wiphy, struct wifi_iface_stat *iface_st; struct sprdwl_llstat_radio *dif_radio; u16 r_len = sizeof(*llst); - u8 r_buf[r_len], ret, i; + u8 r_buf[sizeof(*llst)], ret, i; u32 reply_radio_length, reply_iface_length; struct sprdwl_priv *priv = wiphy_priv(wiphy); @@ -575,7 +575,7 @@ static int sprdwl_vendor_clr_llstat_handler(struct wiphy *wiphy, struct nlattr *tb[SPRDWL_LL_STATS_CLR_MAX + 1]; u32 *stats_clear_rsp_mask, stats_clear_req_mask = 0; u16 r_len = sizeof(*stats_clear_rsp_mask); - u8 r_buf[r_len]; + u8 r_buf[sizeof(*stats_clear_rsp_mask)]; u32 reply_length, ret, err; struct sprdwl_priv *priv = wiphy_priv(wiphy); @@ -2409,8 +2409,8 @@ static int sprdwl_vendor_memory_dump(struct wiphy *wiphy, /*CMD ID:61*/ static const struct nla_policy sprdwl_get_wifi_info_policy[ SPRDWL_ATTR_WIFI_INFO_GET_MAX + 1] = { - [SPRDWL_ATTR_WIFI_INFO_DRIVER_VERSION] = {.type = NLA_U8}, - [SPRDWL_ATTR_WIFI_INFO_FIRMWARE_VERSION] = {.type = NLA_U8}, + [SPRDWL_ATTR_WIFI_INFO_DRIVER_VERSION] = {.type = NLA_U32}, + [SPRDWL_ATTR_WIFI_INFO_FIRMWARE_VERSION] = {.type = NLA_U32}, }; static int sprdwl_vendor_get_driver_info(struct wiphy *wiphy, diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c b/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c old mode 100644 new mode 100755 index 042a4df0161..19a00d1f384 --- a/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c @@ -538,20 +538,12 @@ static struct notifier_block boost_notifier = { extern struct sprdwl_priv *g_sprdwl_priv; extern void sprdwl_cancel_scan(struct sprdwl_vif *vif); extern void sprdwl_cancel_sched_scan(struct sprdwl_vif *vif); -extern void sprdwl_flush_all_txlist(struct sprdwl_tx_msg *sprdwl_tx_dev); -extern int sprdwl_cmd_init(void); -extern void sprdwl_cmd_deinit(void); -extern void sprdwl_net_flowcontrl(struct sprdwl_priv *priv, - enum sprdwl_mode mode, bool state); -extern void sprdwl_reg_notify(struct wiphy *wiphy, struct regulatory_request *request); -struct work_struct wifi_rst_begin; -struct work_struct wifi_rst_down; struct completion wifi_reset_ready; +extern void sprdwl_net_flowcontrl(struct sprdwl_priv *priv, enum sprdwl_mode mode, bool state); extern struct sprdwl_cmd g_sprdwl_cmd; -static void wifi_reset_wq(struct work_struct *work) +static void sprdwl_wifi_reset(void) { - struct sprdwl_vif *vif, *tmp_vif; struct sprdwl_intf *intf = NULL; struct sprdwl_tx_msg *tx_msg = NULL; struct sprdwl_rx_if *rx_if = NULL; @@ -560,103 +552,38 @@ static void wifi_reset_wq(struct work_struct *work) tx_msg = (void *)intf->sprdwl_tx; rx_if = (struct sprdwl_rx_if *)intf->sprdwl_rx; - reinit_completion(&wifi_reset_ready); - wl_err("cp2 reset begin..........\n"); g_sprdwl_priv->sync.scan_not_allowed = true; g_sprdwl_priv->sync.cmd_not_allowed = true; intf->cp_asserted = 1; - sprdwl_reorder_init(&rx_if->ba_entry); - sprdwl_net_flowcontrl(g_sprdwl_priv, SPRDWL_MODE_NONE, false); - if (tx_msg->tx_thread) + intf->exit = 1; + if (tx_msg->tx_thread) { tx_up(tx_msg); - - sprdwl_flush_all_txlist(tx_msg); - flush_workqueue(rx_if->rx_queue); - list_for_each_entry_safe(vif, tmp_vif, &g_sprdwl_priv->vif_list, vif_node) { - g_sprdwl_priv->sync.fw_stat[vif->mode] = g_sprdwl_priv->fw_stat[vif->mode]; - g_sprdwl_priv->fw_stat[vif->mode] = SPRDWL_INTF_CLOSE; - sprdwl_report_disconnection(vif, true); - if (g_sprdwl_priv->scan_vif) - sprdwl_cancel_scan(g_sprdwl_priv->scan_vif); - if (g_sprdwl_priv->sched_scan_vif) { - sprdwl_sched_scan_done(g_sprdwl_priv->sched_scan_vif, true); - sprdwl_cancel_sched_scan(g_sprdwl_priv->sched_scan_vif); - } + kthread_stop(tx_msg->tx_thread); + tx_msg->tx_thread = NULL; } - sprdwl_vendor_deinit(g_sprdwl_priv->wiphy); - sprdwl_cmd_wake_upall(); - sprdwl_tcp_ack_deinit(g_sprdwl_priv); - sprdwl_intf_deinit(intf); - // sprdwl_cmd_deinit(); - complete(&wifi_reset_ready); wl_err("cp2 reset finish..........\n"); - -} - -static void wifi_resume_wq(struct work_struct *work) -{ - struct sprdwl_vif *vif, *tmp_vif; - struct sprdwl_intf *intf = NULL; - struct sprdwl_rx_if *rx_if = NULL; - wl_err("cp2 resume begin...............\n"); - - intf = (struct sprdwl_intf *)g_sprdwl_priv->hw_priv; - rx_if = (struct sprdwl_rx_if *)intf->sprdwl_rx; - - wait_for_completion(&wifi_reset_ready); - - sprdwl_intf_init(g_sprdwl_priv, intf); - // sprdwl_cmd_init(); - wl_err("sprdwl cmd init finish.\n"); - g_sprdwl_priv->sync.cmd_not_allowed = false; - intf->cp_asserted = 0; - sprdwl_net_flowcontrl(g_sprdwl_priv, SPRDWL_MODE_NONE, true); - sprdwl_reorder_init(&rx_if->ba_entry); - sprdwl_sync_version(g_sprdwl_priv); - sprdwl_download_ini(g_sprdwl_priv); - sprdwl_tcp_ack_init(g_sprdwl_priv); - sprdwl_get_fw_info(g_sprdwl_priv); - sprdwl_setup_wiphy(g_sprdwl_priv->wiphy, g_sprdwl_priv); - sprdwl_vendor_init(g_sprdwl_priv->wiphy); - - sprdwl_reg_notify(g_sprdwl_priv->wiphy, &g_sprdwl_priv->sync.request); - - list_for_each_entry_safe(vif, tmp_vif, &g_sprdwl_priv->vif_list, vif_node) { - if (SPRDWL_INTF_OPEN == g_sprdwl_priv->sync.fw_stat[vif->mode]) { - vif->mode = SPRDWL_MODE_NONE; - sprdwl_init_fw(vif); - } - } - g_sprdwl_priv->sync.scan_not_allowed = false; - wl_err("cp2 resume complete...............\n"); } -static void wifi_reset_init(void) +static int wifi_exception_event(void) { - INIT_WORK(&wifi_rst_begin, wifi_reset_wq); - INIT_WORK(&wifi_rst_down, wifi_resume_wq); - init_completion(&wifi_reset_ready); - return; + char *envp[2]; + envp[0] = "CP2-EXCEPTION-EVENT"; + envp[1] = NULL; + kobject_uevent_env(&sprdwl_dev->kobj, KOBJ_CHANGE, envp); + return 0; } int wifi_reset_callback(struct notifier_block *nb, unsigned long event, void *v) { - wl_info("%s[%d]: %s %d\n", __func__, __LINE__, (char *)v, (int)event); - switch (event) { - case 1: - schedule_work(&wifi_rst_begin); - break; - case 0: - schedule_work(&wifi_rst_down); - break; - } - + sprdwl_wifi_reset(); + wifi_exception_event(); return NOTIFY_OK; } + static struct notifier_block wifi_reset_notifier = { - .notifier_call = wifi_reset_callback, + .notifier_call = wifi_reset_callback, }; #endif @@ -668,7 +595,6 @@ static int sprdwl_probe(struct platform_device *pdev) u8 i; #ifdef CP2_RESET_SUPPORT - wifi_reset_init(); marlin_reset_callback_register(MARLIN_WIFI, &wifi_reset_notifier); #endif @@ -765,7 +691,6 @@ static int sprdwl_probe(struct platform_device *pdev) return ret; err_core_init: - sprdwl_bus_deinit(); sprdwl_tx_deinit(intf); err_tx_init: sprdwl_rx_deinit(intf); @@ -791,7 +716,6 @@ static int sprdwl_remove(struct platform_device *pdev) cpufreq_unregister_notifier(&boost_notifier, CPUFREQ_POLICY_NOTIFIER); sprdwl_debugfs_deinit(); sprdwl_core_deinit(priv); - sprdwl_bus_deinit(); sprdwl_tx_deinit(intf); sprdwl_rx_deinit(intf); sprdwl_intf_deinit(intf); diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c old mode 100644 new mode 100755 index a6def0e0682..bb8d3762579 --- a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c +++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c @@ -32,6 +32,10 @@ .rx_threshold = threshold, .timeout = time, .pop_link = pop,\ .push_link = push, .tx_complete = complete, .power_notify = suspend } +#ifndef CPUFREQ_ADJUST +#define CPUFREQ_ADJUST CPUFREQ_CREATE_POLICY +#endif + struct sprdwl_intf_ops g_intf_ops; static inline struct sprdwl_intf *get_intf(void) @@ -708,8 +712,8 @@ unsigned char sprdwl_find_lut_index(struct sprdwl_intf *intf, break; } - //wl_err("ctx_id = %d, sm_state = %d, bssid =%pM\n", - // vif->ctx_id, vif->sm_state, intf->skb_da); + wl_err("ctx_id = %d, sm_state = %d, bssid =%pM\n", + vif->ctx_id, vif->sm_state, intf->skb_da); return ret; } @@ -762,7 +766,7 @@ int sprdwl_intf_fill_msdu_dscr(struct sprdwl_vif *vif, lut_index = sprdwl_find_lut_index(dev, vif); if ((lut_index < 6) && (!sprdwl_is_group(dev->skb_da))) { - //wl_err("%s, %d, sta disconn, no data tx!", __func__, __LINE__); + wl_err("%s, %d, sta disconn, no data tx!", __func__, __LINE__); return -EPERM; } skb_push(skb, sizeof(struct tx_msdu_dscr) + offset + dscr_rsvd); @@ -1048,20 +1052,6 @@ void sprdwl_count_rx_tp(struct sprdwl_rx_if *rx_if, int num) rx_if->rx_data_num = 0; } } - -static int check_msdu_early(struct sprdwl_intf *intf, struct mbuf_t *mbuf) -{ - struct rx_msdu_desc *msdu_desc = - (struct rx_msdu_desc *)(mbuf->buf + intf->hif_offset); - - if (mbuf->len < msdu_desc->msdu_len || - msdu_desc->msdu_len > 1600) { - wl_err("%s, %d, %d, %d\n", __func__, __LINE__, mbuf->len, msdu_desc->msdu_len); - return -1; - } - return 0; -} - static int intf_rx_handle(int chn, struct mbuf_t *head, struct mbuf_t *tail, int num) { @@ -1085,13 +1075,6 @@ static int intf_rx_handle(int chn, struct mbuf_t *head, for (i = num; i > 0; i--) { sprdwl_sdio_process_credit(intf, (void *)(mbuf->buf + intf->hif_offset)); - if (intf->priv->hw_type == SPRDWL_HW_USB && - chn == USB_RX_DATA_PORT && - check_msdu_early(intf, mbuf)) { - sprdwcn_bus_push_list(chn, head, tail, num); - return 0; - } - mbuf = mbuf->next; } } @@ -1645,12 +1628,12 @@ void sprdwl_tx_ba_mgmt(struct sprdwl_priv *priv, void *data, int len, tid = addba->addba_param.tid; if (!test_and_clear_bit(tid, &peer_entry->ba_tx_done_map)) goto out; - //wl_err("%s, %d, tx_addba failed, reason=%d, lut_index=%d, tid=%d, map=%lu\n", - // __func__, __LINE__, - // rbuf[0], - // addba->lut_index, - // tid, - // peer_entry->ba_tx_done_map); + wl_err("%s, %d, tx_addba failed, reason=%d, lut_index=%d, tid=%d, map=%lu\n", + __func__, __LINE__, + rbuf[0], + addba->lut_index, + tid, + peer_entry->ba_tx_done_map); } out: kfree(rbuf); @@ -1750,26 +1733,17 @@ void sprdwl_tx_delba(struct sprdwl_intf *intf, int sprdwl_notifier_boost(struct notifier_block *nb, unsigned long event, void *data) { -#if KERNEL_VERSION(5, 4, 19) <= LINUX_VERSION_CODE struct cpufreq_policy_data *policy = data; -#else - struct cpufreq_policy *policy = data; -#endif unsigned long min_freq; unsigned long max_freq = policy->cpuinfo.max_freq; struct sprdwl_intf *intf = get_intf(); u8 boost; - if (NULL == intf) return NOTIFY_DONE; boost = intf->boost; -#if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE - if (event != CPUFREQ_CREATE_POLICY) -#else if (event != CPUFREQ_ADJUST) -#endif return NOTIFY_DONE; min_freq = boost ? 1200000 : 400000; @@ -1846,7 +1820,7 @@ void adjust_rxnum_level(char *buf, unsigned char offset) #undef MAX_LEN } -int sprdwl_bus_init(struct sprdwl_priv *priv) +int sprdwl_intf_init(struct sprdwl_priv *priv, struct sprdwl_intf *intf) { int ret = -EINVAL, chn = 0; @@ -1873,40 +1847,10 @@ int sprdwl_bus_init(struct sprdwl_priv *priv) if (ret < 0) goto err; } - return 0; - } -err: - wl_err("%s: unregister %d ops\n", - __func__, g_intf_ops.max_num); - - for (; chn > 0; chn--) - sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]); - g_intf_ops.hif_ops = NULL; - g_intf_ops.max_num = 0; - - return ret; -} - -void sprdwl_bus_deinit(void) -{ - int chn = 0; - - for (chn = 0; chn < g_intf_ops.max_num; chn++) - sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]); -} - -int sprdwl_intf_init(struct sprdwl_priv *priv, struct sprdwl_intf *intf) -{ - int ret = -EINVAL; - - ret = sprdwl_bus_init(priv); - if (ret < 0) - return ret; - - g_intf_ops.intf = (void *)intf; - /* TODO: Need we reserve g_intf_ops? */ - intf->hw_intf = (void *)&g_intf_ops; + g_intf_ops.intf = (void *)intf; + /* TODO: Need we reserve g_intf_ops? */ + intf->hw_intf = (void *)&g_intf_ops; priv->hw_priv = intf; priv->hw_offset = intf->hif_offset; @@ -1917,14 +1861,30 @@ int sprdwl_intf_init(struct sprdwl_priv *priv, struct sprdwl_intf *intf) intf->rxnum_level = BOOST_RXNUM_LEVEL; intf->boost = 0; #ifdef UNISOC_WIFI_PS - init_completion(&intf->suspend_completed); + init_completion(&intf->suspend_completed); #endif + } else { +err: + wl_err("%s: unregister %d ops\n", + __func__, g_intf_ops.max_num); + + for (; chn > 0; chn--) + sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]); + + g_intf_ops.hif_ops = NULL; + g_intf_ops.max_num = 0; + } return ret; } void sprdwl_intf_deinit(struct sprdwl_intf *dev) { + int chn = 0; + + for (chn = 0; chn < g_intf_ops.max_num; chn++) + sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]); + g_intf_ops.intf = NULL; g_intf_ops.max_num = 0; dev->hw_intf = NULL; @@ -1936,8 +1896,8 @@ int sprdwl_dis_flush_txlist(struct sprdwl_intf *intf, u8 lut_index) int i, j; if (lut_index <= 5) { - //wl_err("err lut_index:%d, %s, %d\n", - // lut_index, __func__, __LINE__); + wl_err("err lut_index:%d, %s, %d\n", + lut_index, __func__, __LINE__); return -1; } wl_debug("disconnect, flush qoslist, %s, %d\n", __func__, __LINE__); diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h old mode 100644 new mode 100755 index b159c685a5e..7e609023f63 --- a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h +++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h @@ -60,7 +60,6 @@ #define BOOST_RXNUM_LEVEL 16 #ifdef SPRDWL_TX_SELF -#include struct sprdwl_tx_buf { unsigned char *base; unsigned short buf_len; @@ -299,5 +298,4 @@ void sprdwl_boost(void); void sprdwl_unboost(void); void adjust_txnum_level(char *buf, unsigned char offset); void adjust_rxnum_level(char *buf, unsigned char offset); -void sprdwl_bus_deinit(void); #endif /* __SPRDWL_INTF_SDIO_SC2355_H__ */ -- 2.34.1